Standardabweichung in Python
Standardabweichung in Python berechnen: statistics-Modul, NumPy, pandas und ML-Anwendungsfälle mit scikit-learn.
Die Standardabweichung misst, wie weit die Werte um ihren Mittelwert gestreut sind. Sie gehört zu den am häufigsten verwendeten statistischen Kennzahlen in der Datenanalyse und im maschinellen Lernen – vom Prüfen, ob ein Datensatz normalverteilt ist, bis hin zur Skalierung von Merkmalen vor dem Training eines Modells. Dieses Kapitel erklärt, was die Standardabweichung ist, wie man sie in Python mit dem statistics-Modul, NumPy und pandas berechnet und wie sie in gängige ML-Workflows einfließt.
Was ist die Standardabweichung?
Die Standardabweichung (σ für eine Grundgesamtheit, s für eine Stichprobe) quantifiziert den durchschnittlichen Abstand jedes Datenpunkts vom Mittelwert. Eine kleine Standardabweichung bedeutet, dass die Werte eng um den Mittelwert gruppiert sind; eine große bedeutet, dass sie weit gestreut sind.
Sie ist die Quadratwurzel der Varianz:
variance = Σ(xᵢ − x̄)² / N # population
variance = Σ(xᵢ − x̄)² / (N − 1) # sample (Bessel's correction)
std dev = √varianceGrundgesamtheit vs. Stichproben-Standardabweichung
| Begriff | Formelnenner | Wann zu verwenden |
|---|---|---|
| Grundgesamtheit-Std | N | Man hat alle Datenpunkte (z. B. alle Testergebnisse einer Klasse) |
| Stichproben-Std | N − 1 | Man hat eine Teilmenge und möchte die gesamte Grundgesamtheit schätzen |
Der Nenner N − 1 (Besselsche Korrektur) korrigiert den Bias, der bei der Schätzung aus einer Stichprobe entsteht. In der Praxis ist der Unterschied bei großen Datensätzen vernachlässigbar, aber bei kleinen Stichproben ist er bedeutsam.
Schritt-für-Schritt-Beispiel von Hand
data = [10, 20, 30, 40, 50]
mean = (10 + 20 + 30 + 40 + 50) / 5 = 30
Differences from mean: -20, -10, 0, 10, 20
Squared differences: 400, 100, 0, 100, 400
Population variance = (400 + 100 + 0 + 100 + 400) / 5 = 200
Sample variance = (400 + 100 + 0 + 100 + 400) / 4 = 250
Population std dev = √200 ≈ 14.14
Sample std dev = √250 ≈ 15.81Das statistics-Modul
Pythons eingebautes statistics-Modul ist der einfachste Weg, die Standardabweichung für kleine Datensätze zu berechnen – ohne externe Bibliotheken.
stdev() wirft einen StatisticsError, wenn man weniger als zwei Werte übergibt, da eine einelementige Liste keine sinnvolle Streuung besitzt.
NumPy std()
NumPy ist die Standardwahl beim Arbeiten mit Arrays, Matrizen oder großen Datensätzen. Die Funktion np.std() verwendet standardmäßig die Grundgesamtheit-Standardabweichung (ddof=0). Mit ddof=1 erhält man stattdessen die Stichproben-Standardabweichung.
NumPy ermöglicht es außerdem, die Standardabweichung entlang einer bestimmten Achse eines 2-D-Arrays zu berechnen, was nützlich ist, wenn jede Zeile eine Beobachtung und jede Spalte ein Merkmal darstellt:
import numpy as np
# 3 samples, 2 features
X = np.array([[1, 10],
[2, 20],
[3, 30]])
print(np.std(X, axis=0, ddof=1)) # std per feature: [1. 10.]
print(np.std(X, axis=1, ddof=1)) # std per sample: [6.36 6.36 6.36] (approx)pandas std() und describe()
Wenn die Daten in einem DataFrame vorliegen, bietet pandas std() direkt auf jeder Spalte oder dem gesamten Frame. Standardmäßig verwendet pandas ddof=1 (Stichproben-Std), was der Konvention von R entspricht.
import pandas as pd
temps = [72, 68, 75, 80, 65, 70, 78]
df = pd.DataFrame({"temperature": temps})
print(df["temperature"].std()) # 5.4116 (sample std, ddof=1)
print(df["temperature"].mean()) # 72.5714describe() liefert eine schnelle statistische Zusammenfassung einschließlich der Standardabweichung für jede numerische Spalte:
import pandas as pd
df = pd.DataFrame({
"height_cm": [165, 170, 175, 160, 180],
"weight_kg": [55, 70, 80, 50, 90],
})
print(df.describe())Die std-Zeile in der Ausgabe zeigt die Stichproben-Standardabweichung für jede Spalte:
height_cm weight_kg
count 5.000000 5.000000
mean 170.000000 69.000000
std 7.905694 16.733201
min 160.000000 50.000000
25% 165.000000 55.000000
50% 170.000000 70.000000
75% 175.000000 80.000000
max 180.000000 90.000000Standardabweichung im maschinellen Lernen
Merkmalsskalierung mit StandardScaler
Rohe Merkmale liegen oft auf sehr unterschiedlichen Skalen (Alter in Jahren vs. Einkommen in Tausend). Algorithmen wie lineare Regression, SVMs und k-nächste-Nachbarn sind empfindlich gegenüber diesem Ungleichgewicht. Standardisierung (auch z-Score-Normalisierung genannt) transformiert jedes Merkmal so, dass es den Mittelwert = 0 und die Standardabweichung = 1 hat:
z = (x − mean) / stdscikit-learns StandardScaler wendet dies automatisch an:
from sklearn.preprocessing import StandardScaler
import numpy as np
# 3 samples, 2 features
features = np.array([[1, 2],
[3, 4],
[5, 6]])
scaler = StandardScaler()
scaled = scaler.fit_transform(features)
print(scaled)
# [[-1.2247 -1.2247]
# [ 0. 0. ]
# [ 1.2247 1.2247]]Nach der Skalierung hat jede Spalte einen Mittelwert von 0 und eine Standardabweichung von 1. Die gelernten Parameter können anschließend abgerufen werden:
print(scaler.mean_) # [3. 4.]
print(scaler.scale_) # [1.6330 1.6330]Vergleich von Gruppenvariabilität
Die Standardabweichung hilft zu entscheiden, ob sich zwei Gruppen wirklich unterscheiden oder nur verrauscht sind. Zwei Klassen können einen ähnlichen Mittelwert teilen, sich aber dramatisch in ihrer Streuung unterscheiden:
import statistics
scores_a = [78, 80, 82, 79, 81] # consistent group
scores_b = [60, 100, 55, 95, 70] # high-variance group
print(f"Group A — mean: {statistics.mean(scores_a)}, std: {statistics.stdev(scores_a):.2f}")
# Group A — mean: 80, std: 1.58
print(f"Group B — mean: {statistics.mean(scores_b)}, std: {statistics.stdev(scores_b):.2f}")
# Group B — mean: 76, std: 20.43Gruppe A und Gruppe B haben ähnliche Mittelwerte, aber die Standardabweichung von Gruppe B ist etwa 13-mal größer, was auf weit weniger vorhersagbare Ergebnisse hinweist.
Ausreißererkennung mit z-Scores
Ein z-Score gibt an, wie viele Standardabweichungen ein Wert vom Mittelwert entfernt ist. Werte mit |z| > 3 gelten üblicherweise als Ausreißerkandidaten:
import numpy as np
values = np.array([2.0, 2.5, 3.0, 2.8, 100.0, 2.2, 3.1])
mean = np.mean(values)
std = np.std(values, ddof=1)
z_scores = (values - mean) / std
print(z_scores.round(2))
# [-0.39 -0.38 -0.37 -0.37 2.27 -0.39 -0.36]Der Wert 100.0 hat einen z-Score von 2,27, was – angesichts des kleinen Datensatzes – bereits deutlich als wahrscheinlicher Ausreißer auffällt.
Modell-Unsicherheit verstehen
Die Standardabweichung taucht auch auf, wenn ein Modell über mehrere Kreuzvalidierungs-Folds hinweg ausgewertet wird. Eine hohe Standardabweichung über Folds hinweg deutet darauf hin, dass das Modell instabil ist oder die Daten eine hohe Varianz aufweisen. Siehe das Kreuzvalidierungskapitel für eine vollständige Erläuterung.
Das richtige Werkzeug wählen
| Situation | Empfohlenes Werkzeug |
|---|---|
| Schnelle Berechnung, keine Abhängigkeiten | statistics.stdev() / statistics.pstdev() |
| Array- oder Matrizenoperationen | numpy.std() |
| DataFrame-Spaltenstatistiken | pandas.DataFrame.std() |
| ML-Merkmalsvorverarbeitung | sklearn.preprocessing.StandardScaler |
Häufige Fehlerquellen
- Falsches
ddof: NumPy verwendet standardmäßigddof=0(Grundgesamtheit), während pandas standardmäßigddof=1(Stichprobe) verwendet. Immer prüfen, welche Variante benötigt wird, bevor Ergebnisse der beiden Bibliotheken verglichen werden. - Einelementige Listen:
statistics.stdev()wirft einen Fehler;np.std()gibt stillschweigend0.0zurück. - Scaler auf Testdaten anpassen:
scaler.fit_transform()immer auf dem Trainingsset aufrufen undscaler.transform()(nichtfit_transform) auf dem Testset. Das Anpassen auf Testdaten führt zu Informationslecks und verfälscht die Leistungsmetriken. Siehe das Kapitel zu Train/Test-Split für Details. - Ausreißer verzerren die Std: Ein einzelner extremer Wert kann die Standardabweichung erheblich aufblähen, wie das Anomalie-Erkennungsbeispiel oben zeigt. Ausreißer sollten zuerst geprüft werden (siehe das Kapitel zur Datenverteilung).
Verwandte Kapitel
- Mittelwert, Median und Modus — andere Lagemaße, die die Standardabweichung ergänzen
- Perzentile — rangbasierte Streuungsmaße, die robust gegenüber Ausreißern sind
- Normalverteilung — die Standardabweichung ist der zentrale Parameter der Normalverteilung
- Skalierung — weiterführende Merkmalsskalierungsstrategien jenseits der Standardisierung
- Datenverteilung — Streuung visualisieren und Schiefe erkennen