Statistik med Python

Fordelen ved at anvende Python til matematik fremfor regneark er, at vi hele tiden kan se koden. I regnearket forsvinder koden, så snart man forlader feltet.

Nødvendige moduler

for at kunne anvende statistik funktionerne skal vi importere to moduler: statistics og numpy.

	
import statistics as st
import numpy as np
	

Deskriptorer

Deskriptor funktion
antal observationer (n) len()
Mindste værdi min()
Maksimal værdi max()
Gennemsnit st.mean()
Median st.median()
typtetal (se nedenfor) st.mode()

Typetallet kræver lidt mere programmering, da vi kan risikere at der er flere værdier med samme antal. Derfor skal vi anvende en Try sætning.

	
try:
	st.mode(x)
	print("Typetal: {0}".format(st.mode(x)))
	
except:
	print("Der er ikke noget typetal (flere værdier med samme antal")
	

Koden gør, at den forsøger at køre det der står under try. Hvis den støder ind i en fejl, så vil den gøre det der står under except.

Eksempel

Her anvender jeg en liste over karakterer i en klasse med 10 elever, som jeg kalder x.

	
>>> import statistics as st
>>> import numpy as np
>>> x = [2,2,4,4,4,7,7,10,10,12]
>>> len(x)
10
>>> min(x)
2
>>> max(x)
12
>>> st.mean(x)
6.2
>>> st.median(x)
5.5
>>> st.mode(x)
4
	

Eksempel intet typetal

Herunder er lavet et eksempel med datasættet y, hvor både 4 og 7 har lige mange observationer.

	
import statistics as st

y = [2, 2, 4, 4, 4, 7, 7, 7, 10, 12]

print("Datasæt: {0}\n".format(y))

st.mode(y)
	
Datasæt: [2, 2, 4, 4, 4, 7, 7, 7, 10, 12]

Traceback (most recent call last):
  File "statistic_test.py", line 7, in 
    st.mode(y)
  File "C:\Users\ThomasJensen\AppData\Local\Programs\Python\Python36\lib\statistics.py", line 507, in mode
    'no unique mode; found %d equally common values' % len(table)
statistics.StatisticsError: no unique mode; found 2 equally common values

Koden ændres så den anvender try.

	
import statistics as st

y = [2, 2, 4, 4, 4, 7, 7, 7, 10, 12]

print("Datasæt: {0}\n".format(y))

try:
	st.mode(y)
	print("typetaller er: {0}".format(st.mode(y)))
	
except:
	print("Der er ikke noget typtetal.")
	
Datasæt: [2, 2, 4, 4, 4, 7, 7, 7, 10, 12]

Der er ikke noget typtetal.

Kvartilsæt

For at finde kvartilsæt anvendes funktionen np.percentile

	
>>> np.percentile(x,25)
4.0
>>> np.percentile(x,50)
5.5
>>> np.percentile(x,75)
9.25
	

Varians og spredning

Deskriptor funktion
Varians (stikprøve) st.variance()
Spredning (stikprøve) st.stdev()
	
>>> st.variance(x)
12.622222222222222
>>> st.stdev(x)
3.552776691859794
	

Percentiler

	
import statistics as st
import numpy as np

x = [2, 2, 4, 4, 4, 7, 7, 10, 10, 12]

print("Observationssæt: \n----------------\n{0}".format(x))

print("Percentilsæt:")

for i in range(10,101,10):

	print("Værden for den {0}. percentil er: {1}".format(i, round(np.percentile(x,i),1)))
	
Observationssæt
---------------
[2, 2, 4, 4, 4, 7, 7, 10, 10, 12]

Percentilsæt:
Værden for den 10. percentil er: 2.0
Værden for den 20. percentil er: 3.6
Værden for den 30. percentil er: 4.0
Værden for den 40. percentil er: 4.0
Værden for den 50. percentil er: 5.5
Værden for den 60. percentil er: 7.0
Værden for den 70. percentil er: 7.9
Værden for den 80. percentil er: 10.0
Værden for den 90. percentil er: 10.2
Værden for den 100. percentil er: 12.0

Program eksempler

Diskret data

_
_
Kode til diskret data
		
import statistics as st
import numpy as np
import matplotlib.pyplot as plt

# https://docs.python.org/3/library/statistics.html

x = [2,2,4,4,4,7,7,10,10,12]

print("Observationssæt: \n----------------\n{0}".format(x))

#antal
print("\nAntal observationer: {0}".format(len(x)))

#gennemsnit
print("\nGennemsnit = {0}".format(st.mean(x)))
#median
print("\nMedian: {0}".format(st.median(x)))

#min og max værdi
print("\nMindste værdi: {0}".format(min(x)))

print("\nMaksimale værdi: {0}".format(max(x)))


try:
	st.mode(x)
	print("\nTypetal: {0}".format(st.mode(x)))
	
except:
	print("\nDer er ikke noget typetal (flere værdier med samme antal")

#Varians
print("\nVarians: {0}".format(round(st.variance(x),2)))

#Spredning
print("\nSpredning: {0}".format(round(st.stdev(x),2)))

# Finder unikke værdier
x_unik = np.unique(x)
# Finder antal for hver unik værdi
x_unik_antal = []
for i in x_unik:
	x_unik_antal.append(x.count(i))
	
#plotfunktionen
plt.xticks(x_unik, x_unik) 
plt.bar(x_unik,x_unik_antal, width=0.8)
plt.title("Kontinuert data")
plt.show()
		
	

Kontinuert data

_
_
Kode til kontinuert data
		
import statistics as st
import numpy as np
import matplotlib.pyplot as plt

x = [156,159,161,164,165,167, 168,171,173,173,174,176,177,177,179,179,180,181,183,183,185,187,192,194,198,201]

print("Observationssæt: \n----------------\n{0}".format(x))

#antal
print("\nAntal observationer: {0}".format(len(x)))
#gennemsnit
print("\nGennemsnit = {0}".format(round(st.mean(x),2)))
#median
print("\nMedian: {0}{1}".format(st.median(x),2))
#min og max værdi
print("\nMindste værdi: {0}".format(min(x)))
print("\nmaksimale værdi: {0}".format(max(x)))

startværdi = 150
spring = 10
x_ny = []

#ændrer datasættet til middelværdier ud fra startværdi og spring
for i in range(len(x)):
	if x[i]< startværdi+spring and x[i]>=startværdi:
		x_ny.append(startværdi+1/2*spring)
	else:
		startværdi += spring
		x_ny.append(startværdi+1/2*spring)
	
#print(x_ny)
	
try:
	st.mode(x_ny)
	print("\nTypeintervallet er: [{0} - {1}[".format(st.mode(x_ny)-spring/2,st.mode(x_ny)+spring/2))
except:
	print("\nDer er ikke noget typetal (flere værdier med samme antal")

#Varians
print("\nVarians: {0}".format(round(st.variance(x_ny),2)))
#Spredning
print("\nSpredning: {0}".format(round(st.stdev(x_ny),2)))
		
# Finder unikke værdier
x_unik = np.unique(x_ny)
# Finder antal for hver unik værdi
x_unik_antal = []
for i in x_unik:
	x_unik_antal.append(x_ny.count(i))
	
#plotfunktionen
plt.xticks(x_unik, x_unik) 
plt.bar(x_unik,x_unik_antal, width=0.8)
plt.title("Kontinuert data")
plt.show()