프로젝트/GA4 분석

[GA4 퍼널 분석] Day5-1 장바구니 전환율 가설 검증 (Day3 결과 통합)

조성호 2026. 5. 11. 21:22

추가 분석 이유

이전 분석에서는 Device, User Type, Source, Price Band, Category 등 다양한 가설을 통해 장바구니 전환율 저하 원인을 탐색했다. 그러나 단순 EDA 결과만으로는 어떤 요인이 실제 핵심 변수인지 확정하기 어려웠다. 따라서 Day 5에서는 통계적 검증을 통해 실제 영향력 있는 요인을 선별하고, 우선순위를 재정렬하고자 했다.

 

이전 분석에서 어떤 가설을 세웠는가?

가설 왜 봤는가 초기 결과
Device 모바일 UX 문제 여부 차이 작음
User Type 신규 유저 장벽 여부 차이 작음
Source 유입 채널 품질 일부 차이
Price Band 가격 민감도 차이 큼
Category 상품 경쟁력 차이 큼

초기 EDA 결과 Price Band와 Category가 가장 영향력 높은 후보로 판단되어 우선 검증 대상으로 선정했다

 

왜 통계 검증이 필요했는가?

보이는 차이와 실제 차이는 다르다

예시)

  • Low: 25%
  • High: 20%

차이가 있어 보이지만, 표본 수 / 우연 / 분산 영향일 수도 있어서 통계 검증이 필요

 

사용한 방법

1. Chi-Square

여러 그룹 전체 차이 검정
(Price 전체 / Category 전체)

 

2. Two-Proportion Z-Test

두 그룹 직접 비교
(Low vs High / Bags vs Home)

 

먼저 전체 구조 차이가 있는지 확인하고 이후 실제 어떤 그룹 차이가 큰지 직접 비교했다.


Price Band 검증 – 가격은 실제 중요한가?

Price Band는 EDA 기준 가장 직관적임

 

[Price Band 그래프 삽입]

[Low > Mid > High]

전처리

장바구니 전환 여부를 통계적으로 검정하기 위해 각 그룹별 view_sessions 대비 cart_sessions뿐 아니라, 장바구니에 담지 않은 세션(not_cart_sessions)을 함께 계산해 contingency table 형태로 구성했다.

Price Band Chi-Square

from scipy.stats import chi2_contingency

price_table = price_df[
    ["cart_sessions", "not_cart_sessions"]
].values

chi2, p, dof, expected = chi2_contingency(price_table)

print("=== Price Band Chi-Square Test ===")
print("Chi-Square:", chi2)
print("p-value:", p)
print("Degrees of Freedom:", dof)

low_rate = 25.43
high_rate = 20.15

lift = (low_rate - high_rate) / high_rate * 100
print("lift",lift)

Low vs High Two-Proportion Z-Test

from statsmodels.stats.proportion import proportions_ztest

low = price_df[price_df["price_band"] == "Low"].iloc[0]
high = price_df[price_df["price_band"] == "High"].iloc[0]

count = [low["cart_sessions"], high["cart_sessions"]]
nobs = [low["view_sessions"], high["view_sessions"]]

stat, pval = proportions_ztest(count, nobs)

print("=== Low vs High Z-Test ===")
print("Z-stat:", stat)
print("p-value:", pval)

 

해석

  • p-value < 0.001
  • Low vs High +26% Lift

저가 상품은 단순히 “조금 더 높은 수준”이 아니라, 실제로 장바구니 진입률이 구조적으로 높았습니다.

 

실무적 생각

  • 저가 진입 상품
  • 할인
  • 엔트리 전략
    - 같은 가격 정책이 중요할 가능성이 높음

“가격은 실제 핵심 변수였다.”


Category 검증 – 상품군 자체가 중요한가?

가격만으로 설명 안 될 수 있기 때문

같은 가격이어도 어떤 상품군은 잘 담기고 어떤 상품군은 안 담길 수 있음

Category Chi-Square

category_table = category_df[
    ["cart_sessions", "not_cart_sessions"]
].values

