Lær å beregne gjennomsnitt, median og modus i Python!

Grunnleggende statistikk: Gjennomsnitt, median og modus i Python

Gjennomsnitt, median og modus er sentrale begreper innen statistikk. Disse kan du enkelt beregne i Python, både med og uten bruk av eksterne biblioteker.

Disse tre målene er de viktigste for å forstå sentraltendens. Sentraltendens hjelper oss med å identifisere de typiske eller vanlige verdiene i et datasett. Hvis du er nybegynner innenfor dataanalyse, er denne veiledningen perfekt for deg.

Etter denne veiledningen vil du kunne:

  • Forstå prinsippene bak gjennomsnitt, median og modus.
  • Utvikle egne funksjoner for å beregne gjennomsnitt, median og modus i Python.
  • Bruke Pythons statistikkmodul for å raskt anvende disse målingene.

Om du ønsker en nedlastbar versjon av disse øvelsene, kan du se GitHub-repositoriet.

La oss utforske de ulike metodene for å beregne gjennomsnitt, median og modus.

Beregning av gjennomsnittet i Python

Gjennomsnittet, også kjent som det aritmetiske gjennomsnittet, er den mest brukte indikatoren for sentraltendens.

Husk at sentraltendens viser en typisk verdi for et sett med data.

Et datasett er en samling av data. I Python kan et datasett være en av de følgende datastrukturene:

  • Lister, tupler og sett: en samling objekter.
  • Strenger: en samling tegn.
  • Ordbøker: en samling av nøkkel-verdi par.

Merk: Selv om det finnes andre datastrukturer i Python, som køer eller stabler, begrenser vi oss til de innebygde her.

Gjennomsnittet beregnes ved å summere alle verdiene i et datasett og deretter dele summen på antall verdier. For eksempel, hvis vi har denne listen med tall:

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

Gjennomsnittet vil være 3.5, ettersom summen av tallene er 21, og det er 6 tall. 21 delt på 6 er 3.5. Du kan se beregningen nedenfor:

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

I denne veiledningen vil vi bruke alderen på spillerne i et basketballag som eksempler.

Egendefinert gjennomsnittsfunksjon

La oss starte med å beregne den gjennomsnittlige alderen til spillerne på basketballaget «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))

La oss se på denne koden:

  • pythonic_machine_ages er en liste med alder til basketballspillerne.
  • Vi definerer en mean() funksjon som returnerer summen av det gitte datasettet delt på lengden.
    • sum() funksjonen gir oss den totale summen av alle verdiene i en itererbar, her en liste. Hvis du sender inn datasettet som argument, returnerer funksjonen 211.
    • len() funksjonen returnerer lengden til en itererbar. Hvis du sender inn datasettet her, får du 8.
  • Vi sender inn alderen til basketballaget til mean() funksjonen og skriver ut resultatet.

Output vil være:

26.375
# Fordi 211 / 8 = 26.375

Dette tallet representerer gjennomsnittsalderen for spillerne på laget. Merk at dette tallet ikke finnes i datasettet, men gir en nøyaktig representasjon av alderen til de fleste spillerne.

Bruk av `mean()` fra Pythons statistikkmodul

Å beregne sentraltendens er en vanlig prosess for mange utviklere. Derfor inneholder Pythons statistikkmodul flere funksjoner for å beregne dette, i tillegg til andre statistiske emner.

Siden denne modulen er en del av Pythons standardbibliotek, trenger du ikke installere noen eksterne pakker med pip.

Slik bruker du modulen:

from statistics import mean

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

print(mean(pythonic_machine_ages))

I koden over trenger du kun å importere mean() funksjonen fra statistikkmodulen og sende inn datasettet som et argument. Dette gir samme resultat som den egendefinerte funksjonen vi laget tidligere:

26.375

Nå har du en klar forståelse av gjennomsnitt. La oss gå videre til median.

Finne medianen i Python

Medianen er den midterste verdien i et sortert datasett. Den brukes for å finne en typisk verdi i en bestemt populasjon.

I programmering defineres medianen som verdien som deler en sekvens i to like store deler – en nedre og en øvre halvdel.

For å beregne medianen, må vi først sortere datasettet. Dette kan vi gjøre med sorteringsalgoritmer, eller med den innebygde funksjonen sorted(). Deretter må vi finne ut om lengden på datasettet er partall eller oddetall. Ut fra dette gjøres følgende:

  • Oddetall: Medianen er den midterste verdien i datasettet.
  • Partall: Medianen er summen av de to midterste verdiene delt på to.

La oss fortsette med basketballaget og regne ut medianhøyden til spillerne i centimeter:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Siden datasettet har et oddetall antall verdier, velger vi den midterste.
median = 198

Som du ser, er lengden på datasettet oddetall, så medianen er den midterste verdien. Men hva ville skje hvis en spiller pensjonerte seg?

Vi må beregne medianen ved å ta de to midterste verdiene i datasettet.

[181, 187, 196, 198, 203, 207, 211, 215]
# Vi velger de to midterste verdiene, og deler dem på 2.
median = (198 + 203) / 2
median = 200.5

Egendefinert medianfunksjon

La oss implementere dette i en Python-funksjon.

Husk de tre stegene vi må følge:

  • Sorter datasettet: Dette kan vi gjøre med sorted() funksjonen.
  • Finn ut om datasettet har partall eller oddetall lengde: Dette kan vi gjøre ved å hente lengden på datasettet, og bruke modulo-operatoren (%).
  • Returner medianen basert på utfallet:
    • Oddetall: Returner den midterste verdien.
    • Partall: Returner gjennomsnittet av de to midterste verdiene.

