인과 효과의 정의와 잠재 결과

Potential Outcomes — 반사실적 표기법으로 인과를 수학화하다

개체 수준 인과 효과와 평균 인과 효과를 잠재 결과(potential outcomes) 표기법으로 정의한다. 인과 추론의 근본 문제, 효과 지표(risk difference, risk ratio, odds ratio), 인과(causation)와 연관(association)의 수학적 구분을 다룬다. Hernán & Robins (2020) Ch.1을 기반으로 작성하였다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 03월 20일

1 정의

정의: 인과 효과 (Causal Effect)

처리 \(A\)가 개체 \(i\)의 결과 \(Y\)인과 효과를 가진다:

\[ Y_i(1) \neq Y_i(0) \]

  • 역학: Individual Causal Effect (ICE), Individual Treatment Effect (ITE)
  • IT: Individual Treatment Effect, Unit-level Uplift

여기서 \(Y_i(1)\)은 처리를 받았을 때의 잠재 결과, \(Y_i(0)\)은 받지 않았을 때의 잠재 결과이다.

역학 용어 IT 용어 수식
Individual Causal Effect ITE (Uplift) \(\tau_i = Y_i(1) - Y_i(0)\)
Average Causal Effect (ACE) ATE (Average Treatment Effect) \(E[Y(1)] - E[Y(0)]\)
Causal Risk Difference Absolute Uplift \(\Pr[Y^{a=1}=1] - \Pr[Y^{a=0}=1]\)
Causal Risk Ratio Lift (Relative Lift) \(\Pr[Y^{a=1}=1] / \Pr[Y^{a=0}=1]\)
Number Needed to Treat (NNT) Number to Convert \(1 / |RD|\)

2 개념 및 원리

2.1 반사실적 정의

Zeus는 심장 이식을 받은 환자이다. 이식 5일 후 사망했다. 만약 이식을 받지 않았다면 5일 후에도 생존했을 것이라고 가정하자. 이 경우, 심장 이식이 Zeus의 5일 생존에 인과 효과를 가졌다 (Hernán & Robins, 2020, Ch.1).

수학적 표기:

  • \(A\): 이원 처리 변수 (1: 처리, 0: 비처리)
  • \(Y\): 이원 결과 변수 (1: 사망, 0: 생존)
  • \(Y^{a=1}\) (= \(Y_i(1)\)): 처리를 받았을 때의 잠재 결과
  • \(Y^{a=0}\) (= \(Y_i(0)\)): 처리를 받지 않았을 때의 잠재 결과

Zeus: \(Y^{a=1} = 1\) (이식 → 사망), \(Y^{a=0} = 0\) (미이식 → 생존). \(Y^{a=1} \neq Y^{a=0}\)이므로 심장 이식은 Zeus에게 인과 효과를 가진다.

2.2 일관성 (Consistency)

\[ \text{if } A_i = a, \text{ then } Y_i^a = Y_i \]

간결하게 \(Y = Y^A\)로 표기한다. Zeus는 실제로 이식을 받았으므로(\(A = 1\)), 관측 결과 \(Y = 1\)은 잠재 결과 \(Y^{a=1} = 1\)과 같다.

2.3 인과 추론의 근본 문제

한 개체에 대해 두 잠재 결과를 동시에 관측할 수 없다. Zeus가 이식을 받았다면 \(Y^{a=1}\)만 관측되고, \(Y^{a=0}\)는 영원히 결측이다. 이것이 인과 추론의 근본 문제(fundamental problem of causal inference)이다.

2.4 평균 인과 효과 (ATE)

정의: 평균 인과 효과 (Average Causal Effect, ATE)

\[ \text{ATE} = E[Y^{a=1}] - E[Y^{a=0}] = E[Y_i(1) - Y_i(0)] \]

이원 결과의 경우 \(E[Y^a] = \Pr[Y^a = 1]\)이므로:

\[ \text{ATE} = \Pr[Y^{a=1}=1] - \Pr[Y^{a=0}=1] \]

20명 모집단에서 \(\Pr[Y^{a=1}=1] = \Pr[Y^{a=0}=1] = 0.5\)이면, ATE = 0. 평균 인과 효과가 없다 — 이식 여부와 무관하게 모집단의 절반이 사망한다.

