Zurück zur Startseite

Collider bias in der Data Science: Simulation des Effekts

Der Artikel erklärt collider bias — Verzerrung von Korrelationen beim Filtern auf einen Collider. Python-Simulationen auf uniformen und normalen Daten mit Visualisierung werden bereitgestellt. Empfehlungen zur Vermeidung in der Analyse.

Collider bias: falsche Verbindungen durch Datenfilterung
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot
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:

Google AdInline article slot
  • 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

Advertisement 728x90

Weiterlesen