huny.log

기술 포스트 · 통계·ML

Doubly robust estimation — IPW와 outcome 모델의 결합으로 인과 추정 안정화

PSM·IPW는 propensity 모델이 틀리면 무너지고, 회귀는 outcome 모델이 틀리면 무너집니다. doubly robust는 두 모델을 결합해 둘 중 하나만 맞으면 정직한 효과 추정. 마케팅 인과 분석의 안전판.

무작위 배정이 안 되는 자리에 인과 효과를 추정하려면 두 가지 길이 있습니다 — propensity 모델 기반(PSM·IPW) 또는 outcome 모델 기반(회귀). 두 길은 각각 서로 다른 자리에서 깨집니다. doubly robust(이중 안전) 추정은 두 모델을 결합해, 둘 중 하나만 맞으면 정직한 효과 추정을 보장합니다. 마케팅 인과 분석의 안전판.

마케터가 이 글을 읽어야 하는 이유: 인과 분석 결과를 회의에서 신뢰성 있게 보고하려면 “이 추정의 모델 가정 중 어느 게 깨져도 결과가 무너지는가”를 먼저 답해야 합니다. doubly robust는 그 답이 “둘 다 깨져야 무너진다”라 회의 신뢰도가 한 단계 올라갑니다.

Propensity weighting과 outcome regression이 평행으로 결합되는 doubly robust 다이어그램
둘 중 하나만 맞으면 정직 — 인과 추정의 안전 마진.

1. PSM·IPW가 흔들리는 자리

PSM이나 IPW(역확률 가중)는 propensity score 를 정확히 추정한다는 가정에 의존합니다.

propensity 모델이 틀리면 매칭·가중이 잘못되고 효과 추정이 편향됩니다.

흔한 자리:

  • 비선형 관계 (로지스틱이 아닌 GBM 필요)
  • 변수가 너무 많음 (overfitting)
  • 관측 변수 부족 (unmeasured confounder)

2. Outcome 회귀가 흔들리는 자리

다른 길은 outcome을 직접 모델링하는 것. 를 회귀로 추정하고, 의 차이를 효과로.

outcome 모델이 틀리면 회귀 계수가 편향되고 효과 추정도 무너집니다.

흔한 자리:

  • 비선형 outcome (회귀 가정 위반)
  • interaction 효과 미포함
  • 결과 변수의 분포 가정 위반

3. Doubly robust의 한 줄 직관

두 모델을 결합해 어느 하나만 맞으면 정직한 추정을 보장.

둘 다 잘 추정하면 효율 최고, 하나만 맞아도 unbias, 둘 다 틀리면 무너짐.

수식으로(AIPW = Augmented IPW):

  • 첫 두 항: IPW 보정 (residual에 가중)
  • 세 번째 항: outcome 모델의 직접 추정

핵심: propensity 모델이 정확하면 첫 두 항이 정직. outcome 모델이 정확하면 세 번째 항이 정직. 둘 다 틀려야 무너짐.

4. AIPW vs 단순 IPW·회귀 비교

같은 데이터에 세 추정량을 적용하면 어떻게 다른지.

추정량propensity 정확outcome 정확결과
IPW정직
회귀정직
IPW편향
회귀편향
AIPW정직
AIPW정직
AIPW편향

AIPW가 IPW와 회귀의 위험 분산. 한 모델이 흔들려도 다른 모델이 받쳐주는 구조.

5. 코드 한 묶음 — Python AIPW 구현

이게 글에 박는 유일한 코드입니다.

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingRegressor
# df: T(노출), X(특성), Y(결과)
features = ["age", "past_purchases", "visits_30d", "is_mobile"]
X = df[features].values
T = df["treated"].values
Y = df["outcome"].values
# 1. propensity 모델 — Logistic 또는 GBM
ps_model = LogisticRegression(max_iter=1000)
ps_model.fit(X, T)
p_hat = ps_model.predict_proba(X)[:, 1]
# clipping (extreme weights 방지)
p_hat = np.clip(p_hat, 0.05, 0.95)
# 2. outcome 모델 — 노출별 별도 학습
model_1 = GradientBoostingRegressor().fit(X[T==1], Y[T==1])
model_0 = GradientBoostingRegressor().fit(X[T==0], Y[T==0])
mu_1 = model_1.predict(X)
mu_0 = model_0.predict(X)
# 3. AIPW 추정
term1 = T * (Y - mu_1) / p_hat
term2 = (1 - T) * (Y - mu_0) / (1 - p_hat)
term3 = mu_1 - mu_0
ate_dr = np.mean(term1 - term2 + term3)
print(f"Doubly Robust ATE = {ate_dr:.4f}") # 예: 0.0184
# bootstrap 95% CI
n_boot = 1000
boot_estimates = []
for _ in range(n_boot):
idx = np.random.choice(len(Y), len(Y), replace=True)
p_b = np.clip(ps_model.predict_proba(X[idx])[:, 1], 0.05, 0.95)
mu1_b = model_1.predict(X[idx])
mu0_b = model_0.predict(X[idx])
t1 = T[idx] * (Y[idx] - mu1_b) / p_b
t2 = (1 - T[idx]) * (Y[idx] - mu0_b) / (1 - p_b)
t3 = mu1_b - mu0_b
boot_estimates.append(np.mean(t1 - t2 + t3))
ci_lo, ci_hi = np.percentile(boot_estimates, [2.5, 97.5])
print(f"95% CI: ({ci_lo:.4f}, {ci_hi:.4f})")

