선택 편향

Selection Bias — 충돌자 조건화가 만드는 허위 연관

선택 편향(selection bias)의 DAG 기반 구조적 정의, 충돌자(collider) 조건화, 중도탈락·자기선택·건강한 근로자 편향 등 실제 사례, 교란과의 비교, IP 가중치를 통한 보정, 그리고 선택이 편향을 유발하지 않는 특수 조건을 다룬다. Hernán & Robins (2020) Ch.8을 기반으로 작성하였다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 03월 20일

1 정의

정의: 선택 편향 (Selection Bias)

선택 편향은 분석에 포함될 개인을 선택(selection)하는 과정에서 처리 \(A\)와 결과 \(Y\)의 공통 결과(common effect)에 조건화함으로써 발생하는 허위 연관이다.

  1. \(A\)\(Y\)의 공통 결과(충돌자 \(C\))에 조건화 → 경로 \(A \rightarrow C \leftarrow Y\) 개방
  2. 교란과 달리 공통 원인이 아닌 공통 결과에 의해 발생
  3. 무작위 실험에서도 발생 가능 (배정 이후 선택이 일어나면)
  • 역학: Selection Bias, Informative Censoring, Berkson’s Bias
  • IT: Survivorship Bias, Sample Selection Bias, Attrition Bias
역학 (Epidemiology) IT/비즈니스 비고
Selection Bias Survivorship Bias, Attrition Bias 분석 대상 선택에 의한 편향
Censoring Churn, Drop-off 추적 중단 / 탈락
Collider Common Effect \(A\)\(Y\) (또는 그 원인)의 공통 결과
IP Weighting for \(C\) Inverse Propensity for Attrition 탈락 보정 가중치
Healthy Worker Bias Active User Bias 건강한/활발한 사람만 남는 편향
Berkson’s Bias Hospital/Platform Bias 특정 장소에서의 선택 편향

2 개념 및 원리

2.1 선택 편향의 구조

가장 단순한 구조 (Figure 8.1):

\[A \rightarrow C \leftarrow Y\]

\(C\)에 조건화(= 분석을 \(C=0\)으로 제한)하면 충돌자 경로가 열린다:

\[ \frac{\Pr[Y=1 \mid A=1, C=0]}{\Pr[Y=1 \mid A=0, C=0]} \;\neq\; \frac{\Pr[Y^{a=1}=1]}{\Pr[Y^{a=0}=1]} \]

2.2 다양한 선택 편향 구조

Figure 구조 예시
8.1 \(A \rightarrow C \leftarrow Y\) 엽산(\(A\)) → 출생(\(C\)) ← 심장기형(\(Y\))
8.3 \(A \rightarrow C \leftarrow L \leftarrow U \rightarrow Y\) 항레트로바이러스(\(A\)) → 탈락(\(C\)) ← 증상(\(L\)) ← 면역억제(\(U\)) → 사망(\(Y\))
8.4 \(A \rightarrow L \rightarrow C\), \(U \rightarrow L\), \(U \rightarrow Y\) 처리 → 부작용(\(L\)) → 탈락(\(C\)), 건강상태(\(U\)) → 증상, 사망
8.5-8.6 M-편향 변형 생활습관(\(W\)) → 처리 & 탈락

공통 구조: 처리(또는 처리의 원인)와 결과(또는 결과의 원인)의 공통 결과에 조건화.

2.3 선택 편향의 실제 사례

Hernán & Robins (2020, Section 8.2)에 따른 주요 사례:

  1. 차등 추적 탈락 (Differential loss to follow-up)
    • 처리가 부작용을 유발 → 탈락 증가
    • 건강 상태가 탈락과 결과 모두에 영향
    • 생존자만 분석하면 편향
  2. 결측 데이터 편향 (Missing data bias)
    • 결과 변수 \(Y\)가 누락되는 이유가 \(A\)\(Y\)의 원인과 관련
  3. 건강한 근로자 편향 (Healthy worker bias)
    • 건강한 사람만 직장에 남아 있음 → 위험 노출의 효과 과소 추정
  4. 자기 선택 편향 (Self-selection / Volunteer bias)
    • 자발적 참여가 처리, 결과의 원인과 연관
  5. 연구 진입 전 처리에 의한 선택 (Selection by pre-study treatment)
    • 과거 처리가 연구 참여 확률에 영향

2.4 교란과 선택 편향의 비교

특성 교란 선택 편향
원인 공통 원인 공통 결과 조건화
DAG 구조 \(A \leftarrow L \rightarrow Y\) (뒷문 경로) \(A \rightarrow C \leftarrow Y\) (충돌자 개방)
무작위 배정 제거됨 배정 이후 선택이면 여전히 발생
보정 방법 표준화, IPW, 매칭 IPW (중도절단 가중치)
시변 처리 층화로 보정 가능 층화가 추가 편향 유발 가능 → G-방법 필요
핵심 차이
  • 무작위 배정은 교란을 방지하지만, 배정 이후의 선택 편향은 방지하지 못한다
  • 예: RCT에서 처리군 탈락률이 높으면 생존자 분석에 선택 편향 발생

