LTV 분석¶
왜 이 분석을?¶
문제: 마케팅에 얼마를 써야 하는지 모른다.
LTV(Lifetime Value, 고객 생애 가치)는 한 고객이 전체 관계 기간 동안 가져다 주는 총 가치다:
LTV = 100,000원
CAC = 30,000원
LTV:CAC = 3.3:1
→ 고객 1명 확보에 30,000원 써도 70,000원 이익
→ CAC 50,000원까지는 수익성 있음
핵심: LTV를 알아야 마케팅 예산, 고객 투자, 세그먼트 우선순위를 결정할 수 있다.
어떤 가설?¶
가설 예시¶
| 가설 | 검증 방법 | 예상 액션 |
|---|---|---|
| Organic 유입이 Paid보다 LTV가 높다 | 채널별 LTV 비교 | SEO 투자 확대, Paid 예산 재배분 |
| 첫 구매 금액이 높을수록 LTV가 높다 | 첫 구매 금액 vs LTV 상관관계 | 첫 구매 객단가 상승 유도 |
| 구독 전환 고객은 LTV가 2배다 | 구독 vs 일반 LTV 비교 | 구독 전환 인센티브 강화 |
| 프로모션 첫 구매자의 LTV가 낮다 | 프로모션 vs 정가 첫 구매 LTV | 프로모션 구조 변경 |
분석 방법¶
1. 단순 LTV 계산¶
# 히스토리컬 LTV (과거 데이터 기반)
ltv_simple = df.groupby('user_id').agg({
'revenue': 'sum',
'order_date': ['min', 'max']
})
# 평균 LTV
avg_ltv = ltv_simple['revenue']['sum'].mean()
# 기간별 평균 (ARPU 기반)
monthly_arpu = df.groupby(['user_id', df['order_date'].dt.to_period('M')])['revenue'].sum().mean()
avg_lifespan = 12 # 평균 활동 개월
ltv_arpu = monthly_arpu * avg_lifespan
2. 코호트 기반 LTV¶
# 코호트별 누적 매출
df['cohort'] = df.groupby('user_id')['order_date'].transform('min').dt.to_period('M')
df['month_index'] = ((df['order_date'].dt.to_period('M') - df['cohort']).apply(lambda x: x.n))
cohort_revenue = df.groupby(['cohort', 'month_index'])['revenue'].sum().unstack()
cohort_size = df.groupby('cohort')['user_id'].nunique()
# 고객당 누적 매출
ltv_curve = cohort_revenue.divide(cohort_size, axis=0).cumsum(axis=1)
# 12개월 LTV
ltv_12m = ltv_curve[11] # month_index 11 = 12번째 달
3. 확률적 LTV (BG/NBD + Gamma-Gamma)¶
from lifetimes import BetaGeoFitter, GammaGammaFitter
from lifetimes.utils import summary_data_from_transaction_data
# 요약 데이터 생성
summary = summary_data_from_transaction_data(
df, 'user_id', 'order_date',
monetary_value_col='revenue',
observation_period_end='2024-06-30'
)
# BG/NBD 모델 (구매 빈도 예측)
bgf = BetaGeoFitter()
bgf.fit(summary['frequency'], summary['recency'], summary['T'])
# 향후 12개월 예상 구매 횟수
summary['predicted_purchases'] = bgf.predict(
12 * 30, # 12개월
summary['frequency'],
summary['recency'],
summary['T']
)
# Gamma-Gamma 모델 (구매 금액 예측)
returning_customers = summary[summary['frequency'] > 0]
ggf = GammaGammaFitter()
ggf.fit(returning_customers['frequency'], returning_customers['monetary_value'])
# 예상 평균 구매액
summary['expected_avg_revenue'] = ggf.conditional_expected_average_profit(
summary['frequency'],
summary['monetary_value']
)
# LTV 계산
summary['CLV'] = ggf.customer_lifetime_value(
bgf,
summary['frequency'],
summary['recency'],
summary['T'],
summary['monetary_value'],
time=12, # 12개월
discount_rate=0.01 # 월 할인율
)
LTV vs CAC¶
기본 공식¶
채널별 분석¶
| 채널 | CAC | LTV | LTV:CAC | 판단 |
|---|---|---|---|---|
| Organic | 0원 | 120,000 | - | 최고 효율 |
| SEO/Content | 5,000원 | 100,000 | 20:1 | 확대 |
| Facebook Ads | 25,000원 | 80,000 | 3.2:1 | 유지 |
| Google Ads | 35,000원 | 75,000 | 2.1:1 | 최적화 필요 |
| Influencer | 50,000원 | 60,000 | 1.2:1 | 재검토 |
Payback Period¶
# 몇 개월 만에 CAC 회수?
monthly_revenue = ltv_curve.diff(axis=1).fillna(ltv_curve.iloc[:, 0])
cac = 30000
cumsum = ltv_curve.copy()
payback_month = (cumsum >= cac).idxmax(axis=1)
# 평균: 4.5개월 만에 CAC 회수
비즈니스 액션¶
LTV 기반 의사결정¶
| 상황 | LTV 활용 | 액션 |
|---|---|---|
| 마케팅 예산 책정 | 채널별 LTV:CAC | 고효율 채널에 예산 집중 |
| 고객 세그먼트 우선순위 | 세그먼트별 LTV | 고LTV 세그먼트 VIP 서비스 |
| 프로모션 설계 | 프로모션 고객 LTV | 할인 상한선 설정 |
| 제품 개발 | 기능별 사용자 LTV | 고LTV 유발 기능 강화 |
| 이탈 방지 투자 | 이탈 예상 고객 LTV | LTV 높은 고객 우선 리텐션 |
실제 적용 예시¶
문제: 마케팅 예산 1억 원, 어디에 쓸까?
분석:
채널별 분석
-------------------------------------------
채널 CAC LTV(12M) LTV:CAC 예상 ROI
Facebook 25,000 80,000 3.2:1 220%
Google 35,000 75,000 2.1:1 114%
Influencer 50,000 60,000 1.2:1 20%
네이버 DA 20,000 70,000 3.5:1 250%
-------------------------------------------
의사결정:
예산 배분
- 네이버 DA: 4,000만 원 (확대)
- Facebook: 3,500만 원 (유지)
- Google: 2,000만 원 (최적화 후 재평가)
- Influencer: 500만 원 (테스트 유지)
실행 후 모니터링: - 월별 채널별 CAC 추적 - 분기별 채널별 LTV 업데이트 - LTV:CAC 1.5:1 미만 시 채널 재검토
세그먼트별 LTV¶
분석¶
# RFM 세그먼트별 LTV
segment_ltv = df.merge(rfm[['segment']], left_on='user_id', right_index=True)
segment_summary = segment_ltv.groupby('segment').agg({
'revenue': 'sum',
'user_id': 'nunique'
})
segment_summary['avg_ltv'] = segment_summary['revenue'] / segment_summary['user_id']
| 세그먼트 | 고객 수 | 평균 LTV | 전체 매출 비중 |
|---|---|---|---|
| Champions | 5,000 | 350,000원 | 35% |
| Loyal | 15,000 | 150,000원 | 25% |
| At Risk | 20,000 | 80,000원 | 18% |
| New | 30,000 | 40,000원 | 12% |
| Lost | 50,000 | 20,000원 | 10% |
액션¶
Champions (350K)
→ 이탈 방지가 최우선
→ 이탈 시 매출 타격 큼
→ VIP 전담 CS, 이탈 징후 모니터링
At Risk (80K)
→ Champions 재활성화 시 잠재 가치 높음
→ 리텐션 캠페인 ROI 계산 후 투자
Lost (20K)
→ 재활성화 비용 > 예상 LTV면 포기
→ 신규 획득에 집중
주의사항¶
함정¶
- 과거 = 미래 가정
- 시장/제품 변화 시 과거 LTV가 미래를 대표하지 않음
-
해결: 최근 코호트 가중치 높이기, 정기적 재계산
-
평균의 함정
- 평균 LTV 100,000원 (상위 10%: 500,000원, 하위 50%: 30,000원)
-
해결: 분포 확인, 세그먼트별 LTV
-
마진 무시
- 매출 기반 LTV vs 이익 기반 LTV
-
해결: 매출 × 마진율로 계산
-
시간 가치 무시
- 오늘의 1만원 ≠ 1년 후 1만원
- 해결: 할인율(Discount Rate) 적용
보완 분석¶
| 한계 | 보완 방법 |
|---|---|
| LTV 높은 고객 특성 모름 | RFM, 행동 분석 결합 |
| 이탈 시점 예측 | 코호트 분석, 이탈 예측 모델 |
| LTV 상승 방법 | 퍼널 분석, A/B 테스트 |