Jak znaleźć średnią, medianę i tryb w Pythonie?

Średnia, mediana i tryb to podstawowe zagadnienia statystyki. Możesz je łatwo obliczyć w Pythonie, z użyciem zewnętrznych bibliotek i bez nich.

Te trzy są głównymi środkami tendencji centralnej. Tendencja centralna pozwala nam poznać „normalne” lub „średnie” wartości zbioru danych. Jeśli dopiero zaczynasz z nauką o danych, ten samouczek jest dla Ciebie odpowiedni.

Pod koniec tego samouczka:

  • Zrozumieć pojęcie średniej, mediany i trybu
  • Możliwość tworzenia własnych funkcji średniej, mediany i trybu w Pythonie
  • Skorzystaj z modułu statystyk Pythona, aby szybko rozpocząć korzystanie z tych pomiarów

Jeśli chcesz pobrać wersję poniższych ćwiczeń, nie wahaj się sprawdzić Repozytorium GitHub.

Przejdźmy do różnych sposobów obliczania średniej, mediany i trybu.

Obliczanie średniej w Pythonie

The oznaczać lub średnia arytmetyczna jest najczęściej używaną miarą tendencji centralnej.

Pamiętaj, że tendencja centralna jest typową wartością zbioru danych.

Zestaw danych jest zbiorem danych, dlatego w Pythonie zestawem danych może być dowolna z następujących wbudowanych struktur danych:

  • Listy, krotki i zbiory: zbiór obiektów
  • Ciągi: zbiór znaków
  • Słownik: zbiór par klucz-wartość

Uwaga: Chociaż w Pythonie istnieją inne struktury danych, takie jak kolejki lub stosy, będziemy używać tylko tych wbudowanych.

Możemy obliczyć średnią, dodając wszystkie wartości ze zbioru danych i dzieląc wynik przez liczbę wartości. Na przykład, jeśli mamy następującą listę liczb:

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

Średnia wyniosłaby 3,5, ponieważ suma listy wynosi 21, a jej długość wynosi 6. Dwadzieścia jeden podzielone przez sześć daje 3,5. Możesz wykonać to obliczenie za pomocą poniższego obliczenia:

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

W tym samouczku użyjemy graczy drużyny koszykówki jako przykładowych danych.

Tworzenie niestandardowej funkcji średniej

Zacznijmy od obliczenia średniego wieku graczy w drużynie koszykówki. Nazwa zespołu będzie brzmiała „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))

Podział tego kodu:

  • „pythonic_machine_ages” to lista wieku koszykarzy
  • Definiujemy funkcję mean(), która zwraca sumę podanego zbioru danych podzieloną przez jego długość
    • Funkcja sum() zwraca całkowitą sumę (jak na ironię) wartości iterowalnej, w tym przypadku listy. Spróbuj przekazać zestaw danych jako argument, zwróci 211
    • Funkcja len() zwraca długość iterowalności, jeśli przekażesz do niej zestaw danych, otrzymasz 8
  • Przekazujemy wiek drużyny koszykówki do funkcji mean() i wypisujemy wynik.

Jeśli sprawdzisz dane wyjściowe, otrzymasz:

26.375
# Because 211 / 8 = 26.375

Ten wynik reprezentuje średni wiek graczy drużyny koszykówki. Zwróć uwagę, że liczba nie pojawia się w zbiorze danych, ale dokładnie opisuje wiek większości graczy.

Używając mean() z modułu statystycznego Pythona

Obliczanie miar tendencji centralnej jest powszechną operacją większości programistów. To jest ponieważ Statystyki Pythona Moduł zapewnia różnorodne funkcje do ich obliczania, wraz z innymi podstawowymi tematami statystycznymi.

Ponieważ jest częścią Standardowa biblioteka Pythona nie będziesz musiał instalować żadnego zewnętrznego pakietu z PIP.

Oto sposób korzystania z tego modułu:

from statistics import mean

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

print(mean(pythonic_machine_ages))

W powyższym kodzie wystarczy zaimportować funkcję mean() z modułu statystyk i przekazać do niej zestaw danych jako argument. Zwróci to ten sam wynik, co funkcja niestandardowa, którą zdefiniowaliśmy w poprzedniej sekcji:

26.375