그러나 ATE = 0이라 해서 개체 수준 효과가 없는 것은 아니다. 20명 중 12명에게 개체 수준 인과 효과가 존재할 수 있다:

  • 6명: 이식으로 해를 입음 (\(\tau_i = +1\))
  • 6명: 이식으로 이득을 봄 (\(\tau_i = -1\))
  • 8명: 이식과 무관 (\(\tau_i = 0\))

해를 입은 6명과 이득을 본 6명이 상쇄되어 평균이 0이 된다 (Hernán & Robins, 2020, Ch.1).

2.5 효과 지표

지표 정의 영가설 값 해석
Causal Risk Difference \(\Pr[Y^{a=1}=1] - \Pr[Y^{a=0}=1]\) 0 절대적 위험 증감
Causal Risk Ratio \(\Pr[Y^{a=1}=1] / \Pr[Y^{a=0}=1]\) 1 위험 몇 배 증감
Causal Odds Ratio \(\frac{\Pr[Y^{a=1}=1]/\Pr[Y^{a=1}=0]}{\Pr[Y^{a=0}=1]/\Pr[Y^{a=0}=0]}\) 1 로지스틱 회귀의 자연스러운 척도
NNT \(-1 / \text{CRD}\) 1건 예방에 필요한 처리 수

2.6 SUTVA (Stable Unit Treatment Value Assumption)

잠재 결과가 잘 정의되려면 두 가지 가정이 필요하다 (Rubin, 1980):

가정 정의 역학 위반 예시 IT 위반 예시
비간섭 (No Interference) \(Y_i^a\)\(A_j\)에 의존하지 않음 백신 집단면역 효과 소셜 네트워크 효과
처리 변동 무관성 처리 \(A=a\)의 모든 “버전”이 같은 결과 수술자에 따른 결과 차이 기기/OS별 다른 동작

3 직관적 설명

3.1 반사실적 사고의 일상 예시

“우산을 가져갔는데 비가 안 왔다. 우산이 필요 없었나?”

이것은 반사실적 질문이다: “우산을 안 가져갔다면 어떻게 되었을까?” 관측된 결과(비에 안 젖음)만으로는 우산의 인과 효과를 알 수 없다 — 애초에 비가 안 왔으니까.

인과 추론의 근본 문제는 정확히 이것이다: 실제로 선택하지 않은 경로의 결과를 관측할 수 없다.

3.2 결측 데이터로 보는 인과 추론

개체 \(A\) (처리) \(Y\) (관측) \(Y(0)\) \(Y(1)\)
Zeus 1 사망 ? 사망
Hera 1 생존 ? 생존
Kronos 0 사망 사망 ?
Rheia 0 생존 생존 ?

?는 결측이다. 한 개체에서 두 잠재 결과를 동시에 볼 수 없기 때문이다. 인과 추론의 모든 방법론은 이 ?를 채우는 체계적 전략이다.

3.3 IT 비유: A/B 테스트에서의 근본 문제

A/B 테스트에서 사용자 Alice는 Treatment (새 UI)를 보았고 구매했다. “Alice가 Control을 보았다면 구매했을까?” — 이것이 Alice에 대한 반사실이다. 개별 사용자의 ITE는 알 수 없지만, 무작위 배정 덕분에 집단 평균 ATE는 추정할 수 있다.


4 왜 필요한가

4.1 연관 ≠ 인과의 실무적 위험

관측 데이터에서 처리군 사망률 \(7/13 = 0.54\), 대조군 사망률 \(3/7 = 0.43\)이면 연관 Risk Difference = \(+0.11\)로 처리가 해로워 보인다. 그러나 실제 인과 효과는 0이다 — 교란 때문이다 (Hernán & Robins, 2020, Ch.1).

이를 구분하지 못하면:

실패 사례 결과
효과 없는 치료를 효과 있다고 판단 의료비 낭비, 환자 위해
효과 있는 기능을 효과 없다고 롤백 매출 기회 상실
교란된 연관을 인과로 해석 잘못된 세그먼트 타겟팅

4.2 인과 지표 vs. 연관 지표

인과 지표 연관 지표
비교 대상 같은 모집단이 다른 처리를 받았을 때 서로 다른 집단
표기 \(\Pr[Y^{a=1}=1]\) vs. \(\Pr[Y^{a=0}=1]\) \(\Pr[Y=1 \mid A=1]\) vs. \(\Pr[Y=1 \mid A=0]\)
교환가능성 필요 아니오 (정의 자체가 인과적) 예 (인과 해석하려면)
핵심 구분

