隊列分析
隊列分析
隊列分析根據單個啟動事件對對象(通常是用戶)進行分組,並比較它們保持活躍和價值的時間和時間。這種方法將系統中的時間效應(季節,股票)與隊列年齡效應(從開始的日子)分開。
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。