STS-Scripts/DeskriptiveStatistik.py

152 lines
6.0 KiB
Python

import numpy as np
def werteListe(absoluteHaufigkeiten):
werte = []
for wert in absoluteHaufigkeiten.keys():
for i in range(absoluteHaufigkeiten[wert]):
werte.append(wert)
return werte
def mittelwert(werte=[], haufigkeiten={}):
count = 0
sum = 0
if(len(haufigkeiten) > 0):
for wert in haufigkeiten.keys():
sum = sum + wert * haufigkeiten[wert]
count = count + haufigkeiten[wert]
return sum / count
else:
return np.sum(werte) / len(werte)
def anzahlElemente(werte, absoluteHaufigkeiten={}):
if(len(absoluteHaufigkeiten) > 0):
sum(absoluteHaufigkeiten.values())
else:
return len(werte)
def absoluteHaufigkeiten(werte):
haufigkeiten = {}
for wert in werte:
if(wert in haufigkeiten):
haufigkeiten[wert] = haufigkeiten[wert] + 1
else:
haufigkeiten[wert] = 1
return haufigkeiten
def relativeHaufigkeiten(werte=[], absoluteWerte={}):
haufigkeiten = {}
if(len(absoluteWerte) == 0):
absoluteWerte = absoluteHaufigkeiten(werte)
anzahl = anzahlElemente(werte)
for wert in absoluteWerte.keys():
haufigkeiten[wert] = absoluteWerte[wert] / anzahl
return haufigkeiten
def qquantil(werte, q):
werteSortiert = sorted(werte)
nq = len(werteSortiert) * q
if nq % 1 == 0: #ganze Zahl
nq = int(nq - 1)
return 0.5 * (werteSortiert[nq] + werteSortiert[nq+1])
else: #nicht ganze Zahl
return werteSortiert[int(np.ceil(nq - 1))]
def median(werte):
return qquantil(werte, 0.5)
def interqurartilsabstand(werte):
return qquantil(werte, 0.75) - qquantil(werte, 0.25)
def obereAntenne_obereAusreisser(werte):
werteSortiert = sorted(werte)
resultat = ["",[]]
maxAntenne = (qquantil(werte, 0.75) + interqurartilsabstand(werteSortiert) * 1.5)
if(max(werteSortiert) > maxAntenne):
for i in range(len(werteSortiert)):
wert = werteSortiert[i]
if(i+1 == len(werteSortiert)):
resultat[1].append(wert)
elif(werteSortiert[i+1] > maxAntenne) and resultat[0] == "":
resultat[0] = wert
elif(werteSortiert[i+1] > maxAntenne):
resultat[1].append(wert)
else:
resultat[0] = max(werteSortiert)
return resultat
def untereAntenne_untereAusreisser(werte):
werteSortiert = sorted(werte, reverse=True)
resultat = ["",[]]
maxAntenne = (qquantil(werte, 0.25) - interqurartilsabstand(werteSortiert) * 1.5)
if(min(werteSortiert) < maxAntenne):
for i in range(len(werteSortiert)):
wert = werteSortiert[i]
if(i+1 == len(werteSortiert)):
resultat[1].append(wert)
elif(werteSortiert[i+1] < maxAntenne) and resultat[0] == "":
resultat[0] = wert
elif(werteSortiert[i+1] < maxAntenne):
resultat[1].append(wert)
else:
resultat[0] = min(werteSortiert)
return resultat
def varianz(werte=[], absoluteHaufigkeiten={}, relativeHaufigkeiten={}, pdf={}, stichprobengroesse=0, korrigiert=False):
summe = 0
if(len(relativeHaufigkeiten) > 0):
mittel = mittelwert(haufigkeiten=relativeHaufigkeiten)
for wert in relativeHaufigkeiten.keys():
summe = summe + (relativeHaufigkeiten[wert] * (wert - mittel) ** 2)
if (korrigiert):
return summe * stichprobengroesse / (stichprobengroesse - 1)
else:
return summe
elif (len(pdf) > 0):
mittel = mittelwert(haufigkeiten=pdf)
for wert in pdf.keys():
summe = summe + (pdf[wert] * (wert - mittel) ** 2)
if(korrigiert):
return (summe / sum(pdf.values())) * stichprobengroesse / (stichprobengroesse - 1)
else:
return summe / sum(pdf.values())
elif(len(absoluteHaufigkeiten) > 0):
werte = werteListe(absoluteHaufigkeiten)
if(len(werte) > 0):
mittel = mittelwert(werte=werte)
for wert in werte:
summe = summe + (wert - mittel)**2
if(korrigiert):
return summe / (anzahlElemente(werte=werte) - 1)
else:
return summe / anzahlElemente(werte=werte)
def standardabweichung(werte=[], absuluteHaufigkeit={}, relativeHaufigkeiten={}, pdf={}, stichprobengroesse=0, korrigiert=False):
return np.sqrt(varianz(werte, absuluteHaufigkeit, relativeHaufigkeiten, pdf, stichprobengroesse, korrigiert))
if __name__ == '__main__':
werte = [12, -5, 5, 52, -6, -5, 8, -7, 22, -46, 8, -14, 5, 47]
haufigkeiten = {0: 6, 1: 6, 2: 3, 3: 5, 8: 6}
#werte = [9, 7, 7, 6, 1]
# haufigkeiten = {11: 3/20, 13: 1/2, 15: 1/10, 17: 1/5, 19: 1/20}
# print("Anzahl Elemente: " , anzahlElemente(werte))
# print("Absolute häufigkeiten: " , absoluteHaufigkeiten(werte))
# print("RElative Haufigkeiten: ", relativeHaufigkeiten(werte))
# print("Mittelwert: ", mittelwert(werte))
print("q1: " ,qquantil(werte, 0.25))
print("q2: " , qquantil(werte, 0.5))
print("q3: " , qquantil(werte, 0.75))
print("Interquartilsabstand: ", interqurartilsabstand(werte))
print("obere Antenne: ", obereAntenne_obereAusreisser(werte)[0])
print("obere Ausreisser: ", obereAntenne_obereAusreisser(werte)[1])
print("untere Antenne: ", untereAntenne_untereAusreisser(werte)[0])
print("untere Ausreisser: ", untereAntenne_untereAusreisser(werte)[1])
print("Varianz: ", varianz(absoluteHaufigkeiten=haufigkeiten))
#print("Standardabweichung: ", standardabweichung(werte, korrigiert=True))
# print("Mittelwert : ", mittelwert(haufigkeiten=haufigkeiten))
# print("empirische Varianz: ", varianz(absoluteHaufigkeiten=haufigkeiten, stichprobengroesse=0, korrigiert=True))
# print("empirische Standardabweichung", standardabweichung(absuluteHaufigkeit=haufigkeiten, stichprobengroesse=20, korrigiert=False))
# print("empirische Varianz: ", varianz(absoluteHaufigkeiten=haufigkeiten, stichprobengroesse=20, korrigiert=True))
#print("empirische Standardabweichung", standardabweichung(werte=werte, stichprobengroesse=0, korrigiert=True))