inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

[빠짝스터디 3주차 과제] 리텐션 연습문제

152

sjb2774

작성한 질문수 4

0

1. Weekly Retention

WITH base AS (
	SELECT
		DISTINCT
			DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime,
      DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date,
      DATE_TRUNC(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), WEEK(MONDAY)) AS event_week,  
      DATE_TRUNC(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), MONTH) AS event_month,
			user_id,
			user_pseudo_id,
      event_name,
      platform,
      event_params
	FROM advanced.app_logs
), user_visit_base AS (
  SELECT
    user_pseudo_id,
    MIN(event_week) OVER (PARTITION BY user_pseudo_id) AS first_visit_week,
    event_week AS visit_week
  FROM base
), user_visit_weekdiff AS (
  SELECT
    first_visit_week, 
    DATE_DIFF(visit_week, first_visit_week, week) AS week_diff,
    COUNT(DISTINCT user_pseudo_id) AS visit_users
  FROM user_visit_base
  GROUP BY ALL
)


SELECT
  first_visit_week, 
  week_diff,
  visit_users,
  SAFE_DIVIDE(visit_users, FIRST_VALUE(visit_users) OVER (PARTITION BY first_visit_week ORDER BY week_diff ASC 
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) AS retention
FROM user_visit_weekdiff

 

2. Retain User → New User, Current User, Resurrected User, Dormant User

-- 한 달(30일)을 기준으로 구분하였다.
-- 신규 유저: 최근 한 달 이내 새로 방문
-- 기존 유저: 최근 한 달 이내 재방문, 그 이전 한달에도 방문
-- 복귀 유저: 최근 한 달 이내 재방문, 그 이전 한달에는 방문 X
-- 휴먼 유저: 최근 한 달 이내 재방문 X

WITH base AS (
    SELECT
        DISTINCT
            DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date,
            user_pseudo_id
    FROM advanced.app_logs
), user_first_last AS (
    SELECT
        user_pseudo_id,
        MIN(event_date) AS first_date,
        MAX(event_date) AS last_date
    FROM base
    GROUP BY user_pseudo_id
), last_event_date AS (
    SELECT 
        MAX(event_date) AS current_date
    FROM base
), user_activity AS (
    SELECT
        user_pseudo_id,
        event_date,
        LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS next_event_date,
        CASE
            WHEN DATE_DIFF(LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date), event_date, DAY) > 30 THEN 1 ELSE 0
        END AS dormant_history
    FROM base
), user_types AS (
    SELECT
        u.user_pseudo_id,
        u.first_date,
        u.last_date,
        led.current_date,
        MAX(us.dormant_history) AS dormant_history,
        CASE 
            WHEN DATE_DIFF(led.current_date, u.last_date, DAY) > 30 THEN 'dormant_user'
            WHEN DATE_DIFF(u.last_date, u.first_date, DAY) <= 30 THEN 'new_user'
            WHEN MAX(us.dormant_history) = 1 THEN 'resurrected_user'
            ELSE 'current_user'
        END AS user_type
    FROM user_first_last AS u
    CROSS JOIN last_event_date AS led
    LEFT JOIN user_activity AS us ON u.user_pseudo_id = us.user_pseudo_id
    GROUP BY u.user_pseudo_id, u.first_date, u.last_date, led.current_date
), first_week_and_diff AS (
    SELECT
        ut.user_type,
        fw.user_pseudo_id,
        fw.event_date,
        DATE_DIFF(DATE_TRUNC(fw.event_date, WEEK(MONDAY)), DATE_TRUNC(ut.first_date, WEEK(MONDAY)), WEEK) AS diff_of_week
    FROM base AS fw
    JOIN user_types AS ut ON fw.user_pseudo_id = ut.user_pseudo_id
), user_cnt_by_type_and_week AS (
    SELECT
        user_type,
        diff_of_week,
        COUNT(DISTINCT user_pseudo_id) AS user_cnt
    FROM first_week_and_diff
    GROUP BY user_type, diff_of_week
), retention_base AS (
    SELECT
        user_type,
        diff_of_week,
        user_cnt,
        FIRST_VALUE(user_cnt) OVER (PARTITION BY user_type ORDER BY diff_of_week) AS first_user_cnt
    FROM user_cnt_by_type_and_week
)

