Statistische Analyse
Überblick
Führen Sie Hypothesentests (t-Tests, ANOVA, Chi-Quadrat), Regression, Korrelation und bayesianische Analysen mit systematischer Annahmenprüfung, Effektstärken und APA-konformer Berichterstattung durch. Ziel ist eine Analyse, die ein Reviewer nicht auseinandernehmen könnte: der richtige Test, bestätigte Annahmen, ehrliche Effektstärken und ein vollständiger Ergebnisbericht.
Wann dieser Skill verwendet werden sollte
Verwenden Sie diesen Skill, wenn:
- Statistische Hypothesentests (t-Tests, ANOVA, Chi-Quadrat, nicht-parametrisch) durchgeführt werden
- Regressions- oder Korrelationsanalysen durchgeführt werden
- Bayessche statistische Analysen durchgeführt werden
- Statistische Annahmen und Diagnostik überprüft werden
- Effektstärken berechnet und Power-Analysen durchgeführt werden
- Statistische Ergebnisse im APA-Format berichtet werden
- Experimentelle oder beobachtende Daten für die Forschung analysiert werden
Installation
Verwenden Sie uv, um die in diesem Skill verwendeten Bibliotheken zu installieren. Pinnen Sie Versionen in der Produktion; ungepinnte Installationen sind für die Erkundung in Ordnung.
# Kern-Frequentist-Stack (Python 3.10+; 3.12+ empfohlen für neueste SciPy/ArviZ)
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn
# Bayesianische Modellierung (PyMC 5 + ArviZ)
uv pip install "pymc>=5.0" "arviz>=1.0"
Kompatibilitätshinweise (geprüft gegen Pingouin 0.6.1, StatsModels 0.14.6, ArviZ 1.2, 2026):
- Pingouin 0.6.0 hat Ausgabespalten umbenannt, um Sonderzeichen zu entfernen:
p_val,cohen_d,CI95,p_unc(früherp-val,cohen-d,CI95%,p-uncin 0.5.x). Die Beispiele unten verwenden die aktuellen Namen; bei Verwendung von 0.5.x verwenden Sie die Bindestrich-Formen. - StatsModels + SciPy: Verwenden Sie
statsmodels>=0.14.6mitscipy>=1.11, um_lazywhere-Importfehler bei SciPy 1.16+ zu vermeiden. - ArviZ 1.x:
az.summary()verwendet jetzt standardmäßig 89%-Intervalle (eti89-Spalten) und der Breitenparameter istci_prob(nichthdi_prob). Um ein konventionelles 95%-Kredibilitätsintervall zu melden, übergeben Sieaz.summary(trace, ci_prob=0.95). - Einseitige Bayes-Faktoren sind aus Pingouin entfernt:
pg.ttest(..., alternative='greater')lässt die SpalteBF10stillschweigend weg, undpg.bayesfactor_ttestgibt bei einseitigen Alternativen einen Fehler aus. Für einseitige bayesianische Tests verwenden Sie PyMC direkt (berechnen Sie die Posterior-Wahrscheinlichkeit der gerichteten Hypothese) oder JASP/R's BayesFactor.
Für modellspezifische APIs (OLS, GLM, ARIMA) siehe den Skill statsmodels. Für PyCM-Workflows siehe den Skill pymc.
Analyse-Workflow
Jede fundierte Analyse folgt dem gleichen Bogen. Schritte zu überspringen ist der Grund, warum Analysen zurückgezogen werden, also arbeiten Sie sie in der Reihenfolge durch und geben Sie an, was Sie bei jedem Schritt getan haben.
- Formulieren Sie die Frage, bevor Sie die Daten berühren. Geben Sie die Hypothese, die Ziel- und Prädiktorvariablen und das Design (unabhängig vs. gepaart, Anzahl der Gruppen) an. Legen Sie sich jetzt auf einen geplanten Test fest — den Test nach einem Blick auf die Ergebnisse auszuwählen, ist p-Hacking, auch wenn es unschuldig geschieht.
- Inspizieren Sie die Daten. Pro Gruppe: n, Mittelwert, SD, Median, fehlende Werte. Zeichnen Sie die Rohdaten (Histogramme oder Box-Plots) vor jedem Test. Ungleiche Gruppengrößen, fehlende Werte, Boden-/Deckeneffekte und Ausreißer ändern alle, welcher Test angemessen ist — zeigen Sie sie dem Benutzer an, anstatt stillschweigend um sie herumzuarbeiten.
- Wählen Sie den Test anhand der Kurzreferenz unten oder
references/test_selection_guide.mdfür Designs, die über die Grundlagen hinausgehen (Zählungen, Zeit bis zum Ereignis, Zuverlässigkeit, faktoriell). - Überprüfen Sie die Annahmen mit
scripts/assumption_checks.py. Wenn eine Annahme verletzt ist, wechseln Sie zum Ausweichtest (Tabelle unten) und berichten Sie sowohl den Plan als auch die Änderung. - Führen Sie den Test durch und berechnen Sie immer die Effektstärke parallel dazu — ein p-Wert sagt, dass ein Effekt existiert; die Effektstärke sagt, ob ihn jemand beachten sollte.
- Berichten Sie anhand der APA-Vorlagen unten, einschließlich deskriptiver Statistiken, exakter Statistiken, Effektstärken mit KI und der durchgeführten Annahmenprüfungen.
Wenn der Benutzer nur einen Schritt benötigt (z.B. „Wie viele Teilnehmer brauche ich?“), springen Sie direkt zu diesem Abschnitt — bestätigen Sie aber dennoch die Design-Annahmen, auf denen die Berechnung beruht.
Testauswahl-Leitfaden
Kurzreferenz: Den richtigen Test auswählen
Eine umfassende Anleitung für Zählungen, Überlebenszeit, Zuverlässigkeit, faktorielle Designs finden Sie in der Datei references/test_selection_guide.md. Kurzreferenz:
Zwei Gruppen vergleichen:
- Unabhängig, kontinuierlich, normal → Unabhängiger t-Test
- Unabhängig, kontinuierlich, nicht normal → Mann-Whitney-U-Test
- Gepaart, kontinuierlich, normal → Gepaarter t-Test
- Gepaart, kontinuierlich, nicht normal → Wilcoxon-Vorzeichenrangtest
- Binäres Ergebnis → Chi-Quadrat- oder exakter Fisher-Test
3+ Gruppen vergleichen:
- Unabhängig, kontinuierlich, normal → Einfaktorielle ANOVA
- Unabhängig, kontinuierlich, nicht normal → Kruskal-Wallis-Test
- Gepaart, kontinuierlich, normal → ANOVA mit Messwiederholung
- Gepaart, kontinuierlich, nicht normal → Friedman-Test
Beziehungen:
- Zwei kontinuierliche Variablen → Pearson-Korrelation (normal) oder Spearman-Korrelation (nicht normal)
- Kontinuierliches Ergebnis mit Prädiktor(en) → Lineare Regression
- Binäres Ergebnis mit Prädiktor(en) → Logistische Regression
Bayesianische Alternativen:
Alle Tests haben bayesianische Versionen, die direkte Wahrscheinlichkeitsaussagen über Hypothesen, Bayes-Faktoren zur Quantifizierung der Evidenz und die Möglichkeit zur Unterstützung der Nullhypothese bieten. Siehe references/bayesian_statistics.md.
Annahmenprüfung
Überprüfen Sie immer die Annahmen, bevor Sie Testergebnisse interpretieren, und berichten Sie die Prüfungen — Reviewer suchen danach.
Verwenden Sie das beigelegte Modul scripts/assumption_checks.py. Führen Sie Python aus dem Skill-Verzeichnis (skills/statistical-analysis/) aus oder fügen Sie scripts/ zu sys.path hinzu:
from assumption_checks import comprehensive_assumption_check
# Ausreißer + Normalität (pro Gruppe) + Varianzhomogenität, mit Plots
ergebnisse = comprehensive_assumption_check(
data=df,
value_col='score',
group_col='group', # Optional: für Gruppenvergleiche
alpha=0.05
)
Für gezielte Prüfungen importieren Sie einzelne Funktionen:
from assumption_checks import (
check_normality, # Shapiro-Wilk + Q-Q-Plot + Histogramm
check_normality_per_group,
check_homogeneity_of_variance, # Levene-Test + Box-Plots
check_linearity, # Streudiagramm + Residuen-Plot für einfache Regression
check_regression_diagnostics, # vollständige OLS-Diagnostik (siehe Regression unten)
detect_outliers # IQR- oder z-Score-Methoden
)
ergebnis = check_normality(data=df['score'], name='Testwert', alpha=0.05, plot=True)
print(ergebnis['interpretation'])
print(ergebnis['empfehlung'])
Was tun, wenn Annahmen verletzt werden
Normalität verletzt:
- Leichte Verletzung + n > 30 pro Gruppe → Fahren Sie mit dem parametrischen Test fort (robust)
- Mittelschwere Verletzung → Verwenden Sie die nicht-parametrische Alternative
- Schwere Verletzung → Transformieren Sie die Daten oder verwenden Sie den nicht-parametrischen Test
Varianzhomogenität verletzt:
- Für t-Test → Verwenden Sie den Welch-t-Test (
pg.ttestwendet ihn automatisch mitcorrection='auto'an) - Für ANOVA → Verwenden Sie Welch-ANOVA (
pg.welch_anova) oder Brown-Forsythe - Für Regression → Verwenden Sie robuste Standardfehler oder gewichtete kleinste Quadrate
Linearität verletzt (Regression):
- Fügen Sie polynomiale Terme hinzu, transformieren Sie Variablen oder verwenden Sie nichtlineare Modelle / GAM
Formale Tests werden mit wachsendem n überempfindlich: Für n ≥ 100 gewichten Sie den Q-Q-Plot stärker als den Shapiro-Wilk-p-Wert. Eine umfassende Anleitung finden Sie in der Datei references/assumptions_and_diagnostics.md.
Statistische Tests durchführen
Primäre Bibliotheken:
- pingouin: benutzerfreundliche Tests, die standardmäßig Effektstärken zurückgeben — bevorzugen für Standardtests
- scipy.stats: grundlegende statistische Tests
- statsmodels: Regression, Diagnostik, Power-Analyse
- pymc + arviz: bayesianische Modellierung und Diagnostik
T-Test mit vollständiger Berichterstattung
import pingouin as pg
# correction='auto' wendet die Welch-Korrektur an, wenn die Varianzen ungleich sind
ergebnis = pg.ttest(gruppe_a, gruppe_b, correction='auto')
# Pingouin >= 0.6 Spaltennamen
t_wert = ergebnis['T'].values[0]
df = ergebnis['dof'].values[0]
p_wert = ergebnis['p_val'].values[0]
cohens_d = ergebnis['cohen_d'].values[0]
ci_unten, ci_oben = ergebnis['CI95'].values[0] # KI für die mittlere Differenz
print(f"t({df:.0f}) = {t_wert:.2f}, p = {p_wert:.3f}, d = {cohens_d:.2f}")
ANOVA mit Post-hoc-Tests
import pingouin as pg
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)
# Effektstärke: partielles Eta-Quadrat
eta_p2 = aov['np2'].values[0]
# Wenn signifikant, führen Sie Post-hoc-Tests durch (Tukey HSD kontrolliert den Familientestfehler)
if aov['p_unc'].values[0] < 0.05:
posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
print(posthoc) # enthält Hedges' g pro Paar
Lineare Regression mit Diagnostik
import statsmodels.api as sm
from assumption_checks import check_regression_diagnostics
X = sm.add_constant(X_praediktoren) # Achsenabschnitt hinzufügen
modell = sm.OLS(y, X).fit()
print(modell.summary())
# 4-Feld-Residuen-Plot + Shapiro-Wilk, Breusch-Pagan, Durbin-Watson, VIF
diag = check_regression_diagnostics(modell)
print(diag['interpretation'])
print(diag['vif'])
# Wenn Heteroskedastizität gemeldet wurde, stattdessen robuste Standardfehler melden
robust = modell.get_robustcov_results('HC3')
Bayesianischer T-Test
import pymc as pm
import arviz as az
import numpy as np
with pm.Model() as modell:
# Priors
mu1 = pm.Normal('mu_gruppe1', mu=0, sigma=10)
mu2 = pm.Normal('mu_gruppe2', mu=0, sigma=10)
sigma = pm.HalfNormal('sigma', sigma=10)
# Likelihood
y1 = pm.Normal('y1', mu=mu1, sigma=sigma, observed=gruppe_a)
y2 = pm.Normal('y2', mu=mu2, sigma=sigma, observed=gruppe_b)
# Abgeleitete Größe
diff = pm.Deterministic('differenz', mu1 - mu2)
trace = pm.sample(2000, tune=1000)
# ArviZ 1.x verwendet standardmäßig 89%-Intervalle; für die Berichterstattung explizit 95% anfordern
print(az.summary(trace, var_names=['differenz'], ci_prob=0.95))
# Direkte Wahrscheinlichkeitsaussage (das wird aus einseitigen Fragen)
prob_groesser = np.mean(trace.posterior['differenz'].values > 0)
print(f"P(mu1 > mu2 | Daten) = {prob_groesser:.3f}")
# ArviZ 1.x hat az.plot_posterior entfernt; verwenden Sie plot_dist (unter 0.x funktioniert plot_posterior noch)
az.plot_dist(trace, var_names=['differenz'], ci_prob=0.95)
Skalieren Sie die Priors auf die Daten (z.B. sigma=10 passt für Ergebnisse mit SD nahe 10; verwenden Sie die beobachtete SD als Orientierung) und geben Sie die Priors im Bericht an.
Effektstärken
Effektstärken quantifizieren die Größe; p-Werte zeigen nur die Existenz an. Berichten Sie eine für jeden Test. Eine vollständige Anleitung finden Sie in der Datei references/effect_sizes_and_power.md.
Kurzreferenz: Häufige Effektstärken
| Test | Effektstärke | Klein | Mittel | Groß |
|---|---|---|---|---|
| t-Test | Cohens d | 0,20 | 0,50 | 0,80 |
| ANOVA | η²_p | 0,01 | 0,06 | 0,14 |
| Korrelation | r | 0,10 | 0,30 | 0,50 |
| Regression | R² | 0,02 | 0,13 | 0,26 |
| Chi-Quadrat | Cramérs V | 0,07 | 0,21 | 0,35 |
Die Benchmarks sind Konventionen, keine Gesetze – ein „kleiner“ Effekt kann enorm wichtig sein (Nebenwirkungen von Medikamenten) und ein „großer“ kann trivial sein. Interpretieren Sie im Kontext.
Effektstärken berechnen
Pingouin gibt Effektstärken mit seinen Tests zurück (cohen_d von pg.ttest, np2 von pg.anova, hedges von pg.pairwise_tukey; r von pg.corr ist bereits eine Effektstärke).
Konfidenzintervalle für Effektstärken
Berichten Sie ein KI für die Effektstärke, um ihre Genauigkeit zu zeigen. Verwenden Sie pg.compute_esci (Hinweis: pg.compute_effsize_from_t gibt nur den Punktschätzer zurück – es gibt kein KI zurück):
import pingouin as pg
d = pg.compute_effsize(gruppe_a, gruppe_b, eftype='cohen')
ci_unten, ci_oben = pg.compute_esci(stat=d, nx=len(gruppe_a), ny=len(gruppe_b),
eftype='cohen', confidence=0.95)
print(f"d = {d:.2f}, 95% KI [{ci_unten:.2f}, {ci_oben:.2f}]")
Power-Analyse
A-priori-Power-Analyse (Studienplanung)
Bestimmen Sie die erforderliche Stichprobengröße vor der Datenerhebung:
from statsmodels.stats.power import tt_ind_solve_power, FTestAnovaPower
# t-Test: Welcher n pro Gruppe ist nötig, um d = 0,5 zu erkennen?
n_erforderlich = tt_ind_solve_power(
effect_size=0.5,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Erforderliches n pro Gruppe: {n_erforderlich:.0f}")
# Einfaktorielle ANOVA: Welcher n ist nötig, um Cohens f = 0,25 zu erkennen?
# Hinweise: Der Parameter ist k_groups; effect_size ist Cohens f (f = sqrt(eta2/(1-eta2)));
# und solve_power gibt die GESAMTE Stichprobengröße zurück, nicht n pro Gruppe.
import math
anova_power = FTestAnovaPower()
n_gesamt = anova_power.solve_power(
effect_size=0.25,
k_groups=3,
alpha=0.05,
power=0.80
)
print(f"Erforderliche Gesamt-N: {math.ceil(n_gesamt)} ({math.ceil(n_gesamt / 3)} pro Gruppe)")
Sensitivitätsanalyse (Post-Study)
Bestimmen Sie, welche Effektstärke die Studie erkennen könnte:
# Mit n=50 pro Gruppe, welchen Effekt könnten wir bei 80% Power erkennen?
erkennbares_d = tt_ind_solve_power(
effect_size=None, # Löse nach diesem Wert
nobs1=50,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Studie könnte d >= {erkennbares_d:.2f} erkennen")
Hinweis: Post-hoc „beobachtete Power“ (Berechnung der Power aus dem beobachteten Effekt) ist zirkulär und irreführend – sie ist eine deterministische Funktion des p-Werts. Wenn eine Studie abgeschlossen ist und jemand nach Power fragt, führen Sie stattdessen eine Sensitivitätsanalyse durch.
Weitere detaillierte Anleitung finden Sie in der Datei references/effect_sizes_and_power.md.
Ergebnisse berichten
Die vollständige APA-Stil-Anleitung finden Sie in der Datei references/reporting_standards.md. Jeder Bericht benötigt:
- Deskriptive Statistiken: M, SD, n für alle Gruppen/Variablen
- Teststatistiken: Testname, Statistik, df, exakter p-Wert (
p = .034, nichtp < .05; verwenden Siep < .001nur unter .001) - Effektstärken: Mit Konfidenzintervallen
- Annahmenprüfungen: Welche Tests durchgeführt wurden, Ergebnisse und ergriffene Maßnahmen
- Alle geplanten Analysen: Einschließlich nicht signifikanter Ergebnisse – diese auszulassen ist Cherry-Picking
Beispiel-Berichtsvorlagen
Unabhängiger T-Test
Gruppe A (n = 48, M = 75,2, SD = 8,5) erzielte signifikant höhere Werte als
Gruppe B (n = 52, M = 68,3, SD = 9,2), t(98) = 3.34, p = .001, d = 0.68, 95% KI [0.27, 1.09].
Die Annahmen der Normalität (Shapiro-Wilk: W = 0.98, p = .245) und Varianzhomogenität
(Levene: F(1, 98) = 0.12, p = .730) wurden erfüllt.
Einfaktorielle ANOVA
Eine einfaktorielle ANOVA ergab einen signifikanten Unterschied in den
Leistungswerten zwischen den drei Gruppen, F(2, 87) = 5.21, p = .007,
pη² = .11, 90% KI [.02, .22]. Post-hoc Tukey-Tests zeigten, dass Gruppe A
(M = 82.4, SD = 7.3) signifikant höhere Werte erzielte als Gruppe C (M = 74.1,
SD = 8.7), p = .009, Hedges' g = 0.79, 95% KI [0.19, 1.38]. Es gab keinen
signifikanten Unterschied zwischen Gruppe A und B oder Gruppe B und C (p > .05).
Korrelation
Es gab eine signifikante positive Korrelation zwischen der Trainingsdauer und
den Leistungswerten, r(98) = .45, p < .001, 95% KI [.28, .60].
Logistische Regression
Ein logistisches Regressionsmodell mit Prädiktor, χ²(1) = 12,34, p < .001,
Nagelkerke-R² = .15, sagte 72,5% der Fälle korrekt voraus. Ein stetiger
Prädiktor war ein signifikanter Prädiktor für das binäre Ergebnis, OR = 1.25,
95% KI [1.08, 1.45], Wald-χ²(1) = 8.12, p = .004.
Verwandte Referenzen
references/test_selection_guide.md– Vollständiger Leitfaden zur Testauswahl für fortgeschrittene Designsreferences/effect_sizes_and_power.md– Ausführliche Anleitung zu Effektstärken, Power-Analyse mit interaktiven Beispielenreferences/reporting_standards.md– Vollständige APA-Berichterstattungsstandards mit Vorlagenreferences/assumptions_and_diagnostics.md– Umfassender Leitfaden zu Annahmen, Diagnostik und Ausweichstrategienreferences/bayesian_statistics.md– Leitfaden zu bayesianischen Alternativen für alle gängigen Tests