매칭이 필요 없고, 두 모델을 합치는 한 단계 추가만으로 인과 추정의 안전 마진이 폭발적으로 늘어납니다.

6. Cross-fitting — 데이터 누수 방지

AIPW의 한 가지 함정: 같은 데이터로 propensity 모델 + outcome 모델 + 효과 추정을 모두 하면 데이터 누수가 발생할 수 있음. cross-fitting이 표준 해결책.

데이터를 K개 fold로 나눠, fold 1로 모델 학습 → fold 2에서 예측 → 결과 사용. 모든 fold에 대해 반복.

이 절차로 데이터 누수 없이 AIPW를 계산. Double Machine Learning(DML) 프레임워크에 들어가는 핵심 아이디어.

7. 마케팅 자리에서 AIPW의 자리

7-1. 광고 노출 lift 추정 (관측 데이터)

무작위 lift study가 어려운 자리에서 PSM 대신 AIPW. 두 모델 모두 GBM·random forest로 학습하면 비선형 패턴 자연스럽게 잡음.

7-2. CRM 캠페인 효과

이메일·푸시 발송 대상 vs 비대상 차이 추정. 발송이 무작위가 아닌 자리에 AIPW가 표준.

7-3. 옴니채널 노출 결합 효과

여러 채널의 결합 효과 추정. 각 채널별 propensity·outcome 모델을 결합해 채널 간 상호작용까지 분석.

7-4. 신규 채널의 인과 효과

lift study가 운영되지 않는 신규 채널의 인과 추정에서 AIPW의 가치가 큼.

자리도구
무작위 lift study 가능lift study
관측 풍부, 신뢰성 중요AIPW
시계열 자연실험 있음DiD
정책 cutoff 있음RDD

DiD, RDD, AIPW가 인과추론 도구상자에 함께.

8. EconML·DoubleML 라이브러리

직접 구현 대신 표준 라이브러리 활용 추천.

8-1. EconML (Microsoft)

LinearDML, CausalForestDML, OrthoForest 등 다양한 doubly robust 추정량. cross-fitting 자동.

8-2. DoubleML (Bach et al.)

Python·R 양쪽 지원. 추론 통계량(표준오차) 자동 계산.

8-3. CausalML (Uber)

Uplift 모델·CATE 추정 통합. 마케팅 자리에 자주 사용.

# EconML 예시
from econml.dml import LinearDML
est = LinearDML(model_t=LogisticRegression(), model_y=GradientBoostingRegressor())
est.fit(Y=Y, T=T, X=X)
ate = est.ate(X=X)

라이브러리 사용 시 표준 추정량과 inference가 함께 따라와 운영 효율이 좋음.

9. 마치며 — 인과 추정의 안전 마진

doubly robust는 인과 추정의 안전 마진을 한 단계 올리는 표준 기법입니다. PSM·IPW의 propensity 모델 위험과 회귀의 outcome 모델 위험을 동시에 분산. 두 모델 중 하나만 맞으면 정직한 추정. 마케팅 인과 분석을 회의 보고에 안정적으로 가져가려면 AIPW를 표준 도구로 두는 게 좋습니다.

다음 분기에 한 번만 시도해 볼 만한 것은 이미 PSM·IPW로 추정한 캠페인 효과 자리에 AIPW를 추가로 돌려 결과 차이를 비교하는 흐름입니다. 두 결과가 비슷하면 추정의 robustness가 확인되고, 다르면 어느 모델 가정에 의존했는지가 드러납니다.

다음에 읽을 글

참고

통계·ML 카테고리의 다른 글

전체 보기 →