Jak najít průměr, medián a režim v Pythonu?

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.