묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
최종과제 제출
질문을 남겨주실 때 아래 부분을 같이 남겨주시면 더 빠르게 상황을 파악하고 답변드릴 수 있어요 🙂어떤 강의를 들으면서 발생했나요?어떤 문제가 생겼나요?어떤 시도를 해보셨나요? 어떤 쿼리를 사용했나요?환경이 어떻게 되나요?(윈도우, 맥 중 택1, 크롬 같은 웹브라우저 환경)배운 것을 토대로 분석해보았는데, 홈페이지에 올렸습니다링크
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-13. 리텐션 과제
안녕하세요3-13 리텐션 과제를 풀어보았습니다익숙치 않아서 그런지 꽤나 어려웠네요https://uncleq.tistory.com/entry/%EB%A6%AC%ED%85%90%EC%85%98-%EC%97%B0%EC%8A%B5
-
미해결[프리미엄] AI와 대화하며 웹 서비스 만들기
커서 ai 노트패드가 안보여요.
최근에 커서 ai 노트패드가 지원안한다라는것같은데이 부분 어떻게 해야할까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9. [자습] PIVOT 테이블 생성하기
WITH base as ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, MAX(IF(params.key='firebase_screen', params.value.string_value, NULL)) as firebase_screen, -- MAX(IF(params.key='food_id', params.value.int_value, NULL)) as food_id, MAX(IF(params.key='session_id', params.value.string_value, NULL)) as session_id, FROM advanced.app_logs CROSS JOIN UNNEST(event_params) as params WHERE -- event_date = "2022-08-01" # 적은 데이터로 쿼리를 작성하기 위해 만든 조건 event_date BETWEEN "2022-08-01" AND "2022-08-18" GROUP BY ALL ), fileter_event_and_concat_event_and_screen AS( -- event_name + screen 하면서(필요한 이벤트만 WHERE 조건에 걸어서 사용) SELECT * EXCEPT(event_name, firebase_screen, event_timestamp), CONCAT(event_name, "-", firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul") AS event_datetime FROM base WHERE event_name IN("screen_view", "click_payment") ) -- step_number + cnt 만들기 -- step_number : CASE WHEN을 사용해 숫자 지정 , pivot_base as ( SELECT event_date, # 일자별로 퍼널별 유저 수 쿼리, 일자별로 처리하기 위해 event_date 추가 event_name_with_screen, CASE WHEN event_name_with_screen = 'screen_view-welcome' THEN 1 WHEN event_name_with_screen = 'screen_view-home' THEN 2 WHEN event_name_with_screen = 'screen_view-food_category' THEN 3 WHEN event_name_with_screen = 'screen_view-restaurant' THEN 4 WHEN event_name_with_screen = 'screen_view-cart' THEN 5 WHEN event_name_with_screen = 'click_payment-cart' THEN 6 ELSE NULL END AS step_number, COUNT(DISTINCT user_pseudo_id) as cnt FROM fileter_event_and_concat_event_and_screen GROUP BY ALL HAVING step_number IS NOT NULL ORDER BY event_date -- WHERE -- user_pseudo_id = "2173465695.8694960923" -- user_pseudo_id = "2173465695.8694960923" :event_name_with_screen = screen_view-welcome의 user_id는 NULL -> home에서 로그인 -- food_detal, search 등 event_name_with_scree의 여러 요소들을 확인해보기 ) # [자습] 위 테이블을 screen_view 타입별로 피벗 테이블 만들기 쿼리 (위 테이블을 with 절로 만들고 아래 쿼리 실행) SELECT event_date, MAX(IF(event_name_with_screen="screen_view-welcome", cnt, NULL)) as `scren_view-welcome`, MAX(IF(event_name_with_screen="screen_view-home", cnt, NULL)) as `scren_view-home`, MAX(IF(event_name_with_screen="screen_view-food_category", cnt, NULL)) as `scren_view-category`, MAX(IF(event_name_with_screen="screen_view-restaurant", cnt, NULL)) as `scren_view-restaurant` FROM pivot_base GROUP BY event_date ORDER BY event_date과제 올립니다 감사합니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. 리텐션 쿼리 작성 및 질문(Weekly, Montly)
안녕하세요,강의 수강하면서 Weekly, Monthly Retention 쿼리를 작성해보았습니다!그리고 질문이 하나 있는데, 첨부해드린 코드는 현재 첨부해드린 사진처럼 오류가 발생합니다. 그런데 Weekly Retention 쿼리를 전부 주석처리하면 Monthly Retention 쿼리는 정상 작동합니다. 반대로 Monthly Retention 쿼리를 주석처리하면 Weekly Retention 쿼리는 정상 작동합니다.이 현상의 원리에 대한 감이 잡히지 않아서 질문드립니다!그 외에 쿼리 관련해서 고칠 점이 있다면 편하게 말씀해주시면 감사하겠습니다!WITH base AS ( SELECT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_week_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) diff_of_day DATE_DIFF(event_week, first_week, WEEK) diff_of_week FROM ( SELECT DISTINCT -- 일자별로 중복 제거 user_pseudo_id, -- DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER (PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, MIN(event_date) OVER (PARTITION BY user_pseudo_id) AS first_date, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week, event_date FROM base ) ), first_month_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) diff_of_day DATE_DIFF(event_month, first_month, MONTH) AS diff_of_month FROM ( SELECT DISTINCT user_pseudo_id, --DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER (PARTITION BY user_pseudo_id), MONTH) AS first_month, DATE_TRUNC(event_date, MONTH) AS event_month, MIN(event_date) OVER (PARTITION BY user_pseudo_id) AS first_date, event_date FROM base ) ) -- Weekly Retention SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_cnt), 3) AS week_retention_rate FROM ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_week) AS first_cnt FROM ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) ) ORDER BY diff_of_week; -- 추가. Monthly Retention SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_cnt), 3) AS month_retention_rate FROM ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_month) AS first_cnt FROM ( SELECT diff_of_month, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_month_and_diff GROUP BY diff_of_month ) ) ORDER BY diff_of_month;
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9 PIVOT문제 풀기
안녕하세요 카일스쿨님!1-9 PIVOT문제를 풀어봤습니다.먼저 PIVOT전에 제방식대로 푼코드를 드리겠습니다. 제가 WITH문을 자주 쓰지않고 그냥 한코드에 다쓰는 습관이 있어서 이런식으로 코드를 짜면 안좋은점이 있는지 피드백받고싶습니다. 또한 PIVOT문제를 풀긴 했는데 맞는 답인지 피드백받고싶습니다.-- PIVOT하기전에 제가 푼 것-- 내가 쓴 답 -- SELECT -- event_date, -- concat(event_name,'-', param.value.string_value) AS event_name_with_screen, -- CASE -- WHEN (event_name='screen_view' AND param.value.string_value='welcome') THEN 1 -- WHEN (event_name='screen_view' AND param.value.string_value='home') THEN 2 -- WHEN (event_name='screen_view' AND param.value.string_value='food_category') THEN 3 -- WHEN (event_name='screen_view' AND param.value.string_value='restaurant') THEN 4 -- WHEN (event_name='screen_view' AND param.value.string_value='cart') THEN 5 -- WHEN (event_name = 'click_payment' AND param.value.string_value='home') THEN 6 -- ELSE 0 -- END AS step_number, -- COUNT(DISTINCT user_id) AS cnt -- FROM `expanded-idiom-446706-d4.advanced.app_logs` -- CROSS JOIN UNNEST(event_params) AS param -- WHERE -- (event_date BETWEEN "2022-08-01"AND '2022-08-18') AND key='firebase_screen' -- GROUP BY event_date,event_name,param.value.string_value,step_number -- HAVING step_number !=0 -- ORDER BY step_number ,event_date-- PIVOT문제 푼것 WITH base AS ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, MAX(IF(event_param.key = 'firebase_screen',event_param.value.string_value,null)) AS firebase_screen, MAX(IF(event_param.key = 'food_id',event_param.value.int_value,null)) AS food_id, MAX(IF(event_param.key = 'session_id',event_param.value.string_value,null)) AS session_id FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS event_param WHERE -- event_date = '2022-08-01' # 적은 데이터로 쿼리를 작성하기 위해 만들어둔 조건 event_date BETWEEN '2022-08-01' AND '2022-08-18' GROUP BY ALL ) , fliter_event_and_concat_evnet_and_screen AS( -- screen과 event_name을 합치자(필요한 이벤트만 where 조건에걸어서 사용) SELECT * EXCEPT(event_name,firebase_screen,event_timestamp), CONCAT(event_name,'-',firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')AS event_datetime FROM base WHERE event_name IN ('screen_view','click_payment') ) SELECT event_date, SUM(IF(event_name_with_screen='screen_view-welcome'),cnt,0) AS `screen_view-welcome`, SUM(IF(event_name_with_screen='screen_view-home'),cnt,0) AS `screen_view-home`, SUM(IF(event_name_with_screen=' screen_view-food_category'),cnt,0) AS `screen_view-food_category`, SUM(IF(event_name_with_screen='screen_view-restaurant'),cnt,0) AS `screen_view-restaurant`, SUM(IF(event_name_with_screen='screen_view-cart'),cnt,0) AS `screen_view-cart`, SUM(IF(event_name_with_screen='click_payment-cart'),cnt,0) AS `click_payment-cart` FROM fliter_event_and_concat_evnet_and_screen GROUP BY ALL ORDER BY event_date
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 과제
리텐션 과제 제출합니다 !쿼리를 짜는 것보다 유저를 어떤 기준으로 나눌 것인지, 리텐션을 어떻게 해석할 것인지 등의 부분이 항상 어려운 것 같습니다 . . ㅠㅠ최대한 배운 내용을 활용해서 인사이트를 도출해보고자 했습니다. 한번 봐주시면 감사하겠습니다 ㅎㅎ!https://bubble-supernova-783.notion.site/19defe88476380ef91abc06719a01ba9#1a4efe88476380e6bd84d4ac9602522d
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9 마지막 테이블 피벗 해보기
안녕하세요 카일님강의 마지막에 주신 연습문제 해보았습니다. PIVOT에 어떤 연산자를 사용할 것인가?MAX로 할 경우 -> 별도의 연산된 결과값이 있는 base`가 필요할 것 같음. 이 경우 강의 중 작성된 cnt를 참조하여 작성할 수 있을 것 같으나 3중 쿼리라는게 마음에 걸림.SUM으로 할 경우 -> 강의 중 작성한 base 만으로 충분할 것 같음. 2중 쿼리로 충분해보임.따라서 B안으로 작성해보았습니다.WITH base AS ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, -- event_param, MAX(IF(event_param.key = 'firebase_screen',event_param.value.string_value, NULL)) AS firebase_screen, -- MAX(IF(event_param.key = 'food_id',event_param.value.int_value, NULL)) AS food_id, MAX(IF(event_param.key = 'session_id',event_param.value.string_value, NULL)) AS session_id, FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS event_param WHERE -- event_date = '2022-08-01' -> 적은 데이터로 쿼리를 작성하기 위해 입력한 임시 조건 event_date BETWEEN '2022-08-01' AND '2022-08-18' GROUP BY ALL -- LIMIT 100 -> 기초 구문 작성 완료 시 삭제 필요! ), filter_event_and_concat_event_and_screen AS ( -- name, screen concatate (필요한 이벤트만 WHERE 조건 걸어 사용) SELECT * EXCEPT(event_name,firebase_screen, event_timestamp), CONCAT(event_name, '-', firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM base WHERE event_name IN('screen_view', 'click_payment') ) # PIVOT 연습문제 SELECT event_date, SUM(IF(event_name_with_screen = 'screen_view-welcome',1,0)) AS `screen_view-welcome`, SUM(IF(event_name_with_screen = 'screen_view-home',1,0)) AS `screen_view-home`, SUM(IF(event_name_with_screen = 'screen_view-food_category',1,0)) AS `screen_view-food_category`, SUM(IF(event_name_with_screen = 'screen_view-restaurant',1,0)) AS `screen_view-restaurant`, SUM(IF(event_name_with_screen = 'screen_view-cart',1,0)) AS `screen_view-cart`, SUM(IF(event_name_with_screen = 'click_payment=cart',1,0)) AS `click_payment-cart`, FROM filter_event_and_concat_event_and_screen GROUP BY ALL ORDER BY event_date ASC
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
counts와 cnt 차이
안녕하세요. Weekly retention을 구하고자 아래와 같이 쿼리를 작성했습니다.WITH base AS (SELECT DISTINCT user_id, event_name, DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, user_pseudo_id FROM `advanced.app_logs` WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_cnt AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate FROM ( SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week ASC) AS first_week_user_cnt FROM user_cnt );이렇게 쿼리 작성을 하니 오류가 발생했고 user_cnt AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week )이 부분에서 테이블 이름을 user_counts로 수정하니 제대로 동작함을 확인했습니다. 왜 이름 때문에 오류가 발생하는 것인지 궁금합니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-5 예제용 학생 점수 데이터 테이블 생성 시 오류 발생
안녕하세요 카일님1-5 학습 중 PIVOT 예제용 TABLE을 만들어 보려고 하였습니다.결론부터 말씀드리면 TABLE 생성에 성공하였어요.다만 궁금한 것은 제가 겪은 오류에 대한 해석이 올바른 것인지 확인 받고 싶어서 질문 드립니다.1-4 강에 있던 array_exercise 생성 구문을 참고하여 아래와 같은 구문으로 실행하였더니 생성되지 않았습니다.가장 안쪽의 select 부터 실행하면서 찾아보니 최하단의 UNION ALL이 원인이었더라구요. UNION ALL 은 아래에도 추가 ROW를 입력해야 할 때, 한 행으로 밀어넣는 명령어이므로, 마지막 행 다음에는 넣지 말아야 한다. 넣을 경우 그 뒤에 추가적인 데이터의 입력을 요구하나, 데이터가 없으므로 실행이 되지 않는 것이다.라고 이해했는데, 맞게 이해했을까요?CREATE OR REPLACE TABLE `advanced.grade` AS SELECT student, grades FROM ( SELECT 'A' AS student, ARRAY<STRUCT<subject STRING, score INT64>>[ STRUCT('수학', 80), STRUCT('영어', 90), STRUCT('과학', 85) ] AS grades UNION ALL SELECT 'B', ARRAY<STRUCT<subject STRING, score INT64>>[ STRUCT('수학', 75), STRUCT('영어', 95), STRUCT('과학', 80) ] UNION ALL )
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
(빅쿼리활용편)디스코드 접속 시 초대 수락이 안됩니다
안녕하세요, 빅쿼리 활용편 강의 수강 중입니다.디스코드 접속 시 초대 수락이 불가해서 확인 부탁드리겠습니다. 어떤 강의를 들으면서 발생했나요? 빅쿼리 활용편어떤 문제가 생겼나요?첨부파일 내 링크를 통해 접속 후 초대 수락하기 클릭 시 불가하다는 메세지가 나옵니다 환경이 어떻게 되나요? 맥 m1 사용중입니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 4주차] 최종 과제
노션 링크 첨부합니다.https://focapa.notion.site/4-141094a2b89980b080c6e19f8b5c4a48?pvs=4
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝 스터디 최종 과제] 6-1의 최종 과제
https://www.notion.so/yijin87/Foodie-4-1430181a6e9b808c9426fb5475909a23?pvs=4 노션링크로 대체합니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 4주차 과제] 강의 6-1의 최종 과제
노션으로 작성하여 링크 첨부합니다.https://sapphire-spade-aa6.notion.site/1435677c375480a997e3d8bf961008dd
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 3주차 과제] 리텐션 연습 문제
6주차 과제 - 1) Weekly Retention을 구하는 쿼리를 바닥부터 스스로 작성해보세요 with base as ( select distinct user_pseudo_id , event_name , date(datetime(timestamp_micros(event_timestamp),'Asia/Seoul')) AS event_date from advanced.app_logs where event_date between '2022-08-01' and '2022-11-01' ) , retention_base as ( select distinct date_trunc(event_date, week(monday)) as event_week , min(date_trunc(event_date , week(monday)) ) over(partition by user_pseudo_id order by event_date)as first_week , user_pseudo_id from base ) , middle as ( select event_week , first_week , date_diff(event_week, first_week, day) as diff , user_pseudo_id from retention_base ) , final as ( select diff , count(distinct user_pseudo_id) as user_cnt from middle group by all ) select diff , first_value(user_cnt) over(order by diff asc) as first_visit_users , user_cnt , round((user_cnt/first_value(user_cnt) over(order by diff asc)), 2) from final - 2) Retain User를 New + Current + Resurrected + Dormant User로 나누는 쿼리를 작성해보세요. --한달내 유저가 얼마나 많은 이벤트를 발생시키는지? --지속적으로 사용한다의 정의를 이벤트를 고려할 것인지 아니면 방문만 볼것인지 신규 유저(New) : 제품을 처음 사용하는 유저 --각 달에 첫 로그를 남긴 유저 기존 유저(Current) : 제품을 지속적으로 사용하는 유저 --한달내에 복귀 유저(Resurrected) : 과거에 사용 -> 비활성 -> 다시 제품을 사용한 유저 휴면 유저(Dormant) : 일정 기간 제품을 사용하지 않은 비활성화 사용자 --해당 주 이외에 - 3) 주어진 데이터에서 어떤 사람들이 리텐션이 그나마 높을까요? 찾아보세요 --함께 고민해보면 좋을 가이드라인 - 휴면 유저를 어떻게 복귀 유저로 부활시킬 수 있을까? - 어떻게 신규 유저를 계속 늘릴 수 있을까? - 기존 유저가 감소하지 않으려면 어떻게 해야할까? - 4) Core Event를 “click_payment”라고 설정하고 Weekly Retention을 구해주세요 with base as ( select distinct user_pseudo_id , event_name , date(datetime(timestamp_micros(event_timestamp),'Asia/Seoul')) AS event_date , min(date_trunc(datetime(timestamp_micros(event_timestamp),'Asia/Seoul') , week(monday)) ) over(partition by user_pseudo_id order by event_week)as first_all_week from advanced.app_logs where event_date between '2022-08-01' and '2022-11-01' ) , retention_base as ( select distinct -- extract(event_date from week) as event_week , min(date_trunc(event_date , week(monday)) ) over(partition by user_pseudo_id order by event_week)as first_week -- , date_trunc(min(event_date) over(partition by user_pseudo_id), week(monday)) as first_week , date_trunc(event_date, week(monday)) as event_week , user_pseudo_id from base where event_name = “click_payment” ) , middle as ( select event_week , first_week , date_diff(event_week, first_week, day) as diff , user_pseudo_id from retention_base ) , weeks as ( select distinct first_week from base ) , final as ( select diff , min(first_week) as first_Week , count(distinct user_pseudo_id) as user_cnt from middle group by all ) select diff , first_value(user_cnt) over(order by diff asc) as first_visit_users , user_cnt , round((user_cnt/first_value(user_cnt) over(order by diff asc)). , 2) --safe_divide() 사용하면 좋음 from final1번 문제(15분)주차별 각 카테고리별 평균 할인율이 가장 높았던 기간과 할인율을 구하는 쿼리를 작성해주세요단, 날짜 데이터를 YYYY-MM-DD 23:59:39 이런 형태로 변경해주세요with raw as (select a.user_id , a.item_id , a.actual_price 90 , b.category , b.list_price 100 , (b.list_price-a.actual_price)/ b.list_price as discount , a.transaction_date from transaction_data a left join item_info b on a.item_id=b.item_id ) select FORMAT_TIMESTAMP('%Y-%m-%d 23:59:59', TIMESTAMP(DATE_TRUNC(DATE(transaction_date), WEEK(MONDAY)))) AS week_start_date, -- 주차의 월요일 날짜를 “YYYY-MM-DD 23:59:59” 형식으로 변환 , category , avg(discount) as avg_discount from raw group by 1,2 order 3 desc limit 1 2번 문제(10분)2024년 1월에 가장 많은 매출을 기록한 카테고리를 구하는 쿼리를 작성해주세요with raw as (select a.user_id , a.item_id , a.actual_price 90 , b.category , b.list_price 100 , (b.list_price-a.actual_price)/ b.list_price as discount , a.transaction_date from transaction_data a left join item_info b on a.item_id=b.item_id where extract(month from a.transaction_date) = 1 and extract(year from a.transaction_date) = 2024 ) select category , sum(actual_price) as gmv from raw group by 1 order gmv desc limit 1 3번 문제(10분)유저별 총 구매 금액이 200만원 이상인 유저들이 가장 많이 구매한 카테고리를 찾는 쿼리를 작성해주세요with raw as (select a.user_id , a.item_id , a.actual_price , b.category , b.list_price , a.transaction_date , sum(a.actual_price) over(partition by user_id) as user_gmv from transaction_data a left join item_info b on a.item_id=b.item_id where ) select category , count(item_id) as cnt_item , count(distinct item_id) as cnt_item , sum(actual_price) as gmv from raw where user_gmv group by 1 order 2 desc --가장많이의 정의가 구매건수라면 order 3 desc --가장많이의 정의가 유니크한 상품수라면 order 4 desc --가장많이의 정의가 gmv 매출이라면 limit 1
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 4주차 과제] 강의 6-1의 최종과제
https://ambiguous-serpent-eb1.notion.site/4-6-1-10208045473b80789c2ccd0823506890
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 연습문제
1. Weekly RetentionWITH 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이 높은 그룹?current user: 최고 0.41 (4~5주차)new user: 최고 0.11 (1,3주차)resurrected user: 최고 0.14 (9~12주차)dormant user: 최고 0.09 (3주차)리텐션이 그나마 높은 그룹: current usercurrent user, resurrected user 리텐션 분포의 경우 상승세 → 하강세 경향성을 보여 피크를 찍을 때 즈음 어떤 이벤트가 있었다고도 추측할 수 있다. 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
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 4주차 과제] 최종 과제
SELECT DISTINCT LEFT(FORMAT_DATE('%Y%m%d', event_date), 6) AS login_month, COUNT(DISTINCT user_pseudo_id) as count FROM advanced.app_logs GROUP BY LEFT(FORMAT_DATE('%Y%m%d', event_date), 6)2022년 8월부터 2023년 1월까지의 MAU를 살펴보니(MAU기준은 로그인 기록), 첫 달인 2022년 8월에는 미진했지만 그 후로 점차 증가하는 것을 볼 수 있습니다. 특히 9월은 8월 대비 2배에 가까운 성장률을 보였고 10월에는 1.5배 이상의 성장률을 보이면서 점차 사용자가 확대되고 있는 것을 알 수 있습니다. WITH base AS ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), WEEK(MONDAY)) AS event_week, DATE_TRUNC(MIN(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week FROM `advanced.app_logs` ), first_week_diff AS ( SELECT user_pseudo_id, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM base ), user_counts AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_count FROM first_week_diff GROUP BY diff_of_week ) SELECT diff_of_week, user_count, ROUND(SAFE_DIVIDE(user_count, FIRST_VALUE(user_count) OVER (ORDER BY diff_of_week ASC)), 2) AS retention_rate FROM user_counts ORDER BY diff_of_week;주 리텐션율을 살펴보면, 첫 주에는 당연히 1%이지만 그 후로 확연히 주마다 접속하는 사용자가 줄고 있습니다. Foodie Express는 아직 Product Market Fit을 발견하지 못한 것으로 보입니다. WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN '2022-08-01' AND '2022-12-31' -- 데이터 길게보기 ), first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week,first_week, WEEK) AS weeks_after_first_week FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), active_users AS( SELECT first_week, weeks_after_first_week, COUNT(DISTINCT user_pseudo_id) AS avtive_users FROM first_week_and_diff GROUP BY first_week, weeks_after_first_week ) SELECT first_week, weeks_after_first_week, avtive_users, FIRST_VALUE(avtive_users) OVER(PARTITION BY first_week ORDER BY weeks_after_first_week) AS cohort_users FROM active_users AS a ORDER BY first_week, weeks_after_first_week; 첫 주에 1,211의 사용자가 있었으나 1주차에 32명으로 급감했습니다 (약 2.6% 유지)2-8주차에는 비교적으로 안정적이었고, 9주차에서 20주에는 사용자가 좀 더 증가하였습니다.특히 14주차에 142명으로 가장 많은 사용자가 있었습니다. 이를 살펴보면, 초기에 감소 후에 오히려 사용자 수가 증가하는 패턴을 보이고오히려 앱을 사용하면 사용할 수록 더 활발하게 앱을 사용하는 것을 알 수 있습니다.따라서 어떻게든 사용자들을 앱에 유입시켜서 사용하게 만들어야합니다. 특히 주말, 공휴일 또는 음식 주문이 많은 근무 시간 이후에 비활성 사용자에게 정기적인 푸시 알림이나 메시지를 보내면 좋을 것 같습니다. (음식을 많이 시켜먹는 주말이나, 공휴일 또는 퇴근시간때쯤 맞춰서 푸시알림을 준다)공휴일에 좀 더 사용자가 증가하는 경향을 보이는 것 같은데, 이 때는 사용자 유입이 많으므로 소액 할인 쿠폰을 제공하는 것이 효과적일 것이라고 판단됩니다.무엇보다도 정기적인 알림을 통해 앱 사용 습관을 들이는 것이 중요해 보입니다!
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[인프런 빅쿼리 빠짝스터디 3주차] 3주차 과제
1번WITH -- 1단계: 필수 데이터만 추출하기 base_events AS ( SELECT user_pseudo_id, DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul") AS event_date FROM advanced.app_logs ), -- 2단계: 사용자별 첫 방문 주차와 각 활동 주차 구하기 user_weeks AS ( SELECT DISTINCT -- 중복 제거 user_pseudo_id, -- 사용자별 첫 방문 주차 (월요일 기준) DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, -- 실제 방문한 주차 (월요일 기준) DATE_TRUNC(event_date, WEEK(MONDAY)) AS visit_week FROM base_events ), -- 3단계: 첫 방문 이후 몇 주차인지 계산하기 week_numbers AS ( SELECT user_pseudo_id, -- 첫 방문 이후 경과된 주차 계산 DATE_DIFF(visit_week, first_week, WEEK) AS week_number FROM user_weeks -- 최대 12주까지만 분석 WHERE DATE_DIFF(visit_week, first_week, WEEK) <= 12 ), -- 4단계: 주차별 총 사용자 수 계산하기 weekly_users AS ( SELECT week_number, COUNT(DISTINCT user_pseudo_id) AS user_count FROM week_numbers GROUP BY week_number ) -- 5단계: 최종 리텐션 계산하기 SELECT week_number, user_count as active_users, FIRST_VALUE(user_count) OVER(ORDER BY week_number) as first_week_users, ROUND(100.0 * user_count / FIRST_VALUE(user_count) OVER(ORDER BY week_number), 2) as retention_rate FROM weekly_users ORDER BY week_number; 2번WITH -- 1단계: 사용자별 주차 데이터 준비 user_weeks AS ( SELECT DISTINCT user_pseudo_id, -- 첫 방문 주차 DATE_TRUNC(MIN(DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul")) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, -- 활동 주차 DATE_TRUNC(DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul"), WEEK(MONDAY)) AS event_week FROM advanced.app_logs ), -- 2단계: 사용자 상태 확인 user_status AS ( SELECT user_pseudo_id, event_week, first_week, -- 이전 방문 주차 LAG(event_week) OVER(PARTITION BY user_pseudo_id ORDER BY event_week) AS prev_week FROM user_weeks ), -- 3단계: 상태 분류 weekly_status AS ( SELECT event_week, user_pseudo_id, CASE WHEN event_week = first_week THEN 'New' WHEN DATE_DIFF(event_week, prev_week, WEEK) = 1 THEN 'Current' WHEN DATE_DIFF(event_week, prev_week, WEEK) > 1 THEN 'Resurrected' END as user_type FROM user_status ), -- 4단계: 각 주차별 전체 유저 수 total_users AS ( SELECT fwd.event_week, COUNT(DISTINCT user_pseudo_id) AS total_user_count FROM user_status CROSS JOIN (SELECT DISTINCT event_week FROM user_weeks) AS fwd WHERE first_week <= fwd.event_week GROUP BY event_week ), -- 5단계: 주차별 활성 유저 수 계산 active_users AS ( SELECT event_week, COUNTIF(user_type = 'New') AS new_users, COUNTIF(user_type = 'Current') AS current_users, COUNTIF(user_type = 'Resurrected') AS resurrected_users, COUNT(DISTINCT user_pseudo_id) AS retain_users FROM weekly_status GROUP BY event_week ) -- 6단계: 최종 결과 SELECT FORMAT_DATE('%Y-%m-%d', a.event_week) as week_start, new_users, current_users, resurrected_users, (t.total_user_count - a.retain_users) as dormant_users, ROUND(100.0 * current_users / NULLIF(LAG(new_users) OVER(ORDER BY a.event_week), 0), 1) as retention_rate, retain_users as active_users, t.total_user_count as total_users FROM active_users a JOIN total_users t ON a.event_week = t.event_week ORDER BY a.event_week; 3번WITH -- 1단계: 기본 데이터 준비 user_weeks AS ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul")) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul"), WEEK(MONDAY)) AS event_week FROM advanced.app_logs ), -- 2단계: 사용자별 방문 주차 수 계산 user_visit_frequency AS ( SELECT user_pseudo_id, COUNT(DISTINCT event_week) as total_visit_weeks, DATE_DIFF(MAX(event_week), MIN(event_week), WEEK) + 1 as weeks_since_first, MIN(event_week) as first_visit_week FROM user_weeks GROUP BY user_pseudo_id ), -- 3단계: 사용자별 리텐션 점수 계산 user_retention_score AS ( SELECT user_pseudo_id, total_visit_weeks, weeks_since_first, ROUND(100.0 * total_visit_weeks / weeks_since_first, 2) as visit_rate, FORMAT_DATE('%Y-%m', first_visit_week) as cohort_month FROM user_visit_frequency WHERE weeks_since_first >= 4 -- 최소 4주 이상 경과된 사용자만 ), -- 4단계: 사용자 행동 데이터 분석 user_behavior AS ( SELECT r.user_pseudo_id, r.visit_rate, r.cohort_month, COUNT(DISTINCT DATE(TIMESTAMP_MICROS(l.event_timestamp), "Asia/Seoul")) as active_days, COUNT(DISTINCT l.event_timestamp) as total_events, COUNT(DISTINCT l.event_name) as unique_event_types FROM user_retention_score r JOIN advanced.app_logs l ON r.user_pseudo_id = l.user_pseudo_id GROUP BY r.user_pseudo_id, r.visit_rate, r.cohort_month ), -- 5단계: 리텐션 세그먼트별 행동 패턴 분석 retention_segments AS ( SELECT cohort_month, CASE WHEN visit_rate >= 75 THEN 'Very High (75%+)' WHEN visit_rate >= 50 THEN 'High (50-74%)' WHEN visit_rate >= 25 THEN 'Medium (25-49%)' ELSE 'Low (<25%)' END as retention_segment, COUNT(DISTINCT user_pseudo_id) as user_count, ROUND(AVG(visit_rate), 2) as avg_retention_rate, ROUND(AVG(active_days), 1) as avg_active_days, ROUND(AVG(total_events), 1) as avg_total_events, ROUND(AVG(unique_event_types), 1) as avg_unique_events FROM user_behavior GROUP BY cohort_month, CASE WHEN visit_rate >= 75 THEN 'Very High (75%+)' WHEN visit_rate >= 50 THEN 'High (50-74%)' WHEN visit_rate >= 25 THEN 'Medium (25-49%)' ELSE 'Low (<25%)' END ) -- 최종 결과 SELECT cohort_month, retention_segment, user_count, avg_retention_rate, avg_active_days, avg_total_events, avg_unique_events, ROUND(100.0 * user_count / SUM(user_count) OVER (PARTITION BY cohort_month), 2) as segment_percentage FROM retention_segments ORDER BY cohort_month, CASE retention_segment WHEN 'Very High (75%+)' THEN 1 WHEN 'High (50-74%)' THEN 2 WHEN 'Medium (25-49%)' THEN 3 WHEN 'Low (<25%)' THEN 4 END; 4번WITH -- 1단계: 결제 이벤트 기본 데이터 payment_base AS ( SELECT DISTINCT user_pseudo_id, DATE(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul") AS event_date FROM advanced.app_logs WHERE event_name = "click_payment" ), -- 2단계: 사용자별 첫 결제일과 주차 계산 user_weeks AS ( SELECT user_pseudo_id, -- 첫 결제 주차 DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, -- 실제 결제 주차 DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM payment_base ), -- 3단계: 주차별 상태 계산 week_status AS ( SELECT user_pseudo_id, event_week, first_week, -- 첫 주차와의 차이 DATE_DIFF(event_week, first_week, WEEK) AS week_number FROM user_weeks WHERE DATE_DIFF(event_week, first_week, WEEK) <= 12 -- 최대 12주까지만 분석 ), -- 4단계: 주차별 활성 사용자 수 계산 weekly_users AS ( SELECT week_number, COUNT(DISTINCT user_pseudo_id) AS active_users FROM week_status GROUP BY week_number ), -- 5단계: 첫 주 사용자 수 (코호트 크기) 구하기 first_week_users AS ( SELECT COUNT(DISTINCT user_pseudo_id) AS cohort_size FROM week_status WHERE week_number = 0 ) -- 최종 결과 SELECT week_number as week, active_users, cohort_size, ROUND(100.0 * active_users / cohort_size, 2) as retention_rate FROM weekly_users CROSS JOIN first_week_users ORDER BY week_number; 서비스 성장세총 사용자: 52,823명까지 증가8월부터 12월까지 꾸준한 성장10월에 가장 높은 신규 유저 유입 (4,048명)리텐션 개선전체 리텐션: 8월 2.6% → 1월 48%로 큰 폭 개선12월부터 40% 이상의 안정적인 리텐션 유지재방문 사용자 비중이 지속적으로 증가 개선 필요점결제 리텐션이 매우 낮음 (1% 수준)신규 사용자 유입이 감소 추세휴면 사용자가 지속적으로 증가
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[빠짝스터디 4주차] 데이터 분석 실습
활성사용자 주간 트렌드로 확인하면 최근 두 달은 감소세이나 그 이후에도 감소할지는 아직 알 수 없습니다. 주중 VS 주말 큰 차이는 아니지만, 주말의 활성사용자가 더 많습니다. 주중에만 참여가능한 프로모션을 실행해볼 수 있다고 판단됩니다. 신규사용자 2022년 40주차에 신규유저 유치용 프로모션을 진행한 것으로 보이며, 그 시기를 기점으로 신규유저 유입이 지속적으로 감소세에 있습니다.22년 40주차에 잘된 원인을 분석하여 그에 맞는 액션아이템을 도출해야 합니다.40주차에 진행한 프로모션과 유사한 프로모션을 진행하거나,40주차에 특정 페이드마케팅(광고)를 진행했다면 비슷한 수준의 예산과 매체로 캠페인을 다시 진행할 필요가 있습니다. 리텐션, 코호트월간 리텐션 코호트 월간(30일) 기준으로 리텐션과 코호트를 보았는데, 더 긴 기간의 데이터를 들여다봐야 한다고 생각합니다.데이터를 잘못 만졌을 가능성이 있다고 생각하는데, +2개월차나 +3개월차에 리텐션이 오히려 상승하는 경우가 있었습니다. 데이터 테이블을 첨부해봅니다. 만약 데이터 추출결과가 문제가 없다면, 월간기준으로 리텐션이 다시 높아지는 원인을 찾고 그에 맞게 액션아이템을 도출해야합니다. 2022년 10월~12월의 리텐션은 30%대를 유지하고 있는것으로 보아, 리텐션 유지를 위한 프로모션을 해당 기간에 진행했을 가능성이 있습니다.12월 신규유입 유저가 1월에 잔존율이 20%초반대로 급감한 것으로 보아 프로모션이 없었거나, 명절연휴의 영향이 있었을 가능성이 있습니다.23년 1월의 명절 연휴가 평일 기준 이틀 뿐이어서 이건 가능성이 없는 것 같고,리텐션용 프로모션이 23년 1월부터 진행되지 않았을 가능성이 높다고 봅니다.리텐션용 프로모션을 부활시켜야 합니다. 이벤트, 전환율 분석검색 후 결제전환율과 추천메뉴 클릭 후 결제전환율의 트렌드입니다. 2022년 35주차에 두 전환율이 모두 높았는데, 추천메뉴 클릭 후 결제전환율이 특히 높았던 것으로 보아 관련 이벤트가 있던 것으로 생각됩니다.아마 아주 비싼 고급 음식을 매우 합리적인 가격에 추천하는 이벤트를 진행하지 않았나 싶습니다. 다만 모든 유저에게 노출되는 추천메뉴는 아니었을 것 같습니다. 이유는 후술하겠습니다.추천 메뉴 -> 결제전환율은 평균 30.99%로 매우 높은 반면, 검색 -> 결제전환율은 평균 5.68%로 현저히 낮습니다.검색결과의 품질이나 UX가 그렇게 만족스럽지 않을 가능성이 있으므로 개선이 필요합니다.추천메뉴 관련 경험을 계속 유지하거나 더 좋게 만드는 액션아이템을 개발할 필요가 있습니다. 결제건수 트렌드입니다. 결제건수는 2022년 40주차에 단연 가장 높습니다. 위에 언급했던 신규유저수가 튀었던 주차와 동일합니다.앞서 언급한 35주차의 결제건수는 40주차에 비하면 그렇게 높지 않습니다. 그렇기 때문에 35주차는 모든 유저 대상이 아니었다라고 판단하게 되었습니다.다만 이것이 단순히 기존 전체 유저 대상이었는지(그럴 가능성이 높다고 보지만), 기존 유저 중 특정 유저만 대상인지는 조금 더 살펴봐야 합니다.40주차 이후에 결제건수가 36주차 이전보다 확연히 늘어난 상태로 유지가 되고 있는 것으로 보아 신규유저의 대량 유입이 결제건수 상승에 기여했다고 판단됩니다. 장바구니 -> 결제 전환율 트렌드입니다.추천메뉴->결제전환율이 튀었던 35주차에 장바구니-> 결제전환율은 거의 100%입니다. 무조건 결제를 한 수준입니다.신규유저가 대폭 유입된 40주차의 결제전환율도 매우 높은 편입니다.트렌드 그래프로만 보면 이벤트가 없을때의 장바구니-> 결제전환율이 낮을 것으로 보일 수 있으나 거의 항상 80% 이상의 전환율을 유지하고 있습니다. 가설(액션아이템)주중 프로모션을 진행하면 일간 활성사용자수가 주말만큼 상승할 것이다.검색관련 UX를 개선하면 검색 후 결제전환율이 5%보다 상승할 것이다. 기존유저 대상으로 정기적인 혜택을 부여하면 리텐션이 30%대로 높게 유지될 것이다.신규유저를 적극적으로 유치하는 프로모션이나 광고캠페인을 적극적으로 진행하면신규유저 유입수가 크게 증가할 것이다.결제건수가 이전보다 높은 수준으로 상승하여 유지될 것이다.
주간 인기글
순위 정보를
불러오고 있어요