프로젝트/GA4 분석

[GA4 퍼널 분석] Day3-4 (view_item → add_to_cart | Price Band 분석)

조성호 2026. 5. 8. 18:58

무슨 상품이 문제인가?

 

가설

가격 경쟁력 부족

- 비싼 상품일수록 상품 조회 후 장바구니 전환이 낮은가?

 

 

1. 상품 정보 추출

- items 배열에서 price / item_category 추출

SELECT
  event_name,

  item.item_name,

  item.item_category,

  item.price,

  user_pseudo_id

FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`,
UNNEST(items) AS item

WHERE event_name IN ('view_item', 'add_to_cart')

LIMIT 100;
event_name item_name item_category price user_pseudo_id
1 view_item Google Camp Mug Ivory 13 3024189.61
2 view_item Android Iconic Mug Gray 17 3024189.61
3 add_to_cart Android Iconic Mug Gray 17 3024189.61
4 add_to_cart Android Hipster Pin 8 4254791.129
5 view_item Android Hipster Pin 8 4254791.129
6 view_item Android Lumberjack Pin 8 4254791.129
7 add_to_cart Android Geek Pin 8 4254791.129
8 view_item Android Geek Pin 8 4254791.129
9 add_to_cart Android Lumberjack Pin 8 4254791.129
10 add_to_cart Google Camp Mug Ivory 13 7187484.395

 

2. 가격대별 세션 퍼널 구조화

- 세션별 price_band 기준 viewed/add_to_cart 여부 생성

-- 2단계: 세션 기준 퍼널 구조화 (Price Band)
-- 목표
-- "각 세션에서 어떤 가격대 상품을 보고,
-- 장바구니까지 갔는지 확인"

WITH funnel AS (

  SELECT
    -- 사용자 고유 식별자
    user_pseudo_id,

    -- 세션 고유 ID 생성
    CONCAT(
      user_pseudo_id,
      '-',
      CAST((
        SELECT value.int_value
        FROM UNNEST(event_params)
        WHERE key = 'ga_session_id'
      ) AS STRING)
    ) AS session_id,

    -- 가격대 구분
    CASE
      WHEN item.price < 30 THEN 'Low'
      WHEN item.price < 100 THEN 'Mid'
      ELSE 'High'
    END AS price_band,

    -- 상품 조회 여부
    MAX(CASE WHEN event_name = 'view_item' THEN 1 ELSE 0 END) AS viewed,

    -- 장바구니 여부
    MAX(CASE WHEN event_name = 'add_to_cart' THEN 1 ELSE 0 END) AS added_to_cart

  FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`,

  -- items 배열 펼치기
  UNNEST(items) AS item

  WHERE event_name IN ('view_item', 'add_to_cart')

  -- 세션 + 가격대 기준 요약
  GROUP BY
    user_pseudo_id,
    session_id,
    price_band
)

-- 중간 결과 확인
SELECT *

FROM funnel

LIMIT 100;
user_pseudo_id session_id price_band viewed added_to_cart
1 1540124.214 1540124.2144280285-5349214666 Low 1 1
2 8628650.754 8628650.7543508418-6987184897 Low 1 1
3 25631840.32 25631840.3215691016-3289776494 Mid 1 0
4 34448390.2 34448390.1968678271-9438611847 Low 1 0
5 59158438.17 59158438.1725123945-4678135765 Low 1 1
6 6386690154 6386690153.7750456159-5759170156 Low 1 1
7 44781397.64 44781397.6407575477-9407646567 Mid 1 0
8 8470764.787 8470764.7870904838-3449410268 High 1 0
9 27443328.67 27443328.6742870458-7253400739 Mid 1 0
10 72181032.07 72181032.0710608558-9159318125 Low 1 0

 

3. 가격대별 전환 성과 비교

- price_band별 장바구니 전환율 계산

-- Price Band(가격대)별
-- view_item → add_to_cart 전환율 분석
-- 목표:
-- "가격대가 높을수록 장바구니 전환율이 낮은가?"
-- → 가격 경쟁력 부족 가설 검증

