퍼널 분석¶
왜 이 분석을?¶
문제: 전환율이 낮은데 어디가 문제인지 모른다.
퍼널 분석은 고객 여정의 각 단계별 전환/이탈을 추적한다:
핵심: "어디서" 이탈하는지 알아야 "왜" 이탈하는지 가설을 세울 수 있다.
어떤 가설?¶
단계별 이탈 가설¶
| 이탈 구간 | 가능한 원인 | 검증 방법 |
|---|---|---|
| 방문 → 상품 조회 | 랜딩 페이지 불일치, 로딩 속도 | 유입 경로별 이탈률, 페이지 속도 |
| 상품 조회 → 장바구니 | 가격, 재고, 상품 정보 부족 | 조회 상품 특성 분석, 스크롤 깊이 |
| 장바구니 → 결제 시작 | 배송비, 회원가입 강제 | 장바구니 체류 시간, 이탈 직전 행동 |
| 결제 시작 → 완료 | 결제 오류, 결제수단 부족 | 결제 에러 로그, 결제수단별 완료율 |
가설 설정 예시¶
현상: 장바구니 → 결제 시작 전환율이 40%로 낮음
가설 후보: 1. 배송비가 장바구니에서 처음 노출되어 이탈 (가격 충격) 2. 비회원 결제 불가로 회원가입 강제 시 이탈 3. 쿠폰 입력창에서 "더 좋은 쿠폰 있나?" 검색하러 이탈
검증: - 배송비 무료 상품 vs 유료 상품 전환율 비교 - 회원 vs 비회원 퍼널 전환율 비교 - 쿠폰 입력창 클릭 후 이탈률 측정
분석 방법¶
1. 기본 퍼널 구성¶
import pandas as pd
# 이벤트 데이터
events = pd.DataFrame({
'user_id': [...],
'event': [...], # 'visit', 'view', 'add_cart', 'checkout_start', 'purchase'
'timestamp': [...]
})
# 퍼널 단계 정의
funnel_steps = ['visit', 'view', 'add_cart', 'checkout_start', 'purchase']
# 단계별 유니크 유저 수
funnel = {}
for step in funnel_steps:
funnel[step] = events[events['event'] == step]['user_id'].nunique()
# 전환율 계산
funnel_df = pd.DataFrame({
'step': funnel_steps,
'users': [funnel[s] for s in funnel_steps]
})
funnel_df['conversion_rate'] = funnel_df['users'] / funnel_df['users'].iloc[0] * 100
funnel_df['step_conversion'] = funnel_df['users'] / funnel_df['users'].shift(1) * 100
2. 세그먼트별 퍼널¶
# 디바이스별 퍼널
def calculate_funnel(df, group_col):
result = []
for group, data in df.groupby(group_col):
for step in funnel_steps:
users = data[data['event'] == step]['user_id'].nunique()
result.append({
'group': group,
'step': step,
'users': users
})
return pd.DataFrame(result)
device_funnel = calculate_funnel(events, 'device')
3. 시간 기반 퍼널¶
# 세션 내 전환 (30분 윈도우)
events['session_id'] = (
events.groupby('user_id')['timestamp']
.diff()
.gt(pd.Timedelta('30min'))
.cumsum()
)
# 전환까지 걸린 시간
conversion_time = (
events[events['event'] == 'purchase'].groupby('user_id')['timestamp'].min() -
events[events['event'] == 'visit'].groupby('user_id')['timestamp'].min()
)
퍼널 유형¶
선형 퍼널 vs 비선형 퍼널¶
선형 퍼널: A → B → C → D (순차적) - 예: 회원가입 프로세스
비선형 퍼널: 다양한 경로 허용 - 예: 이커머스 (검색 → 구매, 홈 → 카테고리 → 구매, 추천 → 구매)
마이크로 퍼널¶
대형 퍼널 내 특정 구간을 확대:
비즈니스 액션¶
이탈 구간별 개선 전략¶
| 이탈 구간 | 개선 방향 | 구체적 액션 |
|---|---|---|
| 방문 → 조회 | 랜딩 최적화 | 광고 소재와 랜딩 일치, 핵심 가치 즉시 노출 |
| 조회 → 장바구니 | 상품 매력 강화 | 리뷰 상단 노출, 재고 긴급성, 가격 비교 |
| 장바구니 → 결제 | 마찰 제거 | 배송비 사전 고지, 비회원 결제, 쿠폰 자동 적용 |
| 결제 → 완료 | 결제 안정성 | 결제 오류 모니터링, 다양한 결제수단 |
실제 적용 예시¶
문제: 전체 전환율 2.5% → 2.0% 하락
퍼널 분석 결과:
구간별 전환율 변화 (WoW)
- 방문 → 조회: 70% → 68% (-2%p)
- 조회 → 장바구니: 30% → 25% (-5%p) ← 문제 구간
- 장바구니 → 결제: 60% → 62% (+2%p)
- 결제 완료: 80% → 78% (-2%p)
가설: 상품 조회 → 장바구니 구간에서 문제 발생
심층 분석:
# 조회만 하고 이탈한 유저 vs 장바구니 추가한 유저 비교
churned = events[(events['event'] == 'view') &
(~events['user_id'].isin(cart_users))]
# 차이점 분석
# - 조회한 상품 카테고리
# - 조회한 상품 가격대
# - 디바이스
# - 유입 채널
발견: 신규 유입 채널(인플루언서 마케팅)의 조회→장바구니 전환율이 15%로 낮음
액션: 1. 인플루언서 콘텐츠와 랜딩 상품 일치 확인 2. 해당 채널 유입 고객 대상 한정 쿠폰 제공 3. 1주 후 해당 채널 퍼널 재측정
주의사항¶
함정¶
- 전환율만 보고 절대 수 무시
- 전환율 10% (100명 중 10명) vs 전환율 5% (10,000명 중 500명)
-
해결: 전환율과 절대 수 함께 보기
-
평균의 함정
- 전체 전환율 5%지만, 모바일 3% / PC 8%
-
해결: 세그먼트별 분리 분석
-
상관관계 ≠ 인과관계
- 장바구니 체류 시간이 길면 전환율이 낮다 (고민 중이라서? UI가 복잡해서?)
- 해결: A/B 테스트로 인과 검증
보완 분석¶
| 한계 | 보완 방법 |
|---|---|
| "왜" 이탈하는지 모름 | VoC 분석, 세션 리플레이 |
| 개선 효과 검증 | A/B 테스트 |
| 고객 특성 파악 | RFM, 코호트와 결합 |