Teraz masz krystalicznie czystą koncepcję średniej, przejdźmy do pomiaru mediany.

Znalezienie mediany w Pythonie

The mediana jest środkową wartością posortowanego zbioru danych. Jest używany — ponownie — do podania „typowej” wartości określonej populacja.

W programowaniu możemy zdefiniować medianę jako wartość, która dzieli sekwencję na dwie części — dolną połowę i wyższą połowę —.

Aby obliczyć medianę, najpierw musimy posortować zbiór danych. Moglibyśmy to zrobić za pomocą algorytmów sortowania lub wbudowanej funkcji sorted(). Drugim krokiem jest określenie, czy długość zbioru danych jest parzysta czy nieparzysta. W zależności od tego niektóre z następujących procesów:

  • Nieparzyste: Mediana jest środkową wartością zbioru danych
  • Parzysta: mediana to suma dwóch środkowych wartości podzielona przez dwa

Kontynuując nasz zbiór danych o drużynie koszykówki, obliczmy medianę wzrostu graczy w centymetrach:

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

Jak widać, ponieważ długość zbioru danych jest nieparzysta, możemy przyjąć wartość środkową jako medianę. Jednak co by się stało, gdyby gracz właśnie przeszedł na emeryturę?

Musielibyśmy obliczyć medianę, biorąc pod uwagę dwie środkowe wartości zbioru danych

[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

Tworzenie niestandardowej funkcji mediany

Zaimplementujmy powyższą koncepcję w funkcji Pythona.

Pamiętaj o trzech krokach, które musimy wykonać, aby uzyskać medianę zbioru danych:

  • Sortowanie zestawu danych: Możemy to zrobić za pomocą funkcji sorted().
  • Określ, czy jest nieparzysta, czy parzysta: możemy to zrobić, pobierając długość zbioru danych i używając operatora modulo (%)
  • Zwróć medianę na podstawie każdego przypadku:
    • Nieparzyste: zwraca środkową wartość
    • Parzyste: zwraca średnią z dwóch środkowych wartości

Dałoby to następującą funkcję:

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

Drukowanie wyniku naszych zestawów danych:

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

Wyjście:

198
200.5

Zwróć uwagę, jak tworzymy zmienną danych, która wskazuje posortowaną bazę danych na początku funkcji. Chociaż powyższe listy są posortowane, chcemy utworzyć funkcję wielokrotnego użytku, a zatem sortować zestaw danych za każdym razem, gdy funkcja jest wywoływana.

Indeks przechowuje środkową wartość — lub górną środkową wartość — zestawu danych za pomocą operatora dzielenia liczb całkowitych. Na przykład, gdybyśmy przekazywali listę „pythonic_machine_heights”, miałaby ona wartość 4.

Pamiętaj, że w Pythonie indeksy sekwencji zaczynają się od zera, ponieważ możemy zwrócić środkowy indeks listy z dzieleniem całkowitym.

Następnie sprawdzamy, czy długość zbioru danych jest nieparzysta, porównując wynik operacji modulo z dowolną wartością różną od zera. Jeśli warunek jest spełniony, zwracamy środkowy element, na przykład z listą „pythonic_machine_heights”:

>>> pythonic_machine_heights[4]
# 198

Z drugiej strony, jeśli zestaw danych jest parzysty, zwracamy sumę wartości środkowych podzieloną przez dwa. Zwróć uwagę na te dane[index -1] daje nam dolny punkt środkowy zbioru danych, podczas gdy data[index] dostarcza nam górny punkt środkowy.

Używając median() z Modułu Statystycznego Pythona

Ten sposób jest znacznie prostszy, ponieważ używamy już istniejącej funkcji z modułu statystyk.

Osobiście, jeśli coś jest już dla mnie zdefiniowane, użyłbym tego ze względu na zasadę DRY —Don’t repeat yourself — (w tym przypadku nie powtarzaj cudzego kodu).

Możesz obliczyć medianę poprzednich zestawów danych za pomocą następującego kodu:

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))

Wyjście:

198
200.5

Obliczanie trybu w Pythonie

The tryb jest najczęstszą wartością w zbiorze danych. Możemy o niej myśleć jako o „popularnej” grupie w szkole, która może reprezentować standard dla wszystkich uczniów.