2.5 중도절단을 처리로 간주

선택 편향 보정의 핵심 아이디어 (Section 8.4):

중도절단 \(C\)두 번째 처리로 간주한다:

\[ \text{관심 대조:} \quad \Pr[Y^{a=1, c=0}=1] \;\;\text{vs.}\;\; \Pr[Y^{a=0, c=0}=1] \]

  • \(Y^{a, c=0}\): 처리 \(a\)를 받고, 중도절단되지 않았을 때의 반사실적 결과
  • \(C\)도 처리이므로 교환가능성·양성·일관성이 \(C\)에 대해서도 필요

2.6 IPW를 통한 선택 편향 보정

와사비 실험 예시 (Section 8.4-8.5):

  • 60명, \(L\) = 심장병, \(A\) = 와사비 보충, \(C\) = 중도절단, \(Y\) = 사망
  • 진짜 인과 위험비 = 1.0 (와사비는 사망에 영향 없음)
  • 미중절단자만 분석 시 위험비 = 0.89 (선택 편향!)
  • IP 가중치 \(W^C = 1 / \Pr[C=0 \mid L, A]\)로 의사-모집단 생성 → 위험비 = 1.0 복원

2.7 선택이 편향을 유발하지 않는 경우

Figure 8.13: \(A\)\(E\)완전히 독립적인 메커니즘으로 \(Y\)에 영향을 미칠 때

  • 사망을 원인별로 분해: \(Y_A\), \(Y_E\), \(Y_O\)
  • \(Y=0\) (생존)에 조건화 ⟹ \(Y_A=0\) AND \(Y_E=0\) AND \(Y_O=0\)에 조건화
  • d-분리에 의해 \(A \perp\!\!\!\perp E \mid Y=0\)생존자에서 선택 편향 없음
  • 이는 승법적 생존 모형(multiplicative survival model)에 해당

3 직관적 설명

3.1 “입학 허가” 비유

  1. 대학이 학업 성적(\(A\))운동 능력(\(E\))으로 입학을 결정한다
  2. 합격자(\(C=0\)) 중에서 성적과 운동 능력을 분석하면 음의 연관 발견
  3. “공부 잘하는 학생은 운동을 못한다?” → 거짓! 이것은 선택 편향이다
  4. 합격이라는 공통 결과에 조건화했기 때문에 발생

3.2 IT 비유: “활성 사용자만 분석”

  1. 앱에서 A/B 테스트 실행: 처리(\(A\)) = 새 UI
  2. 일부 사용자가 탈락(\(C=1\)): 새 UI의 학습 비용 + 원래 이탈 성향
  3. 남은 사용자만 분석 → 처리군에서 “끈기 있는” 사용자가 과잉 대표
  4. 결과: 새 UI가 리텐션을 개선한 것처럼 보이지만, 실제로는 선택 편향

해결: 탈락 확률의 역수로 가중치를 부여 (IPW for censoring)

4 왜 필요한가

상황 선택 편향 무시 결과 올바른 접근
임상시험 탈락 부작용으로 처리군 탈락 → 효과 과대 추정 IPW for censoring
A/B 테스트 이탈 처리군 이탈률 차이 → 생존자 편향 ITT 분석 + IPW 보정
설문 응답 특정 유형만 응답 → 결과 왜곡 비응답 가중치
코호트 연구 건강한 근로자만 분석 → 위험 과소 추정 직업 선택 변수 보정
후향적 연구 생존자만 관찰 → 위험 인자 효과 왜곡 시간 매칭 + IPW
케이스-컨트롤 부적절한 대조군 선택 → OR 편향 적절한 대조군 샘플링

핵심: 선택 편향은 교란과 달리 무작위 실험에서도 발생하며, “데이터에 남아 있는 사람”만 분석하는 모든 상황에서 위협이 된다.

5 응용 분야

분야 선택 편향의 형태 보정 접근
임상시험 중도절단, 프로토콜 위반 IP 가중치, 이중 강건 추정
테크/A/B 테스트 이탈, 미노출 ITT + IPW, 탈락 모형
역학/코호트 건강한 근로자, 자발적 참여 선택 변수 보정, IPW
GWAS 생존자 편향 (사망자 비관찰) 연령 보정, 경쟁 위험 모형
경제학/설문 비응답, 자기 선택 Heckman 보정, 가중치
추천 시스템 노출 편향 (추천된 것만 관찰) IPS (역성향 점수)

6 예시

6.1 수치 예시: 와사비 RCT의 선택 편향

Hernán & Robins (2020, Section 8.4)의 와사비 실험을 재현한다.

\(L=0, A=0\) \(L=0, A=1\) \(L=1, A=0\) \(L=1, A=1\)
\(n\) 10 10 20 20
\(\Pr[C=0 \mid L, A]\) 1.0 0.5 0.6 0.2
미중절단 \(n\) 10 5 12 4
\(\Pr[Y=1 \mid L]\) 0.2 0.2 0.75 0.75
IP 가중치 \(W^C\) 1.0 2.0 1.67 5.0
  • 미중절단자 위험비 = \((4/9) / (11/22) = 0.89\) → 선택 편향
  • IPW 의사-모집단 위험비 = 1.0 → 편향 제거

