W3docs

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   = √variance

Grundgesamtheit vs. Stichproben-Standardabweichung

BegriffFormelnennerWann zu verwenden
Grundgesamtheit-StdNMan hat alle Datenpunkte (z. B. alle Testergebnisse einer Klasse)
Stichproben-StdN − 1Man 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.81

Das statistics-Modul

Pythons eingebautes statistics-Modul ist der einfachste Weg, die Standardabweichung für kleine Datensätze zu berechnen – ohne externe Bibliotheken.

python— editable, runs on the server

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.

python— editable, runs on the server

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.5714

describe() 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.000000

Standardabweichung 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) / std

scikit-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.43

Gruppe 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

SituationEmpfohlenes Werkzeug
Schnelle Berechnung, keine Abhängigkeitenstatistics.stdev() / statistics.pstdev()
Array- oder Matrizenoperationennumpy.std()
DataFrame-Spaltenstatistikenpandas.DataFrame.std()
ML-Merkmalsvorverarbeitungsklearn.preprocessing.StandardScaler

Häufige Fehlerquellen

  • Falsches ddof: NumPy verwendet standardmäßig ddof=0 (Grundgesamtheit), während pandas standardmäßig ddof=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 stillschweigend 0.0 zurück.
  • Scaler auf Testdaten anpassen: scaler.fit_transform() immer auf dem Trainingsset aufrufen und scaler.transform() (nicht fit_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
Was this page helpful?