Podstawowymi elementami statystyki są średnia, mediana i dominanta. W języku Python ich wyliczenie jest proste, zarówno z wykorzystaniem bibliotek zewnętrznych, jak i bez ich pomocy.
Te trzy parametry są kluczowymi wskaźnikami tendencji centralnej, która pozwala określić „typową” lub „przeciętną” wartość w zbiorze danych. Jeśli stawiasz pierwsze kroki w analizie danych, ten poradnik będzie dla Ciebie idealny.
Po zapoznaniu się z tym artykułem:
- Zrozumiesz, czym jest średnia, mediana i dominanta.
- Będziesz umiał tworzyć własne funkcje do obliczania średniej, mediany i dominanty w języku Python.
- Nauczysz się korzystać z modułu statystyk Pythona, aby szybko i łatwo operować na tych miarach.
Jeśli chcesz pobrać materiały do tych ćwiczeń, zajrzyj na repozytorium GitHub.
Przejdźmy teraz do omówienia różnych metod wyliczania średniej, mediany i dominanty.
Obliczanie średniej w Pythonie
Średnia, znana również jako średnia arytmetyczna, jest najczęściej wykorzystywanym miernikiem tendencji centralnej.
Pamiętajmy, że tendencja centralna wskazuje na reprezentatywną wartość dla danego zbioru danych.
Zbiór danych to kolekcja danych, a w Pythonie może być reprezentowany przez różne wbudowane struktury:
- Listy, krotki i zbiory: kolekcje obiektów.
- Ciągi znaków: kolekcje znaków.
- Słowniki: kolekcje par klucz-wartość.
Uwaga: W Pythonie istnieją również inne struktury danych, takie jak kolejki czy stosy, ale w tym poradniku skupimy się na wyżej wymienionych.
Średnią obliczamy, sumując wszystkie wartości zbioru danych, a następnie dzieląc wynik przez liczbę tych wartości. Przykładowo, dla listy liczb:
[1, 2, 3, 4, 5, 6]
Średnia wynosi 3,5, ponieważ suma elementów listy to 21, a liczba elementów to 6. Wynik działania 21 podzielone przez 6 to właśnie 3,5. Obliczenie przedstawia się następująco:
(1 + 2 + 3 + 4 + 5 + 6) / 6 = 21 / 6 = 3.5
W tym poradniku posłużymy się danymi o wieku zawodników drużyny koszykarskiej.
Tworzenie własnej funkcji obliczającej średnią
Na początek obliczmy średni wiek graczy drużyny koszykówki o nazwie „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))
Wyjaśnienie kodu:
- „pythonic_machine_ages” to lista zawierająca wiek koszykarzy.
- Definiujemy funkcję o nazwie `mean()`, która zwraca sumę elementów zbioru danych podzieloną przez liczbę tych elementów.
- Funkcja `sum()` zwraca sumę wartości w iterowalnym obiekcie, w tym przypadku liście. Jeśli do funkcji tej przekażemy naszą listę, otrzymamy wartość 211.
- Funkcja `len()` zwraca długość iterowalnego obiektu. Dla naszej listy będzie to 8.
- Przekazujemy wiek drużyny koszykówki do funkcji `mean()` i wyświetlamy wynik.
Wynikiem działania programu będzie:
26.375 # Ponieważ 211 / 8 = 26.375
Otrzymana wartość reprezentuje średni wiek zawodników drużyny. Warto zauważyć, że wartość ta nie występuje w zbiorze danych, a mimo to oddaje ona w przybliżeniu wiek większości zawodników.
Wykorzystanie funkcji `mean()` z modułu statystycznego Pythona
Obliczanie miar tendencji centralnej jest częstą operacją, z którą mają do czynienia programiści. Dlatego też moduł statystyk Pythona oferuje szereg funkcji służących do ich obliczania oraz innych podstawowych operacji statystycznych.
Ponieważ jest on częścią standardowej biblioteki Pythona, nie musimy instalować żadnych dodatkowych pakietów za pomocą PIP.
Oto, jak możemy skorzystać z tego modułu:
from statistics import mean pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] print(mean(pythonic_machine_ages))
Powyższy kod importuje funkcję `mean()` z modułu statystyk i przekazuje do niej zbiór danych jako argument. Uzyskamy ten sam wynik, co w przypadku naszej autorskiej funkcji:
26.375
Teraz, gdy masz już jasne pojęcie o średniej, przejdźmy do omówienia mediany.
Obliczanie mediany w Pythonie
Mediana to środkowa wartość w uporządkowanym zbiorze danych. Podobnie jak średnia, służy do przedstawienia „typowych” wartości w danej populacji.
W programowaniu medianę możemy zdefiniować jako wartość, która dzieli zbiór danych na dwie równe części – dolną i górną.
Aby obliczyć medianę, w pierwszym kroku musimy posortować zbiór danych. Możemy to zrobić, stosując algorytmy sortowania lub wbudowaną funkcję `sorted()`. Następnie sprawdzamy, czy liczba elementów zbioru jest parzysta, czy nieparzysta. W zależności od tego stosujemy jeden z poniższych algorytmów:
- Nieparzysta liczba elementów: mediana to środkowa wartość zbioru.
- Parzysta liczba elementów: mediana to średnia arytmetyczna dwóch środkowych wartości.
Kontynuując nasz przykład z drużyną koszykarską, obliczmy medianę wzrostu zawodników, wyrażoną w centymetrach:
[181, 187, 196, 196, 198, 203, 207, 211, 215] # Ponieważ zbiór danych ma nieparzystą liczbę elementów, wybieramy wartość środkową. median = 198
Jak widzimy, w tym przypadku, z racji nieparzystej liczby elementów, mediana to środkowa wartość. A co jeśli jeden z zawodników zakończył karierę?
Wtedy musielibyśmy obliczyć medianę, biorąc pod uwagę dwie środkowe wartości zbioru danych:
[181, 187, 196, 198, 203, 207, 211, 215] # Wybieramy dwie środkowe wartości i dzielimy ich sumę przez 2. median = (198 + 203) / 2 median = 200.5
Tworzenie własnej funkcji obliczającej medianę
Zaimplementujmy powyższą koncepcję w postaci funkcji Pythona.
Przypomnijmy sobie trzy kroki niezbędne do wyznaczenia mediany:
- Posortowanie zbioru danych: można to zrobić za pomocą funkcji `sorted()`.
- Określenie, czy liczba elementów jest parzysta, czy nieparzysta: użyjemy do tego długości zbioru i operatora modulo (%).
- Zwrócenie mediany, w zależności od liczby elementów:
- Nieparzysta: zwracamy środkową wartość.
- Parzysta: zwracamy średnią z dwóch środkowych wartości.
Poniżej przedstawiono implementację funkcji:
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 # Jeśli liczba elementów zbioru jest nieparzysta if len(dataset) % 2 != 0: return data[index] # Jeśli liczba elementów zbioru jest parzysta return (data[index - 1] + data[index]) / 2
Wyświetlmy wyniki dla naszych zbiorów danych:
print(median(pythonic_machines_heights)) print(median(after_retirement))
Otrzymamy:
198 200.5
Zauważmy, że na początku funkcji tworzymy zmienną `data`, która przechowuje posortowaną kopię zbioru danych. Mimo że podane listy są już posortowane, chcemy stworzyć funkcję uniwersalną, która sortuje zbiór danych za każdym razem, gdy jest wywoływana.
Zmienna `index` przechowuje indeks środkowej wartości (lub górnej środkowej wartości) w zbiorze, dzięki zastosowaniu operatora dzielenia całkowitego. Przykładowo, dla listy „pythonic_machine_heights” indeks ten wynosi 4.
Pamiętamy, że w Pythonie indeksy sekwencji zaczynają się od zera. Dlatego dzięki dzieleniu całkowitemu, możemy od razu uzyskać środkowy indeks listy.
Następnie sprawdzamy, czy długość zbioru danych jest nieparzysta, porównując wynik operacji modulo z wartością różną od zera. Jeśli warunek jest spełniony, zwracamy środkowy element, czyli w przypadku listy „pythonic_machine_heights”:
>>> pythonic_machine_heights[4] # 198
W przypadku, gdy zbiór danych ma parzystą liczbę elementów, zwracamy średnią z dwóch środkowych wartości. Zauważ, że `data[index – 1]` daje nam dolny punkt środkowy, a `data[index]` – górny punkt środkowy zbioru danych.
Wykorzystanie funkcji `median()` z modułu statystycznego Pythona
To podejście jest znacznie prostsze, ponieważ korzystamy z gotowej funkcji z modułu statystyk.
Osobiście, jeśli coś jest już zdefiniowane, preferuję to rozwiązanie, kierując się zasadą DRY – Don’t Repeat Yourself (w tym przypadku nie powtarzaj kodu innych).
Mediany dla poprzednich zbiorów danych możemy obliczyć za pomocą poniższego 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))
Otrzymamy:
198 200.5
Obliczanie dominanty w Pythonie
Dominanta, znana również jako moda, to najczęściej występująca wartość w zbiorze danych. Możemy ją porównać do „popularnej” grupy w szkole, która stanowi pewien standard dla reszty uczniów.
Przykładem dominanty może być analiza sprzedaży w sklepie z elektroniką. Dominanta w tym przypadku byłaby najczęściej kupowanym produktem w danym dniu.
['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']
Jak łatwo zauważyć, dominantą powyższego zbioru danych jest „laptop”, ponieważ jest to najczęściej występująca wartość.
Atutem dominanty jest to, że nie musi być ona liczbowa. Możemy pracować z ciągami znaków.
Przeanalizujmy sprzedaż z innego dnia:
['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']
Powyższy zbiór danych ma dwie dominanty: „mysz” i „słuchawki”, ponieważ oba elementy występują dwa razy. Oznacza to, że mamy do czynienia z wielomodalnym zbiorem danych.
Co jeśli w zbiorze danych nie ma dominanty, tak jak w przykładzie poniżej?
['usb', 'camera', 'smartphone', 'laptop', 'TV']
Mówimy wtedy o rozłożeniu równomiernym, co w zasadzie oznacza brak dominanty w zbiorze.
Teraz, gdy masz ogólne pojęcie o dominancie, przejdźmy do jej obliczania w Pythonie.
Tworzenie własnej funkcji obliczającej dominantę
Częstotliwość występowania wartości możemy traktować jako parę klucz-wartość, a więc jako słownik Pythona.
Wracając do naszej analogii z koszykówką, użyjemy dwóch zbiorów danych: punktów zdobytych w meczu i sponsorów zawodników (marki butów).
Aby znaleźć dominantę, najpierw musimy utworzyć słownik częstotliwości, który przypisuje każdej wartości jej liczbę wystąpień w zbiorze. Następnie wyszukamy maksymalną częstotliwość i zwrócimy wszystkie elementy o tej częstotliwości.
Przełóżmy 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
Sprawdźmy wyniki, przekazując dwie listy jako argumenty:
print(mode(points_per_game)) print(mode(sponsorship))
Otrzymamy:
[10] ['nike', 'adidas', 'jordan']
Jak widać, w pierwszym przypadku otrzymaliśmy jedną dominantę, a w drugim – kilka.
Wyjaśnijmy dokładniej działanie kodu:
- Deklarujemy pusty słownik `frequency`, który będzie przechowywał częstotliwość występowania elementów.
- Iterujemy po zbiorze danych, aby utworzyć histogram, czyli zbiór liczników (częstotliwości):
- Jeśli klucz (wartość elementu) znajduje się w słowniku, zwiększamy jego wartość o jeden.
- Jeśli nie, tworzymy nową parę klucz-wartość o wartości 1.
- Zmienna `most_frequent` przechowuje największą wartość (nie klucz) ze słownika `frequency`.
- Zwracamy listę `modes`, która zawiera wszystkie klucze słownika `frequency` o największej częstotliwości.
Zauważ, jak ważne jest odpowiednie nazewnictwo zmiennych, aby kod był czytelny.
Wykorzystanie funkcji `mode()` i `multimode()` z modułu statystycznego Pythona
Moduł statystyk po raz kolejny dostarcza nam szybkie rozwiązanie do wykonania podstawowych operacji statystycznych.
Możemy skorzystać z dwóch funkcji: `mode()` i `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']
Powyższy kod importuje obie funkcje i definiuje zbiory danych, których używaliśmy wcześniej.
Mała różnica: funkcja `mode()` zwraca pierwszy napotkany tryb, natomiast funkcja `multimode()` zwraca listę z najczęściej występującymi wartościami w zbiorze danych.
Można więc powiedzieć, że nasza autorska funkcja implementowała w istocie funkcję `multimode()`.
print(mode(points_per_game)) print(mode(sponsorship))
Otrzymamy:
10 nike
Uwaga: W Pythonie w wersji 3.8 lub nowszej, funkcja `mode()` zwraca pierwszy znaleziony tryb. W starszych wersjach otrzymamy błąd StatisticsError.
Użycie funkcji `multimode()`:
print(multimode(points_per_game)) print(multimode(sponsorship))
Otrzymamy:
[10] ['nike', 'adidas', 'jordan']
Podsumowanie
Gratulacje! Jeśli dotarłeś do tego miejsca, nauczyłeś się, jak obliczać średnią, medianę i dominantę, czyli główne miary tendencji centralnej.
Mimo że możesz definiować własne funkcje do wyznaczania średniej, mediany i dominanty, rekomenduje się korzystanie z modułu statystyk, ponieważ jest on częścią standardowej biblioteki i nie musisz instalować dodatkowych pakietów, aby z niego korzystać.
Następnie zapoznaj się z wprowadzeniem do analizy danych w Pythonie.