huny.log

기술 포스트 · 통계·ML

Uplift 모델링 — "쿠폰 줘도 살 사람 vs 줘야 사는 사람" 가르기

리텐션·CRM 캠페인에서 가장 비싼 실수는 "어차피 살 사람한테 쿠폰 주는 것". Uplift 모델링은 캠페인이 정말 효과를 만든 사람만 골라냅니다. 4가지 페르소나와 T-Learner·X-Learner의 직관.

“쿠폰 캠페인 전환율이 18%, 비대상은 12%. 효과 +6%p 인정!” — 이 한 줄이 위험한 이유는, 그 18% 중 대부분이 어차피 샀을 사람이기 때문이에요. 쿠폰을 안 줘도 살 사람한테 쿠폰을 주는 건 마진을 그냥 깎는 행위입니다. 이 글은 “진짜 바뀐 사람”만 골라내는 uplift 모델링의 직관을 마케터 언어로 풀어봅니다.

고객을 4가지 페르소나로 분류한 다이어그램 — persuadables, sure things, lost causes, do not disturb
캠페인이 효과를 만들 수 있는 사람은 오직 '설득 가능한(persuadables)' 사분면뿐. 나머지 셋은 쿠폰을 주는 게 손해이거나 무관.

4가지 페르소나 — 가장 중요한 그림

uplift 사고의 출발점은 이 2×2 표예요. “쿠폰 받았다 / 안 받았다” × “샀다 / 안 샀다”의 모든 조합:

쿠폰 받음 → 샀다쿠폰 받음 → 안 샀다
쿠폰 안 받음 → 샀다Sure Things (어차피 살 사람)Lost Causes에 가까움
쿠폰 안 받음 → 안 샀다Persuadables 🎯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단계:

  1. T-Learner처럼 두 모델 학습 (treated용 / control용)
  2. Treatment 그룹 사람한테는 “실제 전환 - control 모델이 예측한 값”을 “가짜 효과(imputed effect)“로 라벨
  3. Control 그룹 사람한테는 “treated 모델 예측 - 실제 전환”을 가짜 효과로 라벨
  4. 이 가짜 효과를 회귀모델 두 개로 따로 학습 후, propensity score로 가중평균

이름이 X인 이유: 두 그룹의 정보를 cross로 활용하기 때문. 데이터 적은 쪽이 많은 쪽 모델의 예측을 받아 자기 데이터를 보완해요. T-Learner가 “두 모델을 분리”했다면, X-Learner는 “두 모델이 서로의 정보를 빌리는” 구조.

Learner적합 상황강점약점
S-Learner소규모, 빠른 베이스라인가장 간단효과 작으면 무시됨
T-Learner그룹 균등 (50:50)디버깅 쉬움불균등에 약함
X-LearnerTreatment ≪ Control (CRM 표준)작은 그룹 보강구현 복잡
DR-Learner관찰 데이터 (RCT 아닌)가장 robust튜닝 어려움
Causal Forest비선형 효과자동 segment 발견학습 느림

Qini 곡선 — Uplift 모델 평가의 표준

전통적 ML 평가(AUC, accuracy)는 uplift에 안 맞아요. 우리가 알고 싶은 건 “상위 N%만 골라 보냈을 때 얼마나 더 많은 전환을 만들었나”입니다. 이걸 시각화한 게 Qini 곡선.

핵심 수식:

  • = 상위 명에 발송했을 때 그 안의 treated 그룹 전환 수
  • = 같은 명 중 control 그룹의 전환 수 (treated 비율로 정규화)
  • 차이가 크면 “이 모델이 진짜 효과 있는 사람을 잘 골라낸다”는 뜻

좋은 모델 패턴 예시:

발송 비율누적 incremental 전환한계 효과
상위 10%+200한 명당 매우 효율적
상위 20%+280효율 둔화 시작
상위 30%+320 (정점)권장 타겟팅 컷
상위 50%+300약간 떨어짐
상위 60%+280Do Not Disturb가 깎기 시작
100% (전수)+200사실상 랜덤 발송과 비슷

해석:

  • 곡선이 랜덤 라인보다 위에 있을수록 모델이 좋다
  • 곡선의 정점(상위 30%)이 권장 타겟팅 비율
  • 정점 이후로는 더 보낼수록 “안 살 사람” + Do Not Disturb까지 끌어들이는 셈 → 효과 감소

실무 케이스 — 윈백 캠페인 예시

이탈 위험 고객 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 개선 포인트.

운영 팁 — 마케터·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)“를 임베딩으로 미리 잡는 법을 다뤄볼게요.

참고

통계·ML 카테고리의 다른 글

전체 보기 →