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

Průměr, medián a mod jsou základními tématy statistiky. Můžete je snadno vypočítat v Pythonu, s použitím i bez použití externích knihoven.

Tyto tři jsou hlavními měřítky centrální tendence. Centrální tendence nám umožňuje znát „normální“ nebo „průměrné“ hodnoty souboru dat. Pokud s datovou vědou teprve začínáte, je to pro vás ten pravý tutoriál.

Na konci tohoto tutoriálu budete:

  • Pochopte koncept střední hodnoty, mediánu a modu
  • Být schopen vytvářet své vlastní střední, střední a režimové funkce v Pythonu
  • Využijte statistický modul Pythonu k rychlému zahájení používání těchto měření

Pokud chcete stáhnout verzi následujících cvičení, neváhejte se podívat na úložiště GitHub.

Pojďme se podívat na různé způsoby výpočtu střední hodnoty, mediánu a režimu.

Výpočet průměru v Pythonu

The znamenat nebo aritmetický průměr je nejpoužívanějším měřítkem centrální tendence.

Pamatujte, že centrální tendence je typickou hodnotou souboru dat.

Datová sada je sbírka dat, proto datová sada v Pythonu může být jakákoli z následujících vestavěných datových struktur:

  • Seznamy, n-tice a množiny: kolekce objektů
  • Struny: sbírka znaků
  • Slovník: sbírka párů klíč–hodnota

Poznámka: Přestože v Pythonu existují další datové struktury, jako jsou fronty nebo zásobníky, budeme používat pouze ty vestavěné.

Můžeme vypočítat průměr sečtením všech hodnot datové sady a vydělením výsledku počtem hodnot. Máme-li například následující seznam čísel:

[1, 2, 3, 4, 5, 6]

Průměr nebo průměr by byl 3,5, protože součet seznamu je 21 a jeho délka je 6. Dvacet jedna děleno šesti je 3,5. Tento výpočet můžete provést pomocí níže uvedeného výpočtu:

(1 + 2 + 3 + 4 + 5 + 6) / 6 = 21

V tomto tutoriálu použijeme jako ukázková data hráče basketbalového týmu.

Vytvoření uživatelské funkce střední hodnoty

Začněme výpočtem průměrného (průměrného) věku hráčů v basketbalovém týmu. Název týmu bude „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))

Rozložení tohoto kódu:

  • „pythonic_machine_ages“ je seznam s věky basketbalistů
  • Definujeme funkci mean(), která vrací součet daného datového souboru dělený jeho délkou
    • Funkce sum() vrací celkový součet (ironicky) hodnot iterovatelného, ​​v tomto případě seznamu. Zkuste datovou sadu předat jako argument, vrátí 211
    • Funkce len() vrací délku iterovatelného, ​​pokud mu předáte datovou sadu, dostanete 8
  • Věk basketbalového týmu předáme funkci mean() a vytiskneme výsledek.

Pokud zkontrolujete výstup, dostanete:

26.375
# Because 211 / 8 = 26.375

Tento výstup představuje průměrný věk hráčů basketbalového týmu. Všimněte si, že se číslo neobjevuje v datové sadě, ale přesně popisuje věk většiny hráčů.

  Jak používat režim skryté čtečky Google Chrome

Použití mean() ze statistického modulu Pythonu

Výpočet míry centrální tendence je běžnou operací pro většinu vývojářů. To je Protože Statistiky Pythonu modul poskytuje různé funkce pro jejich výpočet spolu s dalšími základními tématy statistiky.

Vzhledem k tomu, že je součástí Standardní knihovna Python nebudete muset instalovat žádný externí balíček s PIP.

Tento modul používáte takto:

from statistics import mean

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

print(mean(pythonic_machine_ages))

Ve výše uvedeném kódu stačí importovat funkci mean() ze statistického modulu a předat mu datovou sadu jako argument. To vrátí stejný výsledek jako vlastní funkce, kterou jsme definovali v předchozí části:

26.375

Nyní máte křišťálově jasný pojem střední hodnoty, pojďme pokračovat v měření mediánu.

