Hur hittar man medelvärde, median och läge i Python?

By rik

Grundläggande statistik i Python: Medelvärde, median och typvärde

Att beräkna medelvärde, median och typvärde är fundamentalt inom statistiken. Dessa beräkningar kan utföras enkelt i Python, både med och utan externa bibliotek.

Dessa tre mått utgör kärnan i centraltendens. Centraltendensen ger oss insikt i de ”vanliga” eller ”genomsnittliga” värdena inom en datamängd. Om du är nybörjare inom dataområdet, är den här guiden för dig.

Efter att ha läst den här guiden kommer du att:

  • Förstå koncepten bakom medelvärde, median och typvärde.
  • Kunna skapa egna funktioner för att beräkna medelvärde, median och typvärde i Python.
  • Kunna använda Pythons statistikmodul för att snabbt tillämpa dessa beräkningar.

Om du vill ladda ner de övningar vi kommer att gå igenom, kan du hitta dem i detta GitHub-arkiv.

Låt oss nu utforska olika metoder för att beräkna medelvärde, median och typvärde.

Beräkna medelvärdet i Python

Medelvärdet, eller det aritmetiska medelvärdet, är det mest använda måttet för central tendens.

Kom ihåg att central tendens representerar ett typiskt värde för en datamängd.

En datamängd är en samling av data, och i Python kan den representeras med olika inbyggda datastrukturer, såsom:

  • Listor, tupler och mängder: Samlingar av objekt
  • Strängar: Samlingar av tecken
  • Ordböcker: Samlingar av nyckel-värdepar

Obs: Även om det finns andra datastrukturer som köer och stackar, kommer vi att fokusera på de inbyggda i Python.

Medelvärdet beräknas genom att addera alla värden i en datamängd och sedan dividera summan med antalet värden. Till exempel, om vi har följande lista med nummer:

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

Medelvärdet skulle vara 3,5 eftersom summan av listan är 21 och antalet element är 6. 21 dividerat med 6 är 3,5. Denna beräkning kan illustreras på följande sätt:

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

I den här guiden kommer vi att använda åldern på spelare i ett basketlag som exempel.

Skapa en egen medelvärdesfunktion

Låt oss börja med att beräkna medelåldern för spelarna i basketlaget ”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))

En genomgång av koden:

  • `pythonic_machine_ages` är en lista med åldrar på basketspelare.
  • Vi definierar en funktion `mean()` som returnerar summan av alla värden i datamängden dividerat med antalet värden.
    • Funktionen `sum()` returnerar den totala summan av värdena i en iterabel (i detta fall en lista). Om vi använder `pythonic_machine_ages` som argument, blir resultatet 211.
    • Funktionen `len()` returnerar antalet element i en iterabel. Om vi använder `pythonic_machine_ages` som argument, blir resultatet 8.
  • Vi skickar listan med basketspelarnas åldrar till funktionen `mean()` och skriver ut resultatet.

Resultatet av körningen är:

26.375
# Eftersom 211 / 8 = 26.375

Detta resultat visar medelåldern för basketlagets spelare. Observera att detta värde inte nödvändigtvis finns i själva datamängden, men ger en bra indikation på åldern för de flesta spelare.

Använda `mean()` från Pythons statistikmodul

Att beräkna mått på central tendens är en vanlig uppgift. Därför tillhandahåller Pythons statistikmodul olika funktioner för att utföra dessa beräkningar, tillsammans med andra grundläggande statistiska beräkningar.

Eftersom modulen ingår i Pythons standardbibliotek, behöver du inte installera något extra med PIP.

Så här använder du modulen:

from statistics import mean

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

print(mean(pythonic_machine_ages))

I ovanstående kod behöver du bara importera funktionen `mean()` från statistikmodulen och skicka datamängden som argument. Detta kommer att ge samma resultat som vår egen definierade funktion:

26.375

Nu har du en klar förståelse för medelvärde. Låt oss nu titta på medianen.

Hitta medianen i Python

Medianen är det mittersta värdet i en sorterad datamängd. Den används för att ge ett ”typiskt” värde för en given population.

Inom programmering kan vi definiera medianen som det värde som delar en sekvens i två delar – den nedre halvan och den övre halvan.

För att beräkna medianen måste vi först sortera datamängden. Vi kan använda sorteringsalgoritmer eller den inbyggda funktionen `sorted()`. Sedan avgör vi om datamängdens längd är udda eller jämn. Beroende på detta appliceras något av följande:

  • Udda: Medianen är det mellersta värdet i datamängden.
  • Jämn: Medianen är summan av de två mittersta värdena dividerat med två.

Vi fortsätter med vårt basketlag och beräknar medianlängden hos spelarna i centimeter:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Eftersom datamängden är udda, väljer vi det mittersta värdet
median = 198

Eftersom längden på datamängden är udda, kan vi ta det mittersta värdet som median. Men vad händer om en spelare nyligen gått i pension?

Då skulle vi behöva beräkna medianen med de två mittersta värdena i datamängden:

[181, 187, 196, 198, 203, 207, 211, 215] 
# Vi väljer de två mittersta värdena och delar summan med 2
median = (198 + 203) / 2
median = 200.5

Skapa en egen medianfunktion

Låt oss implementera ovanstående koncept i en Python-funktion.

Kom ihåg att vi behöver följa dessa steg för att beräkna medianen:

  • Sortera datamängden: Detta kan vi göra med funktionen `sorted()`.
  • Bestäm om datamängden är udda eller jämn: Vi kan använda längden på datamängden och modulooperatorn (`%`).
  • Returnera medianen beroende på fallet:
    • Udda: Returnera mittvärdet.
    • Jämn: Returnera medelvärdet av de två mittersta värdena.

