
가짜연구소 Causal Inference 팀에서 발표한 내용을 정리하였습니다.
생성일: 2023년 11월 3일 오후 5:59
발표자: 유정현
날짜: 2023년 11월 5일
상태: 완료
속성: causal inference
- 인과추론에서의 매칭은 관측된 데이터에서 인과 효과를 추정하기 위해 처리군과 대조군을 비슷하게 만드는 통계적 기법입니다.
- 인과 효과를 추정할 때는 유사한 공변량 분포를 가진 처리군과 대조군을 구하여, 가능한 무작위 실험을 가깝게 재현하는 것이 바람직합니다.
- Key idea는 일종의 교란요인 가 실험군과 대조군을 비교할 수 없도록 만들기 때문에, 각 실험군의 값을 유사한 대조군의 값과 일치시켜 비교할 수 있습니다. 처치를 받을 때마다, 처치받지 않은 쌍둥이를 찾는 개념과 비슷합니다. 이러한 비교를 통해, 처치된 것과 처치되지 않은 것을 다시 비교할 수 있습니다.
- RSM, CEM 등 Matching에 사용되는 방법과 장/단점을 알 수 있습니다.
- 인과 추론에서 Regression이나 Matching 모두 단독으로 사용하는 것을 권장하지 않습니다.
A/B Test처럼 통제된 환경을 조성한 뒤, 실험 결과를 확인하는 작업은 비용이 많이 투입됩니다.
또한, 게임이라는 산업은 여러 유관 부서의 이해관계가 얽혀있기 때문에 프로덕트(이하 게임)에 A/B Test를 설계 및 적용한다는 것은 대부분 투입 비용 대비 결과가 좋지 않습니다.
따라서, DiD 같은 준실험 방법, 회귀를 많이 사용합니다.
그러나, 회귀는 선형적이고 매개변수적이며, 분산이 큰 특성을 선호하며, 교란변수에 취약함
한 가지 예시를 들어보겠습니다.
음주가 간암에 영향을 미치는 정도를 알아보는 실험을 진행한다고 가정해봅시다.
위 참가자의 음주 여부만으로 간암에 미치는 영향을 계산할 수 있을까요? 단순 음주 외에도 나이, 간염 이력, 운동 시간도 암의 발생에 영향을 줄 수 있지 않을까요?
즉, 두 실험군은 동일한 조건이 아니기 때문에 음주가 간암에 영향을 주는 인과성을 설명하기에는 한계가 있을 것입니다.
이를 보완할 수 있는 Matching이라는 개념을 사용할 수 있습니다.
**⇒ 처리 효과의 추정치에서 혼동 변수로 인한 편향을 줄이는데 기여함**
| Regression | Matching | |
|---|---|---|
| 장점 | RCT, DID 등의 다양한 설정과 방법에 유연하게 확장 가능 | 연구 설계가 명확함 |
| 매칭과 비교하여 모든 관찰 변수를 유지함 | 그룹 간 균형을 쉽게 평가할 수 있음 | |
| 단점 | 회귀식에 민감함 | [PSM] 성향 점수 추정에 민감함 |
| 조건부 독립 가정을 평가하기 어려움 | [CEM] 샘플 크기가 작아지며, 이는 데이터의 분산을 증가시킬 수 있음 |
관찰 가능한 변수 선택: 선택 과정에서의 성향 점수는 관찰된 변수를 사용하여 예측할 수 있음
Binary모델에서 Logistic이나 Probit 모델로, Treatment를 Binary outcome, 나머지 변수로 분석을 진행할 수 있음

임의 생성한 데이터셋을 기반으로 PSM을 구현해 보겠습니다. 분류 모델로 각 클래스에 속할 조건부 확률을 사용하고, KDTree로 각 처리 그룹의 샘플에 가장 가까운 대조 그룹 샘플을 찾습니다.
import numpy as np
import pandas as pd
np.random.seed(0)
n = 100 # 샘플 수
treatment = np.random.binomial(1, 0.5, size=n) # 처리 여부
covariates = np.random.normal(size=(n, 5)) # 공변량
outcome = treatment + covariates[:, 0] + np.random.normal(size=n) # 결과 변수
# 데이터셋 생성
df = pd.DataFrame(covariates, columns=['covariate1', 'covariate2', 'covariate3', 'covariate4', 'covariate5'])
df['treatment'] = treatment
df['outcome'] = outcome
b. 데이터셋은 아래와 같습니다.
성향 점수를 계산하겠습니다. 성향 점수를 계산하는데 사용한 알고리즘은 LR입니다.

