09.2024 | Miary Centralne | Python | SQL | Przeczytasz w 4 min.
Miary centralne to podstawowe narzędzia statystyczne, które pomagają nam zrozumieć typowe lub centralne wartości w zbiorze danych. W kontekście e-commerce, miary te mogą dostarczyć cennych informacji o zachowaniach klientów, trendach sprzedażowych i wydajności produktów. W tym artykule omówimy trzy kluczowe miary centralne: średnią arytmetyczną, medianę i modę, oraz pokażemy, jak je obliczać w Pythonie na przykładzie danych ze sklepu e-commerce.
Średnia arytmetyczna to suma wszystkich wartości podzielona przez liczbę obserwacji. Jest przydatna do określenia przeciętnej wartości w zbiorze danych.
Załóżmy, że mamy listę wartości zamówień w naszym sklepie e-commerce:
import numpy as np
zamowienia = [120, 80, 200, 150, 100, 250, 80, 300, 120, 180]
srednia = np.mean(zamowienia)
print(f"Średnia wartość zamówienia: {srednia:.2f} zł")
Mediana to wartość środkowa w uporządkowanym zbiorze danych. Jest szczególnie przydatna, gdy mamy do czynienia z danymi zawierającymi wartości odstające.
mediana = np.median(zamowienia)
print(f"Mediana wartości zamówień: {mediana:.2f} zł")
Moda to wartość występująca najczęściej w zbiorze danych. W kontekście e-commerce może to być np. najpopularniejsza cena produktu.
from scipy import stats
moda = stats.mode(zamowienia)
print(f"Najczęstsza wartość zamówienia (moda): {moda.mode[0]:.2f} zł")
Wybór odpowiedniej miary centralnej zależy od charakteru danych i celu analizy:
Teraz zastosujmy te miary do rzeczywistego scenariusza e-commerce. Załóżmy, że mamy dane o czasie spędzonym przez klientów na naszej stronie (w minutach) przed dokonaniem zakupu:
import pandas as pd
import matplotlib.pyplot as plt
# Symulowane dane
dane = pd.DataFrame({
'czas_na_stronie': [5, 10, 15, 7, 12, 20, 8, 30, 25, 18, 22, 6, 14, 9, 11],
'wartosc_zakupu': [50, 100, 150, 80, 120, 200, 70, 250, 180, 160, 190, 60, 130, 90, 110]
})
# Obliczanie miar centralnych
sredni_czas = np.mean(dane['czas_na_stronie'])
mediana_czasu = np.median(dane['czas_na_stronie'])
moda_czasu = stats.mode(dane['czas_na_stronie'])
print(f"Średni czas na stronie: {sredni_czas:.2f} minut")
print(f"Mediana czasu na stronie: {mediana_czasu:.2f} minut")
print(f"Najczęstszy czas na stronie (moda): {moda_czasu.mode[0]:.2f} minut")
# Wizualizacja
plt.figure(figsize=(10, 6))
plt.scatter(dane['czas_na_stronie'], dane['wartosc_zakupu'])
plt.axvline(sredni_czas, color='r', linestyle='--', label='Średnia')
plt.axvline(mediana_czasu, color='g', linestyle='--', label='Mediana')
plt.axvline(moda_czasu.mode[0], color='b', linestyle='--', label='Moda')
plt.xlabel('Czas spędzony na stronie (minuty)')
plt.ylabel('Wartość zakupu (zł)')
plt.title('Relacja między czasem na stronie a wartością zakupu')
plt.legend()
plt.show()
Ten kod nie tylko oblicza miary centralne, ale także tworzy wykres rozrzutu pokazujący relację między czasem spędzonym na stronie a wartością zakupu, z zaznaczonymi liniami dla średniej, mediany i mody czasu spędzonego na stronie.
Załóżmy, że mamy tabelę charging_sessions z danymi o ładowaniu samochodów elektrycznych:
-- Tworzenie tabeli
CREATE TABLE ladowanie_samochodow (
id INT PRIMARY KEY,
id_samochodu VARCHAR(10),
start_ladowania TIMESTAMP,
koniec_ladowania TIMESTAMP
);
-- Wczytywanie danych z pliku CSV
-- Uwaga: Poniższa komenda jest specyficzna dla PostgreSQL. Dla innych systemów bazodanowych może być potrzebna inna składnia.
COPY ladowanie_samochodow(id, id_samochodu, start_ladowania, koniec_ladowania)
FROM '/sciezka/do/pliku/ladowanie_samochodow.csv'
DELIMITER ','
CSV HEADER;
-- Obliczanie średniego czasu ładowania
SELECT AVG(EXTRACT(EPOCH FROM (koniec_ladowania - start_ladowania))/60) AS sredni_czas_ladowania_minuty
FROM ladowanie_samochodow;
-- Obliczanie mediany czasu ładowania
WITH czasy_ladowania AS (
SELECT EXTRACT(EPOCH FROM (koniec_ladowania - start_ladowania))/60 AS czas_ladowania_minuty
FROM ladowanie_samochodow
ORDER BY czas_ladowania_minuty
)
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY czas_ladowania_minuty) AS mediana_czasu_ladowania_minuty
FROM czasy_ladowania;
-- Obliczanie mody (najczęstszego czasu ładowania)
WITH czasy_ladowania AS (
SELECT ROUND(EXTRACT(EPOCH FROM (koniec_ladowania - start_ladowania))/60) AS czas_ladowania_minuty
FROM ladowanie_samochodow
)
SELECT czas_ladowania_minuty, COUNT(*) AS liczba_wystapien
FROM czasy_ladowania
GROUP BY czas_ladowania_minuty
ORDER BY liczba_wystapien DESC
LIMIT 1;
-- Analiza godzin rozpoczęcia ładowania
SELECT
EXTRACT(HOUR FROM start_ladowania) AS godzina_rozpoczecia,
COUNT(*) AS liczba_ladowan
FROM ladowanie_samochodow
GROUP BY godzina_rozpoczecia
ORDER BY liczba_ladowan DESC;
Podpowiedź => Pełny zestaw danych (100 rekordów) można wygenerować przy użyciu skryptu Pythona i zapisać do pliku CSV:
import csv
from datetime import datetime, timedelta
import random
def generate_charging_data(num_records=100):
data = []
start_date = datetime(2024, 8, 29)
for i in range(1, num_records + 1):
car_id = random.randint(100, 199)
start_time = start_date + timedelta(hours=random.randint(0, 23), minutes=random.randint(0, 59))
duration = timedelta(hours=random.uniform(1, 4))
end_time = start_time + duration
data.append([i, car_id, start_time, end_time])
return data
# Generowanie danych
charging_data = generate_charging_data()
# Zapisywanie do pliku CSV
with open('charging_sessions.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['id', 'car_id', 'start_time', 'end_time'])
writer.writerows(charging_data)
print("Plik CSV z danymi został wygenerowany.")
Ten skrypt generuje plik charging_sessions.csv, który można zaimportować do bazy danych SQL lub użyć bezpośrednio w analizie.
Miary centralne są niezwykle przydatne w analizie danych e-commerce. Pozwalają na:
Pamiętajmy, że każda z tych miar ma swoje zalety i ograniczenia. Średnia jest wrażliwa na wartości skrajne, podczas gdy mediana jest bardziej odporna. Moda może być szczególnie przydatna dla danych kategorialnych lub dyskretnych. Najlepsze rezultaty osiągniesz, używając ich w połączeniu i interpretując w kontekście swojego biznesu e-commerce.
Napisz do mnie poprzez formularz kontaktowy.