1 정의
Personal characteristic 이 비즈니스 행동의 효과를 moderate 하는 case (Buisson, 2021, Ch.11).
수식:
\[ Y = \beta_0 + \beta_X \cdot X + \beta_M \cdot M + \beta_i \cdot (X \cdot M) \]
여기서:
- \(X\) = 비즈니스 행동 (PlayArea, Email 등)
- \(M\) = personal characteristic (Children, Age 등)
해석: \(M\) 의 segment 별 \(X\) 의 효과 다름.
비즈니스 활용:
- Targeting: 효과 큰 segment 우선
- Personalization: segment 별 다른 전략
- Resource allocation: ROI 최대 segment 에 투자
분석가의 자연스러운 질문: “평균 효과만 알면 충분한가?”
평균 효과만 보면:
- “PlayArea 의 평균 효과: +10 분”
- 모든 매장에 설치 vs 일부만? — 결정 어려움
Segmentation 후:
- “자녀 동반 customer 매장: PlayArea +25 분”
- “자녀 없는 매장: PlayArea +4 분”
- 자녀 동반 비율 높은 매장 우선
→ Segmentation 이 의사결정의 정밀도. 평균 효과의 6 배 정확.
2 C-Mart 사례 — 단계별 분석
2.1 비즈니스 문제
C-Mart 가 매장 200 개 운영. PlayArea 설치 비용 = $50K/매장.
질문:
- 어느 매장에 설치?
- 모든 매장? — $10M 비용 (200 × $50K)
- 자녀 비율 높은 매장만? — 비용 절약 + ROI 최대
기존 데이터:
- 매장별 자녀 동반 customer 비율 (10% ~ 60%)
- 평균 visit duration
- 매장별 매출
분석가의 도전:
- PlayArea 의 효과가 자녀 동반 customer 에게 큼?
- 효과 크기는?
- 매출 영향은?
2.2 단계 1: Historical Data 분석
PlayArea 가 일부 매장에 이미 설치 (50 매장). 매장별 평균 분석:
매장 그룹 자녀 동반 (%) PA 설치 평균 duration
A: 자녀 적음 (10%) 10% No 20 분
B: 자녀 적음 (10%) 10% Yes 24 분
C: 자녀 많음 (50%) 50% No 30 분
D: 자녀 많음 (50%) 50% Yes 45 분
해석:
- A vs B (자녀 적음): PlayArea +4 분 효과
- C vs D (자녀 많음): PlayArea +15 분 효과
- → PlayArea 의 효과가 자녀 비율에 따라 다름 (segmentation 신호).
위 분석을 회귀로:
import statsmodels.formula.api as smf
# Customer-level 데이터 (visit 별)
df["visit_duration"] = ...
df["play_area"] = ...
df["children"] = ...
m = smf.ols("visit_duration ~ play_area * children", data=df).fit()
print(m.summary())출력:
Estimate
(Intercept) 20.0
play_area1 4.0
children1 10.0
play_area1:children1 21.0
해석:
- PlayArea 효과 (자녀 없음): +4 분
- Children 효과 (PlayArea 없음): +10 분
- Interaction: +21 분 (자녀 있을 때 PA 효과의 추가 boost)
자녀 있는 customer 의 PA 효과: 4 + 21 = 25 분.
2.3 단계 2: 매장 우선순위 결정
각 매장의 PA 설치 ROI:
\[ \text{ROI} = \frac{\text{매출 증가/년}}{\text{설치 비용}} \]
매출 증가 추정:
- Visit duration ↑ → 추가 구매
- 평균 customer 의 분당 구매 = $0.50 (가정)
- 자녀 동반 customer: PA = +25 분 × $0.50 = +$12.5/visit
- 자녀 없는 customer: PA = +4 분 × $0.50 = +$2/visit
매장별 매출 증가:
- 자녀 비율 50%, 1000 visits/일:
- 500 자녀 동반 × $12.5 + 500 자녀 없음 × $2
- = $6,250 + $1,000 = $7,250/일
- = $2,646,250/년
- 자녀 비율 10%, 1000 visits/일:
- 100 × $12.5 + 900 × $2
- = $1,250 + $1,800 = $3,050/일
- = $1,113,250/년
→ 자녀 비율 50% 매장의 ROI 가 자녀 비율 10% 매장의 2.4 배.
PlayArea 비용 $50K/매장 회수 기간:
- 자녀 비율 50% 매장: $50K / $2.6M = 0.02 년 (1 주!)
- 자녀 비율 10% 매장: $50K / $1.1M = 0.045 년 (16 일)
둘 다 빠른 ROI. 그러나 자녀 비율 높은 매장이 우선.
비즈니스 결정:
- 1 단계: 자녀 비율 50%+ 매장 (50 개) 에 PA 우선 설치
- 2 단계: 결과 점검 후 자녀 비율 30~50% 매장
- 3 단계: 비용 효과 점검 후 나머지
→ 단순 평균 효과로는 못 만드는 정밀한 plan.
2.4 단계 3: Subgroup 별 효과의 robustness 점검
Subgroup 분석의 흔한 위험:
- Multiple testing
- Small subgroup → noise 큼
- Effect size 가 통계적 유의 안 함
분석가의 점검:
# 자녀 동반 + PlayArea subgroup
sub = df[(df["children"] == 1) & (df["play_area"] == 1)]
print(f"N = {len(sub)}")
print(f"Mean duration = {sub['visit_duration'].mean():.2f}")
print(f"95% CI: {sub['visit_duration'].quantile([0.025, 0.975]).values}")만약 N = 20 (매우 작음):
- Estimate 가 noise 일 수 있음
- 다른 subgroup 의 결과로 검증
- Bootstrap CI 사용
Subgroup 의 정확한 CI:
import numpy as np
def subgroup_bootstrap(df, condition, outcome="visit_duration", B=1000):
"""Subgroup 의 평균 효과 CI."""
sub = df[condition].copy()
means = []
for _ in range(B):
sample = sub.sample(len(sub), replace=True)
means.append(sample[outcome].mean())
return np.percentile(means, [2.5, 97.5])
ci = subgroup_bootstrap(df, (df["children"] == 1) & (df["play_area"] == 1))
print(f"95% CI: {ci}")CI 가 좁으면 → 추정 정확. CI 가 넓으면 → 더 많은 데이터 필요 (subgroup 의 작은 N 시그널).
3 Marketing Uplift 분석
3.1 정의
마케팅의 핵심 질문: “어떤 customer 에게 캠페인 보낼까?”
기존 접근 (response modeling):
- “Email 받으면 구매할 가능성 높은 customer” 식별
- 그 customer 에게 보냄
함정: 가능성 높은 customer 가 사실 email 없어도 구매할 수도.
Uplift 접근:
- “Email 의 효과가 큰 customer” 식별
- 그 customer 에게 보냄
수학적으로:
- Response modeling: \(E[Y | X = 1, M_i]\) 가 큰 segment
- Uplift modeling: \(E[Y | X = 1, M_i] - E[Y | X = 0, M_i]\) 가 큰 segment
→ Uplift 가 진짜 marketing ROI.
Group 1 (younger, < 30):
No email: 20% 구매
With email: 40% 구매
Uplift: 20%p
Group 2 (older, > 60):
No email: 80% 구매
With email: 90% 구매
Uplift: 10%p
Response modeling: Group 2 우선 (90% 구매). Uplift modeling: Group 1 우선 (Uplift 20%p > 10%p).
비용 분석:
- Email 비용: $0.10/customer
- Group 2 (10K customer): $1K 비용 → 1K 추가 구매 (uplift 10%) → ROI 1
- Group 1 (10K customer): $1K 비용 → 2K 추가 구매 (uplift 20%) → ROI 2
→ Group 1 이 ROI 2 배.
3.2 4 Quadrant 분류
Treatment effect 와 baseline propensity 별:
| Baseline ↓ + Effect | Group | 마케팅 결정 |
|---|---|---|
| 높음 + 큼 | Persuadables | 우선 target (uplift 큼) |
| 높음 + 작음 | Sure Things | 안 보내도 구매 (낭비) |
| 낮음 + 큼 | Persuadables (보너스) | Target |
| 낮음 + 작음 | Lost Causes | 안 보내도 구매 안 함 |
Persuadables = uplift modeling 의 핵심 segment.
전통 response modeling 이 “Sure Things” 에 낭비 (이미 구매할 사람에게 보냄).
→ Uplift 가 정밀 targeting 의 도구.
3.3 R / Python 회귀
import statsmodels.formula.api as smf
# Treatment + multiple covariates with interactions
m = smf.ols(
"purchase ~ treatment + age + treatment:age + gender + treatment:gender",
data=df,
).fit()
print(m.summary())출력:
Estimate
treatment 0.10
treatment:age -0.005
treatment:gender +0.05
해석:
- 평균 treatment 효과: +0.10 (10%p 구매 ↑)
- Age 1 살 ↑ 시 효과 -0.5%p (younger 가 효과 큼)
- Gender 남자: 효과 +5%p 더 큼
Predicted uplift for individual:
\[ \text{Uplift}(i) = 0.10 - 0.005 \cdot \text{age}_i + 0.05 \cdot \text{gender}_i \]
각 customer 의 estimated uplift 계산 후:
- Top 10% uplift → email 발송
- 나머지 → 보내지 않음
비교:
- Random targeting (모든 사용자): ROI = 1
- Response targeting (high baseline): ROI = 1.5
- Uplift targeting (top 10% uplift): ROI = 3
→ Uplift 가 가장 효율적. Buisson 의 핵심 메시지.
4 Personalization 의 본질
4.1 “All-Effective” 가 아닌 차별
흔한 오해: “Personalization = 좋은 message 를 모두에게.”
정확: Personalization = “다른 segment 에 다른 message”.
Mass marketing: 모두에게 message A (평균 효과 +5%p)
Personalization:
Segment 1: message A (+10%p uplift)
Segment 2: message B (+8%p uplift)
Segment 3: no message (uplift 0 또는 negative)
핵심:
- 한 message 가 모든 segment 에 좋으면 = personalization 이 아님
- Segment 별 best message 가 다름 = personalization
Buisson 의 강조:
“Personalization 의 본질은 increasing effectiveness on certain subgroups while decreasing on others.”
4.2 위험 — Negative Uplift
일부 segment 에서 treatment 가 부정적 효과:
Segment 1: No email 30% 구매 → With email 35% 구매 (+5%p)
Segment 3: No email 40% 구매 → With email 25% 구매 (-15%p)
이유:
- Email 이 annoying → 구매 거부
- Brand 인지도 손상
- Spam 인식
→ Segment 3 에 보내면 negative ROI.
Mass marketing 의 함정:
- Segment 3 의 negative effect 가 segment 1 의 positive effect 와 cancel
- 평균 효과 0
- “Email 무용” 결론 → 잘못
분석가의 발견:
- Segmentation 으로 두 그룹 구분
- Segment 1 에만 보냄 → ROI ↑
→ Personalization 이 mass marketing 보다 효과적.
5 다른 비즈니스 사례
5.1 Pricing Personalization
이커머스의 동적 가격:
Segment Price 인하 (-10%) 효과 (Uplift)
Price-sensitive -10% +30% 구매
Brand-loyal -10% +5% 구매
Indifferent -10% +15% 구매
Price-sensitive segment 에 큰 uplift → 그 segment 에 promo 우선.
Brand-loyal segment 에 promo = revenue 손실 (이미 구매할 사람에게 가격 인하).
→ Pricing 의 uplift modeling.
5.2 Healthcare Targeting
임상 시험:
- 평균 효과: 약 X 가 증상 -20%
- Subgroup 분석:
- 65 세 이상: -30%
- 65 세 미만: -10%
처방 결정:
- 모든 환자에게 약 X? — 평균 효과 -20% 라 OK 같아 보임
- 65+ 만 처방? — 그 group 에 효과 큼, side effect risk 같음 → 더 정확한 의사결정
→ Personalized medicine 의 통계적 기반.
6 Subgroup Analysis 의 함정
Subgroup 검색의 함정:
- 100 가지 segmentation 시도 (age, gender, region, …)
- 각 p < 0.05 로 검정
- 평균적으로 5 개 false positive
이게 “30 세 남자 + Kansas + 화요일 응답자” 의 거짓 발견.
대처:
- Pre-registered subgroups: 실험 시작 전 segmentation 등록
- Bonferroni 보정: \(\alpha / N_{\text{tests}}\)
- Bootstrap CI: subgroup 의 robust 검증
- 외부 데이터 검증: 다른 dataset 에서 replicate
Segmentation 의 분석 default:
- 사전 가설: 도메인 직관으로 1~3 개 moderator 선택
- Pre-register: 실험 시작 전 가설 등록
- 회귀 + interaction term: 표준 분석
- Bootstrap CI: robust 검증
- Effect size 점검: 비즈니스 의미 있는가
- 외부 검증: 다른 데이터에서 동일 패턴?
이 절차가 false discovery 위험 줄임.
→ Discovery 가 아닌 confirmation 이 분석가의 default.
7 코드 예시 — 종합 Segmentation
7.1 시뮬레이션
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
np.random.seed(42)
n = 5000
df = pd.DataFrame({
"play_area": np.random.binomial(1, 0.5, n),
"children": np.random.binomial(1, 0.3, n),
"store_id": np.random.choice(range(50), n),
})
# True coefficients (모형)
beta_0 = 20
beta_p = 4
beta_c = 10
beta_i = 21
df["duration"] = (
beta_0
+ beta_p * df["play_area"]
+ beta_c * df["children"]
+ beta_i * df["play_area"] * df["children"]
+ np.random.normal(0, 5, n)
)
# Moderation 회귀
m = smf.ols("duration ~ play_area * children", data=df).fit()
print("=== Moderation Regression ===")
print(m.summary().tables[1])추정값이 진짜 coefficients 가까이:
- \(\hat{\beta}_p \approx 4\)
- \(\hat{\beta}_c \approx 10\)
- \(\hat{\beta}_i \approx 21\)
→ 시뮬레이션 검증.
7.2 매장별 Predicted Uplift
def predict_uplift(df, model, treatment_var, target_var):
"""각 행의 treatment uplift 추정."""
df_with = df.copy()
df_with[treatment_var] = 1
df_without = df.copy()
df_without[treatment_var] = 0
pred_with = model.predict(df_with)
pred_without = model.predict(df_without)
return pred_with - pred_without
# 매장별 평균 uplift
df["uplift"] = predict_uplift(df, m, "play_area", "duration")
store_uplift = df.groupby("store_id")["uplift"].mean().sort_values(ascending=False)
print("\n=== Top 10 매장 ===")
print(store_uplift.head(10))
print("\n=== Bottom 10 매장 ===")
print(store_uplift.tail(10))store_uplift.sort_values(ascending=False) 가 우선순위:
- Top 매장: PlayArea 효과 큼 (자녀 비율 높음)
- Bottom 매장: PlayArea 효과 작음
비즈니스 결정:
- Budget = $1M (20 매장 설치 가능)
- Top 20 매장 선택
- ROI 최대
→ 회귀의 segmentation 이 직접 의사결정 도구.
7.3 ROI 계산 자동화
def calculate_roi(df, store_uplift, install_cost=50000, value_per_minute=0.50,
days_per_year=365, daily_visits=1000):
"""매장별 ROI 계산."""
annual_value = store_uplift * value_per_minute * daily_visits * days_per_year
roi = annual_value / install_cost
payback_days = install_cost / (store_uplift * value_per_minute * daily_visits)
return pd.DataFrame({
"uplift": store_uplift,
"annual_value": annual_value,
"roi": roi,
"payback_days": payback_days,
}).sort_values("roi", ascending=False)
roi_df = calculate_roi(df, store_uplift)
print("\n=== Top 10 ROI ===")
print(roi_df.head(10))이 함수의 출력이 비즈니스 파트너에게:
- 매장별 expected uplift (분 단위)
- Annual value 추정 ($)
- ROI 비율
- Payback 기간 (일)
분석가의 권장:
- ROI > 5 인 매장 우선 설치
- Payback < 30 일이면 빠른 회수
→ Segmentation 의 직접 응용. 의사결정 가이드.
8 종합 — Segmentation 의사결정
1. 사전 가설 (도메인 직관)
- 어떤 personal characteristic 이 moderator 일까
- 1~3 개 후보 명시
2. 회귀 분석
- X * M interaction term
- Main effect 모두 포함
- Bootstrap CI
3. 추정값의 비즈니스 해석
- Effect size 의 dollar/visit 변환
- 통계적 유의 + 실용적 유의
4. Subgroup별 ROI
- Predicted uplift × visits × value
- Cost 와 비교
5. Action plan
- Top segment 우선 적용
- Bottom segment 무관 또는 다른 전략
- 결과 monitoring + 피드백
이 워크플로가 segmentation 의 표준.
9 관련 주제
9.1 Ch.11 의 형제 글
- E-BUI11-0 Moderation overview — Ch.11 전체 흐름
- E-BUI11-2 상호작용과 비선형 — Interaction + Quadratic
- E-BUI11-3 다중 조절 변수와 부트스트랩 — 다중 moderator
9.2 이전 챕터
- E-BUI3-2 체인과 포크 구조 — Mediator 와의 차이
- E-BUI8-3 검정력 분석 — Power simulation 기초
9.3 후속 챕터
- E-BUI12-0 Mediation·IV overview — Ch.12: Mediation
9.4 카테고리 진입점
- Experimentation 학습 로드맵 — 11 Phase × 7 교재 매핑