7 코드 예시

7.1 선택 편향 시뮬레이션과 IPW 보정

import numpy as np
import pandas as pd
from scipy.special import expit

np.random.seed(42)
n = 20_000

# --- DGP: Figure 8.3 구조 ---
# U → L → C, U → Y, A → C (무작위 배정)
U = np.random.binomial(1, 0.4, n)   # 비측정 건강 상태
L = np.random.binomial(1, expit(-0.5 + 2 * U), n)  # 증상 (U의 결과)
A = np.random.binomial(1, 0.5, n)   # 무작위 배정
C = np.random.binomial(1, expit(-1 + 0.8 * A + 1.0 * L), n)  # 탈락
Y = np.random.binomial(1, expit(-1.5 + 1.5 * U + 0 * A), n)  # A의 진짜 효과 = 0

df = pd.DataFrame({"U": U, "L": L, "A": A, "C": C, "Y": Y})

# --- 1. 전체 모집단 (이상적) ---
full_rr = df.loc[df.A == 1, "Y"].mean() / df.loc[df.A == 0, "Y"].mean()
print(f"전체 모집단 위험비: {full_rr:.3f}")  # ≈ 1.0

# --- 2. 미중절단자만 (선택 편향) ---
uncensored = df[df.C == 0]
biased_rr = (uncensored.loc[uncensored.A == 1, "Y"].mean() /
             uncensored.loc[uncensored.A == 0, "Y"].mean())
print(f"미중절단자 위험비: {biased_rr:.3f}")  # ≠ 1.0

# --- 3. IPW 보정 ---
from sklearn.linear_model import LogisticRegression

# 중도절단 모형: Pr[C=0 | A, L]
cens_model = LogisticRegression()
cens_model.fit(df[["A", "L"]], 1 - df["C"])  # C=0을 모델링
pr_uncensored = cens_model.predict_proba(df[["A", "L"]])[:, 1]

# 미중절단자에게 가중치 부여
df["w_c"] = np.where(df.C == 0, 1 / pr_uncensored, 0)
unc = df[df.C == 0]

ipw_risk = {}
for a in [0, 1]:
    sub = unc[unc.A == a]
    ipw_risk[a] = np.average(sub["Y"], weights=sub["w_c"])

ipw_rr = ipw_risk[1] / ipw_risk[0]
print(f"IPW 보정 위험비: {ipw_rr:.3f}")  # ≈ 1.0
print(f"\n요약: 전체={full_rr:.3f}, 편향={biased_rr:.3f}, IPW={ipw_rr:.3f}")

7.2 충돌자 편향의 직관적 시뮬레이션

np.random.seed(7)
n = 10_000

# 학업(A)과 운동(E)은 독립, 둘 다 합격(C)에 영향
academic = np.random.normal(0, 1, n)
athletic = np.random.normal(0, 1, n)
admitted = (academic + athletic > 1).astype(int)  # 충돌자

# 전체 모집단: 상관 ≈ 0
print(f"전체 상관: {np.corrcoef(academic, athletic)[0,1]:.3f}")

# 합격자만: 음의 상관 (선택 편향!)
adm_idx = admitted == 1
print(f"합격자 상관: {np.corrcoef(academic[adm_idx], athletic[adm_idx])[0,1]:.3f}")
print("→ 공통 결과(합격)에 조건화하면 독립인 원인들 사이에 연관이 생긴다")

7.3 Hazard Ratio의 내재된 선택 편향

# Technical Point 8.1: RCT에서도 hazard ratio는 선택 편향을 가진다
np.random.seed(99)
n = 50_000

U = np.random.exponential(1, n)  # 비측정 frailty
A = np.random.binomial(1, 0.5, n)

# A는 시점 1 사망만 감소, 시점 2에는 직접 효과 없음
Y1 = np.random.binomial(1, expit(-2 - 0.8 * A + 0.5 * U), n)
Y2_risk = expit(-2 + 0.5 * U)  # A의 직접 효과 없음
Y2 = np.random.binomial(1, Y2_risk, n)

# 시점 1 hazard ratio (올바름)
hr1 = (Y1[A == 1].mean()) / (Y1[A == 0].mean())
print(f"시점 1 HR: {hr1:.3f}")  # < 1 (치료 효과)

# 시점 2 hazard ratio — 시점 1 생존자만 (선택 편향)
surv1 = Y1 == 0
hr2 = (Y2[(A == 1) & surv1].mean()) / (Y2[(A == 0) & surv1].mean())
print(f"시점 2 HR (생존자만): {hr2:.3f}")  # > 1 (선택 편향!)
print("→ A의 시점2 직접 효과는 0이지만, 생존자 선택으로 HR > 1")

8 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: