Како пронаћи средњу вредност, медијану и мод у Питхон-у?

Aritmetička sredina, medijana i modus su temeljne statističke mere. U Pythonu ih možete izračunati jednostavno, koristeći ili ne koristeći spoljne biblioteke.

Ove tri mere su ključne za razumevanje centralne tendencije. Centralna tendencija nam pomaže da identifikujemo „tipične“ ili „prosečne“ vrednosti u skupu podataka. Ako tek počinjete sa naukom o podacima, ovaj vodič je savršen za vas.

Po završetku ovog vodiča:

  • Razumećete koncepte aritmetičke sredine, medijane i modusa.
  • Moći ćete sami da kreirate funkcije za izračunavanje aritmetičke sredine, medijane i modusa u Pythonu.
  • Iskoristićete Pythonov statistički modul kako biste brzo primenili ova merenja.

Ako želite preuzeti verziju vežbi, pogledajte GitHub repozitorijum.

Pogledajmo različite načine izračunavanja aritmetičke sredine, medijane i modusa.

Izračunavanje aritmetičke sredine u Pythonu

Aritmetička sredina, ili prosečna vrednost, najčešće je korišćena mera centralne tendencije.

Podsetimo se, centralna tendencija predstavlja tipičnu vrednost u skupu podataka.

Skup podataka je kolekcija podataka, i u Pythonu, skup podataka može biti bilo koja od sledećih ugrađenih struktura:

  • Liste, torke i skupovi: kolekcije objekata.
  • Stringovi: kolekcije karaktera.
  • Rečnici: kolekcije parova ključ/vrednost.

Napomena: Iako postoje druge strukture podataka u Pythonu, kao što su redovi ili stekovi, mi ćemo se fokusirati samo na ugrađene.

Aritmetičku sredinu izračunavamo sabiranjem svih vrednosti u skupu podataka, a zatim delimo taj zbir brojem vrednosti. Na primer, ako imamo sledeću listu brojeva:

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

Aritmetička sredina, ili prosek, biće 3.5, jer je zbir elemenata liste 21, a dužina liste je 6. Dvadeset i jedan podeljeno sa šest daje 3.5. Ovaj proračun možete videti ovde:

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

U ovom tutorijalu koristićemo košarkaše kao naš uzorak podataka.

Kreiranje sopstvene funkcije za aritmetičku sredinu

Počnimo sa izračunavanjem prosečne (aritmetičke sredine) starosti košarkaša tima. Ime tima će biti „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))

Razlaganje koda:

  • `pythonic_machine_ages` je lista sa godinama košarkaša.
  • Definišemo funkciju `mean()` koja vraća zbir svih elemenata prosleđenog skupa podataka, podeljen sa dužinom tog skupa.
    • Funkcija `sum()` vraća ukupan zbir vrednosti u iterabilnom objektu, u ovom slučaju liste. Kada joj prosledite skup podataka, vratiće 211.
    • Funkcija `len()` vraća dužinu iterabilnog objekta. Ako joj prosledite skup podataka, vratiće 8.
  • Prosleđujemo starosti košarkaškog tima funkciji `mean()` i štampamo rezultat.

Kada proverite izlaz, dobićete:

26.375
# Jer 211 / 8 = 26.375

Ovaj rezultat predstavlja prosečnu starost košarkaša. Važno je primetiti da se ova brojka ne pojavljuje u samom skupu podataka, ali precizno opisuje tipičnu starost igrača.

Korišćenje funkcije mean() iz Pythonovog statističkog modula

Izračunavanje mera centralne tendencije je uobičajena operacija za većinu programera. Zato Pythonov statistički modul nudi razne funkcije za njihovo izračunavanje, kao i za druge osnove statistike.

Pošto je ovaj modul deo Pythonove standardne biblioteke, ne morate instalirati nikakve spoljne pakete pomoću pip-a.

Evo kako koristiti ovaj modul:

from statistics import mean

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

print(mean(pythonic_machine_ages))

U gornjem kodu, samo treba da importujete funkciju `mean()` iz modula `statistics` i prosledite joj skup podataka kao argument. Ovo će vratiti isti rezultat kao i naša sopstvena funkcija koju smo definisali u prethodnom odeljku:

26.375

