일일 활성 유저(DAU)나 구매 건수만으로는 서비스의 ‘건강도’를 제대로 판단하기 어렵습니다.
숫자는 늘어날 수 있지만, 새로운 유저만 계속 들어오고 기존 유저가 빠르게 이탈하고 있을 수도 있죠.
이럴 때 유용한 방법이 코호트(Cohort) 분석입니다.
사용자를 ‘시간의 흐름’에 따라 그룹화하고, 이후 행동 변화를 살펴보는 방식이에요.
이 분석을 통해 단순히 “얼마나 많은가”가 아니라, “얼마나 남아 있는가”를 볼 수 있습니다.
코호트 분석은 특정 시점에 함께 유입된 사용자 집단(cohort) 을 기준으로
시간이 지날수록 얼마나 활동이 이어지는지를 추적하는 방법입니다.
• 가입월별 코호트 : 각 월 가입자가 이후 몇 달 동안 활동을 유지했는가
• 첫 구매월별 코호트 : 첫 구매 이후 재구매가 얼마나 이어졌는가
• 앱 설치일 기준 코호트 : 설치 후 N일째에도 남아 있는 사용자 비율
아래와 같은 사용자 활동 로그가 있다고 가정해봅시다.
| user_id | signup_date | activity_date |
|---|---|---|
| 1001 | 2025-01-10 | 2025-01-15 |
| 1001 | 2025-01-10 | 2025-02-03 |
| 1002 | 2025-02-02 | 2025-02-04 |
| 1002 | 2025-02-02 | 2025-03-01 |
| 1003 | 2025-03-15 | 2025-03-16 |
• 가입월(cohort_month)을 기준으로 유저를 묶고,
• 이후 월(active_month)마다 얼마나 잔존(retention) 하고 있는지 확인하기
WITH base AS (
SELECT
user_id
, DATE_TRUNC('month', signup_date) AS cohort_month
, DATE_TRUNC('month', activity_date) AS active_month
FROM user_activity
)
, retention AS (
SELECT
cohort_month
, active_month
, COUNT(DISTINCT user_id) AS active_users
FROM base
GROUP BY cohort_month
, active_month
)
SELECT
cohort_month
, active_month
, COUNT(DISTINCT CASE WHEN cohort_month = active_month THEN user_id END)
OVER (PARTITION BY cohort_month) AS cohort_size
, active_users
, ROUND(active_users * 100.0 /
NULLIF(
COUNT(DISTINCT CASE WHEN cohort_month = active_month THEN user_id END)
OVER (PARTITION BY cohort_month), 0
), 1
) AS retention_rate
FROM retention
ORDER BY cohort_month
, active_month;
| cohort_month | active_month | cohort_size | active_users | retention_rate |
|---|---|---|---|---|
| 2025-01 | 2025-01 | 120 | 120 | 100.0 |
| 2025-01 | 2025-02 | 120 | 80 | 66.7 |
| 2025-01 | 2025-03 | 120 | 60 | 50.0 |
| 2025-02 | 2025-02 | 150 | 150 | 100.0 |
| 2025-02 | 2025-03 | 150 | 110 | 73.3 |
• 코호트별 리텐션을 비교하면 유입 품질과 유저 경험 개선 여부를 확인할 수 있습니다.
• 특정 달의 리텐션이 급격히 낮다면, 온보딩 과정, 프로모션 효과, 또는 UI 변경 시점을 함께 검토해볼 수 있습니다.
• 이 방식은 단순 방문뿐 아니라 구매, 재결제, 콘텐츠 이용 지속도 분석에도 동일하게 적용 가능합니다.
✔️ 코호트 분석은 “시간 기준으로 사용자 행동 변화를 추적하는 방법”입니다.
✔️ 각 그룹이 시간이 지나며 어떻게 변하는지를 보여줍니다.