Hvordan finne gjennomsnitt, median og modus i Python?

Gjennomsnitt, median og modus er grunnleggende emner for statistikk. Du kan enkelt beregne dem i Python, med og uten bruk av eksterne biblioteker.

Disse tre er hovedmålene på sentral tendens. Den sentrale tendensen lar oss vite de «normale» eller «gjennomsnittlige» verdiene til et datasett. Hvis du nettopp har startet med datavitenskap, er dette den rette opplæringen for deg.

Ved slutten av denne opplæringen vil du:

  • Forstå begrepet gjennomsnitt, median og modus
  • Kunne lage dine egne gjennomsnitts-, median- og modusfunksjoner i Python
  • Benytt Pythons statistikkmodul for å hurtigstarte bruken av disse målingene

Hvis du vil ha en nedlastbar versjon av følgende øvelser, sjekk gjerne ut GitHub-depot.

La oss komme inn på de forskjellige måtene å beregne gjennomsnitt, median og modus.

Beregning av gjennomsnittet i Python

De mener eller aritmetisk gjennomsnitt er det mest brukte målet på sentral tendens.

Husk at sentral tendens er en typisk verdi for et sett med data.

Et datasett er en samling av data, derfor kan et datasett i Python være en av følgende innebygde datastrukturer:

  • Lister, tupler og sett: en samling av gjenstander
  • Strenger: en samling karakterer
  • Ordbok: en samling nøkkelverdi-par

Merk: Selv om det er andre datastrukturer i Python som køer eller stabler, vil vi bare bruke de innebygde.

Vi kan beregne gjennomsnittet ved å legge til alle verdiene til et datasett og dele resultatet på antall verdier. For eksempel, hvis vi har følgende liste over tall:

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

Gjennomsnittet eller gjennomsnittet vil være 3,5 fordi summen av listen er 21 og lengden er 6. Enogtyve delt på seks er 3,5. Du kan utføre denne beregningen med beregningen nedenfor:

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

I denne opplæringen vil vi bruke spillerne til et basketballag som prøvedata.

Opprette en egendefinert gjennomsnittsfunksjon

La oss starte med å beregne gjennomsnittlig (gjennomsnittlig) alder for spillerne i et basketballag. Lagets navn vil være «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))

Å bryte ned denne koden:

  • «pythonic_machine_ages» er en liste med alderen til basketballspillere
  • Vi definerer en mean() funksjon som returnerer summen av det gitte datasettet delt på lengden
    • Sum()-funksjonen returnerer den totale summen (ironisk nok) av verdiene til en iterabel, i dette tilfellet en liste. Prøv å sende datasettet som et argument, det vil returnere 211
    • len()-funksjonen returnerer lengden på en iterabel, hvis du sender datasettet til det får du 8
  • Vi overfører basketballagaldrene til funksjonen mean() og skriver ut resultatet.
  Slik deler du batteri på iPhone

Hvis du sjekker utdataene, får du:

26.375
# Because 211 / 8 = 26.375

Denne utgangen representerer gjennomsnittsalderen til spillerne i basketballlaget. Legg merke til hvordan tallet ikke vises i datasettet, men beskriver nøyaktig alderen til de fleste spillere.

Bruke mean() fra Python Statistic Module

Å beregne mål på sentral tendens er en vanlig operasjon for de fleste utviklere. Det er fordi Pythons statistikk modulen gir forskjellige funksjoner for å beregne dem, sammen med andre grunnleggende statistikkemner.

Siden det er en del av Python standardbibliotek du trenger ikke å installere noen ekstern pakke med PIP.

Slik bruker du denne modulen:

from statistics import mean

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

print(mean(pythonic_machine_ages))

I koden ovenfor trenger du bare å importere mean()-funksjonen fra statistikkmodulen og sende datasettet til det som et argument. Dette vil returnere det samme resultatet som den tilpassede funksjonen vi definerte i forrige del:

26.375

Nå har du krystallklart begrepet gjennomsnitt, la oss fortsette med medianmålingen.

Finne medianen i Python

De median er den midterste verdien av et sortert datasett. Det brukes – igjen – for å gi en «typisk» verdi av en bestemt befolkning.

I programmering kan vi definere medianen som verdien som skiller en sekvens i to deler — Den nedre halvdelen og den høyere halvdelen —.

For å beregne medianen må vi først sortere datasettet. Vi kan gjøre dette med sorteringsalgoritmer eller bruke den innebygde funksjonen sorted(). Det andre trinnet er å bestemme om datasettlengden er oddetall eller partall. Avhengig av dette er noen av følgende prosesser:

  • Odd: Medianen er den midterste verdien av datasettet
  • Even: Medianen er summen av de to midterste verdiene delt på to

La oss fortsette med vårt basketballlagsdatasett, og la oss beregne spillernes medianhøyde i centimeter:

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

Som du kan se, siden datasettlengden er oddetall, kan vi ta middelverdien som medianen. Men hva ville skje hvis en spiller nettopp ble pensjonert?

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