Detta resulterar i följande funktion:

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
    
    # Om datamängden är udda  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # Om datamängden är jämn
    return (data[index - 1] + data[index]) / 2

Vi skriver ut resultatet för våra datamängder:

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

Resultat:

198
200.5

Observera att vi skapar en `data`-variabel som refererar till den sorterade datamängden i början av funktionen. Även om listorna ovan redan är sorterade, vill vi skapa en återanvändbar funktion, så därför sorterar vi datamängden varje gång funktionen anropas.

Variabeln `index` lagrar det mittersta värdet (eller det övre mittersta värdet) i datamängden genom att använda heltalsdivision. Om vi exempelvis skickar listan `pythonic_machine_heights` kommer den att få värdet 4.

Kom ihåg att index i Python börjar på noll. Därför kan vi returnera det mittersta indexet i en lista med hjälp av heltalsdivision.

Sedan kontrollerar vi om längden på datamängden är udda genom att jämföra resultatet av modulo-operationen med ett värde som inte är noll. Om villkoret är sant, returnerar vi det mittersta elementet, till exempel med listan `pythonic_machine_heights`:

>>> pythonic_machine_heights[4]
# 198

Om datamängden istället är jämn returnerar vi summan av de mittersta värdena dividerat med två. Observera att `data[index -1]` ger oss det nedre mittersta värdet, medan `data[index]` ger oss det övre mittersta värdet.

Använda `median()` från Pythons statistikmodul

Detta tillvägagångssätt är mycket enklare eftersom vi använder en färdig funktion från statistikmodulen.

Personligen föredrar jag att använda färdiga funktioner, i enlighet med principen DRY – Don’t Repeat Yourself (i det här fallet, upprepa inte andras kod).

Du kan beräkna medianen för de tidigare datamängderna med följande kod:

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

Resultat:

198
200.5

Beräkna typvärdet i Python

Typvärdet är det vanligaste värdet i en datamängd. Vi kan se det som den ”populära” gruppen i en skola, vilket kan representera ett genomsnitt för alla elever.

Ett exempel på typvärde kan vara den dagliga försäljningen i en elektronikaffär. Typvärdet för en sådan datamängd skulle vara den mest sålda produkten under en viss dag.

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

Som du ser är typvärdet för ovanstående datamängd ”laptop” eftersom det är det vanligaste värdet i listan.

Det intressanta med typvärdet är att datamängden inte behöver vara numerisk. Vi kan exempelvis använda strängar.

Låt oss analysera försäljningen från en annan dag:

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

Ovanstående datamängd har två typvärden: ”mouse” och ”headphones” eftersom båda har frekvensen två. Detta betyder att datamängden är multimodal.

Vad händer om vi inte hittar något typvärde i en datamängd, som den nedan?

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

Detta kallas en likformig fördelning, vilket i grund och botten betyder att det inte finns något typvärde i datamängden.

Nu har du en grundläggande förståelse för typvärde. Låt oss se hur vi kan beräkna det i Python.

Skapa en egen funktion

Vi kan se frekvensen av ett värde som ett nyckel-värdepar, med andra ord, en Python-ordbok.

Om vi återgår till basketexemplet kan vi använda två datamängder: Poäng per match och sponsorskap för vissa spelare.

För att hitta typvärdet behöver vi först skapa en frekvensordbok för varje värde som finns i datamängden. Därefter hämtar vi den maximala frekvensen och returnerar alla element med den frekvensen.

Låt oss översätta detta till 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

Vi kontrollerar resultatet genom att skicka de två listorna som argument:

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

Resultat:

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

Som du kan se returnerade det första anropet ett enskilt typvärde, medan det andra returnerade flera typvärden.

En djupare förklaring av ovanstående kod:

  • Vi deklarerar en frekvensordbok.
  • Vi itererar genom datamängden för att skapa ett histogram (en statistisk term för en uppsättning räknare eller frekvenser).
    • Om nyckeln finns i ordlistan ökar vi värdet med ett.
    • Om den inte finns skapar vi ett nytt nyckel-värdepar med värdet ett.
  • Variabeln `most_frequent` lagrar det största värdet (inte nyckeln) i frekvensordboken.
  • Vi returnerar `modes`-variabeln som består av alla nycklar i frekvensordboken med den högsta frekvensen.

Observera hur viktigt variabelnamn är för att skriva läsbar kod.

Använda `mode()` och `multimode()` från Pythons statistikmodul

Än en gång ger statistikmodulen oss ett snabbt sätt att utföra grundläggande statistiska beräkningar.

Vi kan använda två funktioner: `mode()` och `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']

Ovanstående kod importerar båda funktionerna och definierar de datamängder vi har arbetat med.

Här är den lilla skillnaden: Funktionen `mode()` returnerar det första typvärdet den stöter på, medan `multimode()` returnerar en lista med alla de vanligaste värdena i datamängden.

Följaktligen kan vi säga att den anpassade funktionen vi definierade egentligen är en `multimode()`-funktion.

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

Resultat:

10
nike

Obs: I Python 3.8 och senare returnerar funktionen `mode()` det första typvärdet den hittar. Om du har en äldre version får du ett StatisticsError.

Använda funktionen `multimode()`:

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

Resultat:

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

Sammanfattning

Grattis! Om du har följt den här guiden har du nu lärt dig att beräkna medelvärde, median och typvärde, de viktigaste måtten på central tendens.

Även om du kan skapa dina egna funktioner för att beräkna medelvärde, median och typvärde, är det rekommenderat att använda statistikmodulen eftersom den är en del av standardbiblioteket och du inte behöver installera något extra för att börja använda den.

Nästa steg kan vara att läsa en introduktion till dataanalys i Python.