콘텐츠로 이동

퍼널 분석


왜 이 분석을?

문제: 전환율이 낮은데 어디가 문제인지 모른다.

퍼널 분석은 고객 여정의 각 단계별 전환/이탈을 추적한다:

방문 (100%)
  ↓ 70% 전환
상품 조회 (70%)
  ↓ 30% 전환
장바구니 (21%)
  ↓ 60% 전환
결제 시작 (12.6%)
  ↓ 80% 전환
결제 완료 (10.1%)

핵심: "어디서" 이탈하는지 알아야 "왜" 이탈하는지 가설을 세울 수 있다.


어떤 가설?

단계별 이탈 가설

이탈 구간 가능한 원인 검증 방법
방문 → 상품 조회 랜딩 페이지 불일치, 로딩 속도 유입 경로별 이탈률, 페이지 속도
상품 조회 → 장바구니 가격, 재고, 상품 정보 부족 조회 상품 특성 분석, 스크롤 깊이
장바구니 → 결제 시작 배송비, 회원가입 강제 장바구니 체류 시간, 이탈 직전 행동
결제 시작 → 완료 결제 오류, 결제수단 부족 결제 에러 로그, 결제수단별 완료율

가설 설정 예시

현상: 장바구니 → 결제 시작 전환율이 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 (순차적) - 예: 회원가입 프로세스

비선형 퍼널: 다양한 경로 허용 - 예: 이커머스 (검색 → 구매, 홈 → 카테고리 → 구매, 추천 → 구매)

비선형 퍼널 분석 시:
- 주요 경로 Top 10 추출
- 경로별 전환율 비교
- 최적 경로 발견 → 해당 경로로 유도

마이크로 퍼널

대형 퍼널 내 특정 구간을 확대:

[결제 페이지 마이크로 퍼널]
결제 페이지 진입
배송지 입력 완료
결제수단 선택
약관 동의
결제 버튼 클릭
결제 완료

비즈니스 액션

이탈 구간별 개선 전략

이탈 구간 개선 방향 구체적 액션
방문 → 조회 랜딩 최적화 광고 소재와 랜딩 일치, 핵심 가치 즉시 노출
조회 → 장바구니 상품 매력 강화 리뷰 상단 노출, 재고 긴급성, 가격 비교
장바구니 → 결제 마찰 제거 배송비 사전 고지, 비회원 결제, 쿠폰 자동 적용
결제 → 완료 결제 안정성 결제 오류 모니터링, 다양한 결제수단

실제 적용 예시

문제: 전체 전환율 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주 후 해당 채널 퍼널 재측정


주의사항

함정

  1. 전환율만 보고 절대 수 무시
  2. 전환율 10% (100명 중 10명) vs 전환율 5% (10,000명 중 500명)
  3. 해결: 전환율과 절대 수 함께 보기

  4. 평균의 함정

  5. 전체 전환율 5%지만, 모바일 3% / PC 8%
  6. 해결: 세그먼트별 분리 분석

  7. 상관관계 ≠ 인과관계

  8. 장바구니 체류 시간이 길면 전환율이 낮다 (고민 중이라서? UI가 복잡해서?)
  9. 해결: A/B 테스트로 인과 검증

보완 분석

한계 보완 방법
"왜" 이탈하는지 모름 VoC 분석, 세션 리플레이
개선 효과 검증 A/B 테스트
고객 특성 파악 RFM, 코호트와 결합