\[ \underbrace{\Pr[Y=1 \mid A=1] - \Pr[Y=1 \mid A=0]}_{\text{연관 (association)}} \neq \underbrace{\Pr[Y^{a=1}=1] - \Pr[Y^{a=0}=1]}_{\text{인과 (causation)}} \]

좌변은 관측 데이터에서 계산 가능하다. 우변은 추가 가정(교환가능성, 양성, 일관성) 없이는 계산할 수 없다.


5 응용 분야

분야 활용 구체적 예시
임상시험 약물 효과 정의 ATE = 생존률 차이로 신약 승인 판단
테크 기업 A/B 테스트 효과 정량화 ATE = 전환율 차이로 feature 출시 판단
마케팅 캠페인 효과 측정 ITE 추정으로 타겟팅 최적화 (Uplift Modeling)
경제학 정책 평가 ATE = 최저임금 인상의 고용 효과
교육 교수법 비교 소규모 수업 vs. 대규모 수업의 성적 차이

6 코드 예시

6.1 잠재 결과 시뮬레이션과 근본 문제

import numpy as np
import pandas as pd

np.random.seed(42)
n = 1000

# --- 잠재 결과 생성 (신의 관점) ---
Y0 = np.random.binomial(1, 0.3, n)  # 미처리 시 결과
tau = np.random.choice([-1, 0, 1], n, p=[0.2, 0.5, 0.3])  # ITE
Y1 = np.clip(Y0 + tau, 0, 1).astype(int)  # 처리 시 결과

true_ate = (Y1 - Y0).mean()
print(f"True ATE (신의 관점): {true_ate:.3f}")
print(f"ITE 분포: harm={np.mean(tau > 0):.1%}, benefit={np.mean(tau < 0):.1%}, null={np.mean(tau == 0):.1%}")

# --- 무작위 배정 (RCT) ---
A = np.random.binomial(1, 0.5, n)
Y_obs = np.where(A == 1, Y1, Y0)  # 일관성: Y = Y^A

naive_ate = Y_obs[A == 1].mean() - Y_obs[A == 0].mean()
print(f"\nRCT ATE estimate: {naive_ate:.3f}")
print(f"Bias (RCT): {naive_ate - true_ate:.3f}")

# --- 교란된 관찰 데이터 ---
# 건강한 사람(Y0=0)이 처리를 받을 확률이 높음
prob_treat = 0.7 * (1 - Y0) + 0.3 * Y0
A_obs = np.random.binomial(1, prob_treat)
Y_confounded = np.where(A_obs == 1, Y1, Y0)

confounded_ate = Y_confounded[A_obs == 1].mean() - Y_confounded[A_obs == 0].mean()
print(f"\nConfounded estimate: {confounded_ate:.3f}")
print(f"Bias (confounded): {confounded_ate - true_ate:.3f}")

6.2 효과 지표 계산

# 역학 ↔ IT 효과 지표 매핑
p_t = 0.38  # 처리군 전환율 (Risk under treatment)
p_c = 0.32  # 대조군 전환율 (Risk under control)

# 역학 지표
crd = p_t - p_c  # Causal Risk Difference
crr = p_t / p_c  # Causal Risk Ratio
cor = (p_t / (1 - p_t)) / (p_c / (1 - p_c))  # Causal Odds Ratio
nnt = 1 / abs(crd)  # Number Needed to Treat

print("=== 역학 ↔ IT 효과 지표 ===")
print(f"Risk Difference (Uplift):   {crd:+.3f}")
print(f"Risk Ratio (Lift):          {crr:.3f}")
print(f"Odds Ratio:                 {cor:.3f}")
print(f"NNT (Number to Convert):    {nnt:.1f}")
print(f"  → {int(nnt)}명당 1건 추가 전환")

7 관련 주제

이전/다음

같은 카테고리

다른 카테고리


8 참고 문헌

  • Hernán, M. A. & Robins, J. M. (2020). Causal Inference: What If, Ch.1. Chapman & Hall/CRC.
  • Rubin, D. B. (1974). Estimating causal effects of treatments in randomized and nonrandomized studies. Journal of Educational Psychology, 66(5), 688-701.
  • Rubin, D. B. (1980). Randomization analysis of experimental data: The Fisher randomization test. JASA, 75(371), 591-593.

Subscribe

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