"쿠폰 캠페인 전환율이 18%, 비대상은 12%. 효과 +6%p 인정!" — 이 한 줄이 위험한 이유는, 그 18% 중 대부분이 어차피 샀을 사람이기 때문이에요. 쿠폰을 안 줘도 살 사람한테 쿠폰을 주는 건 마진을 그냥 깎는 행위입니다. 이 글은 "진짜 바뀐 사람"만 골라내는 uplift 모델링의 직관을 마케터 언어로 풀어봅니다.
4가지 페르소나 — 가장 중요한 그림
uplift 사고의 출발점은 이 2×2 표예요. "쿠폰 받았다 / 안 받았다" × "샀다 / 안 샀다"의 모든 조합:
| 쿠폰 받음 → 샀다 | 쿠폰 받음 → 안 샀다 | |
|---|---|---|
| 쿠폰 안 받음 → 샀다 | Sure Things (어차피 살 사람) | Lost Causes에 가까움 |
| 쿠폰 안 받음 → 안 샀다 | Persuadables 🎯 | Lost Causes (안 살 사람) |
여기서 빠진 한 칸: Do Not Disturb — 쿠폰을 주면 오히려 안 사는 역효과 그룹. 너무 자주 쿠폰을 받아 "이 브랜드 항상 할인하네" 인식이 생긴 사람들.
📌 네 페르소나 한 줄 정의
- Persuadables 🎯: 쿠폰을 받으면 사고, 안 받으면 안 산다. 이 그룹만 캠페인에 가치가 있음
- Sure Things: 받든 안 받든 산다. 쿠폰 = 마진 깎는 행위
- Lost Causes: 받든 안 받든 안 산다. 쿠폰 = 비용만 발생
- Do Not Disturb: 쿠폰을 받으면 오히려 떠난다. 쿠폰 = 음의 효과
전통적인 "전환 가능성 높은 사람한테 보내기"(propensity 모델)는 Persuadables와 Sure Things를 구분하지 못해요. 둘 다 "전환 가능성 높음"으로 잡히기 때문이죠. Uplift는 이 둘을 구분합니다.
Uplift의 정의 — Treatment Effect
수식으로는 단순.
마케터 언어로: "그 사람이 쿠폰을 받았을 때의 구매 확률 - 안 받았을 때의 구매 확률". 양수면 캠페인이 그 사람에게 효과가 있다는 뜻.
문제: 한 사람한테는 "받았다" 또는 "안 받았다" 한 가지 결과만 관측되지, 둘 다 관측 못 합니다(인과추론의 근본 문제, 다시 등장). 그래서 여러 모델 접근이 있어요.
T-Learner — 가장 단순한 시작
각 그룹에 모델 따로 학습.
from sklearn.ensemble import GradientBoostingClassifier
# 데이터: features X, treatment T (0 or 1), outcome y (0 or 1)
treated_idx = (T == 1)
control_idx = (T == 0)
# 두 모델 따로
m_treated = GradientBoostingClassifier().fit(X[treated_idx], y[treated_idx])
m_control = GradientBoostingClassifier().fit(X[control_idx], y[control_idx])
# 새 사람 x의 uplift 추정
def uplift(x):
p1 = m_treated.predict_proba(x)[:, 1]
p0 = m_control.predict_proba(x)[:, 1]
return p1 - p0
장점: 단순, 빠름, 디버깅 쉬움.
단점: 두 모델이 따로라 데이터 적은 그룹의 분산이 큼. Treatment·Control 그룹 크기가 비슷해야 잘 됨.
X-Learner — Treatment 데이터 적을 때의 답
CRM 실무에선 보통 Treatment(쿠폰 받은 사람)가 Control보다 적어요. T-Learner는 이 불균형에 약합니다. X-Learner는 한 단계 더 나가요.
핵심 아이디어 4단계:
- T-Learner처럼 두 모델 학습 (treated용 / control용)
- Treatment 그룹 사람한테는 "실제 전환 - control 모델이 예측한 값"을 "가짜 효과(imputed effect)"로 라벨
- Control 그룹 사람한테는 "treated 모델 예측 - 실제 전환"을 가짜 효과로 라벨
- 이 가짜 효과를 회귀모델 두 개로 따로 학습 후, propensity score로 가중평균
이름이 X인 이유: 두 그룹의 정보를 cross로 활용하기 때문. 데이터 적은 쪽이 많은 쪽 모델의 예측을 받아 자기 데이터를 보완해요. T-Learner가 "두 모델을 분리"했다면, X-Learner는 "두 모델이 서로의 정보를 빌리는" 구조.
| Learner | 적합 상황 | 강점 | 약점 |
|---|---|---|---|
| S-Learner | 소규모, 빠른 베이스라인 | 가장 간단 | 효과 작으면 무시됨 |
| T-Learner | 그룹 균등 (50:50) | 디버깅 쉬움 | 불균등에 약함 |
| X-Learner | Treatment ≪ Control (CRM 표준) | 작은 그룹 보강 | 구현 복잡 |
| DR-Learner | 관찰 데이터 (RCT 아닌) | 가장 robust | 튜닝 어려움 |
| Causal Forest | 비선형 효과 | 자동 segment 발견 | 학습 느림 |
💡 언제 어떤 learner?
- S-Learner: Treatment 변수 자체를 feature로 넣은 단일 모델. 가장 간단, 단 효과가 작으면 모델이 무시할 수 있음.
- T-Learner: 두 그룹 균등할 때 무난.
- X-Learner: Treatment 적을 때 (CRM 실무 표준).
- DR-Learner / Causal Forest: 더 robust, 단 구현 복잡.
Qini 곡선 — Uplift 모델 평가의 표준
전통적 ML 평가(AUC, accuracy)는 uplift에 안 맞아요. 우리가 알고 싶은 건 "상위 N%만 골라 보냈을 때 얼마나 더 많은 전환을 만들었나"입니다. 이걸 시각화한 게 Qini 곡선.
핵심 수식:
- = 상위 명에 발송했을 때 그 안의 treated 그룹 전환 수
- = 같은 명 중 control 그룹의 전환 수 (treated 비율로 정규화)
- 차이가 크면 "이 모델이 진짜 효과 있는 사람을 잘 골라낸다"는 뜻
좋은 모델 패턴 예시:
| 발송 비율 | 누적 incremental 전환 | 한계 효과 |
|---|---|---|
| 상위 10% | +200 | 한 명당 매우 효율적 |
| 상위 20% | +280 | 효율 둔화 시작 |
| 상위 30% | +320 (정점) | 권장 타겟팅 컷 |
| 상위 50% | +300 | 약간 떨어짐 |
| 상위 60% | +280 | Do Not Disturb가 깎기 시작 |
| 100% (전수) | +200 | 사실상 랜덤 발송과 비슷 |
해석:
- 곡선이 랜덤 라인보다 위에 있을수록 모델이 좋다
- 곡선의 정점(상위 30%)이 권장 타겟팅 비율
- 정점 이후로는 더 보낼수록 "안 살 사람" + Do Not Disturb까지 끌어들이는 셈 → 효과 감소
⚠️ 왜 곡선이 다시 떨어질까
Do Not Disturb 그룹을 더 보낼수록 전체 incremental이 줄어듦. "많이 보내자"가 답이 아니라 "잘 골라서 보내자"가 답이라는 걸 그래프 한 장으로 보여줌. 마케터·CFO에게 보여주기 가장 좋은 차트 중 하나.
실무 케이스 — 윈백 캠페인 예시
이탈 위험 고객 50,000명에게 "30일 안에 다시 오면 20% 쿠폰" 캠페인을 했다고 합시다.
시나리오 1 — 전통적 propensity 모델
"전환 가능성 상위 30%"에 발송. 결과:
- 발송 15,000명, 쿠폰 사용 1,200명
- 비교 control 5,000명 중 전환 280명
- "발송 그룹 전환율 8%, control 5.6% → 효과 +2.4%p"
- 그런데 발송 그룹의 전환자 1,200명 중 800명은 "어차피 사는 Sure Things"
→ 실제 incremental 전환 = 1,200 - 5.6% × 15,000 = 360. 쿠폰 비용 800명분이 낭비.
시나리오 2 — Uplift 모델
"uplift 점수 상위 20%"에 발송. 결과:
- 발송 10,000명, 쿠폰 사용 750명
- control 비교에서 incremental 약 580명
- 동일 예산으로 incremental +60% 향상
같은 캠페인에서 모델만 바꿨는데 incremental이 50~100% 올라가는 사례가 흔해요. CRM 팀의 가장 큰 ROI 개선 포인트.
{/* TODO_HUNY: 본인 회사에서 uplift 모델을 도입한 적이 있다면, 도입 전후 incremental 변화 한 단락 추가하면 좋습니다. (예: "프로펜시 모델 → uplift로 바꿨더니 같은 발송 비용으로 incremental +43%") */}
운영 팁 — 마케터·CRM 팀이 자주 묻는 것
1) Treatment 데이터가 0이면 못 한다
uplift 모델은 "쿠폰 받은 사람 + 안 받은 사람"의 비교 데이터가 필수. 첫 캠페인은 어쨌든 무작위로 (또는 propensity 기반으로) 한 번 돌려야 학습 데이터가 생겨요. 이걸 "learning campaign"이라고 불러요.
2) Treatment / Control 비율
이상적으론 50:50이지만, 실무에선 90:10 정도가 흔함. T-Learner는 80:20 미만에서 흔들리고, X-Learner는 95:5까지도 견딤. Control 5% 이상은 항상 확보하세요.
3) Do Not Disturb 그룹은 진짜 있다
특히 자주 쿠폰을 받는 "VIP인 척 그러나 정상가 안 사는" 고객이 그 예. uplift가 음수로 나오면 "이 사람은 보내지 마라"라고 모델이 말하는 거예요.
4) Cold-start 문제
신규 가입자는 feature가 빈약해서 uplift 추정 분산이 큽니다. 처음 30~60일은 propensity 기반 + 무작위로 운영하다가, 행동 데이터 쌓이면 uplift로 전환.
마치며
CRM·리텐션 팀의 가장 근본적인 질문은 "누구한테 보낼까"인데, 그 답을 "전환 가능성 높은 사람"이 아니라 "우리 캠페인이 진짜 효과를 만들 사람"으로 바꾸는 게 uplift입니다. T-Learner나 X-Learner 한 번만 구현하면 같은 발송 비용으로 incremental이 50% 이상 올라가는 케이스가 흔해요. CRM 팀에서 가장 임팩트 큰 ML 프로젝트를 고르라면 단연 이거.
다음 글에서는 광고 크리에이티브의 "피로도(creative fatigue)"를 임베딩으로 미리 잡는 법을 다뤄볼게요.
{/* TODO_HUNY: 본인 팀의 CRM 자동화 스택과 uplift 활용 여부를 한 단락. (예: "Braze로 발송, BigQuery + Vertex AI로 uplift 모델 매주 학습") */}
참고
- Causal ML — Uber Engineering — T/X/S/DR-Learner 통합 라이브러리
- scikit-uplift — 파이썬 표준, Qini 곡선 시각화
- EconML — Microsoft — Causal Forest, DML 등 고급 모델
- The True Lift Model — Lo (2002) — uplift 페르소나의 원전
- Uplift Modeling for Multiple Treatments — Zhao et al. — 다중 처치(여러 쿠폰 종류) 확장

Top comments (0)