Standardabweichung berechnen in Python

bitmuncher

Senior-Nerd
Bin gerade dabei mich in Statistiken einzulernen. Mein aktuelles Thema: Standardabweichung berechnen (bzw. Korrelationen, aber dafür brauch ich die ja). Um mir das besser zu veranschaulichen, setze ich die im Lehrstoff vorgegebenen Aufgaben in Code um.

Ich nutze dabei numpy und pandas:
Code:
import numpy as np
from pandas import Series,DataFrame
import pandas as pd

Gegeben ist folgender Datensatz :
Code:
dframe_relations = DataFrame([12,30,15,24,14,18,28,26,19,27],
                             index=[1,2,3,4,5,6,7,8,9,10],columns=['workers'])

Von diesem soll die Standard-Abweichung berechnet werden. Ich mache also folgendes:

1. Ich berechne den Durchschnitt der Daten.
Code:
total = i = 0.0
for item in dframe_relations['workers']:
    total += item
    i+=1
average_workers = total / i
average_workers = 21.3

2. Bei jedem Datum muss dann der Durchschnitt vom Datum subtrahiert werden, das Ergebnis dann jeweils quadriert:
Code:
ser_calculated = Series(range(10),index=[1,2,3,4,5,6,7,8,9,10],dtype=float)
i = 1
for workers in dframe_relations['workers']:
    ser_calculated[i] = np.square((workers - average_workers))
    i+=1

Ergibt:
Code:
1     86.49
2     75.69
3     39.69
4      7.29
5     53.29
6     10.89
7     44.89
8     22.09
9      5.29
10    32.49
dtype: float64

3. Dann brauche ich den Durchschnitt der quadrierten Differenzen:

Code:
calc = i = 0.0
for item in ser_calculated:
    i+=1
    calc += item
variance = calc / i

Ergibt: 37.81

5. Und zum Schluss muss daraus die Wurzel gezogen werden.

Code:
std_dev = np.sqrt(variance)

Ergibt: 6.1489836558572826

Mein Problem ist nun, dass es laut Lehrstoff 6.48 sein sollte. Mir stellt sich die Frage: Ist mein Code falsch (was übersehe ich), ist meine Vorgehensweise falsch oder ist der Lehrstoff falsch?
 
Ist mein Code falsch
Code:
>>> dframe = [12,30,15,24,14,18,28,26,19,27]
>>> avg = sum(dframe,0.0) / len(dframe)
>>> diffs = map(lambda x: (x-avg)**2, dframe) 
>>> (sum(diffs)/len(diffs))**0.5
6.148983655857283
>>> # oder einfach:
>>> import numpy
>>> numpy.std(dframe)
6.1489836558572843
>>> help(numpy.std)
std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
    Compute the standard deviation along the specified axis.6: item.name != null

Aaaber:
falls es sich um eine Sichprobe (falls' überhaupt korrekt ist - ist schon länger her ;) ) handelt, sollte die Berechnung der Varianz so gehen:
Code:
variance = calc / (i-1)
siehe den ersten Teil:
Standardabweichung - MatheGuru.com
bzw. Standardabweichung - Formel und Definition - Mathepedia

Dann passt das Ergebnis auch:
Code:
>>> (sum(diffs)/(len(diffs) - 1))**(1.0/2)
6.481597882552658
>>>
 
Zurück
Oben