Prophet과 CausalImpact — 시계열 예측과 캠페인 인과 효과
Prophet은 시즌·트렌드를 자동 분리해 예측을 단순화하고, CausalImpact는 그 예측을 baseline으로 캠페인 효과를 추정합니다. 마케팅 자리의 두 도구 결합 사용 패턴.
캠페인 시작 후 매출이 +20% 올랐다면 그게 캠페인 효과인지 시즌·트렌드 효과인지 구분이 어렵습니다. CausalImpact는 캠페인이 없었을 때의 매출 예측(counterfactual)을 baseline으로 잡고, 실제 매출과의 차이를 캠페인 효과로 추정합니다. baseline 예측에 Prophet 같은 state-space 모델이 자주 들어갑니다. 두 도구의 결합이 마케팅 인과 분석의 표준 패턴 중 하나입니다.
마케터가 이 글을 읽어야 하는 이유: 분기 캠페인의 효과를 보고할 때 “전년 동기 대비 +20%“는 시즌·트렌드 효과가 섞여 있어 정직하지 않습니다. CausalImpact가 시즌·트렌드를 분리한 baseline을 만들어주면, 캠페인의 진짜 효과를 회의에서 데이터로 답할 수 있습니다.
1. Prophet의 한 줄 직관
Facebook이 만든 시계열 예측 라이브러리. 매끄러운 트렌드 + 주기적 시즌 + 휴일 효과로 시계열을 분해.
- : 트렌드 (선형 또는 logistic)
- : 시즌 (주기적 푸리에 항)
- : 휴일 효과
- : 잔차 노이즈
자동으로 트렌드·시즌·휴일을 분리해 예측. 마케팅 시계열(매출·전환·CTR) 자리에 자연스럽게 적용.
2. CausalImpact의 한 줄 직관
Google이 만든 인과 분석 라이브러리. Bayesian state-space 모델로 처리 전 데이터를 학습한 뒤 처리 후 시점의 baseline을 예측. 실제값과 baseline의 차이가 인과 효과.
처리 후 시점의 “캠페인이 없었다면 어땠을까”를 데이터로 추정.
| 단계 | 작업 |
|---|---|
| 1. 학습 | 처리 전 데이터로 baseline 모델 학습 |
| 2. 예측 | 처리 후 baseline 예측 (counterfactual) |
| 3. 차이 | 실제값 - baseline = 인과 효과 |
| 4. 신뢰구간 | Bayesian posterior에서 직접 |
처리 전 충분한 데이터(보통 6주+)가 있으면 정직한 baseline 가능.
3. 두 도구의 결합 — Prophet → CausalImpact 백엔드
CausalImpact의 기본 baseline 모델은 BSTS(Bayesian Structural Time Series). Prophet으로 baseline 예측한 뒤 CausalImpact 식으로 처리 효과 추정하는 패턴이 유연.
처리 전 시계열 │ ▼Prophet (트렌드 + 시즌 분리) │ ▼처리 후 baseline 예측 (Prophet의 yhat) │ ▼실제 처리 후 - baseline = 캠페인 효과 │ ▼Bootstrap 95% CIProphet의 강점(트렌드·시즌 자동 분리) + CausalImpact의 강점(인과 효과 추정 + 신뢰구간)을 결합.
4. 마케팅 자리의 적용
4-1. 분기 캠페인 효과
분기 시작에 큰 캠페인 시작. 그 시점 이후 매출의 캠페인 기여를 baseline 차이로 추정.
4-2. 신규 광고 채널 도입
새 채널 광고 시작한 시점부터의 매출 lift 추정. 채널 도입이 무작위 배정이 아니라 RDD·DiD 적용 어려움. CausalImpact가 표준.
4-3. 가격 변경의 영향
상품 가격 인상·할인 시작 후 판매량 변화. 자연 실험으로 효과 추정.
4-4. 이벤트·시즌 이상치 탐지
블랙프라이데이 같은 이벤트의 매출 lift를 baseline 대비로 측정.
| 자리 | 처리 시점 | baseline 데이터 |
|---|---|---|
| 분기 캠페인 | 캠페인 시작일 | 처리 전 8-12주 |
| 신규 채널 | 채널 도입일 | 처리 전 6주+ |
| 가격 변경 | 변경일 | 처리 전 8주+ |
| 이벤트 lift | 이벤트일 | 작년 동기간 |
5. 코드 한 묶음 — Prophet + CausalImpact
이게 글에 박는 유일한 코드입니다.
import pandas as pdfrom prophet import Prophet
# df: ds(date), y(매출), 처리 시작일 = 2026-04-01PRE_END = "2026-03-31"POST_START = "2026-04-01"
# 1. 처리 전 데이터로 Prophet 학습df_pre = df[df["ds"] <= PRE_END]m = Prophet(yearly_seasonality=True, weekly_seasonality=True)m.fit(df_pre)
# 2. 처리 후 baseline 예측 (counterfactual)future = df[["ds"]] # 전체 기간forecast = m.predict(future)
# 3. 인과 효과 = 실제 - baseline (처리 후만)df_post = df[df["ds"] >= POST_START].merge(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]], on="ds")df_post["effect"] = df_post["y"] - df_post["yhat"]
cumulative_effect = df_post["effect"].sum()print(f"누적 캠페인 효과: {cumulative_effect:,.0f}원")
# 4. Bootstrap 95% CI (간이)n_boot = 1000boot_estimates = []for _ in range(n_boot): df_pre_b = df_pre.sample(frac=1, replace=True) m_b = Prophet(yearly_seasonality=True, weekly_seasonality=True) m_b.fit(df_pre_b) fc_b = m_b.predict(df_post[["ds"]]) eff = (df_post["y"].values - fc_b["yhat"].values).sum() boot_estimates.append(eff)
import numpy as npci_lo, ci_hi = np.percentile(boot_estimates, [2.5, 97.5])print(f"95% CI: ({ci_lo:,.0f}, {ci_hi:,.0f})원")처리 후 매출 - Prophet baseline = 캠페인 효과. Bootstrap으로 신뢰구간. R CausalImpact 패키지를 직접 써도 비슷한 결과.
6. CausalImpact 단독 사용
CausalImpact 자체에 BSTS baseline이 들어있어 단독 사용도 흔함.
# Python causalimpact (TFP 기반)from causalimpact import CausalImpact
ci = CausalImpact( data=df.set_index("ds")["y"], pre_period=["2026-01-01", "2026-03-31"], post_period=["2026-04-01", "2026-04-30"],)print(ci.summary())ci.plot()처리 전·후 기간만 지정하면 baseline 학습·예측·효과 추정·신뢰구간이 한 번에. 운영 효율 좋음.
7. 핵심 가정과 한계
7-1. baseline 모델의 정확성
baseline이 틀리면 인과 효과 추정도 무너짐. 처리 전 데이터에서 모델 검증(holdout MAPE) 필수. MAPE 5% 이하면 baseline 신뢰 가능.
7-2. 처리 시점의 다른 변화
캠페인 시작과 동시에 시즌·경쟁사 행동이 바뀌면 효과가 섞임. 외생 변수를 모델에 명시적 포함.
7-3. 외부 요인의 통제
control 시계열을 함께 사용하면 정밀도 향상. 예: 같은 카테고리의 비교 매장 데이터.
# Prophet에 외생 변수 추가m = Prophet()m.add_regressor("competitor_promo") # 경쟁사 프로모션 인디케이터m.add_regressor("season_index") # 시즌 강도m.fit(df_pre)8. 분기 보고에 박을 표 양식
| 항목 | 값 |
|---|---|
| 처리 시작 | 2026-04-01 |
| 처리 후 30일 실제 매출 | 1.85억 |
| Baseline 예측 매출 | 1.50억 |
| 캠페인 효과 (절대) | +0.35억 |
| 캠페인 효과 (상대) | +23% |
| 95% CI | (+18%, +28%) |
| Baseline MAPE (사전 검증) | 4.2% |
이 한 표가 회의에서 “캠페인 효과 +0.35억 (95% CI 18-28%)“을 정직하게 보고하는 표준 양식.
9. 마치며 — 시계열 인과 분석의 표준 도구
Prophet과 CausalImpact는 시계열 인과 분석의 가장 단순하고 강력한 결합입니다. 처리 전 데이터로 baseline을 학습해 처리 후 counterfactual 예측, 실제와의 차이가 인과 효과. 단순한 흐름이지만 baseline 모델의 정확성·외생 변수 통제·처리 시점의 다른 변화 같은 가정을 매번 점검해야 결과의 정직성이 유지됩니다.
다음 분기에 한 번만 시도해 볼 만한 것은 가장 큰 캠페인 한 자리에 Prophet·CausalImpact를 적용해 baseline 대비 효과를 추정하는 흐름입니다. “전년 동기 대비”가 아니라 “baseline 예측 대비”가 보고에 들어가면 의사결정 신뢰도가 한 단계 올라갑니다.
다음에 읽을 글
- DiD 인과추론 — 통제 그룹 활용 시계열 분석
- Geo-lift 인과추론 — 지역 단위 자연실험
- MMM 입문 — 채널별 시계열 회귀
참고
- Prophet: https://facebook.github.io/prophet/
- CausalImpact (R): https://google.github.io/CausalImpact/
- Brodersen et al. (2015), “Inferring causal impact using Bayesian structural time-series models”: https://research.google/pubs/pub41854/
- Taylor & Letham (2017), “Forecasting at scale”: https://peerj.com/preprints/3190/
- “tfcausalimpact” (Python): https://github.com/WillianFuks/tfcausalimpact
통계·ML 카테고리의 다른 글
전체 보기 →-
2026·05·10
마케팅 실험 플랫폼 설계 — 사내 A/B 시스템의 5가지 원칙
광고 플랫폼 자체 A/B로는 부족하고 외부 SaaS는 비쌉니다. 사내 마케팅 실험 플랫폼을 설계할 때 깔아야 할 split assignment·exposure log·SRM 검정·sequential safe·메타 표준 5가지 원칙.
-
2026·05·09
Bayesian A/B 테스트 심화 — prior 잡는 법과 HDI 해석
베이지안 A/B는 "p-value < 0.05"가 아니라 "B가 A보다 좋을 확률 0.92"를 줍니다. 그 확률이 정직하려면 prior를 잘 잡아야 하고, HDI를 잘못 읽으면 함정이 옵니다. 마케터 시선에서 prior·posterior·HDI 정리.
-
2026·05·09
Doubly robust estimation — IPW와 outcome 모델의 결합으로 인과 추정 안정화
PSM·IPW는 propensity 모델이 틀리면 무너지고, 회귀는 outcome 모델이 틀리면 무너집니다. doubly robust는 두 모델을 결합해 둘 중 하나만 맞으면 정직한 효과 추정. 마케팅 인과 분석의 안전판.
-
2026·05·09
Heterogeneous treatment effects — 평균 효과 너머의 개인별 효과
A/B 평균 효과 +5%p가 모든 사람에게 같지 않습니다. 일부에게는 +20%p, 일부에게는 -3%p. CATE·uplift forest로 효과의 이질성을 추정해 타겟 마케팅을 정밀화하는 흐름.