WITH funnel AS (

  SELECT
    -- 사용자 고유 식별자
    -- 같은 사용자인지 구분
    user_pseudo_id,

    -- 세션 고유 ID 생성
    -- user_pseudo_id + ga_session_id
    -- 한 사용자의 한 방문(세션) 단위 구분
    CONCAT(
      user_pseudo_id,
      '-',
      CAST((
        -- event_params 배열 안에서 ga_session_id 추출
        SELECT value.int_value
        FROM UNNEST(event_params)
        WHERE key = 'ga_session_id'
      ) AS STRING)
    ) AS session_id,

    -- 상품 가격(price)을 기준으로 가격대 분류
    -- Low: 저가
    -- Mid: 중가
    -- High: 고가
    CASE
      WHEN item.price < 30 THEN 'Low'
      WHEN item.price < 100 THEN 'Mid'
      ELSE 'High'
    END AS price_band,

    -- 해당 세션에서 상품 조회(view_item)를 했는지 여부
    -- 한 번이라도 있으면 1
    MAX(CASE WHEN event_name = 'view_item' THEN 1 ELSE 0 END) AS viewed,

    -- 해당 세션에서 장바구니(add_to_cart)를 했는지 여부
    -- 한 번이라도 있으면 1
    MAX(CASE WHEN event_name = 'add_to_cart' THEN 1 ELSE 0 END) AS added_to_cart

  -- GA4 원본 이벤트 테이블
  FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`,

  -- items 배열 펼치기
  -- 각 이벤트 안의 상품 정보(item_name, category, price 등) 추출
  UNNEST(items) AS item

  -- 이번 분석에서는 상품 조회 / 장바구니 이벤트만 사용
  WHERE event_name IN ('view_item', 'add_to_cart')

  -- 세션 + 가격대 기준으로 묶기
  -- 즉, "이 세션에서 이 가격대 상품을 봤는가 / 담았는가"
  GROUP BY
    user_pseudo_id,
    session_id,
    price_band
)

SELECT

  -- 가격대별 결과
  price_band,

  -- 상품 조회(view_item)를 한 세션 수
  COUNTIF(viewed = 1) AS view_sessions,

  -- 장바구니(add_to_cart)를 한 세션 수
  COUNTIF(added_to_cart = 1) AS cart_sessions,

  -- 장바구니 전환율(%)
  -- 장바구니 세션 / 상품 조회 세션
  ROUND(
    SAFE_DIVIDE(
      COUNTIF(added_to_cart = 1),
      COUNTIF(viewed = 1)
    ) * 100,
    2
  ) AS add_to_cart_rate

FROM funnel

-- 상품 조회가 있었던 세션만 분석 대상
WHERE viewed = 1

-- 가격대별 집계
GROUP BY price_band

-- 전환율 낮은 순 정렬
-- 어떤 가격대가 가장 병목인지 확인
ORDER BY add_to_cart_rate ASC;
price_band view_sessions cart_sessions add_to_cart_rate
1 High 13511 2723 20.15
2 Mid 50819 11594 22.81
3 Low 58704 14928 25.43

 

결과1

가격이 높아질수록 장바구니 전환율이 낮아짐

Low: 25.43%

Mid: 22.81%

High: 20.15%

 

해석

가격 경쟁력 부족” 가설이 매우 강하게 지지됨 즉, 사용자는 저가 상품일수록 쉽게 장바구니에 담고 고가의 상품일수록 더 신중하거나 이탈 가능성이 큼

 

비즈니스 관점

High vs Low 차이: 25.43% → 20.15% 약 5.28% 감소

이건 Device / User Type보다 훨씬 큰 차이

 

해석

고가 상품에서 가능한 원인

1. 가격 부담

  • 절대 가격 높음
  • 할인 부족

2. 비교 행동 증가

  • 타사이트 가격 비교
  • 리뷰 탐색

3. 정보 부족

  • 고가일수록 상세정보/신뢰 필요

상품을 안 보는 것이 아니라 보고도 안 담는 것을 확인함

관심 부족보다 구매 장벽(가격/설득력) 문제

 

결론

view_item → add_to_cart 핵심 병목은 “가격 경쟁력 + 고가 상품 설득력”

 

액션

Low 상품

현재 강점

  • 진입 장벽 낮음
  • 프로모션 상품 가능성

High 상품

개선 필요

A.할인/프로모션

B.무료배송 강조

C.리뷰/상세 정보 강화

D.가격 정당화 메시지(프리미엄 가치, 품질)

 

CPC 유입 + High 상품이면 특히 위험

- 광고로 관심 유도 → 가격 보고 이탈 가능성

 

광고 랜딩

  • 가격 노출 방식 개선
  • 할인 정보 선제 제공
  • 비교 우위 강조

상품 조회 이후 장바구니 전환 저하는 사용자 특성보다 가격 상승에 따른 구매 저항 증가와 더 밀접하게 연결될 가능성이 높음