Hledání mediánu v Pythonu

The medián je střední hodnota seřazené datové sady. Používá se – opět – k poskytnutí „typické“ hodnoty určené počet obyvatel.

V programování můžeme definovat medián jako hodnotu, která rozděluje sekvenci na dvě části — dolní polovinu a vyšší polovinu —.

Abychom vypočítali medián, musíme nejprve seřadit datovou sadu. Mohli bychom to udělat pomocí třídicích algoritmů nebo pomocí vestavěné funkce sort(). Druhým krokem je určit, zda je délka datové sady lichá nebo sudá. V závislosti na tom některé z následujících procesů:

  • Odd: Medián je střední hodnota datové sady
  • Even: Medián je součet dvou středních hodnot dělený dvěma

Pokračujeme v datovém souboru našeho basketbalového týmu a vypočítejme střední výšku hráčů v centimetrech:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Since the dataset is odd, we select the middle value
median = 198

Jak můžete vidět, protože délka datové sady je lichá, můžeme vzít střední hodnotu jako medián. Co by se však stalo, kdyby hráč právě odešel do důchodu?

Potřebovali bychom vypočítat medián s použitím dvou středních hodnot datové sady

[181, 187, 196, 198, 203, 207, 211, 215] 
# We select the two middle values, and divide them by 2
median = (198 + 203) / 2
median = 200.5

Vytvoření vlastní střední funkce

Pojďme implementovat výše uvedený koncept do funkce Pythonu.

Pamatujte na tři kroky, které musíme provést, abychom získali medián datové sady:

  • Seřadit datovou sadu: Můžeme to udělat pomocí funkce sort()
  • Určete, zda je lichá nebo sudá: Můžeme to udělat tak, že získáme délku datové sady a použijeme operátor modulo (%)
  • Vraťte medián na základě každého případu:
    • Odd: Vrátí střední hodnotu
    • Sudé: Vrátí průměr dvou středních hodnot
  Klávesové zkratky pro Kalendář Google: Cheat Sheet

Výsledkem by byla následující 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 the dataset is odd  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # If the dataset is even
    return (data[index - 1] + data[index]) / 2

Tisk výsledku našich datových sad:

print(median(pythonic_machines_heights))
print(median(after_retirement))

Výstup:

198
200.5

Všimněte si, jak vytváříme datovou proměnnou, která ukazuje na seřazenou databázi na začátku funkce. Přestože jsou výše uvedené seznamy seřazeny, chceme vytvořit opakovaně použitelnou funkci, a proto třídíme datovou sadu pokaždé, když je funkce vyvolána.

Index ukládá střední hodnotu – nebo horní střední hodnotu – datové sady pomocí operátoru dělení celého čísla. Pokud bychom například předávali seznam „pythonic_machine_heights“, měl by hodnotu 4.

Pamatujte, že v Pythonu začínají sekvenční indexy na nule, protože jsme schopni vrátit střední index seznamu s celočíselným dělením.

Poté zkontrolujeme, zda je délka datové sady lichá, porovnáním výsledku operace modulo s jakoukoli hodnotou, která není nula. Pokud je podmínka pravdivá, vrátíme prostřední prvek, například se seznamem „pythonic_machine_heights“:

>>> pythonic_machine_heights[4]
# 198

Na druhou stranu, pokud je datová sada sudá, vrátíme součet středních hodnot dělený dvěma. Všimněte si těchto údajů[index -1] nám dává spodní střed datové sady, zatímco data[index] nám dodává horní střed.

Použití median() ze statistického modulu Pythonu

Tento způsob je mnohem jednodušší, protože používáme již existující funkci z modulu statistiky.

Osobně, pokud je pro mě něco již definováno, použil bych to kvůli principu DRY —Neopakuj se — (v tomto případě neopakuj cizí kód).

Medián předchozích datových sad můžete 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 režimu v Pythonu

The režimu je nejčastější hodnotou v datové sadě. Můžeme si to představit jako „populární“ skupinu školy, která může představovat standard pro všechny studenty.

