A/B 테스트는 가장 대표적인 인과 추론 실험 방식이며, 그 이론적 토대는 통계적 가설 검정에 기반한다. 그러나 현실 데이터에서는 무작위 실험(Randomized Controlled Trial, RCT)을 설계하기 어려운 경우가 많아, 관측 데이터를 기반으로 인과 관계를 추론하는 기법들이 필수적으로 요구된다.
| 항목 | A/B 테스트 | 인과 추론 |
|---|---|---|
| 목적 | 두 버전의 성과 비교 | 특정 처리(또는 개입)의 인과적 효과 추정 |
| 데이터 구조 | 무작위 할당된 실험군 vs 대조군 | 관측 데이터 또는 준실험(quasi-experiment) |
| 추정 대상 | 평균 처리 효과 (ATE) | ATE, CATE, HTE 등 다양 |
| 도구 | 실험 설계, 통계적 검정 | 성향 점수, Causal Forest, Meta Learners 등 |
무작위 할당 (Random Assignment): 외생성을 확보해 내생성(혼란 변수 영향)을 제거함.
컨트롤 vs 처리 그룹 설정: 비교 가능한 집단 간 차이만 두고 효과 측정 가능하게 함.
통계적 검정
t-test,proportion test, 피셔의 정확 검정카이제곱 검정| 용어 | 설명 |
|---|---|
| ATE (Average Treatment Effect) | 전체 대상에 대한 평균 처리 효과 |
| CATE (Conditional ATE) | 특정 조건(성별, 연령 등)에 따라 달라지는 처리 효과 |
| HTE (Heterogeneous Treatment Effect) | 개별 특성에 따라 반응이 달라지는 효과 (개별화 필요) |
예) 감기약이 A에게는 효과 있지만, B에게는 무의미
예) 학생의 성향에 따라 조기 졸업할 확률을 예측하고, 유사한 성향의 다른 학생과 비교하여 효과 추정
from sklearn.linear_model import LogisticRegression
# 예: propensity score 계산
ps_model = LogisticRegression()
ps_model.fit(X, treatment)
propensity_scores = ps_model.predict_proba(X)[:, 1]
Python의Propensity Score Matching → statsmodels나 causalml 라이브러리 활용 가능
causalml : 인과 추론(Causal Inference) 및 처치 효과 추정(Treatment Effect Estimation)을 위한 라이브러리.
머신러닝을 활용해 개별 처리 효과(CATE)를 예측하는 방법론들
| 이름 | 방식 | 특징 |
|---|---|---|
| T-learner | 처리군, 통제군 각각 모델 학습 | 유연하지만 표본 크기 적으면 불안정 |
| S-learner | 단일 모델 + 처리 변수 포함 | 간단하지만 상호작용 포착 어려움 |
| X-learner | 잔차 기반 보정 방식 | 불균형한 처리군 비율에 강함 |
| R-learner | 반사실 기반 최적화 방식 | 구조적으로 인과성 추정에 적합 |
비유:
두 반을 따로 수업 (T), 같은 반에서 함께 수업(S),
보충 수업(X), 시험 성적과 능력을 따로 평가(R)
예) 마케팅 대상자를 특성에 따라 나눠, 맞춤형 전략 수립
from econml.grf import CausalForest
model = CausalForest()
model.fit(Y, T, X)
python - econml, grf (R), causalml 라이브러리 사용 가능
예) 수험생을 학력, 성별, 성향, 성적 등 기준으로 나누는 전략 수립
비유: 지도와 나침반 중 하나가 고장 나도 항해 가능
from causalml.inference.meta import BaseDRLearner
learner = BaseDRLearner()
learner.fit(X=X, treatment=t, y=y)
python - DoWhy, EconML, causalml 라이브러리 사용 가능
많은 특성이 존재하거나 다중공선성이 있는 상황에서는 모델이 과적합(overfitting)될 수 있다.
이러한 문제를 방지하기 위해 정규화(regularization) 기법이 사용되는데,
대표적으로 Ridge Regression, Lasso Regression, Elastic Net이 있다.
이들은 회귀 계수에 패널티(제약)를 부여하여 모델의 복잡도를 제어한다.
릿지 회귀는 모델이 너무 많은 특성에 과적합되지 않도록 제어하기 위해 모든 회귀 계수에 작은 값을 부여한다. 즉, 큰 계수가 발생하지 않도록 모델의 복잡도를 제어하는 방식이다.
이 방식에서는 모든 변수가 모델에 포함되지만, 영향력이 큰 변수들의 계수가 줄어들 수 있다.
수학적 제약: L2 정규화 (패널티 항 : )
모든 변수 유지, 계수만 축소
릿지 회귀는 변수 간의 계수 크기를 정규화하여, 모든 변수의 기여도를 일정 수준 이하로 제한한다.
- 모델의 분산은 줄이고, 편향은 약간 감수하는 방향으로 안정성을 확보한다
라쏘 회귀는 특성 중에서 중요한 것만 선택하고, 나머지 특성의 계수는 0으로 만들어서 완전히 제외하는 방법이다. 즉, 릿지 회귀와 달리 일부 변수를 아예 사용하지 않게 만들기도 함.
수학적 제약: L1 정규화 (패널티 항 : )
일부 변수 제거, 해석력 증가
제약 조건(L1 Ball) 아래에서 가장 큰 기여를 하는 변수만 남기고 나머지는 제거함.
엘라스틱 넷은 Ridge와 Lasso를 결합한 방법으로, 두 방법의 장점을 모두 사용한다. 즉, 모델의 복잡도를 제어하면서도 중요한 특성만을 선택하려는 목적이다.
수학적 제약: L1 + L2 혼합
라쏘의 변수 선택 + 릿지의 안정성
# 필요한 라이브러리 로드
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge, Lasso
from sklearn.metrics import mean_squared_error
# 가상의 데이터 생성
np.random.seed(42)
X = np.random.rand(100, 5) # 100개의 샘플, 5개의 특성
y = 3*X[:, 0] + 2*X[:, 1] - X[:, 2] + np.random.randn(100) * 0.5 # 실제 출력값에 약간의 노이즈 추가
# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Ridge 회귀 모델 훈련
ridge = Ridge(alpha=1.0) # alpha 값은 페널티의 강도를 조절
ridge.fit(X_train, y_train)
# Lasso 회귀 모델 훈련
lasso = Lasso(alpha=0.1) # alpha 값은 페널티의 강도를 조절
lasso.fit(X_train, y_train)
# 예측 및 성능 평가 (테스트 데이터에서)
y_pred_ridge = ridge.predict(X_test)
y_pred_lasso = lasso.predict(X_test)
# 모델 성능 출력 (MSE)
print(f'Ridge 회귀 MSE: {mean_squared_error(y_test, y_pred_ridge):.4f}')
print(f'Lasso 회귀 MSE: {mean_squared_error(y_test, y_pred_lasso):.4f}')
# 계수 비교
print("Ridge 회귀 계수:", ridge.coef_)
print("Lasso 회귀 계수:", lasso.coef_)
# 결과 시각화
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.bar(range(len(ridge.coef_)), ridge.coef_)
plt.title("Ridge 회귀 계수")
plt.subplot(1, 2, 2)
plt.bar(range(len(lasso.coef_)), lasso.coef_)
plt.title("Lasso 회귀 계수")
plt.show()
Ridge: alpha=1.0은 페널티의 강도를 조절하는 값이다. 릿지 회귀에서는 큰 계수를 억제해서 모델의 과적합을 방지한다.
Lasso: alpha=0.1은 라쏘 회귀에서 페널티의 강도를 나타낸다. 일부 계수는 0으로 만들어져, 중요하지 않은 특성은 제외됨.
MSE (Mean Squared Error): 예측값과 실제값 간의 차이를 제곱하여 평균한 값. 값이 작을수록 모델의 성능이 좋다고 볼 수 있다.
| 기법 | 수학적 제약 | 설명 | Python 예시 |
|---|---|---|---|
| Ridge | L2 | 계수 크기를 모두 줄임 | Ridge(alpha=1.0) |
| Lasso | L1 | 중요하지 않은 변수 제거 | Lasso(alpha=0.1) |
| Elastic Net | L1 + L2 | 변수 선택 + 계수 안정성 | ElasticNet(alpha=1.0, l1_ratio=0.5) |
[실행 및 통계 분석]
[인과 추정]
[모델 구축]
[결론 적용]
| 측면 | 설명 |
|---|---|
| 실험 기반 의사결정 | A/B 테스트는 빠르고 직관적인 실험 설계가 가능하며, 비교 가능한 환경에서 효과적으로 처리 효과를 평가할 수 있음 |
| 비실험 데이터 보완 | 로그 기반의 관측 데이터에 대해 Propensity Score, Causal Forest, Meta-learners 등을 통해 인과 추정이 가능함 |
| 세그먼트 기반 전략 수립 | CATE 및 HTE 분석을 통해 성별, 연령, 행동 특성 등 다양한 기준으로 세분화된 맞춤형 전략 수립 가능 |
| 모델의 일반화 및 안정성 확보 | Ridge, Lasso 등 Penalized Regression을 활용해 고차원 데이터에서 과적합을 방지하고 모델 성능을 안정적으로 유지 |