Was ist der Unterschied zwischen statsmodels und scipy in Python?
In diesem Beitrag
Die kurze Antwort: Wofür steht jedes Paket?
scipy.stats liefert einzelne statistische Funktionen und Tests – schnell, kompakt, ohne viel Overhead. statsmodels schätzt vollständige statistische Modelle mit ausführlichen Ergebnisberichten, Koeffizienten, Konfidenzintervallen und Diagnosewerten. Vereinfacht gesagt: scipy.stats ist der Werkzeugkasten für einzelne Berechnungen, statsmodels ist das Analyseframework für interpretierbare Modelle.
Für Studierende, die eine Abschlussarbeit mit Python auswerten, ist diese Unterscheidung praktisch wichtig: Ein einfacher t-Test oder ein Chi-Quadrat-Test lässt sich bequem über scipy lösen. Sobald Sie aber eine Regressionsanalyse durchführen und die Koeffizienten, Standardfehler und das Bestimmtheitsmaß sauber berichten müssen, führt kein Weg an statsmodels vorbei.
scipy.stats – numerische Bausteine für statistische Tests
SciPy ist primär eine wissenschaftliche Computing-Bibliothek. Als breites Fundament für numerische Algorithmen deckt sie Teilgebiete wie Optimierung, Integration, Interpolation, Eigenwertprobleme und algebraische Gleichungen ab – mit über 600 Beitragenden und mehr als 100.000 abhängigen Repositories einer der meistgenutzten Bausteine im wissenschaftlichen Python-Ökosystem. SciPy baut auf NumPy auf und dient seinerseits als Grundlage für höherstufige Bibliotheken wie scikit-learn.
Das Submodul scipy.stats ist der statistisch relevante Teil davon. Laut der offiziellen Dokumentation umfasst es Wahrscheinlichkeitsverteilungen, zusammenfassende Statistiken, Häufigkeitsstatistiken, Korrelationen, statistische Tests und Kerndichteschätzung. Für Verteilungen stehen generische Klassen für kontinuierliche und diskrete Zufallsvariablen bereit, über die sich Dichtefunktionen, Quantile und Zufallszahlen einheitlich abrufen lassen.
Was scipy.stats typischerweise liefert
- Einstichproben-, Zweistichproben- und gepaarte t-Tests
- Chi-Quadrat-Tests und Mann-Whitney-U-Test
- Pearson- und Spearman-Korrelation
- Normalverteilungstests (Shapiro-Wilk, Kolmogorov-Smirnov)
- Verteilungsobjekte mit PDF, CDF und Quantilfunktionen
- Deskriptive Kennwerte wie Schiefe und Kurtosis
Das Ergebnis einer scipy-Funktion ist typischerweise ein kompaktes Tupel aus Teststatistik und p-Wert – nützlich, aber ohne reichhaltige Modellzusammenfassung. Regression, lineare Modelle und Zeitreihenanalyse nennt die Dokumentation selbst als Themen, die außerhalb des Kernfokus von SciPy liegen.
statsmodels – Modellschätzung und Inferenz
statsmodels ist von Grund auf anders konzipiert. Es geht nicht darum, eine einzelne Teststatistik zu berechnen, sondern ein statistisches Modell vollständig zu schätzen, zu diagnostizieren und zu berichten. Der Fokus liegt auf Inferenz: Welche Koeffizienten sind signifikant? Wie gut passt das Modell? Welche Voraussetzungen sind erfüllt?
Die Regressionsfunktionalität von statsmodels zeigt das exemplarisch: Als Modellklassen stehen Ordinary Least Squares, Weighted Least Squares, Generalized Least Squares und GLS mit autoregressiver Fehlerstruktur zur Verfügung – damit steht nicht nur ein einzelner Fit im Mittelpunkt, sondern die Modellannahme über die Fehlerkovarianzstruktur. Das ist ein konzeptionell anderer Ansatz als in scipy.
Was eine typische statsmodels-Ausgabe enthält
- Koeffizienten mit Standardfehlern, t-Werten und p-Werten
- Bestimmtheitsmaß R² und adjustiertes R²
- F-Statistik für den Gesamtmodelltest
- Konfidenzintervalle für alle Schätzer
- Diagnosemaße wie AIC, BIC und Log-Likelihood
- Residualdiagnose und Modellannahmenprüfung
Für eine Abschlussarbeit, in der Ergebnisse nachvollziehbar berichtet und methodisch begründet werden müssen, ist diese Vollständigkeit entscheidend. Wer Python für die statistische Auswertung einer Abschlussarbeit einsetzt, wird für Regressionen, ANCOVA oder Zeitreihenmodelle fast zwangsläufig auf statsmodels zurückgreifen.
Direkter Vergleich: Was kann welches Paket?
| Kriterium | scipy.stats | statsmodels |
|---|---|---|
| Primärer Zweck | Einzelne statistische Funktionen & Tests | Statistische Modellschätzung & Inferenz |
| Ergebnisobjekt | Kompaktes Tupel (Statistik, p-Wert) | Reichhaltiges Modellobjekt mit Summary |
| t-Test | ✓ (direkt, wenig Code) | ✓ (über OLS möglich, aber umständlicher) |
| Lineare Regression | Sehr eingeschränkt | ✓ OLS, WLS, GLS, robuste Regression |
| Logistische Regression | ✗ | ✓ GLM mit Logit-Link |
| Zeitreihenmodelle | ✗ | ✓ ARIMA, SARIMA, VAR u.a. |
| Verteilungsobjekte | ✓ umfangreich (100+ Verteilungen) | Eingeschränkt |
| Normalverteilungstests | ✓ Shapiro-Wilk, K-S, Anderson-Darling | Teilweise vorhanden |
| Modellannahmenprüfung | Über separate Funktionen | ✓ integriert (Residualplots, Diagnosemaße) |
| Lernaufwand | Gering | Mittel (mehr API-Konzepte) |
Wann nehmen Sie welches Paket?
Die Entscheidung hängt davon ab, was Ihre Analyse leisten muss. Hier eine pragmatische Orientierung für den Forschungsalltag:
Greifen Sie zu scipy.stats, wenn Sie …
- einen t-Test, Mann-Whitney-U oder Chi-Quadrat-Test durchführen möchten
- Normalverteilung oder Varianzhomogenität prüfen
- eine Korrelation (Pearson, Spearman) berechnen
- mit Wahrscheinlichkeitsverteilungen arbeiten (z. B. Quantile berechnen)
- schnell ein numerisches Ergebnis in einer größeren Pipeline benötigen
Greifen Sie zu statsmodels, wenn Sie …
- eine lineare oder logistische Regression schätzen und berichten
- Koeffizienten mit Konfidenzintervallen und Signifikanzniveaus benötigen
- Zeitreihenmodelle (ARIMA, SARIMA) aufbauen
- Modellvergleiche über AIC/BIC durchführen
- eine Analyse im akademischen Stil dokumentieren müssen
Einen detaillierten Überblick über das gesamte Python-Ökosystem für die Analyse – von pandas über matplotlib bis hin zu scikit-learn – bietet der Beitrag zu den Python-Tools für die Datenanalyse.
Codebeispiel: t-Test und Regression im Vergleich
Das folgende Beispiel zeigt denselben Datensatz einmal mit scipy (t-Test) und einmal mit statsmodels (OLS-Regression). Beide Vorgehensweisen ergänzen sich in einer typischen Analyse.
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.api as sm
# Beispieldaten: Testergebnisse zweier Gruppen
np.random.seed(42)
gruppe_a = np.random.normal(loc=75, scale=10, size=50)
gruppe_b = np.random.normal(loc=70, scale=10, size=50)
# --- scipy.stats: Unabhängiger t-Test ---
t_stat, p_wert = stats.ttest_ind(gruppe_a, gruppe_b)
print(f"t-Statistik: {t_stat:.3f}, p-Wert: {p_wert:.3f}")
# Ausgabe: ein kompaktes Tupel – Teststatistik und p-Wert, mehr nicht.
# --- statsmodels: OLS-Regression ---
# Fragestellung: Erklärt die Gruppenzugehörigkeit (0/1) das Testergebnis?
ergebnis = np.concatenate([gruppe_a, gruppe_b])
gruppe_dummy = np.array([1] * 50 + [0] * 50)
X = sm.add_constant(gruppe_dummy) # Intercept hinzufügen
modell = sm.OLS(ergebnis, X).fit()
print(modell.summary())
# Ausgabe: vollständige Regressionstabelle mit R², F-Statistik,
# Koeffizienten, Standardfehlern, t-Werten, p-Werten, 95%-KI
Der Unterschied in der Ausgabe ist direkt spürbar: scipy gibt zwei Zahlen zurück, statsmodels eine vollständige Modellzusammenfassung. Letztere lässt sich mit wenigen Zeilen direkt in den Methodenteil einer Abschlussarbeit überführen. Wie Sie dabei vorgehen, beschreibt der Beitrag zum t-Test in Python im Detail.
scipy.stats.linregress() durch und wundern sich, warum die Ausgabe so dünn ist. linregress() ist auf einfache bivariate Regression beschränkt und liefert keine vollständige Inferenztabelle. Für alles, was über zwei Variablen hinausgeht, brauchen Sie statsmodels.Wenn Sie nach der Analyse Ihre Ergebnisse sauber für die Abschlussarbeit aufbereiten möchten, lohnt sich außerdem ein Blick auf den Beitrag zum Export von Python-Ergebnissen.
Fazit: Kein Entweder-oder
scipy.stats und statsmodels sind keine Konkurrenten – sie ergänzen sich. In der Praxis nutzen erfahrene Anwenderinnen und Anwender beide Pakete im selben Skript: scipy für Voraussetzungstests und einfache Kennwerte, statsmodels für das eigentliche statistische Modell.
Für Abschlussarbeiten gilt als Faustregel: Sobald Sie Ergebnisse im Methodenteil berichten und statistisch begründen müssen, ist statsmodels die richtigere Wahl. Für schnelle Zwischenrechnungen und Diagnosetests ist scipy.stats oft die einfachere Option.
Wer unsicher ist, welches Verfahren für die eigene Fragestellung geeignet ist, oder wer Unterstützung bei der Umsetzung in Python benötigt, findet bei QuantExpert kompetente Begleitung: Unsere Python-Hilfe für statistische Auswertungen richtet sich speziell an Studierende und Promovierende, die ihre empirischen Analysen methodisch sauber durchführen möchten.