Příkladem režimu může být denní prodej technického obchodu. Režim této datové sady by byl nejprodávanějším produktem konkrétního dne.

['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']

Jak jistě oceníte, režim výše uvedené datové sady je „laptop“, protože to byla nejčastější hodnota v seznamu.

Na režimu je skvělé, že datová sada nesmí být číselná. Můžeme například pracovat s řetězci.

Pojďme analyzovat tržby z jiného dne:

['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']

Výše uvedená datová sada má dva režimy: „myš“ a „sluchátka“, protože oba mají frekvenci dva. To znamená, že je to a multimodální datový soubor.

  Jak nainstalovat moduly třetích stran na Webmin

Co když nemůžeme najít režim v datové sadě, jako je ta níže?

['usb', 'camera', 'smartphone', 'laptop', 'TV']

Toto se nazývá a rovnoměrné rozloženív podstatě to znamená, že v datové sadě není žádný režim.

Nyní máte rychlý přehled o konceptu režimu, pojďme jej vypočítat v Pythonu.

Vytvoření funkce uživatelského režimu

Frekvenci hodnoty si můžeme představit jako pár klíč-hodnota, jinými slovy pythonovský slovník.

Při rekapitulaci basketbalové analogie můžeme pracovat se dvěma datovými sadami: Body za hru a sponzorství tenisek některých hráčů.

Abychom našli režim, musíme nejprve vytvořit frekvenční slovník s každou z hodnot přítomných v datové sadě, poté získat maximální frekvenci a vrátit 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 předávání dvou seznamů jako argumentů:

print(mode(points_per_game))
print(mode(sponsorship))

Výstup:

[10]
['nike', 'adidas', 'jordan']

Jak vidíte, první tiskový příkaz nám poskytl jeden režim, zatímco druhý vrátil více režimů.

Hlubší vysvětlení výše uvedeného kódu:

  • Vyhlašujeme frekvenční slovník
  • Iterujeme přes datovou sadu, abychom vytvořili a histogram — statistický termín pro sadu čítačů (nebo frekvencí) —
    • Pokud je klíč nalezen ve slovníku, přidá k hodnotě jedničku
    • Pokud není nalezen, vytvoříme pár klíč–hodnota s hodnotou jedna
  • Proměnná nejfrekventovanější ukládá – ironicky – největší hodnotu (ne klíč) frekvenčního slovníku
  • Vrátíme proměnnou režimů, která se skládá ze všech klíčů ve frekvenčním slovníku s nejvyšší frekvencí.

Všimněte si, jak důležité je pojmenování proměnných pro psaní čitelného kódu.

Použití mode() a multimode() ze statistického modulu Pythonu

Modul statistiky nám opět poskytuje rychlý způsob provádění základních statistických operací.

Můžeme použít dvě funkce: režim() 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']

Výše uvedený kód importuje obě funkce a definuje datové sady, se kterými pracujeme.

Zde je malý rozdíl: Funkce mode() vrací první režim, na který narazí, zatímco multimode() vrací seznam s nejčastějšími hodnotami v datové množině.

V důsledku toho můžeme říci, že vlastní funkce, kterou jsme definovali, je ve skutečnosti funkce multimode().

print(mode(points_per_game))
print(mode(sponsorship))

Výstup:

10
nike

Poznámka: V Pythonu 3.8 nebo vyšší funkce mode() vrací první režim, který našla. Pokud máte starší verzi, dostanete a StatisticsError.

Použití funkce multimode():

print(multimode(points_per_game))
print(multimode(sponsorship))

Výstup:

[10]
['nike', 'adidas', 'jordan']

Abych to shrnul

Gratulujeme! Pokud jste postupovali až sem, naučili jste se vypočítat průměr, medián a modus, což jsou hlavní měření centrální tendence.

Ačkoli můžete definovat své vlastní funkce pro nalezení střední hodnoty, mediánu a režimu, doporučujeme použít modul statistiky, protože je součástí standardní knihovny a abyste jej mohli začít používat, nemusíte nic instalovat.

Dále si přečtěte přátelský úvod do analýzy dat v Pythonu.