Python Tutorial für Data Science: Datenhandling mit pandas: Bereinigung & Qualität

Daten, die wir als Data Scientists erhalten, sind selten perfekt. Sie enthalten fehlende Werte, Ausreißer, uneinheitliche Datentypen oder schlecht formatierte Zeitstempel. Bevor Modelle trainiert oder Analysen erstellt werden können, ist eine gründliche Datenbereinigung notwendig. Dieses Kapitel behandelt die wichtigsten Schritte.

Fehlende Werte (Missing Values)

Definition:
Ein Missing Value ist ein fehlender oder nicht erfasster Datenpunkt. In pandas wird er oft als NaN (Not a Number) dargestellt. Fehlende Werte entstehen z. B. durch fehlerhafte Datenerhebung, nicht ausgefüllte Formulare oder fehlerhafte Importe.

Strategien zum Umgang mit Missing Values:

  • Entfernen: Ganze Zeilen oder Spalten löschen, wenn zu viele Werte fehlen.
  • Imputieren: Fehlende Werte durch sinnvolle Ersatzwerte auffüllen (z. B. Mittelwert, Median, Modus).
  • Fortschreiben: Bei Zeitreihen kann man den letzten bekannten Wert übernehmen (ffill) oder den nächsten (bfill).

Beispiel in Python:

import pandas as pd
import numpy as np

# Beispiel-Daten
data = {
    "age": [25, 30, np.nan, 40],
    "income": [50000, 60000, 55000, None]
}
df = pd.DataFrame(data)

print(df.isna().sum())   # Anzahl fehlender Werte je Spalte

# Imputation: Mittelwert für age
df["age"] = df["age"].fillna(df["age"].mean())

# Entfernen: Zeilen mit fehlendem Einkommen
df = df.dropna(subset=["income"])
print(df)

Ausreißer (Outliers)

Definition:
Ein Ausreißer ist ein Wert, der deutlich außerhalb des typischen Bereichs der Daten liegt. Sie können durch Messfehler entstehen oder reale Extremwerte darstellen.

Erkennungsmethoden:

  • Statistisch: Z-Score (Werte mit |z| > 3 gelten oft als Ausreißer).
  • IQR-Methode: Werte, die mehr als 1,5 * Interquartilsabstand außerhalb des Quartilbereichs liegen.
  • Visuell: Boxplots oder Scatterplots.

Beispiel:

import numpy as np

# Beispiel: Einkommen mit Ausreißer
incomes = np.array([50_000, 52_000, 49_000, 51_000, 200_000])

# IQR-Methode
q1, q3 = np.percentile(incomes, [25, 75])
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

outliers = incomes[(incomes < lower_bound) | (incomes > upper_bound)]
print("Ausreißer:", outliers)

Datentypen (Data Types)

Definition:
Ein Datentyp beschreibt, welche Art von Information eine Spalte enthält. In pandas gibt es u. a.:

  • int64 → Ganzzahlen
  • float64 → Kommazahlen
  • object → Texte
  • datetime64 → Zeitstempel
  • category → Kategorien (effizient bei wiederholten Textwerten)

Probleme:

  • Zahlen können fälschlicherweise als object eingelesen werden.
  • Kategorische Variablen (z. B. „männlich“, „weiblich“) brauchen spezielles Handling.
  • Zeitstempel liegen oft als Text vor.

Beispiel:

# Typen prüfen
print(df.dtypes)

# Typen umwandeln
df["income"] = df["income"].astype(float)
df["gender"] = df["gender"].astype("category")

Zeitstempel & Zeitzonen

Definition:
Ein Zeitstempel (engl. timestamp) ist ein Wert, der Datum und Uhrzeit speichert. In globalen Anwendungen ist es wichtig, Zeitzonen korrekt zu berücksichtigen.

Häufige Probleme:

  • Zeitangaben liegen als Text vor → müssen in datetime konvertiert werden.
  • Unterschiedliche Zeitzonen → können zu Fehlinterpretationen führen.
  • Sommerzeitumstellungen → beeinflussen Zeitreihen.

Beispiel:

# Beispiel mit Strings
df = pd.DataFrame({
    "event_time": ["2024-05-01 14:00:00", "2024-05-02 09:30:00"]
})

# Umwandeln in datetime
df["event_time"] = pd.to_datetime(df["event_time"])

# Zeitzone hinzufügen
df["event_time"] = df["event_time"].dt.tz_localize("Europe/Berlin")
print(df)

akeaways

  • Fehlende Werte immer prüfen und bewusst behandeln.
  • Ausreißer können echte Signale oder Rauschen sein → nicht blind entfernen.
  • Konsistente Datentypen sind Voraussetzung für Analysen.
  • Zeitstempel mit Zeitzonen sind oft tückisch, sollten aber korrekt verarbeitet werden.