Průměr, medián a modus jsou klíčovými koncepty ve statistice. V jazyce Python je lze snadno vypočítat jak s využitím externích knihoven, tak bez nich.
Tyto tři veličiny jsou základními měřítky centrální tendence. Centrální tendence nám pomáhá identifikovat „typické“ nebo „průměrné“ hodnoty v datovém souboru. Pro ty, kteří se s datovou vědou teprve seznamují, je tento návod ideálním startovním bodem.
Po prostudování tohoto návodu:
- Získáte hlubší pochopení průměru, mediánu a modu.
- Budete schopni sami vytvořit funkce pro výpočet průměru, mediánu a modu v Pythonu.
- Naučíte se, jak využít statistický modul Pythonu k rychlému a efektivnímu výpočtu těchto měření.
Pokud si přejete stáhnout si verzi s příklady a cvičeními, navštivte prosím úložiště na GitHubu.
Nyní se podíváme na různé způsoby, jakými lze průměr, medián a modus vypočítat.
Výpočet průměru v Pythonu
Průměr, neboli aritmetický průměr, je jedním z nejčastěji používaných měřítek centrální tendence.
Jak již bylo zmíněno, centrální tendence nám udává typickou hodnotu v souboru dat.
Datová sada představuje kolekci dat, v Pythonu může být reprezentována různými vestavěnými datovými strukturami:
- Seznamy, n-tice a množiny: kolekce objektů.
- Řetězce: kolekce znaků.
- Slovníky: kolekce párů klíč-hodnota.
Poznámka: I když Python nabízí i další datové struktury, jako jsou fronty nebo zásobníky, pro naše účely se zaměříme pouze na výše uvedené.
Průměr vypočítáme tak, že sečteme všechny hodnoty v datové sadě a výsledek vydělíme počtem hodnot. Například, pokud máme seznam čísel:
[1, 2, 3, 4, 5, 6]
Průměr by byl 3,5, protože součet všech čísel v seznamu je 21 a seznam má 6 prvků. 21 děleno 6 se rovná 3,5. Tento výpočet lze provést následovně:
(1 + 2 + 3 + 4 + 5 + 6) / 6 = 3.5
V tomto tutoriálu budeme používat data basketbalového týmu jako ilustrační příklad.
Vytvoření vlastní funkce pro výpočet průměru
Začneme výpočtem průměrného věku hráčů basketbalového týmu s názvem „Pythonic Machines“.
pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] def mean(dataset): return sum(dataset) / len(dataset) print(mean(pythonic_machine_ages))
Rozklad kódu:
- `pythonic_machine_ages` je seznam obsahující věky basketbalových hráčů.
- Definujeme funkci `mean()`, která vrací součet hodnot v datové sadě vydělený jejich počtem:
- Funkce `sum()` vrací celkový součet (jak již z názvu vyplývá) všech hodnot v iterovatelné datové sadě, v tomto případě seznamu. Pokud jí předáte datovou sadu, obdržíte 211.
- Funkce `len()` vrací délku iterovatelné datové sady, v tomto případě 8.
- Předáme věky basketbalového týmu funkci `mean()` a vytiskneme výsledek.
Výstup z kódu:
26.375 # Protože 211 / 8 = 26.375
Tento výsledek udává průměrný věk hráčů basketbalového týmu. Je důležité si uvědomit, že se tato hodnota nemusí nacházet v samotné datové sadě, ale představuje „typický“ věk hráčů.
Využití funkce mean() ze statistického modulu Pythonu
Výpočet měr centrální tendence je běžnou operací. Proto modul `statistics` v Pythonu poskytuje různé funkce pro jejich výpočet, spolu s dalšími základními statistickými funkcemi.
Modul je součástí standardní knihovny Pythonu, takže není potřeba instalovat žádné další balíčky pomocí PIP.
Použití modulu:
from statistics import mean pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] print(mean(pythonic_machine_ages))
Stačí naimportovat funkci `mean()` z modulu `statistics` a předat jí datovou sadu. Obdržíte stejný výsledek jako u vlastní funkce:
26.375
Nyní máte jasnější představu o konceptu průměru. Pojďme se tedy podívat na medián.
Výpočet mediánu v Pythonu
Medián je střední hodnota seřazené datové sady. Opět se používá k určení „typické“ hodnoty dané populace.
V kontextu programování můžeme medián definovat jako hodnotu, která rozděluje sekvenci na dvě části: dolní a horní polovinu.
Pro výpočet mediánu musíme nejprve seřadit datovou sadu. To lze provést pomocí třídících algoritmů nebo vestavěné funkce `sort()`. Dalším krokem je určení, zda je délka datové sady lichá, nebo sudá. V závislosti na tom, použijeme jeden z následujících postupů:
- Lichá délka: Medián je prostřední hodnota datové sady.
- Sudá délka: Medián je průměr dvou prostředních hodnot.
Vrátíme se k našemu basketbalovému týmu a vypočítáme medián výšky hráčů (v centimetrech):
[181, 187, 196, 196, 198, 203, 207, 211, 215] # Protože datová sada je liché délky, vybereme prostřední hodnotu median = 198
Jak je vidět, protože počet prvků v datové sadě je lichý, medián je prostřední hodnota. Ale co když jeden z hráčů odejde do důchodu?
V tomto případě musíme vypočítat medián pomocí dvou prostředních hodnot:
[181, 187, 196, 198, 203, 207, 211, 215] # Vybereme dvě prostřední hodnoty a vydělíme je 2 median = (198 + 203) / 2 median = 200.5
Vytvoření vlastní funkce pro výpočet mediánu
Převedeme výše popsaný koncept do podoby funkce v Pythonu.
Opakujme si tři kroky pro nalezení mediánu:
- Seřadit datovou sadu pomocí funkce `sort()`.
- Zjistit, zda je délka datové sady lichá nebo sudá pomocí operátoru modulo `%`.
- Vrátit medián podle výsledku předchozího kroku:
- Lichá délka: vrátit prostřední hodnotu.
- Sudá délka: vrátit průměr dvou prostředních hodnot.
Výsledná funkce:
pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] def median(dataset): data = sorted(dataset) index = len(data) // 2 if len(dataset) % 2 != 0: return data[index] return (data[index - 1] + data[index]) / 2
Výpis výsledku pro naše dvě datové sady:
print(median(pythonic_machines_heights)) print(median(after_retirement))
Výstup:
198 200.5
Všimněte si, že na začátku funkce vytváříme proměnnou `data`, která odkazuje na seřazenou datovou sadu. I když jsou naše seznamy seřazené, chceme vytvořit funkci, která bude opakovaně použitelná. Proto datovou sadu třídíme při každém volání funkce.
Proměnná `index` uchovává střední hodnotu (nebo horní střední hodnotu) datové sady. Pro seznam `pythonic_machine_heights` by index měl hodnotu 4.
Díky tomu, že indexy seznamů začínají v Pythonu od nuly, dokážeme pomocí celočíselného dělení získat prostřední index seznamu.
Poté ověříme, zda je délka datové sady lichá pomocí operátoru modulo a porovnáním s nenulovou hodnotou. Pokud podmínka platí, vrátíme prostřední prvek. Například pro seznam `pythonic_machine_heights`:
>>> pythonic_machine_heights[4] # 198
Pokud je datová sada sudé délky, vrátíme průměr dvou středních hodnot. Všimněte si, že `data[index – 1]` dává dolní střed a `data[index]` horní střed.
Využití funkce median() ze statistického modulu Pythonu
Tento způsob je mnohem jednodušší, protože využívá již existující funkci z modulu `statistics`.
Pokud je pro mě něco již definováno, upřednostňuji použití existujícího kódu, abych dodržel princip DRY (Don’t Repeat Yourself) – neopakuj se.
Medián pro naše datové sady lze vypočítat pomocí následujícího kódu:
from statistics import median pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] print(median(pythonic_machines_heights)) print(median(after_retirement))
Výstup:
198 200.5
Výpočet modu v Pythonu
Modus je nejčastější hodnota v datové sadě. Lze si ji představit jako „populární“ skupinu ve škole, která reprezentuje standard pro všechny studenty.
Příkladem modu může být denní prodej v obchodu s elektronikou. Modus této datové sady by byl nejprodávanější produkt daného dne.
['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']
Modus výše uvedené datové sady je `’laptop’`, protože se v seznamu vyskytuje nejčastěji.
Skvělé na modu je, že datová sada nemusí obsahovat pouze číselné hodnoty. Můžeme například pracovat s řetězci.
Analyzujme prodeje z jiného dne:
['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']
Tato datová sada má dva mody: `’mouse’` a `’headphones’`, protože se oba vyskytují dvakrát. Jedná se tedy o multimodální datovou sadu.
Co když v datové sadě, jako je ta níže, nenalezneme žádný mod?
['usb', 'camera', 'smartphone', 'laptop', 'TV']
Toto se nazývá rovnoměrné rozdělení. V podstatě to znamená, že datová sada nemá žádný mod.
Nyní máte rychlý přehled o konceptu modu. Pojďme si ho spočítat v Pythonu.
Vytvoření vlastní funkce pro výpočet modu
Frekvenci hodnoty můžeme reprezentovat jako dvojici klíč-hodnota, tedy slovník v Pythonu.
Vrátíme se k naší basketbalové analogii a použijeme dvě datové sady: body za zápas a sponzorství tenisek některých hráčů.
Pro nalezení modu musíme nejprve vytvořit slovník frekvencí s počty výskytů jednotlivých hodnot, poté získáme maximální frekvenci a vrátíme všechny prvky s touto frekvencí.
Přeložíme to do kódu:
points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas'] def mode(dataset): frequency = {} for value in dataset: frequency[value] = frequency.get(value, 0) + 1 most_frequent = max(frequency.values()) modes = [key for key, value in frequency.items() if value == most_frequent] return modes
Kontrola výsledku voláním funkce s dvěma seznamy:
print(mode(points_per_game)) print(mode(sponsorship))
Výstup:
[10] ['nike', 'adidas', 'jordan']
První volání funkce vrátilo jeden mod, zatímco druhé vrátilo více modů.
Hlubší rozbor kódu:
- Vytvoříme prázdný slovník `frequency`.
- Iterujeme přes datovou sadu a vytváříme histogram (statistický termín pro sadu čítačů nebo frekvencí):
- Pokud se klíč (hodnota) již ve slovníku nachází, zvýšíme její frekvenci o jedna.
- Pokud se klíč ve slovníku nenachází, vytvoříme nový pár klíč-hodnota s frekvencí rovnou jedné.
- Proměnná `most_frequent` ukládá maximální hodnotu (ne klíč) ze slovníku frekvencí.
- Vrátíme seznam `modes`, který obsahuje všechny klíče (hodnoty) ve slovníku frekvencí s maximální frekvencí.
Všimněte si, jak je důležité vhodné pojmenování proměnných pro psaní čitelného kódu.
Využití funkcí mode() a multimode() ze statistického modulu Pythonu
Modul `statistics` nám opět poskytuje rychlý způsob, jak provádět základní statistické operace.
Můžeme použít dvě funkce: `mode()` a `multimode()`.
from statistics import mode, multimode points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas']
Importujeme obě funkce a definujeme datové sady, se kterými budeme pracovat.
Malý rozdíl: Funkce `mode()` vrací první nalezený mod, zatímco `multimode()` vrací seznam všech nejčastějších hodnot v datové sadě.
Z toho vyplývá, že naše vlastní funkce, kterou jsme definovali, je ve skutečnosti ekvivalentem funkce `multimode()`.
print(mode(points_per_game)) print(mode(sponsorship))
Výstup:
10 nike
Poznámka: V Pythonu 3.8 a novějších vrací funkce `mode()` první nalezený mod. Pokud máte starší verzi, dostanete `StatisticsError`.
Použití funkce `multimode()`:
print(multimode(points_per_game)) print(multimode(sponsorship))
Výstup:
[10] ['nike', 'adidas', 'jordan']
Shrnutí
Gratuluji! Pokud jste dočetli až sem, naučili jste se, jak vypočítat průměr, medián a modus, které jsou základními měřítky centrální tendence.
I když si můžete definovat vlastní funkce pro nalezení průměru, mediánu a modu, doporučujeme použít modul `statistics`, protože je součástí standardní knihovny a pro jeho používání není potřeba nic instalovat.
Dále si můžete přečíst přátelský úvod do analýzy dat v Pythonu.