队列分析
队列分析
队列分析根据单个启动事件对对象(通常是用户)进行分组,并比较它们保持活跃和价值的时间和时间。这种方法将系统中的时间效应(季节,股票)与队列年龄效应(从开始的日子)分开。
1)基本定义
队列(cohort):由"出生"事件组成的众多玩家-注册,第一笔押金,第一场比赛,第一笔购买。
日历轴(日历时间):实际日期(2025-10-01,……)。
队列年龄轴(cohort age):从"出生"(D0,D1,……)开始的日子/周。
保留度量:D1/D7/D30 (Exact and Rolling)、WAU/MAU、Stickiness (DAU/MAU)。
货币化:ARPU/ARPPU,累积的LTV(在D7/D30/D90上)。
核算单位:用户(user/master_id)-记录在护照上。
2)队列种类以及何时选择
Acquisition队列:按注册/首次访问的日期-评估吸引和追赶渠道。
Activation/Monetization队列:按首次存款/购买-评估早期货币化和促销。
功能队列:在首次使用fici/游戏类别时,发布效果。
行为队列:根据RFM/启动模式(例如"夜间移动")。
3)轴和网格: 如何观察矩阵
队列矩阵:行是队列(日历),列是年龄(D0…… D90)。
季节性:比较对角线(相同的日历)以分离季节性影响。
正常化:相对度量(CR,分数)+累积度(LTV),显示两者。
4)队列护照和指标(template)
5)Pseudo-SQL: retention矩阵(Exact Dn)
sql
WITH regs AS (
SELECT user_id, DATE_TRUNC('day', MIN(ts)) AS cohort_day
FROM event_register
GROUP BY 1
),
act AS (
SELECT user_id, DATE_TRUNC('day', ts) AS act_day
FROM event_activity
),
ages AS (
SELECT r. user_id, r. cohort_day, a. act_day,
(a. act_day - r. cohort_day) AS age_days
FROM regs r
JOIN act a ON a. user_id = r. user_id
),
exact AS (
SELECT cohort_day,
age_days,
COUNT(DISTINCT user_id) AS users_active
FROM ages
GROUP BY 1,2
),
coh_size AS (
SELECT cohort_day, COUNT(DISTINCT user_id) AS cohort_size
FROM regs GROUP BY 1
)
SELECT e. cohort_day,
e. age_days,
e. users_active::decimal / NULLIF(c. cohort_size,0) AS exact_retention
FROM exact e
JOIN coh_size c USING (cohort_day)
WHERE age_days IN (1,7,30,90)
ORDER BY cohort_day, age_days;
Rolling Dn (1天活动)
sql
WITH days AS (... as above...),
roll AS (
SELECT cohort_day,
CASE WHEN age_days BETWEEN 1 AND 7 THEN 7
WHEN age_days BETWEEN 1 AND 30 THEN 30 END AS bucket,
COUNT(DISTINCT user_id) AS any_active
FROM days
WHERE age_days BETWEEN 1 AND 30
GROUP BY 1,2
)
SELECT r. cohort_day, r. bucket AS Dn,
r. any_active::decimal / s. cohort_size AS rolling_retention
FROM roll r
JOIN (SELECT cohort_day, COUNT(DISTINCT user_id) cohort_size FROM regs GROUP BY 1) s USING (cohort_day)
ORDER BY cohort_day, Dn;
6)队列LTV和货币化
累计LTV (Dn):每个队列用户Dn的收入之和。
ARPU/ARPPU:每个用户/Dn付款人的收入。
支付的百分比:≥1支付给Dn的份额。
sql
WITH reg AS (
SELECT user_id, DATE_TRUNC('day', MIN(ts)) AS cohort_day
FROM event_register GROUP BY 1
),
pay AS (
SELECT user_id, amount, DATE_TRUNC('day', ts) AS pay_day
FROM fact_payments
),
ltv AS (
SELECT r. cohort_day,
(pay_day - r. cohort_day) AS age_days,
SUM(amount) AS rev
FROM reg r JOIN pay p USING (user_id)
WHERE pay_day >= r. cohort_day
GROUP BY 1,2
),
cum AS (
SELECT cohort_day, age_days,
SUM(rev) OVER (PARTITION BY cohort_day ORDER BY age_days ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rev_cum
FROM ltv
)
SELECT c. cohort_day, c. age_days,
c. rev_cum::decimal / NULLIF(sz. cohort_size,0) AS ltv_per_user
FROM cum c
JOIN (SELECT cohort_day, COUNT(DISTINCT user_id) cohort_size FROM reg GROUP BY 1) sz USING (cohort_day)
WHERE age_days IN (7,30,90)
ORDER BY cohort_day, age_days;
7)生存/危险以保持
Kaplan-Meier:非模型生存曲线(S(t))是非"解冻"的比例。
危险模型(每天Soch/logit):特征(频道,国家,平台,奖金,内容)对流出风险的影响。
实践:逐段构建KM,然后用危险模型解释差异。
8)季节性,TZ和日历
TZ:将事件存储在UTC中,在本地TZ市场中进行分析;保持一致。
日历:假期/薪水/比赛/发行-作为旗帜;比较类似星期的队列。
滚动窗口:对于周/月队列-假期和报告周期的倍数。
9)分割和归属
细分市场:吸引渠道,平台/OS,地理,第一内容,价格/限制,支付方法。
队列归因:"谁引用"用户-捕获算法(最后不直接,数据驱动)。
LTV加权:不仅要比较CR,还要比较LTV (D30/D90)的频道/段。
10)可视化
热卡矩阵队列(CR/LTV)。
趋势线D1/D7/D30日历。
生存/危险图形。
Bridge"将LTV更改为D30":付费,频率,平均支票的贡献。
11)实验与因果关系
A/B:onbording,tutorials,paywall,offers。主要指标是D7/D30 retention和LTV(D30)。
准实验:DiD/合成控制在市场上推出。
Uplift模型:瞄准重新激活的收益收益(Qini/AUUC,uplift@k)。
12)运营和Hovernance
转化:"RET_D7_vN","LTV_D 30_vN";更改活动/货币定义时的changelog。
SLO新鲜:每日队列-准备到06:00 lock。数据差≤ 1小时。
质量:事件覆盖,重复比例,机器人/同类人群之外的人群比例。
访问:RLS/CLS,PII伪装;导出-仅限聚合。
Runbooks: D1 (bording)、D7(内容)、事件/身份报废。
13)经常出错(反模式)
轴混合:比较不同季节不同年龄的队列而未修正。
滚动vs Exact:被解释为相同。
单位混合:分母中的会话,分子中的用户。
聚合"平均均值":代替分子/分母的总和。
忽略TZ/日历: D1在天/假期边界上的偏移。
没有机器人/兄弟/QA过滤器。
未记录的重启:没有身份桥的帐户拆分/merge。
14)队列报告发布前的支票清单
- 已定义出生事件,单位,TZ,活动窗口
- 不包括机器人/兄弟/质量保证;身份溷合(金唱片)
- 构建了CR (Exact/Rolling)和LTV矩阵D7/D30/D90
- 包括日历/假期;通道/平台/地质部分
- 添加了生存/危险图形和桥梁LTV
- 记录指标版本和归因算法
- 定制SLO新鲜度,监视覆盖/重复/错误
- runbooks准备在D1/D7的瀑布和事件的悬崖上
底线
队列分析是两个轴和学科:固定的"出生时刻",正确的窗口和TZ,保留矩阵和LTV,细分和因果关系更改检查。这种方法不仅有助于观察曲线,还有助于做出决定:在哪里进行盘旋,扩展哪些渠道,哪些内容和离群值使玩家保持更长的时间并增加LTV。