1 정의
선택 편향은 분석에 포함될 개인을 선택(selection)하는 과정에서 처리 \(A\)와 결과 \(Y\)의 공통 결과(common effect)에 조건화함으로써 발생하는 허위 연관이다.
- \(A\)와 \(Y\)의 공통 결과(충돌자 \(C\))에 조건화 → 경로 \(A \rightarrow C \leftarrow Y\) 개방
- 교란과 달리 공통 원인이 아닌 공통 결과에 의해 발생
- 무작위 실험에서도 발생 가능 (배정 이후 선택이 일어나면)
- 역학: 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)에 따른 주요 사례:
- 차등 추적 탈락 (Differential loss to follow-up)
- 처리가 부작용을 유발 → 탈락 증가
- 건강 상태가 탈락과 결과 모두에 영향
- 생존자만 분석하면 편향
- 결측 데이터 편향 (Missing data bias)
- 결과 변수 \(Y\)가 누락되는 이유가 \(A\)나 \(Y\)의 원인과 관련
- 건강한 근로자 편향 (Healthy worker bias)
- 건강한 사람만 직장에 남아 있음 → 위험 노출의 효과 과소 추정
- 자기 선택 편향 (Self-selection / Volunteer bias)
- 자발적 참여가 처리, 결과의 원인과 연관
- 연구 진입 전 처리에 의한 선택 (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 “입학 허가” 비유
- 대학이 학업 성적(\(A\))과 운동 능력(\(E\))으로 입학을 결정한다
- 합격자(\(C=0\)) 중에서 성적과 운동 능력을 분석하면 음의 연관 발견
- “공부 잘하는 학생은 운동을 못한다?” → 거짓! 이것은 선택 편향이다
- 합격이라는 공통 결과에 조건화했기 때문에 발생
3.2 IT 비유: “활성 사용자만 분석”
- 앱에서 A/B 테스트 실행: 처리(\(A\)) = 새 UI
- 일부 사용자가 탈락(\(C=1\)): 새 UI의 학습 비용 + 원래 이탈 성향
- 남은 사용자만 분석 → 처리군에서 “끈기 있는” 사용자가 과잉 대표
- 결과: 새 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 관련 주제
선행 지식
- DAG와 인과 다이어그램 — Ch.6 — 충돌자, d-분리 규칙
- 교란 — Ch.7 — 공통 원인에 의한 편향
후속 주제
- 측정 오차와 랜덤 변동 — Ch.9-10 — 세 번째 편향 유형
- IP 가중치와 주변 구조 모형 — Ch.12 — 교란 + 선택 편향 동시 보정
다른 카테고리 연결
- 관찰 연구와 식별 조건 — Ch.3 — 식별 가능성 조건 (교환가능성, 양성, 일관성)
- 효과 수정과 상호작용 — Ch.4-5 — 하위 그룹 분석에서의 선택 편향