DEV Community

Cover image for Uplift 모델링 — "쿠폰 줘도 살 사람 vs 줘야 사는 사람" 가르기
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

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

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

고객을 4가지 페르소나로 분류한 다이어그램 — persuadables, sure things, lost causes, do not disturb
*캠페인이 효과를 만들 수 있는 사람은 오직 *

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

수식으로는 단순.

uplift(x)=P(convtreated,x)P(convcontrol,x) \text{uplift}(x) = P(\text{conv} \mid \text{treated}, x) - P(\text{conv} \mid \text{control}, x)

마케터 언어로: "그 사람이 쿠폰을 받았을 때의 구매 확률 - 안 받았을 때의 구매 확률". 양수면 캠페인이 그 사람에게 효과가 있다는 뜻.

문제: 한 사람한테는 "받았다" 또는 "안 받았다" 한 가지 결과만 관측되지, 둘 다 관측 못 합니다(인과추론의 근본 문제, 다시 등장). 그래서 여러 모델 접근이 있어요.

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
Enter fullscreen mode Exit fullscreen mode

장점: 단순, 빠름, 디버깅 쉬움.

단점: 두 모델이 따로라 데이터 적은 그룹의 분산이 큼. 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-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 곡선.

핵심 수식:

Qini(n)=TnCnNTNC \text{Qini}(n) = T_n - \frac{C_n \cdot N^T}{N^C}
  • TnT_n = 상위 nn 명에 발송했을 때 그 안의 treated 그룹 전환 수
  • CnC_n = 같은 nn 명 중 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 모델 매주 학습") */}

참고

Top comments (0)