SELECT
    user_type,
    diff_of_week,
    ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 2) AS retention_rate
FROM retention_base
ORDER BY user_type, diff_of_week

 

3. retention이 높은 그룹?

image.pngimage.pngimage.pngimage.png

 

4. click_payment 이벤트를 중점으로 본 Weekly Retention?

WITH base AS (
	SELECT
		DISTINCT
			DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date,
			DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime,
			event_name,
			user_id,
			user_pseudo_id
	FROM advanced.app_logs
	WHERE 1=1
	AND event_name = "click_payment"
), event_week_and_first_week AS (
	SELECT
		DISTINCT
			DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week, 
			user_pseudo_id,
			DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date), WEEK(MONDAY)) AS first_week
	FROM base
), retention_base AS (
	SELECT
		*, 
		FIRST_VALUE(user_cnt) OVER(ORDER BY day_of_week) AS total_user
	FROM (
		SELECT
			DATE_DIFF(event_week, first_week, WEEK) AS day_of_week,
			COUNT(DISTINCT user_pseudo_id) AS user_cnt
		FROM event_week_and_first_week
		GROUP BY day_of_week
	)
)

SELECT
	day_of_week,
	ROUND(SAFE_DIVIDE(user_cnt, total_user), 2) AS retention
FROM retention_base
ORDER BY day_of_week

 

 

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. sjb2774님께서 강의 중 리텐션 분석을 하며 주차별로 사용자 유형을 구분하고, click_payment 이벤트를 중심으로 리텐션을 분석하려는 시도를 하셨군요. 이를 통해 성과를 분석하는 과정에서 중요한 정보를 도출할 수 있습니다.

주요 질문 및 해결 방안

  1. Weekly Retention:

    • 주차 단위로 리텐션을 분석하여 사용자가 처음 방문 후 몇 주 동안 계속 사이트에 방문하는지를 시각화할 수 있습니다. visit_weekfirst_visit_week를 기준으로 사용자를 식별하여 몇 주 동안 유지되는지를 계산하는 방식이 적절합니다.
  2. 리텐션 높은 그룹 분석:

    • 사용자 유형을 New, Current, Resurrected, Dormant로 구분하여 각 그룹의 리텐션을 분석한 덕분에, 어떤 고객층이 더 잘 유지되고 있는지 파악할 수 있습니다. Current User가 가장 높은 리텐션을 보였다는 분석 결과는 특히 중요합니다.
    • 리텐션이 감소하거나 증가하는 피크를 조사하면서 특정 이벤트나 프로모션이 있었는지 추가 분석하면 원인을 파악하는 데 도움이 됩니다.
  3. click_payment 이벤트 중심 분석:

    • click_payment를 중심으로 분석함으로써 구매 관련 유입과 유지율을 이해할 수 있습니다. 이 이벤트를 활용한 주간 리텐션 분석은 결제 행동이 지속되는지를 확인할 수 있게 합니다.

관련된 내용 및 더 나은 설명을 원하는 경우 참고할 수 있는 유사 질문 및 답변들은 다음과 같습니다:

이 질문들을 통해 SQL로 리텐션 분석할 때의 기법과 유사한 리텐션 문제 해결을 위한 다양한 전략을 확인하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최종 과제 제출

0

82

3

BigQuery 활용편 18강 질문있습니다!

0

84

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

83

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

73

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

69

2

윈도우 연습문제 1번 질문

0

65

1

user_id에 NULL이 나오는데 정상인가요?

0

72

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

107

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2