합성 통제와 보강 합성 통제로 반사실을 구성하는 법
합성 통제와 보강 합성 통제의 반사실 구성 원리, 도너 풀 설계, 진단 지표와 정책·마케팅·제품 효과 측정 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
반사실을 직접 만들기 어려운 환경에서의 인과 추정
정책, 전국 단위 마케팅, 제품 론칭처럼 무작위 실험을 설계하기 어렵고 처리 집단이 단일 또는 소수인 상황에서는 비교 기준을 새로 구성해야 한다. 합성 통제(Synthetic Control Method, SCM)와 보강 합성 통제(Augmented Synthetic Control, ASC)는 처리 전 시계열을 바탕으로 처리받지 않았을 결과, 즉 반사실을 만드는 준실험 기법이다.
관측 데이터에 기반한 재현 가능한 절차를 제공하므로 정책 평가, 마케팅 개입, 제품 론칭 효과 측정에 활용할 수 있다.
도너 풀의 가중 합으로 만드는 합성 시계열
SCM은 처리 대상 단위의 처리 전 궤적을 도너 풀(donor pool)에 속한 통제 단위들의 가중 합으로 근사한다. 가중치는 비음수이고 합이 1이 되도록 제한하며, 이 조건 아래에서 사전 기간의 적합 오차를 최소화한다.
처리 후 기간에는 이렇게 만든 합성 시계열을 반사실로 사용한다. 실제 관측값과 합성 시계열의 차이가 처리 효과가 되며, 이 차이를 신뢰하려면 처리 전 RMSPE(root-mean-squared prediction error)가 충분히 작아야 한다.
ASC는 SCM만으로 처리 전 궤적을 충분히 맞추기 어려울 때 결과 회귀(outcome model)를 함께 사용한다. 릿지, 라쏘, 추세 회귀 등으로 사전 모델링한 뒤 잔차에 SCM 가중치를 적용하는 이중강건(doubly robust) 구조다. 도너 풀이 빈약하거나 완전한 사전 합성이 어려운 경우 편향을 줄이고, 사전 적합과 추론 안정성을 높이는 데 쓸 수 있다.
적합도를 좌우하는 설계와 진단
도너 풀에는 처리 단위와 유사한 추세를 보이고 공변량을 충분히 커버하는 통제 단위를 넣는다. 사전 추세와 도메인 지식을 함께 사용해 유사도를 판단하고, 간접적으로 처리받았거나 데이터 품질이 낮은 단위는 제외 기준으로 관리한다. 다중 처리 변수나 시간 가변 공변량이 있다면 사전 기간의 평균, 추세, 요인 점수로 차원을 줄일 수 있다.
가중치 최적화의 목표는 합성 시계열이 사전 기간의 처리 단위를 최소 오차로 근사하도록 하는 것이다. w ≥ 0, Σw = 1 제약은 외삽을 막고 가중치 해석을 쉽게 한다. ASC도 결과모형으로 보정한 잔차에 대해 같은 제약 아래 최적화하며, 편향과 분산 사이의 트레이드오프를 개선한다.
진단에는 사전 RMSPE, 포스트/프리 RMSPE 비율, 누적 효과, 시점별 효과를 사용한다. 가짜 처리 전이를 부여하는 플레이스보 테스트로 유의성을 검정하고, 도너를 제거하거나 추가했을 때, 사전 기간을 이동했을 때, 공변량 세트를 바꿨을 때 결과가 유지되는지도 확인한다.
이 방법은 SUTVA(단위 간 간섭 없음), 시간 불변의 잠재 교란, 처리 대상이 도너의 볼록껍질에 포함될 만큼 처리 전 근사가 가능하다는 가정에 기대고 있다. 급격한 구조 변화나 동시 정책 충격이 있다면 편향이 생길 수 있다. ASC가 일부를 완화할 수는 있지만 외삽 위험이 사라지는 것은 아니다.
운영 단계에서는 단위 id, 시간, 처리 플래그, 결과, 공변량으로 구성된 데이터 스키마를 표준화하고 파이프라인으로 관리하는 편이 낫다. 버전과 시드를 고정하고, 프리/포스트 추세와 가중치 분포를 시각화하며, RMSPE 임계 초과나 도너 집중을 자동 경고 대상으로 둔다.
| 항목 | SCM | ASC | DiD(차분의 차분) |
|---|---|---|---|
| 성능(사전 적합) | 우수, 프리 핏에 민감 | 프리 핏 개선, 편향 완화 | 병렬추세 가정 강함, 프리 핏 반영 약함 |
| 확장성 | 도너·공변량 증가 시 계산 부담 중간 | 모델 학습 비용 추가, 중간~높음 | 매우 높음 |
| 일관성(가정) | 볼록 조합 가능성, 간섭 없음 | 결과모형의 부분적 정규화로 완화 | 엄격한 병렬추세 |
| 안정성 | 특정 도너에 가중 집중 가능 | 가중 분산 완화 경향 | 교란 변수 민감 |
| 운영 편의 | 구현 단순, 튜닝 적음 | 모델·튜닝 선택 필요 | 구현 가장 단순 |
정책과 제품 변경의 효과를 읽는 방식
공공 정책에서는 세금, 흡연 규제, 최저임금 인상 효과를 측정할 때 적용할 수 있다. 처리 단위가 주나 도시처럼 단일 또는 소수이고 장기 시계열을 확보할 수 있는 경우다. 도너 풀이 작거나 구조적 차이가 커서 사전 적합이 나쁘다면 ASC를 고려한다.
전국 런칭, 브랜드 캠페인, 가격 개편처럼 동시에 적용된 마케팅 이벤트도 대상이 된다. 지역이나 채널별로 도너 풀을 구성하고, 계절성이나 프로모션이 겹친 경우 검색 트렌드와 경쟁사 지표 같은 공변량을 포함해 ASC로 편향을 완화한다.
알고리즘 업데이트, 요금제 전환, UI 개편의 KPI 변화를 분석할 때는 처리 전 로그에서 충분한 특징을 구성해야 한다. 롤백이나 확장 결정을 지원하려면 신뢰구간과 감도 분석을 자동화하는 방식이 적합하다.
기대할 수 있는 결과와 적용 범위
프리 핏을 최적화하면 DiD 대비 사전 RMSPE를 개선할 수 있다. 실제 데이터셋 기준으로 ASC 적용 시 프리 RMSPE가 10~40% 추가 개선된 사례가 관찰되었으며, 데이터와 모형에 의존적이고 최신 정보 확인이 필요하다. 플레이스보 분포와 실제 효과를 비교하면 순위 기반 p-value를 제공할 수 있어 보수적인 유의성 평가에도 활용된다.
단일 또는 소수 처리 단위에서도 설득력 있는 반사실을 제시할 수 있고, 외삽을 최소화해 해석하기 쉽다. 데이터 파이프라인까지 갖추면 정책과 기능 릴리스 평가를 위한 표준 운영 체계로 정착시킬 수 있다.
구현을 위한 데이터 준비와 예시
패널 데이터에는 단위 id, 시간, 처리 플래그, 결과, 공변량이 필요하다. 사전 기간은 포스트 길이의 2배 이상을 권장한다. 누락치는 보간하고, 정규화 또는 표준화를 적용하며, 공변량에는 시차와 추세 특징을 만들고 동시 정책 충격은 변수화한다.
Python에서 SCM 가중치 구하기
전제조건: Python 3.9+, pandas, numpy, cvxpy 설치. 패널 데이터 df(unit, time, treated, y).
import pandas as pd, numpy as np, cvxpy as cp
# 설정
treated_unit = "A"
T0 = 20 # 처리 전 기간 길이
# 피벗
Y = df.pivot(index="time", columns="unit", values="y").sort_index()
pre = Y.index < Y.index[T0] # 처리시점 이전 마스크
# 도너와 처리 분리
donors = [u for u in Y.columns if u != treated_unit]
X0 = Y.loc[pre, donors].values # (T0 x J)
X1 = Y.loc[pre, treated_unit].values # (T0,)
# 가중치 최적화: min ||X1 - X0 w||_2, s.t. w>=0, sum w = 1
J = len(donors)
w = cp.Variable(J, nonneg=True)
objective = cp.Minimize(cp.norm(X1 - X0 @ w, 2))
constraints = [cp.sum(w) == 1]
prob = cp.Problem(objective, constraints)
prob.solve(solver=cp.ECOS)
w_hat = w.value
# 합성 시계열 및 효과
Y_sc = (Y[donors] @ w_hat).values # 전체 기간 합성
effect = Y[treated_unit].values - Y_sc
# 진단
pre_rmspe = np.sqrt(np.mean((Y.loc[pre, treated_unit].values - (Y.loc[pre, donors] @ w_hat).values)**2))
post_rmspe = np.sqrt(np.mean((Y.loc[~pre, treated_unit].values - (Y.loc[~pre, donors] @ w_hat).values)**2))
print(pre_rmspe, post_rmspe)
사전 RMSPE가 높다면 공변량을 보강하거나 ASC로 전환한다. 음의 가중치를 허용하는 일반화 SCM은 외삽 위험을 높일 수 있다.
R에서 ASC 모델 적합하기
전제조건: R 4.x, augsynth, dplyr 설치(패키지 버전 최신 정보 확인 필요). 데이터: id, time, treated, y, 공변량 X1, X2…
library(augsynth)
library(dplyr)
# 처리 단위 단일, 이진 처리 플래그(처리 시점 이후 1)
fit <- augsynth(
y ~ X1 + X2,
unit = id, time = time, tmt = treated,
data = df,
progfunc = "ridge", scm = TRUE, # 결과모형 릿지 + SCM 결합
matchfun = "L2", # 잔차 매칭 기준
min.quiet = TRUE
)
summary(fit)
plot(fit) # 프리/포스트 추세 및 효과 시각화
fit$att # 시점별/누적 ATT
progfunc는 ridge 또는 elastic net을 교차검증으로 선택하고, 사전 기간 이동 테스트와 leave-one-out 방식의 도너 풀 민감도 분석을 함께 수행한다.
추정이 흔들릴 때 확인할 항목
입력 단계에서는 사전·사후 기간 구분, 처리 단위의 단일성, 누락치 비율 임계(예: <5%)를 확인한다. 사전 RMSPE 절대값과 포스트/프리 RMSPE 비율을 함께 보고, 비율이 급등하면 모델을 다시 설계한다.
플레이스보 순위 p-value, 도너 제거 민감도, 공변량 세트 변경에 따른 효과 안정성도 점검 대상이다. 문제가 발견되면 도너를 재선정하고, 공변량을 확대하거나 차원을 줄이며, ASC 전환 또는 제약을 완화한 일반화 SCM을 검토한다.