Sada vam je jasan koncept aritmetičke sredine, idemo dalje na merenje medijane.

Pronalaženje medijane u Pythonu

Medijana je središnja vrednost sortiranog skupa podataka. Koristi se – ponovo – za davanje „tipičnih“ vrednosti određene populacije.

U programiranju, medijanu možemo definisati kao vrednost koja deli niz podataka na dva dela – donju i gornju polovinu.

Da bismo izračunali medijanu, prvo moramo sortirati skup podataka. To možemo uraditi pomoću algoritama za sortiranje ili korišćenjem ugrađene funkcije `sorted()`. Drugi korak je utvrđivanje da li je dužina skupa podataka neparna ili parna. Zavisno od toga, sledi jedan od ova dva postupka:

  • Neparan broj: Medijana je srednja vrednost skupa podataka.
  • Paran broj: Medijana je zbir dve srednje vrednosti podeljen sa dva.

Nastavljajući sa našim skupom podataka košarkaškog tima, izračunajmo medijanu visine igrača u centimetrima:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Pošto je dužina skupa podataka neparna, biramo srednju vrednost
median = 198

Kao što vidite, pošto je dužina skupa podataka neparna, možemo uzeti srednju vrednost kao medijanu. Međutim, šta bi se desilo kada bi se igrač upravo penzionisao?

Trebalo bi da izračunamo medijanu uzimajući dve srednje vrednosti skupa podataka.

[181, 187, 196, 198, 203, 207, 211, 215] 
# Biramo dve srednje vrednosti i delimo ih sa 2
median = (198 + 203) / 2
median = 200.5

Kreiranje sopstvene funkcije za medijanu

Implementirajmo gornji koncept u Python funkciju.

Podsetimo se tri koraka koja treba pratiti da bismo dobili medijanu skupa podataka:

  • Sortiraj skup podataka: To možemo uraditi pomoću funkcije `sorted()`.
  • Odrediti da li je broj elemenata neparan ili paran: To možemo uraditi dobijanjem dužine skupa podataka i korišćenjem modulo operatora (%).
  • Vratiti medijanu na osnovu svakog slučaja:
    • Neparan broj: Vratiti srednju vrednost.
    • Paran broj: Vratiti prosek dve srednje vrednosti.

Ovo bi rezultiralo sledećom funkcijom:

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
    
    # Ako je dužina skupa podataka neparna
    if len(dataset) % 2 != 0:
        return data[index]
    
    # Ako je dužina skupa podataka parna
    return (data[index - 1] + data[index]) / 2

Štampanje rezultata za naše skupove podataka:

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

Izlaz:

198
200.5

Obratite pažnju kako kreiramo promenljivu `data` koja pokazuje na sortiranu kopiju skupa podataka na početku funkcije. Iako su gornje liste već sortirane, želimo da napravimo funkciju koja se može ponovo koristiti, pa sortiramo skup podataka svaki put kada se funkcija pozove.

`Index` čuva srednju poziciju – ili gornju srednju poziciju – skupa podataka, koristeći operator celobrojnog deljenja. Na primer, ako bismo prosledili listu `pythonic_machine_heights`, njena vrednost bi bila 4.

Zapamtite da indeksi u Python sekvencama počinju od nule, i zato smo u mogućnosti da vratimo srednji indeks liste koristeći celobrojno deljenje.

Zatim proveravamo da li je dužina skupa podataka neparna poređenjem rezultata modulo operacije sa bilo kojom vrednošću koja nije nula. Ako je uslov tačan, vraćamo srednji element, na primer, sa listom `pythonic_machine_heights`:

>>> pythonic_machine_heights[4]
# 198

S druge strane, ako je skup podataka paran, vraćamo zbir srednjih vrednosti podeljen sa dva. Imajte na umu da `data[index -1]` nam daje donju srednju tačku skupa podataka, dok `data[index]` pruža gornju srednju tačku.

Korišćenje funkcije median() iz Pythonovog statističkog modula

Ovaj način je mnogo jednostavniji, jer koristimo već postojeću funkciju iz statističkog modula.

Lično, ako nešto već postoji, koristim ga zbog DRY – Don’t Repeat Yourself – principa (u ovom slučaju, ne ponavljam tuđi kod).

