跳到主要内容

同期群分析

问题

什么是同期群分析(Cohort Analysis)?和普通留存分析有什么区别?

答案

什么是同期群分析

同期群分析是将用户按某个共同事件的发生时间分组,然后跟踪每组在后续时间段的行为指标。最常见的是按首次注册/首次购买的时间分组,观察留存或付费行为。

留存矩阵

同期群分析最经典的输出就是留存矩阵

Cohort(注册月)用户数第 1 月第 2 月第 3 月第 4 月第 5 月
2024-0110,00035%22%18%15%14%
2024-0212,00038%25%20%17%-
2024-0311,00040%28%22%--
2024-0415,00042%30%---
2024-0513,00045%----
如何阅读留存矩阵
  • 横向看(同一行):某一批用户随时间的留存衰减 → 看用户生命周期
  • 纵向看(同一列):不同批次在同一生命周期阶段的留存 → 看产品改进效果
  • 如果纵向越来越好(2024-05 的第 1 月 > 2024-01 的第 1 月),说明产品在持续改善

SQL 实现

按月 Cohort 留存矩阵
WITH cohort AS (
-- 确定每个用户的 Cohort(首次活跃月)
SELECT
user_id,
DATE_FORMAT(MIN(event_date), '%Y-%m') AS cohort_month
FROM user_events
GROUP BY user_id
),
activity AS (
-- 每个用户每月是否活跃
SELECT DISTINCT
user_id,
DATE_FORMAT(event_date, '%Y-%m') AS active_month
FROM user_events
)
SELECT
c.cohort_month,
COUNT(DISTINCT c.user_id) AS cohort_size,
-- 第 0~5 个月的留存率
ROUND(COUNT(DISTINCT CASE
WHEN PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM STR_TO_DATE(a.active_month, '%Y-%m')),
EXTRACT(YEAR_MONTH FROM STR_TO_DATE(c.cohort_month, '%Y-%m'))) = 1
THEN a.user_id END) * 100.0 / COUNT(DISTINCT c.user_id), 1) AS month_1,
ROUND(COUNT(DISTINCT CASE
WHEN PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM STR_TO_DATE(a.active_month, '%Y-%m')),
EXTRACT(YEAR_MONTH FROM STR_TO_DATE(c.cohort_month, '%Y-%m'))) = 2
THEN a.user_id END) * 100.0 / COUNT(DISTINCT c.user_id), 1) AS month_2,
ROUND(COUNT(DISTINCT CASE
WHEN PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM STR_TO_DATE(a.active_month, '%Y-%m')),
EXTRACT(YEAR_MONTH FROM STR_TO_DATE(c.cohort_month, '%Y-%m'))) = 3
THEN a.user_id END) * 100.0 / COUNT(DISTINCT c.user_id), 1) AS month_3
FROM cohort c
LEFT JOIN activity a ON c.user_id = a.user_id
GROUP BY c.cohort_month
ORDER BY c.cohort_month;

Cohort 分析的变体

变体Cohort 划分依据分析目的
时间 Cohort首次注册/购买的时间留存趋势、产品改进效果
行为 Cohort首次使用某功能功能价值评估
渠道 Cohort获客渠道各渠道用户质量对比
付费 Cohort首次付费时间付费用户生命周期

同期群分析 vs 普通留存分析

对比普通留存分析同期群分析
数据聚合所有用户混在一起按 Cohort 分组
能否看趋势❌ 新老用户混杂✅ 控制变量对比
受新增影响⚠️ 新增暴涨会稀释留存✅ 不受影响
能否评估改进困难✅ 纵向对比不同 Cohort

常见面试问题

Q1: 为什么要用同期群分析?直接看整体留存率不行吗?

答案

  • 整体留存率会被新增用户稀释。如果某月拉了一大波新用户,短期留存数字会变差(因为新用户还没到第 7 天)
  • 同期群把不同时期进来的用户分开,控制了"入组时间"这个变量
  • 才能真正回答"产品改进有没有让留存变好"

Q2: 留存矩阵中,如果纵向留存在下降(越来越差),说明什么?

答案

  • 后进来的用户质量下降(可能是渠道质量变差)
  • 或产品体验变差(Bug、功能变更)
  • 需要按渠道拆分 Cohort,排除是否是某个渠道的问题

Q3: Cohort 的粒度应该怎么选?

答案

粒度适用场景
日 Cohort高频产品(社交、游戏)、关注次日留存
周 Cohort中频产品、消除周末效应
月 Cohort低频产品(电商)、长期趋势
  • 原则:Cohort 内的用户应尽量相似(同一批拉新、同一个活动)

相关链接