# 성향 점수 계산
from sklearn.linear_model import LogisticRegression
propensity_model = LogisticRegression().fit(covariates, treatment)
propensity_score = propensity_model.predict_proba(covariates)[:, 1]
이후, KDTree를 사용하여, 최근접 이웃 매칭을 수행합니다.
from scipy.spatial import KDTree
treated_idx = np.where(treatment == 1)[0]
control_idx = np.where(treatment == 0)[0]
tree = KDTree(propensity_score[control_idx].reshape(-1, 1))
_, match_idx = tree.query(propensity_score[treated_idx].reshape(-1, 1))
매칭된 샘플을 추출(concat)하여, 결과 값을 확인합니다.
# 매칭된 샘플 추출
matched_treated = pd.DataFrame({
'treatment': treatment[treated_idx],
'outcome': outcome[treated_idx],
'propensity_score': propensity_score[treated_idx],
})
matched_control = pd.DataFrame({
'treatment': treatment[control_idx][match_idx],
'outcome': outcome[control_idx][match_idx],
'propensity_score': propensity_score[control_idx][match_idx],
})
matched_data = pd.concat([matched_treated, matched_control])
matched_data
출력 값은 아래와 같습니다. 임의로 생성한 정규분포 무작위 데이터이기 때문에, 2개의 데이터만 매칭되지 못하여 삭제되었군요. 성향 점수도 정규분포 형태를 띄고 있습니다.


사실 causalinference 라이브러리를 사용하면, 7줄로 PSM을 구현할 수 있습니다.
Propensity Score Matching tutorial in Python
이후 평균 처리 효과를 추정할 수 있습니다.
ate = matched_data[matched_data['treatment'] == 1]['outcome'].mean() - matched_data[matched_data['treatment'] == 0]['outcome'].mean()
from scipy import stats
treated_outcome = matched_data[matched_data['treatment'] == 1]['outcome']
control_outcome = matched_data[matched_data['treatment'] == 0]['outcome']
t_stat, p_value = stats.ttest_ind(treated_outcome, control_outcome)
print(f"t-statistic: {t_stat}")
print(f"p-value: {p_value}")

Solving Simpson’s Paradox with Inverse Probability Weighting

CEM은 공변량을 ‘Coarsened’하게 만드는 것이 중요한데(위 이미지의 Grid처럼) Grid 범주를 얼만큼 설정하느냐에 따라서 PSM과 별 차이가 없지 않을까? 즉, parameter의 영향을 많이 받지 않을까?

Regression과 Matching은 Selection observation에 대해 의존합니다.
즉, 선택 편향이 관찰 가능한 공변량에 의해 설명될 수 있다는 가정입니다.
어쩔 수 없이, Regression과 Matching만을 사용할 수 밖에 없는 경우는 Omitted Variable Bias라는 Sensitivity Analysis(민감도 분석)이 굉장히 유용할 수 있다고 합니다.
예를 들어, 아래와 같이 X와 Y가 있고, C1과 C2라는 Control 변수가 있을 때, Regression으로 분석을 한다면, 아래와 같이 수식이 성립됩니다.
이 때, C1과 C2를 기반으로 PS(Propensive score)를 구할 수 있습니다. 이렇게 구한 PS를 기반으로, Matching을 통해서 Regression을 구할 수 있습니다.
여기서 우리는 C1과 C2만 고려하여, 분석을 하게 되는데, 가상의 관찰되지 않은 U가 있다고 한다면, 분석 결과는 어떻게 달라지는지 알아보는 개념입니다. 이미지와 수식은 아래와 같습니다.

여기서 gamma1과 gamma2의 값을 0부터 늘려 나감으로써, 관찰되지 않은 변수의 효과를 측정합니다. 여기서 gamma 값이 매우 클 때만 정반대의 결과가 출력된다면, 관찰되지 않은 변수의 영향력은 작다고 추정할 수 있습니다.