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.