콘텐츠로 이동

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

기본 공식

LTV:CAC 비율 = LTV / CAC

해석:
- 3:1 이상: 건강함 (투자 여력 있음)
- 1:1 ~ 3:1: 개선 필요
- 1:1 미만: 적자 (마케팅 즉시 재검토)

채널별 분석

채널 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면 포기
→ 신규 획득에 집중

주의사항

함정

  1. 과거 = 미래 가정
  2. 시장/제품 변화 시 과거 LTV가 미래를 대표하지 않음
  3. 해결: 최근 코호트 가중치 높이기, 정기적 재계산

  4. 평균의 함정

  5. 평균 LTV 100,000원 (상위 10%: 500,000원, 하위 50%: 30,000원)
  6. 해결: 분포 확인, 세그먼트별 LTV

  7. 마진 무시

  8. 매출 기반 LTV vs 이익 기반 LTV
  9. 해결: 매출 × 마진율로 계산

  10. 시간 가치 무시

  11. 오늘의 1만원 ≠ 1년 후 1만원
  12. 해결: 할인율(Discount Rate) 적용

보완 분석

한계 보완 방법
LTV 높은 고객 특성 모름 RFM, 행동 분석 결합
이탈 시점 예측 코호트 분석, 이탈 예측 모델
LTV 상승 방법 퍼널 분석, A/B 테스트