목표: 단기간의 데이터로 장기간의 ROI를 측정하게 하는 목적으로 진행
위와 같이 어떤 액션의 Incremental Revenue를 구하기를 원함
문제상황1
인과 그래프는 아래와 같이 그릴 수 있는데 현재시점투자(treatment), 장기수익(outcome)에 과거 투자, 인구통계정보, 과거 수익, 과거 대리변수 등의 confounder가 영향을 주기 때문에 바로 treatment→outcome 구조로 모델링하면 공통원인으로 인한 편향된 수치가 나옴
DML을 통해 confounder의 영향에 의한 효과를 제거(통제)한 효과를 추정하고자 함
DML 절차
Y를 W로 예측하도록 모델을 만들어서 Y hat을 만듦
T를 W로 예측하도록 모델을 만들어서 T hat을 만듦
각각을 잔차화시켜서 (Y-Yhat)을 (T-That)으로 회귀
이렇게 causal effect 추정
문제상황2
outcome이 장기수익이기 때문에 아직 관측되지 않았음
과거 데이터셋을 통해 단기 매출로 장기 매출을 예측하는 ML 모델 만들고, 이 모델로 현재 가진 데이터셋으로 장기 매출을 예측하게 함
문제상황3
현재의 투자가 미래의 투자에 영향을 주고 미래의 투자가 장기수익에 영향을 주어 결과적으로 현재 투자의 영향이 두 번 카운팅 됨
순차적으로 DML 적용하는 방식(Dynamic DML)으로 해결
T_t는 Y_t, Y_t+1, T_t+1 세 가지에 연결되는데 T_t와 Y_t는 (시점이 두 개만 있다 했을 때) 교란 요소가 없기 때문에 빼면 T_t, Y_t+1, T_t+1 세 변수가 남게 됨
이 때 DML을 하면 T_t의 영향력을 통제한 T_t+1 → Y_t+1이 나오게 되고(theta_t+1)
Y_t+1에서 theta_t+1 * T_t+1을 빼면 T_t의 t+1 시점 장기적 영향으로 인한 Y 값이 나오고, 이를 Y_t와 더하면 두 시점에 걸친 T_t를 통해 발생한 Y_adj를 구할 수 있음
시점을 좀 더 확대하여 2년 데이터를 6개월씩 4번 나눴을 때, 4번째 기간 수익부터 여러 시점의 투자 영향을 구하고 그만큼 빼줌
# on historical data construct adjusted outcomes
from econml.dynamic.dml import DynamicDML
panelYadj = panelY.copy()
est = DynamicDML(
model_y=LassoCV(max_iter=2000), model_t=MultiTaskLassoCV(max_iter=2000), cv=2
)
for t in range(1, n_periods): # for each target period 1...m
# learn period effect for each period treatment on target period t
est.fit(
long(panelY[:, 1 : t + 1]),
long(panelT[:, 1 : t + 1, :]), # reshape data to long format
X=None,
W=long(panelX[:, 1 : t + 1, :]),
groups=long(panelGroups[:, 1 : t + 1]),
)
# remove effect of observed treatments
T1 = wide(panelT[:, 1 : t + 1, :])
panelYadj[:, t] = panelY[:, t] - est.effect(
T0=np.zeros_like(T1), T1=T1
) # reshape data to wide format