[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

Opprette en egendefinert medianfunksjon

La oss implementere konseptet ovenfor i en Python-funksjon.

Husk de tre trinnene vi må følge for å få medianen til et datasett:

  • Sorter datasettet: Vi kan gjøre dette med funksjonen sorted().
  • Bestem om det er oddetall eller partall: Vi kan gjøre dette ved å hente lengden på datasettet og bruke modulo-operatoren (%)
  • Returner medianen basert på hvert tilfelle:
    • Odd: Returner den midterste verdien
    • Even: Returner gjennomsnittet av de to midterste verdiene

Det vil resultere i 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
    
    # 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

Skrive ut resultatet av våre datasett:

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

Produksjon:

198
200.5

Legg merke til hvordan vi lager en datavariabel som peker til den sorterte databasen i starten av funksjonen. Selv om listene ovenfor er sortert, ønsker vi å lage en gjenbrukbar funksjon, og derfor sorterer datasettet hver gang funksjonen påkalles.

  Hvordan laste ned tekstmeldinger fra iPhone

Indeksen lagrer den midterste verdien – eller den øvre midterste verdien – av datasettet, ved å bruke heltallsdivisjonsoperatoren. For eksempel, hvis vi passerte «pythonic_machine_heights»-listen, ville den ha verdien 4.

Husk at i Python-sekvensen starter indeksene på null, det er fordi vi er i stand til å returnere den midterste indeksen til en liste, med en heltallsdivisjon.

Deretter sjekker vi om lengden på datasettet er oddetall ved å sammenligne resultatet av modulo-operasjonen med en hvilken som helst verdi som ikke er null. Hvis betingelsen er sann, returnerer vi det midterste elementet, for eksempel med «pythonic_machine_heights»-listen:

>>> pythonic_machine_heights[4]
# 198

På den annen side, hvis datasettet er jevnt, returnerer vi summen av de midterste verdiene delt på to. Merk at data[index -1] gir oss det nedre midtpunktet av datasettet, mens data[index] forsyner oss med det øvre midtpunktet.

Bruke median() fra Python Statistic Module

Denne måten er mye enklere fordi vi bruker en allerede eksisterende funksjon fra statistikkmodulen.

Personlig, hvis det er noe allerede definert for meg, ville jeg brukt det på grunn av DRY —Ikke gjenta deg selv — prinsippet (i dette tilfellet, ikke gjenta andres kode).

Du kan beregne medianen til de tidligere datasettene 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))

Produksjon:

198
200.5

Beregning av modusen i Python

De modus er den hyppigste verdien i datasettet. Vi kan tenke på det som den «populære» gruppen på en skole, som kan representere en standard for alle elevene.

Et eksempel på modus kan være det daglige salget til en teknologibutikk. Modusen til det datasettet vil være det mest solgte produktet på en bestemt dag.

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

Som du kan forstå, er modusen for datasettet ovenfor «bærbar» fordi det var den hyppigste verdien i listen.

Det kule med modus er at datasettet ikke må være numerisk. For eksempel kan vi jobbe med strenger.

La oss analysere salget for en annen dag:

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

Datasettet ovenfor har to moduser: «mus» og «hodetelefoner» fordi begge har en frekvens på to. Dette betyr at det er en multimodal datasett.

Hva om vi ikke finner modusen i et datasett, som det nedenfor?

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

Dette kalles en uniform distribusjoni utgangspunktet betyr det at det ikke er noen modus i datasettet.

  Hvordan ta opp lyd på iPhone og iPad

Nå har du et raskt grep om konseptet med modus, la oss beregne det i Python.

Opprette en egendefinert modusfunksjon

Vi kan tenke på frekvensen til en verdi som et nøkkelverdi-par, med andre ord en Python-ordbok.

Ved å rekapitulere basketball-analogien kan vi bruke to datasett til å jobbe med: Poengene per kamp og sponsingen av noen spillere.

For å finne modusen først må vi lage en frekvensordbok med hver av verdiene som er tilstede i datasettet, deretter hente 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

Kontrollerer resultatet ved å sende de to listene som argumenter:

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

Produksjon:

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

Som du kan se, ga den første utskriftserklæringen oss en enkelt modus, mens den andre returnerte flere moduser.

Forklarer dypere koden ovenfor:

  • Vi erklærer en frekvensordbok
  • Vi itererer over datasettet for å lage en histogram – den statistiske betegnelsen for et sett med tellere (eller frekvenser) –
    • Hvis nøkkelen finnes i ordboken, legger den en til verdien
    • Hvis det ikke blir funnet, oppretter vi et nøkkel-verdi-par med en verdi på én
  • Den mest_frequente variabelen lagrer – ironisk nok – den største verdien (ikke nøkkel) i frekvensordboken
  • Vi returnerer modusvariabelen som består av alle nøklene i frekvensordboken med mest frekvens.

Legg merke til hvor viktig variabelnavn er for å skrive lesbar kode.

Bruke mode() og multimode() fra Python Statistic Module

Nok en gang gir statistikkmodulen oss en rask måte å utføre grunnleggende statistikkoperasjoner på.

Vi kan bruke to funksjoner: modus() 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 ovenfor importerer begge funksjonene og definerer datasettene vi har jobbet med.

Her kommer den lille forskjellen: Mode()-funksjonen returnerer den første modusen den møter, mens multimode() returnerer en liste med de hyppigste verdiene i datasettet.

Følgelig kan vi si at den tilpassede funksjonen vi definerte faktisk er en multimode() funksjon.

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

Produksjon:

10
nike

Merk: I Python 3.8 eller nyere returnerer mode()-funksjonen den første modusen den fant. Hvis du har en eldre versjon, får du en Statistikkfeil.

Bruke multimode() funksjonen:

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

Produksjon:

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

Å oppsummere

Gratulerer! Hvis du fulgte så langt, lærte du hvordan du beregner gjennomsnitt, median og modus, de viktigste sentrale tendensmålingene.

Selv om du kan definere dine egendefinerte funksjoner for å finne gjennomsnitt, median og modus, anbefales det å bruke statistikkmodulen, siden den er en del av standardbiblioteket og du ikke trenger å installere noe for å begynne å bruke den.

Les deretter en vennlig introduksjon til dataanalyse i Python.