Medijanu prethodnih skupova podataka možete izračunati pomoću sledećeg koda:

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

Izlaz:

198
200.5

Izračunavanje modusa u Pythonu

Modus je najčešća vrednost u skupu podataka. Možemo ga zamisliti kao „popularnu“ grupu u školi, koja može predstavljati standard za sve učenike.

Primer modusa može biti dnevna prodaja u prodavnici tehnike. Modus tog skupa podataka bi bio najprodavaniji proizvod tog dana.

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

Kao što vidite, modus gornjeg skupa podataka je `laptop`, jer je to najčešća vrednost na listi.

Dobra stvar kod modusa je što skup podataka ne mora biti numerički. Na primer, možemo raditi sa stringovima.

Analizirajmo prodaju drugog dana:

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

Gornji skup podataka ima dva modusa: `mouse` i `headphones`, jer oba imaju frekvenciju od dva. Ovo znači da je to multimodalni skup podataka.

Šta ako ne možemo da pronađemo modus u skupu podataka, kao u ovom slučaju:

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

Ovo se zove uniformna distribucija. U osnovi, to znači da u skupu podataka nema modusa.

Sada imate brzo razumevanje koncepta modusa, hajde da ga izračunamo u Pythonu.

Kreiranje sopstvene funkcije za modus

Frekvenciju vrednosti možemo zamisliti kao par ključ-vrednost, drugim rečima, Python rečnik.

Vraćajući se na košarkašku analogiju, možemo koristiti dva skupa podataka za rad: broj postignutih poena po utakmici i sponzorstva patika nekih igrača.

Da bismo pronašli modus, prvo moramo kreirati rečnik frekvencija sa svakom vrednošću prisutnom u skupu podataka, zatim dobijemo maksimalnu frekvenciju i vratimo sve elemente sa tom frekvencijom.

Prevedimo ovo u 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

Provera rezultata prosleđivanjem dve liste kao argumenata:

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

Izlaz:

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

Kao što vidite, prva `print` izjava nam je dala jedan modus, dok je druga vratila više modusa.

Detaljnije objašnjenje koda iznad:

  • Deklarišemo rečnik frekvencija.
  • Iteriramo skup podataka da bismo kreirali histogram – statistički izraz za skup brojača (ili frekvencija) –
    • Ako se ključ pronađe u rečniku, na njegovu vrednost se dodaje jedan.
    • Ako nije pronađen, kreiramo par ključ/vrednost sa vrednošću jedan.
  • Promenljiva `most_frequent` čuva – ironično – najveću vrednost (ne ključ) rečnika frekvencija.
  • Vraćamo promenljivu `modes` koja se sastoji od svih ključeva u rečniku frekvencija sa najvećom frekvencijom.

Obratite pažnju koliko je važno davanje imena promenljivim za pisanje čitljivog koda.

Korišćenje funkcija mode() i multimode() iz Pythonovog statističkog modula

Još jednom, modul `statistics` nam pruža brz način za izvođenje osnovnih statističkih operacija.

Možemo koristiti dve funkcije: `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']

Gornji kod importuje obe funkcije i definiše skupove podataka sa kojima smo radili.

Evo male razlike: funkcija `mode()` vraća prvi modus na koji naiđe, dok `multimode()` vraća listu sa najčešćim vrednostima u skupu podataka.

Shodno tome, možemo reći da je prilagođena funkcija koju smo definisali zapravo funkcija `multimode()`.

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

Izlaz:

10
nike

Napomena: U Pythonu 3.8 ili novijim, funkcija `mode()` vraća prvi način na koji naiđe. Ako imate stariju verziju, dobićete `StatisticsError`.

Korišćenje funkcije `multimode()`:

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

Izlaz:

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

Da sumiramo

Čestitam! Ako ste pratili do sada, naučili ste kako da izračunate aritmetičku sredinu, medijanu i modus, glavne mere centralne tendencije.

Iako možete definisati sopstvene funkcije za pronalaženje aritmetičke sredine, medijane i modusa, preporučuje se da koristite modul `statistics`, pošto je on deo standardne biblioteke i ne morate ništa da instalirate da biste počeli da ga koristite.

Zatim pročitajte prijateljski uvod u analizu podataka u Pythonu.