Collider-Bias: Wie Datenfilterung falsche Korrelationen erzeugt
Ein Collider ist eine Variable C, die durch kausale Pfade von zwei anderen Variablen A und B beeinflusst wird: A → C ← B. Die Bedingung auf C – sei es durch Filtern oder Schichtung – erzeugt eine irreführende Korrelation zwischen A und B.
Realweltbeispiele:
- Alter → Nutzung → Qualität (überlebende Objekte wirken qualitativ besser).
- IQ → Studienzulassung → Elterliches Einkommen (unter Studierenden erscheinen wohlhabendere Personen weniger intelligent).
- Talent → Erfolg → Arbeitsmoral (erfolgreiche talentierte Personen wirken fauler).
In der Datenwissenschaft führt dies zu irreführenden Modellen: Gradient Boosting auf gefilterten Daten übernimmt den Bias.
Simulation mit gleichverteilten Daten
Wir generieren 1.000 unabhängige Punkte für A und B aus einer Gleichverteilung im Bereich (0,100). Der Collider-Flag wird gesetzt, wenn entweder A > 50 oder B > 50 gilt.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from statsmodels.nonparametric.smoothers_lowess import lowess
NUMBER_OF_VALUES = 1000
A_RANGE = (0, 100)
B_RANGE = (0, 100)
A_THRESHOLD = 50
B_THRESHOLD = 50
a = np.random.uniform(*A_RANGE, NUMBER_OF_VALUES)
b = np.random.uniform(*B_RANGE, NUMBER_OF_VALUES)
data = pd.DataFrame({'a': a, 'b': b})
data['flag'] = (data['a'] > A_THRESHOLD) | (data['b'] > B_THRESHOLD)
print(f"Korrelation zwischen A und B: {data['a'].corr(data['b']):.2f}")
print(f"Korrelation bei flag = True: {data[data['flag']]['a'].corr(data[data['flag']]['b']):.2f}")
Ergebnisse:
- Gesamtdaten: Korrelation ≈ 0,00
- Gefilterter Teil: Korrelation ≈ -0,34
Die Streudiagramm-Visualisierung zeigt, wie das Entfernen nichtüberlebender Punkte (blau) die Tendenz nach unten verschiebt.
sns.scatterplot(data=data, x='a', y='b', hue='flag', palette={True: 'red', False: 'blue'}, alpha=0.5)
sns.regplot(data=data, x='a', y='b', scatter=False, color='black')
plt.show()
Nach dem Filtern zeigt das lmplot eine negative Steigung: Das rechte obere Quadrant wird leer, was das Gleichgewicht stört.
Realistische Szenario: Normalverteilung
Nun verwenden wir np.random.normal: A ~ N(50,5), B ~ N(30,5). Der Collider ist probabilistisch: Werte normalisieren, Auswahlwahrscheinlichkeit als max(a_norm, b_norm)*1,5 berechnen, auf [0,1] clippen, dann Flag basierend auf Zufallsdraw setzen.
a = np.random.normal(loc=50, scale=5, size=NUMBER_OF_VALUES)
b = np.random.normal(loc=30, scale=5, size=NUMBER_OF_VALUES)
normal_data = pd.DataFrame({'a': a, 'b': b})
a_norm = (normal_data['a'] - normal_data['a'].min()) / (normal_data['a'].max() - normal_data['a'].min() + 1e-6)
b_norm = (normal_data['b'] - normal_data['b'].min()) / (normal_data['b'].max() - normal_data['b'].min() + 1e-6)
selection_prob = np.maximum(a_norm, b_norm) * 1.5
selection_prob = np.clip(selection_prob, 0, 1)
normal_data['flag'] = np.random.random(len(normal_data)) < selection_prob
print(f"Korrelation im Gesamtdataset: {normal_data['a'].corr(normal_data['b']):.2f}")
print(f"Korrelation bei flag = True: {normal_data[normal_data['flag']]['a'].corr(normal_data[normal_data['flag']]['b']):.2f}")
Ergebnisse:
- Gesamtdaten: Korrelation ≈ 0,03
- Gefilterter Teil: Korrelation ≈ -0,09
Der Effekt ist schwächer, aber immer noch signifikant in A/B-Tests, Feldstudien oder Machine-Learning-Pipelines.
So vermeiden Sie Collider-Bias in Ihrer Analyse
- Zeichnen Sie DAGs: Nutzen Sie gerichtete azyklische Graphen, um Collider vor der Analyse zu identifizieren.
- Vermeiden Sie ausschließlich erfolgsbasiertes Filtern: Analysieren Sie die Gesamtbevölkerung oder wenden Sie IPCW (inverse probability censoring weighting) an.
- Prüfen Sie Korrelationen vor und nach Schichtung: Vergleichen Sie Trends über Gruppen hinweg.
- Nutzen Sie Instrumentalvariablen: Für kausale Inferenz, wenn Bias vermutet wird.
- Setzen Sie Bayes-Netzwerke ein: Explizite Modellierung von Abhängigkeiten und bedingten Beziehungen.
Wichtige Erkenntnisse
- Collider-Bias tritt auf, wenn auf einen gemeinsamen Ursprung konditioniert wird, was künstliche negative Korrelationen erzeugt.
- Simulation mit Gleichverteilung ergibt Korrelation ≈ -0,34; Normalverteilung liefert ≈ -0,09 – der Effekt skaliert mit der Datenstruktur.
- Ähnlich wie Überlebensbias, Berkson-Paradoxon und Selektionsbias.
- Zeichnen Sie immer einen DAG vor dem Filtern von Daten.
- In ML: gefilterte Daten führen zu verzerrten Modellen, was zu Unter- oder Überbewertung der Merkmalsrelevanz führt.
— Editorial Team
Noch keine Kommentare.