chi2_cat, p_cat, dof_cat, expected_cat = chi2_contingency(category_table)

print("=== Category Chi-Square Test ===")
print("Chi-Square:", chi2_cat)
print("p-value:", p_cat)
print("Degrees of Freedom:", dof_cat)

Top 10 Category

  item_category view_sessions cart_sessions add_to_cart_rate
not_cart_sessions
48 Home/Stationery/Writing/ 976 399 40.88 577
47 Home/Apparel/Hats/ 6226 2529 40.62 3697
46 Writing 413 149 36.08 264
45 Home/Stationery/Stickers/ 1583 514 32.47 1069
44 Home/Shop by Brand/#IamRemarkable/ 102 32 31.37 70
43 Drinkware 3361 1037 30.85 2324
42 Campus Collection 1529 467 30.54 1062
41 Home/Stationery/Notebooks/ 2010 612 30.45 1398
40 Home/Apparel/Socks/ 1018 310 30.45 708
39 Home/Campus Collection/ 3142 916 29.15 2226

 

Bottom 10 Category

  item_category view_sessions cart_sessions add_to_cart_rate not_cart_sessions
0 Accessories/ 106 2 1.89 104
1 Backpacks/ 468 19 4.06 449
2 Water Bottles/ 161 15 9.32 146
3 Men's T-Shirts 372 47 12.63 325
4 Home/Shop by Brand/Google Cloud/ 221 28 12.67 193
5 Mugs & Tumblers/ 242 31 12.81 211
6 Bags 2688 356 13.24 2332
7 Home/Shop by Brand/YouTube/ 4754 744 15.65 4010
8 Men's T-Shirts/ 1810 291 16.08 1519
9 Lifestyle/Bags/ 4796 843 17.58 3953

 

카테고리별 편차가 매우 컸고 단순 가격 외에 상품 구조 / 구매 의도 / 상품력의 영향 가능성이 커 보였습니다.

 

소표본 제거 (500+)

Accessories 106회, Hats 32회와 같이 극단값 가능성 있음

따라서 view_sessions 500 이상 필터함

 

카테고리 분석 초기에는 일부 카테고리의 전환율이 매우 높거나 낮게 나타났지만, 표본 수가 지나치게 적은 경우 우연에 의한 왜곡 가능성이 있었다. 따라서 보다 신뢰도 높은 비교를 위해 view_sessions 500 이상 카테고리만 선별해 안정 표본 기준으로 재분석했다.

 

Stable Top 10 Category

  item_category view_sessions cart_sessions add_to_cart_rate
not_cart_sessions
48 Home/Stationery/Writing/ 976 399 40.88 577
47 Home/Apparel/Hats/ 6226 2529 40.62 3697
45 Home/Stationery/Stickers/ 1583 514 32.47 1069
43 Drinkware 3361 1037 30.85 2324
42 Campus Collection 1529 467 30.54 1062
41 Home/Stationery/Notebooks/ 2010 612 30.45 1398
40 Home/Apparel/Socks/ 1018 310 30.45 708
39 Home/Campus Collection/ 3142 916 29.15 2226
38 Home/Sale/ 9763 2839 29.08 6924
37 Sale 7887 2283 28.95 5604

 

 

Stable Bottom 10 Category

  item_category view_sessions cart_sessions add_to_cart_rate not_cart_sessions
6 Bags 2688 356 13.24 2332
7 Home/Shop by Brand/YouTube/ 4754 744 15.65 4010
8 Men's T-Shirts/ 1810 291 16.08 1519
9 Lifestyle/Bags/ 4796 843 17.58 3953
10 NaN 4986 909 18.23 4077
11 Eco-Friendly 2189 404 18.46 1785
12 Kids 1212 227 18.73 985
13 Home/Apparel/ 6548 1252 19.12 5296
14 Home/New/ 5335 1030 19.31 4305
15 New 1499 296 19.75 1203

 

Main Category Grouping

카테고리가 너무 세분화되어 있으면 실무 액션 어려움