Przykładem trybu może być codzienna sprzedaż w sklepie technicznym. Tryb tego zestawu danych byłby najczęściej sprzedawanym produktem określonego dnia.

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

Jak można zauważyć, tryb powyższego zestawu danych to „laptop”, ponieważ była to najczęstsza wartość na liście.

Fajną rzeczą w trybie jest to, że zestaw danych nie może być numeryczny. Na przykład możemy pracować z łańcuchami.

Przeanalizujmy sprzedaż innego dnia:

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

Powyższy zestaw danych ma dwa tryby: „mysz” i „słuchawki”, ponieważ oba mają częstotliwość dwa. Oznacza to, że jest to A multimodalny zestaw danych.

Co zrobić, jeśli nie możemy znaleźć trybu w zbiorze danych, takim jak ten poniżej?

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

to się nazywa równomierny rozkładzasadniczo oznacza to, że w zbiorze danych nie ma trybu.

Teraz, gdy masz już pojęcie o trybie, obliczmy je w Pythonie.

Tworzenie funkcji trybu niestandardowego

Możemy myśleć o częstotliwości wartości jako o parze klucz-wartość, innymi słowy, o słowniku Pythona.

Podsumowując analogię do koszykówki, możemy użyć dwóch zestawów danych do pracy z: punktami na mecz i sponsorowaniem niektórych graczy przez sneakersy.

Aby znaleźć tryb, najpierw musimy utworzyć słownik częstotliwości z każdą wartością obecną w zbiorze danych, a następnie uzyskać maksymalną częstotliwość i zwrócić wszystkie elementy z tą częstotliwością.

Przetłumaczmy to na kod:

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

Sprawdzanie wyniku przekazującego dwie listy jako argumenty:

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

Wyjście:

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

Jak widać, pierwsza instrukcja print dała nam jeden tryb, podczas gdy druga zwróciła wiele trybów.

Wyjaśniając dokładniej powyższy kod:

  • Deklarujemy słownik częstotliwości
  • Iterujemy zestaw danych, aby utworzyć plik histogram — termin statystyczny dla zbioru liczników (lub częstotliwości) —
    • Jeśli klucz zostanie znaleziony w słowniku, dodaje jeden do wartości
    • Jeśli nie zostanie znaleziony, tworzymy parę klucz-wartość o wartości jeden
  • Zmienna most_frequent przechowuje — jak na ironię — największą wartość (nie klucz) słownika częstotliwości
  • Zwracamy zmienną trybów, która składa się ze wszystkich kluczy w słowniku częstotliwości z największą częstotliwością.

Zwróć uwagę, jak ważne jest nazewnictwo zmiennych, aby pisać czytelny kod.

Korzystanie z mode() i multimode() z modułu statystycznego Pythona

Po raz kolejny moduł statystyk zapewnia nam szybki sposób wykonywania podstawowych operacji statystycznych.

Możemy skorzystać z dwóch funkcji: tryb() oraz wielomodowy().

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']

Powyższy kod importuje obie funkcje i definiuje zestawy danych, z którymi pracowaliśmy.

Oto mała różnica: funkcja mode() zwraca pierwszy napotkany tryb, podczas gdy multimode() zwraca listę z najczęstszymi wartościami w zbiorze danych.

W związku z tym możemy powiedzieć, że zdefiniowana przez nas funkcja niestandardowa jest w rzeczywistości funkcją multimode().

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

Wyjście:

10
nike

Uwaga: W Pythonie 3.8 lub nowszym funkcja mode() zwraca pierwszy znaleziony tryb. Jeśli masz starszą wersję, otrzymasz plik Błąd statystyki.

Korzystanie z funkcji multimode():

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

Wyjście:

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

Podsumowując

Gratulacje! Jeśli śledziłeś do tej pory, nauczyłeś się, jak obliczać średnią, medianę i modę, główne pomiary tendencji centralnej.

Chociaż możesz zdefiniować własne funkcje, aby znaleźć średnią, medianę i modę, zaleca się użycie modułu statystyk, ponieważ jest on częścią standardowej biblioteki i nie trzeba niczego instalować, aby zacząć z niego korzystać.

Następnie przeczytaj przyjazne wprowadzenie do analizy danych w Pythonie.