티스토리 뷰

Data Enginnering /SQL

잔존율

내일도이렇게 2021. 6. 2. 17:22

잔존율 

서비스 등록 후 수개월 후에 어느 정도 비율의 사용자가 서비스를 지속해서 사용하고 있는지 보여지는 비율 

 

 

  2016년 1월 2016년 2월 2016년 3월 2016년 4월 2016년 5월 2016년 6월
2016년 1월 100(100%)          
2016년 2월 90 (90%) 150(100%)        
2016년 3월 80(80%) 120(80%) 120(100%)      
2016년 4월 70(70%) 90(60%) 90(75%) 200(100%)    
2016년 5월 60(60%) 60(40%) 90(75%) 150(75%) 250(100%)  
2016년 6월 50(50%) 30(20%) 30(25%) 100(50%) 125(50%) 220(100%)

[사용자의 잔존율] 

 

다음과 같은 항목에 문제점이 없는지 확인할 수 있다. 

 

1. 이전과 비교해 n개월 후의 잔존율이 내려갔다면?

   - 신규 등록자가 서비스를 사용하기 위한 장벽이 높아지지는 않았는지 확인

2. n 개월 후에 잔존율이 갑자기 낮아지는 경향이 있다면?

   - 서비스의 사용 목적을 달성하는 기간이 예상보다 너무 짧지는 않은지 확인

3. 오래 사용하던 사용자인데도 특정 월을 기준으로 사용하지 않게 되었다면 ? 

   - 사용자가 서비스 내부에서의 경쟁 등으로 빨리 지친 것은 아닌지 확인

 

쿼리환경: bigquery 

 

사용자의 잔존율을 월 단위로 집계하려면 , 알단 사용자의 서비스 등록일로 부터 12개월 후까지의 월을 도출해내기 위한 추가 테이블 필요. 

 

WITH mst_intervals as (
    SELECT *
    FROM UNNEST([0,1,2,3,4,5,6,7,8,9,10,11,12]) AS interval_month 
)

SELECT *
FROM mst_intervals ;

 

사용자 기준월 기준으로  + n개월 컬럼 테이블 생성 

WITH mst_intervals as (
    SELECT *
    FROM UNNEST([0,1,2,3,4,5,6,7,8,9,10,11,12]) AS interval_month 
)
, mst_users_with_index_month as ( 
    SELECT 
     u.user_id 
    ,u.register_date 
    ,date_add(date(timestamp(u.register_date)),interval i.interval_month month) as index_date -- 기준월 + n개월 날짜 
    ,substr(u.register_date,1,7) as register_month  -- 기준월 
    ,substr(cast(date_add(date(timestamp(u.register_date)),interval i.interval_month month) as string),1,7) as index_month -- 기준월 + n개월
    FROM `sqltest-312808.test8.mst_users` as u 
    CROSS JOIN  mst_intervals as i 
)

SELECT *
FROM mst_users_with_index_month 
ORDER BY user_id,register_date,index_date 

 

WITH mst_intervals as (
    SELECT *
    FROM UNNEST([0,1,2,3,4,5,6,7,8,9,10,11,12]) AS interval_month 
)
, mst_users_with_index_month as ( 
    SELECT 
     u.user_id 
    ,u.register_date 
    ,date_add(date(timestamp(u.register_date)),interval i.interval_month month) as index_date -- 기준월 + n개월 날짜 
    ,substr(u.register_date,1,7) as register_month  -- 기준월 
    ,substr(cast(date_add(date(timestamp(u.register_date)),interval i.interval_month month) as string),1,7) as index_month -- 기준월 + n개월
    FROM `sqltest-312808.test8.mst_users` as u 
    CROSS JOIN  mst_intervals as i 
)
,action_log_in_month AS (
    --액션 로그의 날짜에서 월 부분만 추출하기 
    SELECT DISTINCT 
       user_id 
       ,substr(stamp,1,7) AS action_month 
    FROM 
      `sqltest-312808.test8.action_log`
)


SELECT 
   -- 사용자 마스터, 액션로그를 결합한 뒤, 월별로 잔존율 집계하기 
   u.register_month 
   ,u.index_month 
   ,sum(case when a.action_month is not null then 1 else 0 end) as users 
   ,avg(case when a.action_month is not null then 100.0 else 0.0 end) as retension_rate 
 FROM 
   mst_users_with_index_month as u 
  LEFT JOIN 
   action_log_in_month as a  
  ON u.user_id = a.user_id 
  AND u.index_month = a.action_month 
GROUP BY 
 u.register_month,u.index_month  
ORDER BY 
 u.register_month, u.index_month 

 

Reference 

데이터 분석을 위한 SQL 레시피 

'Data Enginnering > SQL' 카테고리의 다른 글

Declie 분석  (0) 2021.06.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함