본문 바로가기
SQL/SQL 궁금증 회고

MYSQL로 코호트 분석, 리텐션 분석하기

by davi_kr 2024. 10. 12.

목차

    반응형

    코호트 분석? 리텐션 분석?

    코호트 분석은 시점을 기준으로 특정 행태의 유저를 분석하는 방법입니다.

    서비스 이용이나 상품 구매, 앱 가입, 웹 첫방문, 캠페인 유입 등 정의할 수 있는 특정 행태를 보인 유저들을 묶어서 일, 주, 월 등과 같은 시점 기준으로 패턴을 확인합니다. 

     

    보통 코호트는 리텐션 분석에서 많이 사용되고 있는데요.

    리텐션 분석은 앞서 정의한 행태들을 반복적으로 보이는지를 분석하는 것입니다.

    서비스 재이용, 재구매로 정의할 수 있는 특정 행태를 앞서와 마찬가지로 일,주,월 단위에서 계속적으로 지속하고 있는지를 확인합니다.

    이를 위해선 언제 맨 처음 해당 행위가 발생했는지를 알아야 하고 그 이후에 같은 행위가 어떤 시점에 발생했는지도 알아야 합니다.

     

    아래 예시는 서비스 이용을 완료한 달을 기준으로 코호트 분석을 하기 위한 쿼리입니다.

    코호트 분석, 리텐션 확인용 쿼리

    -- 1. 코호트 대상자의 첫 사용월을 정의 
    WITH cohort AS (
    	SELECT user_id, MIN(date_format(start_at,'%Y-%m-01')) 'first_use_month'
        FROM `schedule`
        WHERE status = 'completed'
        GROUP BY user_id
    ) 
    -- 2. 코호트 대상자의 첫 사용월과 사용 이력을 비교하여 month_number를 부여 
    ,activity AS (
    	SELECT 
    		c.user_id
            , c.first_use_month
            , date_format(s.start_at,'%Y-%m-01') 'use_date'
            , TIMESTAMPDIFF(MONTH, c.first_use_month, date_format(s.start_at,'%Y-%m-01')) AS month_number
    	FROM `cohort` c 
        JOIN `schedule` s on s.user_id = c.user_id
        WHERE s.status = 'completed'
    )
    -- 3. 첫 이용월과 실제 년월로 액티브 유저수를 그룹핑 함
    ,cohort_retention AS (
    	SELECT 
    		first_use_month
            , month_number
    		, COUNT(distinct user_id) 'active_users'
    	FROM activity
    	GROUP BY first_use_month, month_number
    )
    
    -- 4. 조건문으로 M0부터 시작해 1년치 코호트를 기록함
    SELECT
        first_use_month,
    	max(CASE WHEN month_number = 0 THEN active_users END) 'M0',
        max(CASE WHEN month_number = 1 THEN active_users END) 'M1',
    	max(CASE WHEN month_number = 2 THEN active_users END) 'M2',
        max(CASE WHEN month_number = 3 THEN active_users END) 'M3',
        max(CASE WHEN month_number = 4 THEN active_users END) 'M4',
        max(CASE WHEN month_number = 5 THEN active_users END) 'M5',
        max(CASE WHEN month_number = 6 THEN active_users END) 'M6',
        max(CASE WHEN month_number = 7 THEN active_users END) 'M7',
        max(CASE WHEN month_number = 8 THEN active_users END) 'M8',
        max(CASE WHEN month_number = 9 THEN active_users END) 'M9',
        max(CASE WHEN month_number = 10 THEN active_users END) 'M10',
        max(CASE WHEN month_number = 11 THEN active_users END) 'M11'
    FROM cohort_retention
    GROUP BY first_use_month
    ORDER BY first_use_month;

     

    1. 특정 유저가 맨 처음 이용한 달 정보를 얻기 위해 처음 스케줄을 완료한 날짜 정보를 추출합니다.

    2. 특정 유저가 맨 처음 이용한 달 정보는 그대로 두고 그 이후에 이용한 스케줄들의 정보를 전부 가져오면서 month_number를 생성합니다.

    3. 처음 이용한 달과 month_number를 그룹핑해서 유니크 사용자 수를 셉니다.

    4. 마지막으로 특정 월에 이용한 유저 기준으로 +n개월에 이용했는지를 아래처럼 만들어줍니다.

     

    꿀팁

    M11까지만 구했지만, 만약에 더 긴 기간을 보고 싶으면 max(case when ~ 이 부분에서 month_number 값과 M11 이 부분만 고치면 되는데요. GPT에 원하는 만큼 만들어달라고 요청하면 금방 만들어줍니다. 사람이 하나하나 적을 때보다 훨씬 빨라요 ㅋㅋㅋ

    옛날에는 저 구문 매번 적는게 싫어서 파이썬으로 했었는데, 지금은 GPT가 금방 해주니까 MYSQL로 만들어도 편한 것 같습니다.

    반응형

    댓글