Wie führt man einen t-Test in Python durch?
In diesem Beitrag
- Was ist ein t-Test – und wann brauche ich ihn?
- Die drei Varianten: Welcher t-Test ist der richtige?
- Voraussetzungen prüfen bevor Sie rechnen
- Unabhängiger t-Test in Python (scipy)
- Abhängiger t-Test in Python (Paardifferenzen)
- Einstichproben-t-Test in Python
- Effektstärke berechnen: Cohens d
- Ergebnisse korrekt berichten
- Häufige Fehler und wie Sie sie vermeiden
Was ist ein t-Test – und wann brauche ich ihn?
Der t-Test ist eines der meistgenutzten statistischen Verfahren in Abschlussarbeiten und Forschungsprojekten. Er prüft, ob sich zwei Mittelwerte statistisch bedeutsam voneinander unterscheiden – oder ob ein beobachteter Unterschied auch zufällig entstanden sein könnte.
In Python lässt sich ein t-Test mit wenigen Zeilen Code durchführen, hauptsächlich über die Bibliothek scipy.stats. Die Frage ist weniger, wie man ihn rechnet, sondern welche Variante die richtige ist und wie man die Ergebnisse korrekt interpretiert.
Die drei Varianten: Welcher t-Test ist der richtige?
Je nach Fragestellung und Studiendesign gibt es drei grundlegende t-Test-Varianten. Die Wahl der richtigen Variante ist entscheidend – ein falscher Test führt zu falschen Schlussfolgerungen.
| Variante | Anwendungsfall | scipy-Funktion |
|---|---|---|
| Einstichproben-t-Test | Vergleich eines Stichprobenmittelwerts mit einem bekannten oder hypothetischen Wert | ttest_1samp() |
| Unabhängiger t-Test | Vergleich zweier unabhängiger Gruppen (verschiedene Personen) | ttest_ind() |
| Abhängiger t-Test | Vergleich zweier verbundener Messungen (gleiche Personen, Prä/Post) | ttest_rel() |
In der Praxis ist der unabhängige t-Test (auch Zweistichproben-t-Test genannt) der häufigste Anwendungsfall – etwa wenn Sie zwei Gruppen in einer Befragung oder einem Experiment miteinander vergleichen. Die folgenden Abschnitte behandeln alle drei Varianten mit konkretem Python-Code.
Voraussetzungen prüfen bevor Sie rechnen
Bevor Sie den Test starten, sollten Sie drei Voraussetzungen überprüfen:
- Metrisches Skalenniveau der abhängigen Variable
- Normalverteilung innerhalb jeder Gruppe (bei kleinen Stichproben besonders relevant)
- Varianzhomogenität zwischen den Gruppen (nur beim unabhängigen t-Test)
Die Normalverteilung können Sie mit dem Shapiro-Wilk-Test prüfen (scipy.stats.shapiro()). Für die Varianzhomogenität bietet sich Levene’s Test an (scipy.stats.levene()).
Unabhängiger t-Test in Python (scipy)
Der unabhängige t-Test vergleicht die Mittelwerte zweier unabhängiger Stichproben. Die Nullhypothese lautet: Die Mittelwerte beider Populationen sind gleich. Die Funktion ttest_ind() nimmt standardmäßig gleiche Varianzen an – mit dem Parameter equal_var=False aktivieren Sie stattdessen den Welch-t-Test, der bei ungleichen Varianzen oder unterschiedlichen Gruppengrößen robuster ist.
import numpy as np
from scipy import stats
# Beispieldaten: Prüfungspunkte zweier Gruppen
gruppe_a = np.array([72, 68, 75, 80, 65, 70, 78, 74, 69, 73])
gruppe_b = np.array([65, 60, 58, 63, 67, 55, 61, 64, 59, 62])
# Voraussetzungen prüfen
stat_a, p_shapiro_a = stats.shapiro(gruppe_a)
stat_b, p_shapiro_b = stats.shapiro(gruppe_b)
print(f"Shapiro-Wilk Gruppe A: W={stat_a:.3f}, p={p_shapiro_a:.3f}")
print(f"Shapiro-Wilk Gruppe B: W={stat_b:.3f}, p={p_shapiro_b:.3f}")
# Levene-Test auf Varianzhomogenität (informativ)
stat_lev, p_lev = stats.levene(gruppe_a, gruppe_b)
print(f"Levene-Test: W={stat_lev:.3f}, p={p_lev:.3f}")
# Welch-t-Test (equal_var=False = robustere Wahl)
t_stat, p_wert = stats.ttest_ind(gruppe_a, gruppe_b, equal_var=False)
print(f"\nWelch-t-Test:")
print(f"t = {t_stat:.3f}, p = {p_wert:.3f}")
# Konfidenzintervall
ergebnis = stats.ttest_ind(gruppe_a, gruppe_b, equal_var=False)
ki = ergebnis.confidence_interval(confidence_level=0.95)
print(f"95%-KI der Mittelwertdifferenz: [{ki.low:.3f}, {ki.high:.3f}]")
Parameter im Überblick
Die Funktion ttest_ind() bietet mehrere nützliche Parameter, die Sie kennen sollten:
equal_var=False: Aktiviert den Welch-t-Test (empfohlen als Standard)alternative='two-sided': Zweiseitige Hypothese (Standard);'greater'oder'less'für einseitige Testsnan_policy='omit': Fehlende Werte werden ignoriert – nützlich bei unvollständigen Datensätzentrim: Für einen getrimmten Yuen-t-Test bei Ausreißern oder langen Verteilungsschwänzen
Wer seine Daten bereits mit pandas eingelesen und vorbereitet hat, kann Gruppen direkt aus einem DataFrame herausfiltern und an ttest_ind() übergeben.
Abhängiger t-Test in Python (Paardifferenzen)
Den abhängigen t-Test verwenden Sie, wenn dieselben Personen zweimal gemessen wurden – klassischerweise in einem Prä-Post-Design. Er berechnet intern die Differenz zwischen den Paaren und testet, ob diese Differenz von null verschieden ist.
from scipy import stats
# Prä- und Post-Messungen derselben Personen
prä = [55, 60, 58, 62, 57, 63, 59, 61, 56, 64]
post = [60, 65, 62, 67, 63, 68, 64, 65, 61, 69]
# Abhängiger t-Test
t_stat, p_wert = stats.ttest_rel(prä, post)
print(f"t = {t_stat:.3f}, p = {p_wert:.3f}")
# Mittlere Differenz
import numpy as np
differenzen = np.array(post) - np.array(prä)
print(f"Mittlere Differenz: {differenzen.mean():.2f}")
print(f"SD der Differenzen: {differenzen.std(ddof=1):.2f}")
Achten Sie darauf, dass die Reihenfolge der Beobachtungen in beiden Arrays übereinstimmt – jede Zeile muss derselben Person entsprechen. Ein häufiger Flüchtigkeitsfehler ist das versehentliche Mischen der Reihenfolge beim Einlesen aus verschiedenen Datenquellen.
Einstichproben-t-Test in Python
Manchmal möchten Sie prüfen, ob der Mittelwert Ihrer Stichprobe von einem theoretischen oder in der Literatur berichteten Referenzwert abweicht. Hier kommt der Einstichproben-t-Test zum Einsatz.
from scipy import stats
import numpy as np
# Beispiel: Selbstwirksamkeitswerte Ihrer Stichprobe
werte = np.array([3.8, 4.1, 3.9, 4.3, 3.7, 4.0, 4.2, 3.6, 4.1, 3.8])
# Test gegen den Skalenmittelpunkt (z. B. 3.5 auf einer 5-Punkt-Skala)
referenzwert = 3.5
t_stat, p_wert = stats.ttest_1samp(werte, popmean=referenzwert)
print(f"Stichprobenmittelwert: M = {werte.mean():.3f}")
print(f"t({len(werte)-1}) = {t_stat:.3f}, p = {p_wert:.3f}")
Effektstärke berechnen: Cohens d
Ein statistisch signifikantes Ergebnis sagt noch nichts darüber aus, wie bedeutsam der Unterschied in der Praxis ist. Deshalb sollten Sie immer die Effektstärke berichten – für den t-Test ist das standardmäßig Cohens d.
Cohens d (unabhängige Stichproben)
Die gepoolte Standardabweichung berechnet sich als:
Gepoolte Standardabweichung
Da scipy selbst kein Cohens d liefert, berechnen Sie es manuell oder nutzen die Bibliothek pingouin, die diesen Wert direkt ausgibt:
import numpy as np
def cohens_d(gruppe1, gruppe2):
n1, n2 = len(gruppe1), len(gruppe2)
s1, s2 = np.std(gruppe1, ddof=1), np.std(gruppe2, ddof=1)
s_pooled = np.sqrt(((n1 - 1) * s1**2 + (n2 - 1) * s2**2) / (n1 + n2 - 2))
return (np.mean(gruppe1) - np.mean(gruppe2)) / s_pooled
# Mit den Beispieldaten von oben
d = cohens_d(gruppe_a, gruppe_b)
print(f"Cohens d = {d:.3f}")
# Alternativ mit pingouin (pip install pingouin)
# import pingouin as pg
# pg.ttest(gruppe_a, gruppe_b, correction=True)
Orientierungswerte für Cohens d
Interpretation von Cohens d
- d ≈ 0.20: kleiner Effekt
- d ≈ 0.50: mittlerer Effekt
- d ≈ 0.80: großer Effekt
Diese Konventionen stammen von Jacob Cohen und sind in der sozialwissenschaftlichen Literatur weit verbreitet. In manchen Fächern gelten andere Maßstäbe – prüfen Sie im Zweifel, was in Ihrer Disziplin üblich ist. Wer die statistische Auswertung für eine Abschlussarbeit vorbereitet, sollte die Effektstärke grundsätzlich neben dem p-Wert berichten – das ist heute methodischer Standard.
Ergebnisse korrekt berichten
Die Ergebnisse eines t-Tests werden in wissenschaftlichen Arbeiten nach einem standardisierten Schema berichtet. Orientieren Sie sich am folgenden Format:
Es wurde ein Welch-t-Test für unabhängige Stichproben durchgeführt. Die Gruppe A erzielte signifikant höhere Punktzahlen (M = 72.40, SD = 4.48) als Gruppe B (M = 61.20, SD = 3.49), t(17.43) = 6.37, p < .001, d = 2.77, 95%-KI [7.12, 15.28].
Beachten Sie dabei folgende Punkte:
- Die Freiheitsgrade beim Welch-t-Test sind nicht ganzzahlig – das ist korrekt und kein Fehler
- Bei p < .001 schreibt man nicht den genauen Wert, sondern diese Konvention
- Das Konfidenzintervall bezieht sich auf die Differenz der Mittelwerte, nicht auf einzelne Mittelwerte
- Freiheitsgrade, Teststatistik, p-Wert, Effektstärke und KI sollten vollständig angegeben werden
Eine methodisch fundierte Grundlage für den Zweistichproben-t-Test bieten auch die formalen Definitionen und ein numerisches Berichtsbeispiel mit echten Fahrzeugdaten, an dem sich der korrekte Berichtsweg gut nachvollziehen lässt.
Wer seine Ergebnisse anschließend für die Abschlussarbeit aufbereiten möchte, findet im Beitrag zu Python-Ergebnissen für Abschlussarbeiten exportieren praktische Hinweise zur Formatierung und Tabellenausgabe.
Häufige Fehler und wie Sie sie vermeiden
Student statt Welch verwenden
Der klassische Student-t-Test setzt Varianzhomogenität voraus. Bei ungleichen Varianzen und ungleichen Stichprobengrößen kann er zu stark verzerrten Ergebnissen führen. Der Welch-t-Test ist robuster und hat bei erfüllter Varianzhomogenität kaum Nachteile – er ist daher in den meisten Situationen die bessere Wahl. Setzen Sie deshalb bewusst equal_var=False, statt auf die Standardeinstellung zu vertrauen.
Einseitige vs. zweiseitige Hypothese verwechseln
Standardmäßig führt ttest_ind() einen zweiseitigen Test durch. Wenn Sie eine gerichtete Hypothese haben (z. B. „Gruppe A schneidet besser ab als Gruppe B“), können Sie alternative='greater' setzen – aber nur, wenn diese Richtung vor der Datenerhebung festgelegt wurde. Eine Hypothese post-hoc zu ändern, um ein signifikantes Ergebnis zu erzielen, ist methodisch nicht zulässig.
Fehlende Werte ignorieren
Enthält Ihr Datensatz NaN-Werte, liefert ttest_ind() standardmäßig ebenfalls NaN. Setzen Sie nan_policy='omit', um fehlende Werte listenweise auszuschließen. Wie Sie fehlende Werte systematisch behandeln, bevor Sie inferenzstatistische Verfahren anwenden, ist ein eigenes Thema – einen Überblick dazu finden Sie im Beitrag zu fehlenden Werten in Python.
Signifikanz mit Relevanz verwechseln
Ein p-Wert unter 0.05 bedeutet nicht automatisch, dass der Unterschied praktisch bedeutsam ist. Bei großen Stichproben werden selbst minimale Unterschiede statistisch signifikant. Berichten Sie deshalb immer auch die Effektstärke – sie ist das entscheidende Maß für die inhaltliche Bedeutung Ihres Befunds.