Resultatet vil være følgende funksjon:

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

    # Hvis datasettet har et oddetall antall verdier.
    if len(dataset) % 2 != 0:
        return data[index]

    # Hvis datasettet har et partall antall verdier.
    return (data[index - 1] + data[index]) / 2

La oss se på resultatet:

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

Output:

198
200.5

Merk at vi oppretter en variabel data som peker til den sorterte databasen i starten av funksjonen. Selv om listene over er sortert, ønsker vi å lage en gjenbrukbar funksjon, og sorterer derfor datasettet hver gang funksjonen kalles.

Index lagrer den midterste verdien – eller den øvre midterste verdien – i datasettet, med heltallsdivisjonsoperatoren. Hvis vi for eksempel sender inn pythonic_machine_heights, vil index være 4.

Husk at indekser i Python-sekvenser starter på null, derfor kan vi returnere den midterste indeksen i en liste med en heltallsdivisjon.

Deretter sjekker vi om lengden på datasettet er et oddetall, ved å sammenligne resultatet av modulo-operasjonen med en verdi som ikke er null. Hvis dette stemmer, returnerer vi den midterste verdien, for eksempel pythonic_machine_heights:

>>> pythonic_machine_heights[4]
# 198

Om datasettet er partall, returnerer vi summen av de to midterste verdiene delt på to. data[index - 1] gir oss den nedre midterste verdien i datasettet, mens data[index] gir oss den øvre.

Bruk av `median()` fra Pythons statistikkmodul

Denne måten er enklere, da vi bruker en ferdig funksjon fra statistikkmodulen.

Personlig ville jeg ha brukt en ferdig funksjon dersom den finnes, ut fra DRY – ikke gjenta deg selv – prinsippet (i dette tilfellet, ikke gjenta andres kode).

Du kan regne ut medianen for de tidligere datasett med følgende kode:

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

Output:

198
200.5

Beregning av modus i Python

Modus er den verdien som forekommer oftest i et datasett. Det kan sees på som den «populære» gruppen i en skole, og representerer en standard for alle studentene.

Et eksempel på modus kan være det daglige salget i en teknologibutikk. Modusen i dette datasettet vil være det mest solgte produktet den dagen.

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

Som du forstår er modusen for datasettet over «laptop», da denne verdien forekommer oftest i listen.

Det fine med modus er at datasettet ikke trenger å være numerisk. Vi kan for eksempel jobbe med strenger.

La oss analysere salget for en annen dag:

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

Datasettet over har to moduser: «mus» og «hodetelefoner», da begge har en frekvens på to. Dette betyr at vi har et multimodalt datasett.

Hva om vi ikke finner en modus i et datasett, som her:

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

Dette kalles en uniform fordeling, og betyr at det ikke finnes en modus i datasettet.

Nå har du en god forståelse av modus. La oss beregne det i Python.

Egendefinert modusfunksjon

Vi kan tenke på frekvensen til en verdi som et nøkkel-verdi par, altså en Python ordbok.

For å hente frem basketball-analogien igjen, kan vi bruke to datasett: poeng per kamp og sponsorer for noen av spillerne.

For å finne modusen må vi først lage en frekvensordbok for hver av verdiene i datasettet. Deretter må vi finne den maksimale frekvensen, og returnere alle elementene med den frekvensen.

La oss oversette dette til kode:

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

La oss sjekke resultatet ved å sende inn de to listene som argumenter:

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

Output:

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

Som du ser, ga den første print-uttalelsen oss én modus, mens den andre returnerte flere.

En nærmere forklaring av koden:

  • Vi deklarerer en frekvensordbok.
  • Vi itererer over datasettet for å lage et histogram – det statistiske begrepet for et sett med tellere (eller frekvenser).
    • Hvis nøkkelen finnes i ordboken, legges en til verdien.
    • Hvis den ikke finnes, oppretter vi et nøkkel-verdi par med en verdi på en.
  • Variabelen most_frequent lagrer – ironisk nok – den største verdien i frekvensordboken (ikke nøkkelen).
  • Vi returnerer modes som inneholder alle nøklene i frekvensordboken med høyest frekvens.

Merk hvor viktig variabelnavn er for å skrive lesbar kode.

Bruk av `mode()` og `multimode()` fra Pythons statistikkmodul

Statistikkmodulen gir oss igjen en rask måte å utføre grunnleggende statistikkoperasjoner på.

Vi kan bruke to funksjoner: `mode()` og `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']

Koden over importerer begge funksjonene og definerer datasettet vi har jobbet med.

Her kommer den lille forskjellen: `mode()`-funksjonen returnerer den første modusen den finner, mens `multimode()` returnerer en liste med alle de mest frekvente verdiene i datasettet.

Vi kan derfor si at den egendefinerte funksjonen vi laget egentlig er en multimode()-funksjon.

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

Output:

10
nike

Merk: I Python 3.8 eller nyere returnerer `mode()` funksjonen den første modusen den finner. Om du har en eldre versjon, får du en StatisticsError.

Bruk av `multimode()`-funksjonen:

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

Output:

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

Oppsummering

Gratulerer! Hvis du har fulgt så langt, har du lært hvordan du regner ut gjennomsnitt, median og modus, de viktigste målingene for sentraltendens.

Selv om du kan lage egne funksjoner for å finne gjennomsnitt, median og modus, er det anbefalt å bruke statistikkmodulen, da den er en del av standardbiblioteket, og du slipper å installere noe før du kan begynne å bruke den.

Neste steg er å lese en vennlig introduksjon til dataanalyse i Python.