예시)

 

  • Home/Drinkware/Mugs
  • Home/Drinkware/Bottles
  • Lifestyle/Bags

 

- 상위 카테고리(main_category) 기준 통합

 

세부 카테고리는 지나치게 분산되어 있어 구조적 패턴을 파악하기 어려웠다. 따라서 item_category의 상위 분류(main_category) 기준으로 그룹핑해 보다 실무적인 수준에서 어떤 상품군 구조가 전환율에 영향을 주는지 재정리했다.

  main_category view_sessions cart_sessions add_to_cart_rate
3 Drinkware 3361 1037 30.853913
2 Campus Collection 1529 467 30.542838
13 Sale 7887 2283 28.946367
15 Stationery 1110 307 27.657658
6 Home 73639 18925 25.699697
17 Women's 3470 867 24.985591
5 Google 2578 606 23.506594
9 Men's 7700 1779 23.103896
12 Notebooks 746 172 23.0563
8 Lifestyle 18889 4298 22.753984
14 Small Goods 3068 666 21.707953
0 Apparel 3191 673 21.090567
11 New 1499 296 19.746498
7 Kids 1212 227 18.729373
4 Eco-Friendly 2189 404 18.455916
16 Unknown 4986 909 18.231047
10 Men's T-Shirts 1810 291 16.077348
1 Bags 2688 356 13.244048

Bags Deep Dive (Bags 심층 분석)

Category가 중요하다고 끝나면 무엇을 개선해야 하는지 모릅니다.

그래서 Category 내부에서 가장 문제 가능성 높은 세부군을 탐색했습니다.

Bags 선택 이유

  • 충분한 트래픽
  • 낮은 전환율
  • 실무 개선 가치 큼

 

Bags vs Home

Bags vs DrinkWare

Bags vs Non-Bags

from statsmodels.stats.proportion import proportions_ztest

comparison_targets = ["Drinkware", "Sale", "Home"]

bags = stable_grouped_category[
    stable_grouped_category["main_category"] == "Bags"
].iloc[0]

for target in comparison_targets:
    target_row = stable_grouped_category[
        stable_grouped_category["main_category"] == target
    ].iloc[0]

    count = [
        bags["cart_sessions"],
        target_row["cart_sessions"]
    ]

    nobs = [
        bags["view_sessions"],
        target_row["view_sessions"]
    ]

    stat, pval = proportions_ztest(count, nobs)

    print(f"=== Bags vs {target} ===")
    print("Bags Rate:", round(bags["add_to_cart_rate"], 2))
    print(f"{target} Rate:", round(target_row["add_to_cart_rate"], 2))
    print("Z-stat:", round(stat, 4))
    print("p-value:", pval)
    print("-" * 40)

 

 

  • 고성과군 대비 낮음
  • 평균 대비 낮음
  • 가격보다도 낮음

 

단순히 비싸서가 아니라 Bags 자체 구조 문제 가능성 있음

  • 상세페이지
  • 리뷰
  • 프로모션
  • 무료배송

나머지 가설은 어땠는가?

Device: 유의미하지 않음

User Type: 유의미하지 않음

Source: 일부 유의

 

누가 들어왔는가? 보다 무슨 상품을 봤는가? 가 더 중요함

 

최종 우선순위 재정렬

Tier 1

Price Band

Category (특히 Bags)

Tier 2

Source

Tier 3

Device / User Type

 

처음엔 다양한 가능성을 봤지만 검증 결과 실제 핵심은 Price + Category였습니다.

 

그래서 무엇을 해야 하는가?

 

Price : 전사 가격 전략

Category : 상품 구조 전략

Bags : 즉시 실행 대상

  • 할인
  • 엔트리 상품
  • 리뷰 강화
  • 무료배송

 

오늘 분석을 통해 장바구니 전환율의 핵심 병목이 가격과 카테고리 구조에 있음을 확인했다.

다음 단계에서는 장바구니 이후 결제 단계에서 어떤 추가 이탈이 발생하는지 분석할 예정이다.