Wie geht man mit fehlenden Werten in Python um?
In diesem Beitrag
- Was sind fehlende Werte und wie entstehen sie?
- Die drei Typen fehlender Werte: MCAR, MAR und MNAR
- Fehlende Werte in Python erkennen und diagnostizieren
- Fehlende Werte löschen: Wann ist das vertretbar?
- Fehlende Werte imputieren: Methoden im Überblick
- Multiple Imputation: Der methodisch sauberste Weg
- Empfohlener Workflow für Abschlussarbeiten
Was sind fehlende Werte und wie entstehen sie?
Fehlende Werte sind eines der häufigsten Probleme bei empirischen Auswertungen – und einer der am häufigsten unterschätzten Schritte im Datenbereinigungsprozess. In Python begegnen sie Ihnen in der Regel als NaN (Not a Number), NaT (Not a Time) oder None, je nachdem mit welchem Datentyp Sie arbeiten.
Fehlende Werte entstehen in der Forschungspraxis auf vielfältige Weise: Befragte überspringen einzelne Fragen, Messgeräte liefern keine Daten, Datenbankeinträge sind unvollständig, oder beim Import von CSV- oder Excel-Dateien bleiben Zellen leer. In jedem dieser Fälle muss eine bewusste methodische Entscheidung getroffen werden – Ignorieren ist keine Option.
numpy.nan für numerische Spalten, pd.NaT für Datums- und Zeitdaten sowie pd.NA für nullable Datentypen wie Int64Dtype oder StringDtype. Diese Unterschiede wirken sich direkt auf Berechnungen und Modellkompatibilität aus – ein Punkt, den die offizielle pandas-Dokumentation zu fehlenden Werten besonders betont.Für Ihre Abschlussarbeit ist das keine rein technische Frage: Die Art, wie Sie mit fehlenden Werten umgehen, beeinflusst die Validität Ihrer Ergebnisse und muss im Methodenteil begründet werden.
Die drei Typen fehlender Werte: MCAR, MAR und MNAR
Bevor Sie in Python irgendetwas bereinigen, sollten Sie verstehen, warum Werte fehlen. Die Statistik unterscheidet drei grundlegende Mechanismen:
- MCAR – Missing Completely at Random: Das Fehlen ist völlig zufällig und hängt weder mit dem fehlenden Wert selbst noch mit anderen Variablen zusammen. Das ist der günstigste Fall – Löschen verzerrt hier nicht.
- MAR – Missing at Random: Das Fehlen hängt von anderen beobachteten Variablen ab, nicht vom fehlenden Wert selbst. Beispiel: Ältere Personen überspringen öfter eine bestimmte Frage. Dieser Fall lässt sich durch Imputation gut handhaben.
- MNAR – Missing Not at Random: Das Fehlen hängt vom fehlenden Wert selbst ab. Beispiel: Personen mit sehr hohem Einkommen machen keine Angaben zum Einkommen. Dieser Fall ist methodisch anspruchsvoll und lässt sich nicht einfach wegimputieren.
Für Ihre statistische Auswertung in der Abschlussarbeit gilt: Benennen Sie den Typ fehlender Werte explizit und begründen Sie Ihre Wahl der Behandlungsstrategie daran.
Fehlende Werte in Python erkennen und diagnostizieren
Der erste Schritt im Umgang mit fehlenden Werten ist immer die Diagnose. Wie viele Werte fehlen? In welchen Spalten? Gibt es Muster?
Grundlegende Erkennung mit pandas
Die zentralen Funktionen sind isna() und notna(). Kombiniert mit sum() und mean() erhalten Sie schnell eine Übersicht:
import pandas as pd
import numpy as np
# Beispieldatensatz laden
df = pd.read_csv("fragebogen.csv")
# Anzahl fehlender Werte pro Spalte
print(df.isna().sum())
# Anteil fehlender Werte pro Spalte (in Prozent)
print(df.isna().mean() * 100)
# Zeilen mit mindestens einem fehlenden Wert
print(df[df.isna().any(axis=1)])
# Gesamtüberblick
print(f"Fehlende Werte gesamt: {df.isna().sum().sum()}")
print(f"Anteil am Datensatz: {df.isna().mean().mean() * 100:.2f}%")
Muster fehlender Werte visualisieren
Für eine visuelle Diagnose empfiehlt sich das Paket missingno. Es zeigt auf einen Blick, ob fehlende Werte zufällig über den Datensatz verteilt sind oder ob sie in bestimmten Zeilen oder Spalten gehäuft auftreten – ein wichtiger Hinweis auf den zugrunde liegenden Mechanismus (MCAR vs. MAR).
import missingno as msno
import matplotlib.pyplot as plt
# Matrix-Darstellung: zeigt Muster fehlender Werte
msno.matrix(df)
plt.show()
# Heatmap: zeigt Korrelation zwischen fehlenden Werten
msno.heatmap(df)
plt.show()
missingno fehlende Werte gleichzeitig in mehreren Spalten auftreten (horizontale Lücken in denselben Zeilen), deutet das auf einen systematischen Ausfallmechanismus hin – also eher MAR oder MNAR als MCAR.Fehlende Werte löschen: Wann ist das vertretbar?
Das Löschen von Zeilen oder Spalten mit fehlenden Werten – auch listenweiser Fallausschluss oder complete case analysis genannt – ist die einfachste Strategie und in pandas mit dropna() schnell umgesetzt.
import pandas as pd
df = pd.read_csv("fragebogen.csv")
# Alle Zeilen mit mindestens einem fehlenden Wert entfernen
df_clean = df.dropna()
# Nur Zeilen entfernen, in denen bestimmte Spalten fehlen
df_clean = df.dropna(subset=["alter", "einkommen", "zufriedenheit"])
# Spalten entfernen, in denen mehr als 30% fehlen
threshold = len(df) * 0.7
df_clean = df.dropna(thresh=threshold, axis=1)
print(f"Ursprüngliche Zeilen: {len(df)}")
print(f"Zeilen nach Bereinigung: {len(df_clean)}")
Das Löschen ist nur dann methodisch vertretbar, wenn die fehlenden Werte MCAR sind und der Anteil fehlender Werte gering ist – in der Praxis wird häufig ein Grenzwert von etwa 5 % genannt. Bei höheren Anteilen oder wenn MAR/MNAR vorliegt, entstehen durch den listenweisen Fallausschluss verzerrte Stichproben und damit verzerrte Ergebnisse.
Fehlende Werte imputieren: Methoden im Überblick
Imputation bezeichnet das Schätzen fehlender Werte auf Basis der vorhandenen Daten. In Python stellt vor allem scikit-learn dafür komfortable Werkzeuge bereit. Grundsätzlich unterscheidet man univariate von multivariater Imputation.
Univariate Imputation mit SimpleImputer
Bei der univariaten Imputation wird ein fehlender Wert ausschließlich durch Informationen aus derselben Spalte ersetzt – typischerweise durch den Mittelwert, Median oder häufigsten Wert (Modus).
import pandas as pd
from sklearn.impute import SimpleImputer
import numpy as np
df = pd.read_csv("fragebogen.csv")
# Mittelwert-Imputation für numerische Spalten
imputer_mean = SimpleImputer(strategy="mean")
df[["alter", "einkommen"]] = imputer_mean.fit_transform(df[["alter", "einkommen"]])
# Median-Imputation (robuster bei Ausreißern)
imputer_median = SimpleImputer(strategy="median")
df[["reaktionszeit"]] = imputer_median.fit_transform(df[["reaktionszeit"]])
# Modus-Imputation für kategoriale Variablen
imputer_mode = SimpleImputer(strategy="most_frequent")
df[["bildungsgrad"]] = imputer_mode.fit_transform(df[["bildungsgrad"]])
print(df.isna().sum())
Mittelwert- und Medianimputation sind schnell und verständlich, verzerren aber die Varianz der Variablen – die imputierten Fälle sind künstlich homogen. Für deskriptive Auswertungen mit wenigen fehlenden Werten mag das ausreichen; für inferenzstatistische Analysen wie t-Tests oder Regressionsanalysen ist das jedoch kritisch zu sehen.
Multivariate Imputation mit KNNImputer
Eine deutlich bessere Alternative ist die multivariate Imputation: Dabei werden zur Schätzung eines fehlenden Wertes auch andere Variablen im Datensatz herangezogen. Der KNNImputer (k-Nearest Neighbors) ersetzt fehlende Werte durch den gewichteten Durchschnitt der k ähnlichsten Beobachtungen.
import pandas as pd
from sklearn.impute import KNNImputer
df = pd.read_csv("fragebogen.csv")
numerische_spalten = ["alter", "einkommen", "zufriedenheit", "reaktionszeit"]
# KNN-Imputation mit 5 Nachbarn
knn_imputer = KNNImputer(n_neighbors=5)
df[numerische_spalten] = knn_imputer.fit_transform(df[numerische_spalten])
print(df[numerische_spalten].isna().sum())
KNN-Imputation ist besonders sinnvoll, wenn Variablen untereinander korreliert sind – was in sozialwissenschaftlichen und psychologischen Datensätzen häufig der Fall ist. Der Nachteil: Die Methode ist rechenintensiver und bei sehr großen Datensätzen langsam.
Iterative Imputation (MICE-ähnlich)
Der IterativeImputer in scikit-learn modelliert jede Variable mit fehlenden Werten als Funktion der anderen Variablen und iteriert diesen Prozess mehrfach. Die Methode ist konzeptionell eng verwandt mit dem MICE-Ansatz (Multivariate Imputation by Chained Equations). In der Fachliteratur gilt dieser Ansatz als besonders leistungsfähig, weil er multivariate Abhängigkeiten zwischen Variablen berücksichtigt und so deutlich weniger Informationsverlust verursacht als listenweiser Fallausschluss.
import pandas as pd
from sklearn.experimental import enable_iterative_imputer # muss importiert werden
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
df = pd.read_csv("fragebogen.csv")
numerische_spalten = ["alter", "einkommen", "zufriedenheit", "reaktionszeit"]
# Iterative Imputation (experimentell in scikit-learn)
iterative_imputer = IterativeImputer(
estimator=BayesianRidge(),
max_iter=10,
random_state=42
)
df[numerische_spalten] = iterative_imputer.fit_transform(df[numerische_spalten])
print(df[numerische_spalten].isna().sum())
Wichtig: Der IterativeImputer ist in scikit-learn noch als experimentell gekennzeichnet. Für Produktionsumgebungen oder sehr anspruchsvolle statistische Analysen empfiehlt sich daher der Blick auf vollständige Multiple-Imputation-Verfahren.
Multiple Imputation: Der methodisch sauberste Weg
Der IterativeImputer erzeugt einen einzigen imputierten Datensatz – das ist Single Imputation. Das Problem dabei: Die Unsicherheit, die durch die fehlenden Werte entsteht, wird unterschätzt. Standardfehler und Konfidenzintervalle fallen dadurch zu eng aus.
Die methodisch überlegene Lösung ist Multiple Imputation: Es werden mehrere vollständige Datensätze erzeugt (typischerweise 5–20), jeder wird separat analysiert, und die Ergebnisse werden anschließend nach Rubin’s Rules zusammengeführt. Diese Vorgehensweise berücksichtigt die Schätzunsicherheit angemessen.
Das Konzept dahinter ist methodisch klar fundiert: Multivariate Imputation durch verkettete Gleichungen, wie sie etwa im MICE-Verfahren implementiert ist, nutzt bedingte Imputationsmodelle und iteriert diese, um vollständige Datensätze zu erzeugen, die die ursprüngliche multivariate Struktur der Daten bewahren. Dieser Ansatz gilt in der methodischen Literatur als Goldstandard für MAR-Daten.
In Python lässt sich Multiple Imputation mit dem Paket miceforest umsetzen, das den MICE-Ansatz mit Random-Forest-Modellen kombiniert:
import pandas as pd
import miceforest as mf
df = pd.read_csv("fragebogen.csv")
# Kernel mit 5 imputierten Datensätzen erstellen
kernel = mf.ImputationKernel(
data=df,
datasets=5,
save_all_iterations=True,
random_state=42
)
# Imputation durchführen (3 Iterationen)
kernel.mice(3)
# Einen der imputierten Datensätze abrufen
df_imputed = kernel.complete_data(dataset=0)
# Diagnose: Verteilungen vergleichen
kernel.plot_imputed_distributions(wspace=0.3, hspace=0.4)
Für die statistische Auswertung in Ihrer Abschlussarbeit bedeutet das: Analysieren Sie jeden der imputierten Datensätze separat und fassen Sie die Ergebnisse zusammen. Das ist aufwändiger als eine einfache Imputation, aber methodisch deutlich sauberer – besonders wenn Ihre Ergebnisse in einer Dissertation oder einem Journal-Artikel veröffentlicht werden sollen.
Empfohlener Workflow für Abschlussarbeiten
Wie sieht ein praxistauglicher Umgang mit fehlenden Werten in einer empirischen Abschlussarbeit aus? Die folgende Checkliste fasst die wichtigsten Schritte zusammen.
Workflow: Fehlende Werte behandeln
- Diagnose: Anzahl und Anteil fehlender Werte pro Variable mit
isna().sum()undisna().mean()bestimmen - Muster prüfen: Mit
missingnovisualisieren, ob fehlende Werte zufällig verteilt oder systematisch gehäuft sind - Mechanismus bestimmen: MCAR, MAR oder MNAR – auf Basis inhaltlicher Überlegungen und ggf. Little’s MCAR-Test
- Strategie wählen: Bei < 5 % und MCAR: listenweiser Ausschluss vertretbar. Bei MAR: Imputation. Bei MNAR: zusätzliche Modellierung nötig
- Imputationsmethode festlegen: SimpleImputer für einfache Fälle, KNNImputer oder IterativeImputer für multivariate Daten, miceforest für Multiple Imputation
- Datentypen prüfen: Sicherstellen, dass Datentypen nach der Imputation korrekt sind (z. B. Integer vs. Float)
- Dokumentieren: Im Methodenteil der Arbeit transparent beschreiben: Anteil fehlender Werte, vermuteter Mechanismus, gewählte Strategie und Begründung
Ein sauber dokumentierter Umgang mit fehlenden Werten ist kein technisches Detail – er ist ein Qualitätsmerkmal Ihrer Arbeit. Gutachtende schauen zunehmend genau hin, ob Missing-Data-Strategien methodisch begründet sind.
| Methode | Python-Funktion | Geeignet bei | Nachteil |
|---|---|---|---|
| Listenweiser Ausschluss | dropna() |
MCAR, < 5 % fehlend | Informationsverlust, Stichprobenreduktion |
| Mittelwert-/Medianimputation | SimpleImputer |
Einfache deskriptive Analysen | Unterschätzt Varianz, keine Unsicherheit |
| KNN-Imputation | KNNImputer |
MAR, korrelierte Variablen | Rechenintensiv bei großen Datensätzen |
| Iterative Imputation | IterativeImputer |
MAR, multivariate Daten | Experimentell, Single Imputation |
| Multiple Imputation | miceforest |
MAR, inferenzstatistische Analysen | Komplex, höherer Aufwand |
Fehlende Werte sind in der Datenbereinigung als eigenem Schritt der Datenanalyse fest verankert – und sie gehören zu den Themen, bei denen selbst erfahrene Forschende gelegentlich methodische Fehler machen. Wer sich unsicher ist, wie er mit seinem spezifischen Datensatz umgehen soll, findet bei der methodischen Begleitung durch erfahrene Statistikerinnen und Statistiker eine verlässliche Orientierung – gerade dann, wenn die Wahl der Imputationsstrategie im Methodenteil begründet werden muss.
Das klingt insgesamt aufwändiger als es in der Praxis ist: Für die meisten Abschlussarbeiten reicht eine gut begründete, transparente Strategie – sei es ein dokumentierter listenweiser Ausschluss oder eine einfache KNN-Imputation. Wichtig ist nicht die Sophistiziertheit der Methode, sondern die methodische Reflexion dahinter.