Bayesian Optimization으로 광고 예산 분배 — 채널별 ROAS 곡선을 데이터로 찾아내기
채널 5개에 예산 1억을 어떻게 분배할까요. 채널별 ROAS는 예산 크기에 따라 달라집니다(saturation·diminishing returns). Bayesian Optimization은 적은 시도로 예산-ROAS 곡선을 추정해 최적 분배를 찾아냅니다. MMM·Marketing Mix와 결합하는 운영 도구.
채널 5개에 예산 1억을 어떻게 분배할까요. “ROAS 좋은 채널에 더 태우자”가 답인 것 같은데 채널별 ROAS는 예산 크기에 따라 달라집니다 — 적게 쓸 때는 좋다가, 많이 태우면 saturation이 옵니다. 정확한 예산-ROAS 곡선을 알면 최적 분배가 결정되지만, 곡선을 추정하려면 다양한 예산 시나리오의 데이터가 필요합니다. Bayesian Optimization은 적은 시도로 곡선을 추정하고 최적점을 찾는 도구. 마케터의 예산 의사결정에 들어가는 또 다른 도구입니다.
1. 예산 분배의 진짜 어려움 — saturation
광고 예산 분배의 직관은 단순해 보입니다. ROAS가 좋은 채널에 더 태우자.
문제는 ROAS가 예산에 의존한다는 점입니다.
- Meta에 100만원 → ROAS 6
- Meta에 500만원 → ROAS 4
- Meta에 1,000만원 → ROAS 2.5
같은 채널이어도 예산이 늘면 ROAS가 떨어집니다. 매체 풀이 한정되어 있고, 좋은 임프레션부터 사용되기 때문. 이게 saturation·diminishing returns 입니다. huny.log의 MMM 입문 글에서 이 곡선을 다룹니다.
각 채널마다 saturation 곡선이 다릅니다. 운영 결정의 핵심은 다음입니다.
모든 채널의 marginal ROAS(추가 1원당 ROAS)가 같아질 때까지 예산을 옮긴다.
이 자리에 도달하면 더 옮길 이유가 없습니다 — 어디로 옮겨도 같은 한계 효과. 문제는 marginal ROAS 곡선을 모르면 이 자리를 찾을 수 없다는 점.
2. Bayesian Optimization의 한 줄 직관
Bayesian Optimization(BayesOpt)의 한 줄 정의:
비싼 함수의 최적점을 적은 시도로 찾기.
광고 예산 시뮬레이션이 비쌉니다 — 한 시나리오를 1주 굴려야 진짜 ROAS를 알 수 있습니다. 100가지 시나리오를 다 시도할 수 없습니다. BayesOpt는 다음 두 도구로 가장 가치 있는 시나리오를 골라가며 곡선을 추정합니다.
- Surrogate model — Gaussian Process(GP). 지금까지 본 데이터로 함수의 평균·분산 추정
- Acquisition function — 다음 시도 후보를 고르는 룰. EI(Expected Improvement)·UCB·Thompson Sampling
흐름:
- 첫 5~10개 시도는 무작위로 데이터 수집
- GP로 surrogate function 적합 — 어디가 좋은지·어디가 불확실한지 추정
- acquisition function으로 다음 시도 후보 선택
- 그 시나리오 실험·데이터 수집
- GP 업데이트 → 반복
이 한 사이클로 보통 3050번 시도면 좋은 최적점을 찾습니다. 100가지 시나리오를 다 돌리는 것보다 1/21/3 비용.
3. acquisition function — 탐색·활용 균형
Cold start Thompson Sampling 글의 탐색·활용 프레임이 BayesOpt에도 그대로 적용됩니다. 다음 시도 후보를 고르는 acquisition function이 그 역할.
가장 흔한 3가지:
- Expected Improvement (EI) — 지금까지 best보다 얼마나 더 좋아질 기대값. 가장 자주 쓰임
- Upper Confidence Bound (UCB) — 점추정 + 불확실성 보너스. Thompson과 유사
- Thompson Sampling — GP 사후 분포에서 한 번 샘플링한 함수의 최대점
여기서 는 지금까지 본 best. EI가 높은 자리를 다음 시도로 고릅니다 — best보다 좋아질 기대값이 큰 자리.
from skopt import gp_minimize
# objective: 광고 예산 시나리오 → -ROAS (최소화 문제로)def objective(budget_split): return -simulate_roas(budget_split)
result = gp_minimize( objective, dimensions=[(0, 1)] * 5, # 5개 채널, 비중 0~1 n_calls=30, acq_func='EI',)print(result.x, -result.fun) # 최적 비중, 최대 ROAS이게 본문에 박는 유일한 코드입니다. scikit-optimize 한 줄로 BayesOpt가 동작. 30번 시뮬레이션·실험으로 5채널의 최적 분배를 찾습니다.
4. MMM과의 결합 — surrogate를 MMM으로
위 코드는 simulate_roas() 함수가 필요합니다. 이걸 진짜 광고 시장에서 굴리면 한 시도가 1주·5,000만 원의 비용. BayesOpt도 30번이면 1.5억 원·30주.
대안은 MMM 모델로 simulate_roas를 대체하는 것입니다. MMM이 채널별 saturation 곡선·adstock·시즌을 모델링했다면, 그 위에서 BayesOpt를 돌려 최적 분배를 찾습니다. 진짜 시장 실험 0번으로 BayesOpt 30번 돌릴 수 있습니다.
운영 패턴:
- MMM으로 채널별 saturation 곡선 추정 (분기 1번)
- MMM 위에서 BayesOpt로 다음 분기 최적 예산 분배 탐색
- 실제 운영 = BayesOpt 결과 위주 + 일부 탐색 예산
- 다음 분기 데이터 → MMM 재학습 → 다시 BayesOpt
| 도구 | 답하는 질문 | 빈도 |
|---|---|---|
| MMM | 채널별 곡선 형태 | 분기 1번 |
| BayesOpt | 곡선 위 최적점 | 분기 1번 |
| 일별 운영 | 점진적 조정 | 매일 |
5. constraint와 robustness
운영의 BayesOpt는 단순 최적화가 아닙니다. 제약 조건과 강건성이 함께.
5-1. Constraint
- 총 예산 — 5개 채널 합 = 1억
- 최소 예산 — 각 채널 최소 1,000만원 이상 (브랜드 노출 보장)
- 최대 예산 — 한 채널 4,000만원 이하 (의존도 제한)
constrained BayesOpt가 표준 (skopt·BoTorch에서 지원).
5-2. Robustness
같은 분배가 매주 정확히 같은 ROAS를 내지 않습니다. 분산이 큰 자리. 단순 best 분배가 시장 변동성에 흔들릴 수 있습니다.
robust BayesOpt는 평균 ROAS 대신 ROAS 분포의 conservative 분위(예: 25%분위)를 최적화. 더 안정적인 분배 — 평균 ROAS는 약간 낮지만 worst case가 좋아짐.
6. 마케팅 실무 케이스 3개
6-1. 분기 예산 재분배
분기 시작 시 BayesOpt + MMM으로 채널별 분배 재계산. 새 데이터(지난 분기)와 새 컨텍스트(시즌·매크로)에 맞춤. 사람이 손으로 정한 분배 대비 평균 ROAS 5~12%p 향상이 일반적.
6-2. 신규 채널 추가의 가치 평가
새 채널 도입 시 “이 채널에 얼마 태우면 어떤 ROAS”를 BayesOpt로 빠르게 탐색. 첫 4주에 BayesOpt가 곡선의 가파른 부분을 찾아내고, 5주차부터 그 자리 안정 운영.
6-3. 비용 충격 대응
원자재·매체 비용 급변으로 채널별 ROAS 분포가 변할 때, BayesOpt를 재시작해 새 곡선 빠르게 탐색. 사람의 직관으로 조정하는 것보다 빠르고 정확.
7. BayesOpt가 깨질 때 — 흔한 함정 3가지
7-1. simulate_roas가 부정확
MMM 위에서 BayesOpt를 굴린다면 MMM의 정확도가 결과를 좌우. MMM 모델이 실제 곡선과 다르면 BayesOpt 최적점이 진짜 최적이 아님. MMM 검증을 먼저.
7-2. 차원이 너무 높음
채널 수 × 시간(주별)로 차원이 늘면 BayesOpt가 어려워집니다. 채널 5개 + 분기 단위면 5차원 — OK. 채널 20개 + 주별이면 80차원 — BayesOpt가 잘 안 듣음. 이런 자리는 hierarchical Bayesian이나 다른 도구가 필요.
7-3. acquisition function 선택을 안 함
EI 디폴트 그대로 쓰는 게 보통 OK이지만, 도메인에 따라 다른 선택이 더 적합할 수 있습니다. 시즌이 중요한 자리는 Thompson, 비용 제약이 빡빡한 자리는 EI-with-cost.
8. 마치며 — 마케터의 예산 도구상자
마케터의 예산 분배 도구상자에는 이제 여러 층이 있습니다.
- 직관·경험 — 빠르고 단순. 큰 변화 시점에 첫 추정
- MMM — 채널 곡선의 형태 모델링. 분기 단위 검증
- BayesOpt — 곡선 위 최적점 탐색. MMM 위에서 운영
- 실시간 입찰 자동화 — 일별 미세 조정. Google·Meta의 자동 입찰
네 층이 같이 가야 분기·일별·시즌별 결정이 정합성 있게 짜입니다. 한 층만 쓰면 다른 층이 가져갈 가치를 놓칩니다.
다음 글에서는 같은 도구상자의 또 다른 자리, incrementality test 설계를 다룹니다. geo·user holdout 결정 트리로 어떤 인과 도구를 어디 쓸지 정리.
참고
- Mockus (1989), Bayesian Approach to Global Optimization — BayesOpt 표준 교과서
- Snoek, Larochelle & Adams (2012), Practical Bayesian Optimization of Machine Learning Algorithms, NeurIPS — ML hyperparameter 표준 적용
- Frazier (2018), A Tutorial on Bayesian Optimization — 입문 표준 튜토리얼
- scikit-optimize — Python 운영 표준
- BoTorch — PyTorch 기반 BayesOpt, constrained·multi-objective 지원
- huny.log 내부 글: MMM 입문, Cold start Thompson, Synthetic DiD
퍼포먼스 마케팅 카테고리의 다른 글
전체 보기 →-
2026·06·05
ROAS 보고서가 늘 거짓말하는 이유 — incrementality 3대장
Meta 대시보드 ROAS 5가 실제로는 1.x인 이유. last-click·view-through·incremental 세 가지 ROAS의 차이와, holdout·geo-lift·ghost ads·conversion lift로 진짜 증분을 측정하는 법을 마케터 시선으로 정리합니다.
-
2026·05·16
DSP·SSP·DMP 인프라 해부 — 매체 영업 미팅에서 듣는 약자들의 정체
매체 영업 미팅에서 DSP, SSP, DMP, CDP, ad exchange, 헤더비딩 같은 약자들이 쏟아집니다. 각각이 어느 회사이고, 광고비가 어디로 흘러가며, 마케터가 의사결정할 때 어떤 의미를 갖는지 한 글에 정리합니다.
-
2026·05·16
Lookback window가 ROAS를 바꾸는 법 — click 7d, view 1d, 28d, 90d의 차이
같은 캠페인이라도 attribution lookback window를 click 7d / view 1d / 28d / 90d 중 어느 걸로 보느냐에 따라 ROAS가 두 배까지 차이납니다. 매체별 default와 그것을 마케터가 어떻게 의사결정에 써야 하는지를 정리합니다.
-
2026·05·09
Brand lift study 설계 — 광고가 인지·호감도를 끌어올렸나
브랜드 광고는 ROAS로 잡히지 않고 인지·호감도·구매의향으로만 측정됩니다. 노출 그룹과 비노출 그룹을 비교하는 brand lift study의 설계, 표본 계산, 실무 함정을 마케터 시선에서 정리.