Sentralmål og Spredning med Python
Python med standardbiblioteket `statistics` gir enkle og effektive metoder for å beregne sentralmål (gjennomsnitt, median, typetall) og spredningsmål (standardavvik, variasjonsbredde) fra datasett.
Hva kan du lære i dette kapittelet
- Importere og bruke `statistics`-modulen
- Beregne gjennomsnitt, median og typetall
- Beregne standardavvik og andre spredningsmål
- Arbeide med datasett i form av lister
- Sammenligne ulike datasett ved hjelp av statistiske mål
Importere statistics-modulen
I Python kan du bruke standardbiblioteket `statistics` for å beregne de vanligste statistiske målene. Du trenger ikke installere noe ekstra for å bruke dette biblioteket, det følger med Python.
# Importere statistikk-modulen
from statistics import mean, median, mode, pstdev, stdev, variance, quantiles
# Opprette et datasett (høyder i cm)
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Nå er vi klare til å bruke de statistiske funksjonene på datasettet
Sentralmål: Gjennomsnitt, Median og Typetall
Sentralmål er statistiske verdier som beskriver et typisk eller sentralt punkt i et datasett.
Gjennomsnitt (mean)
Gjennomsnittet er summen av alle verdier delt på antall verdier. Det er det mest brukte sentralmålet.
from statistics import mean
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne gjennomsnitt
gjennomsnitt = mean(høyder)
print(f"Gjennomsnitt: {gjennomsnitt}") # Output: 174.21...
# Du kan også beregne gjennomsnitt manuelt
manuelt_gjennomsnitt = sum(høyder) / len(høyder)
print(f"Manuelt beregnet gjennomsnitt: {manuelt_gjennomsnitt}") # Samme resultat
Median
Median er midtverdien i et sortert datasett. Det er verdien som deler datasettet i to like store deler.
from statistics import median
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne median
median_høyde = median(høyder)
print(f"Median: {median_høyde}") # Output: 174.5
# Du kan også beregne median manuelt
sortert = sorted(høyder)
n = len(sortert)
if n % 2 == 0: # Hvis antall elementer er et partall
midt1 = sortert[n//2 - 1]
midt2 = sortert[n//2]
manuell_median = (midt1 + midt2) / 2
else: # Hvis antall elementer er et oddetall
manuell_median = sortert[n//2]
print(f"Manuelt beregnet median: {manuell_median}") # Samme resultat
Typetall (Mode)
Typetall er den verdien som forekommer oftest i datasettet.
from statistics import mode
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne typetall
typetall = mode(høyder)
print(f"Typetall: {typetall}") # Output: 175
# Du kan også beregne typetall manuelt
frekvenser = {}
for høyde in høyder:
if høyde in frekvenser:
frekvenser[høyde] += 1
else:
frekvenser[høyde] = 1
# Finn verdien med høyest frekvens
manuell_mode = max(frekvenser, key=frekvenser.get)
print(f"Manuelt beregnet typetall: {manuell_mode}") # Samme resultat: 175
Merk:
Hvis det er to eller flere verdier som forekommer like ofte (multimodal fordeling), vil mode()
-funksjonen returnere den verdien som forekommer først i datasettet. For å håndtere flere typetall, kan du bruke multimode()
fra statistics
(tilgjengelig i Python 3.8 og nyere), som returnerer en liste med alle typetallene.
Sammenligning av sentralmål
La oss se på et eksempel der vi sammenligner de tre sentralmålene på samme datasett:
from statistics import mean, median, mode
# Datasett 1: Symmetrisk fordeling
symmetrisk = [5, 6, 7, 7, 8, 8, 8, 9, 9, 10]
print(f"Symmetrisk datasett: {symmetrisk}")
print(f"Gjennomsnitt: {mean(symmetrisk)}") # 7.7
print(f"Median: {median(symmetrisk)}") # 8.0
print(f"Typetall: {mode(symmetrisk)}") # 8
# Datasett 2: Høyreskjev fordeling
høyreskjev = [5, 6, 7, 8, 9, 10, 10, 12, 15, 20]
print(f"
Høyreskjev datasett: {høyreskjev}")
print(f"Gjennomsnitt: {mean(høyreskjev)}") # 10.2 (påvirket av ekstremverdier)
print(f"Median: {median(høyreskjev)}") # 9.5 (mindre påvirket)
print(f"Typetall: {mode(høyreskjev)}") # 10
# Datasett 3: Venstreskjev fordeling
venstreskjev = [1, 5, 8, 10, 10, 11, 12, 13, 14, 14]
print(f"
Venstreskjev datasett: {venstreskjev}")
print(f"Gjennomsnitt: {mean(venstreskjev)}") # 9.8
print(f"Median: {median(venstreskjev)}") # 10.5
print(f"Typetall: {mode(venstreskjev)}") # 10 eller 14 (multimodal)
Spredningsmål: Standardavvik og variasjon
Spredningsmål forteller oss hvor mye verdiene i et datasett varierer eller er spredt ut fra sentralmålet.
Standardavvik
Standardavvik er et mål på hvor mye verdiene avviker fra gjennomsnittet. Et lavt standardavvik indikerer at verdiene er nær gjennomsnittet, mens et høyt standardavvik indikerer stor spredning.
from statistics import mean, pstdev, stdev
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne populasjonsstandardavvik (når dataene representerer hele populasjonen)
pop_std = pstdev(høyder)
print(f"Populasjonsstandardavvik: {pop_std:.2f}") # ca. 6.73
# Beregne utvalgs-standardavvik (når dataene er et utvalg fra en større populasjon)
sample_std = stdev(høyder)
print(f"Utvalgs-standardavvik: {sample_std:.2f}") # ca. 6.97
# Forskjellen er at stdev() deler summen av kvadrerte avvik på (n-1) i stedet for n
Variasjonsbredde (Range)
Variasjonsbredden er differansen mellom den største og den minste verdien i datasettet.
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne variasjonsbredde
variasjonsbredde = max(høyder) - min(høyder)
print(f"Variasjonsbredde: {variasjonsbredde}") # 190 - 165 = 25
Kvartiler og kvartilbredde
Kvartiler deler et sortert datasett i fire like deler. Kvartilbredden (IQR) er differansen mellom tredje og første kvartil.
from statistics import quantiles
høyder = [168, 172, 175, 169, 182, 175, 178, 165, 170, 175, 190, 172, 168, 180]
# Beregne kvartiler
kvartiler = quantiles(høyder)
print(f"Kvartiler: {kvartiler}") # [169.0, 174.5, 179.0]
# Første kvartil (Q1), andre kvartil (median), tredje kvartil (Q3)
Q1 = kvartiler[0]
Q2 = kvartiler[1] # Dette er medianen
Q3 = kvartiler[2]
# Beregne kvartilbredde (IQR)
IQR = Q3 - Q1
print(f"Kvartilbredde (IQR): {IQR}") # 179.0 - 169.0 = 10.0
# Identifisere potensielle uteliggere (verdier som ligger langt fra resten)
nedre_grense = Q1 - 1.5 * IQR
øvre_grense = Q3 + 1.5 * IQR
print(f"Nedre grense for uteliggere: {nedre_grense}")
print(f"Øvre grense for uteliggere: {øvre_grense}")
# Finn uteliggere
uteliggere = [x for x in høyder if x < nedre_grense or x > øvre_grense]
print(f"Uteliggere: {uteliggere}")
Her er et diagram som viser fordelingen av høyder:
Praktisk eksempel: Sammenligning av to klasser
La oss se på et praktisk eksempel der vi sammenligner testresultatene fra to forskjellige klasser:
from statistics import mean, median, mode, stdev
# Testresultater (poeng av 100 mulige)
klasse_a = [65, 72, 78, 85, 90, 92, 68, 75, 82, 79, 88, 84, 78, 75]
klasse_b = [55, 62, 95, 85, 90, 52, 98, 75, 92, 69, 88, 54, 88, 75]
# Sammenligne sentralmål
print("SAMMENLIGNING AV TESTRESULTATER:")
print(f"Gjennomsnitt klasse A: {mean(klasse_a):.2f}") # ca. 79.36
print(f"Gjennomsnitt klasse B: {mean(klasse_b):.2f}") # ca. 76.29
print(f"Median klasse A: {median(klasse_a)}") # 79.5
print(f"Median klasse B: {median(klasse_b)}") # 77.0
# Sammenligne spredning
print(f"Standardavvik klasse A: {stdev(klasse_a):.2f}") # ca. 8.12
print(f"Standardavvik klasse B: {stdev(klasse_b):.2f}") # ca. 16.44
print(f"Variasjonsbredde klasse A: {max(klasse_a) - min(klasse_a)}") # 27
print(f"Variasjonsbredde klasse B: {max(klasse_b) - min(klasse_b)}") # 46
# Beregne antall som bestod testen (over 70 poeng)
bestått_a = sum(1 for poeng in klasse_a if poeng >= 70)
bestått_b = sum(1 for poeng in klasse_b if poeng >= 70)
print(f"Antall som bestod i klasse A: {bestått_a} av {len(klasse_a)} ({bestått_a/len(klasse_a)*100:.1f}%)")
print(f"Antall som bestod i klasse B: {bestått_b} av {len(klasse_b)} ({bestått_b/len(klasse_b)*100:.1f}%)")
# Konklusjon
print("
KONKLUSJON:")
print("Klasse A har et litt høyere gjennomsnitt og median enn klasse B.")
print("Klasse B har mye større spredning i resultatene (nesten dobbelt så stort standardavvik).")
print("Dette tyder på at elevene i klasse A er mer jevne i prestasjonene,")
print("mens klasse B har større forskjeller mellom de sterkeste og svakeste elevene.")
Tips: Hvilke statistiske mål bør jeg bruke?
- Gjennomsnitt: Best for symmetriske fordelinger uten ekstremverdier
- Median: Mer robust mot ekstremverdier, god for skjeve fordelinger
- Typetall: Nyttig for kategoriske data eller diskrete verdier
- Standardavvik: Gir et godt bilde av spredningen rundt gjennomsnittet
- Variasjonsbredde: Enkel å forstå, men sensitiv for ekstremverdier
- Kvartilbredde (IQR): Robust spredningsmål som ignorerer ekstremverdier
Frekvenstabeller og sentralmål
Ofte har vi data i form av en frekvenstabell. La oss se hvordan vi kan beregne sentralmål fra en slik tabell:
from statistics import mean, median, mode
# Høydedata i form av en frekvenstabell
høyde_intervaller = ["155-159", "160-164", "165-169", "170-174", "175-179", "180-184", "185-189", "190-194"]
frekvenser = [2, 5, 8, 12, 9, 7, 4, 3]
# For å beregne statistikk må vi konvertere dette til en liste med individuelle verdier
# Vi bruker midtpunktet i hvert intervall som representativ verdi
midtpunkter = [157, 162, 167, 172, 177, 182, 187, 192]
# Generer liste med alle høyder basert på frekvenstabellen
alle_høyder = []
for i in range(len(midtpunkter)):
# Legger til midtpunktet det antall ganger det forekommer
for j in range(frekvenser[i]):
alle_høyder.append(midtpunkter[i])
# Nå kan vi beregne statistikk
print(f"Antall personer: {len(alle_høyder)}")
print(f"Gjennomsnitt: {mean(alle_høyder):.2f} cm")
print(f"Median: {median(alle_høyder)} cm")
print(f"Typetall: {mode(alle_høyder)} cm")
# Vi kan også telle antall over/under en viss høyde
antall_over_180 = sum(1 for h in alle_høyder if h >= 180)
print(f"Antall personer over 180 cm: {antall_over_180}")
print(f"Prosentandel over 180 cm: {antall_over_180/len(alle_høyder)*100:.1f}%")
Oppsummering
I dette kapittelet har du lært hvordan du kan:
- Bruke Python's statistics-modul for å beregne ulike sentralmål og spredningsmål
- Forstå forskjellen mellom gjennomsnitt, median og typetall
- Beregne standardavvik og andre mål på spredning
- Analysere og sammenligne ulike datasett ved hjelp av statistiske mål
- Arbeide med data fra frekvenstabeller
Disse ferdighetene gir deg et solid grunnlag for statistisk analyse med Python, og du kan nå bruke dem til å utforske og forstå egne datasett.