project · cookie cats

Cookie Cats A/B 测试分析

评估手游付费门位置变动对用户留存的影响。频率派双比例 z-test 确认显著性,贝叶斯 Beta-Binomial 提供概率形式的结论,两套框架交叉验证。

项目定位

分析重点
实验设计验证、双框架假设检验、效应量解读与业务建议。
技术栈
Python(pandas、scipy、matplotlib、seaborn)、Beta-Binomial、Monte Carlo。
数据来源
Cookie Cats 手游公开数据集(Kaggle),90,189 用户。

key results

核心结果一览

从样本规模、留存率数字,到 p 值、贝叶斯概率、SRM 验证,快速定位关键数字。

实验用户总量
90,189
gate_30: 44,700 / gate_40: 45,489
1 日留存(gate_30)
44.82%
对照组次日留存率
7 日留存(gate_30)
19.02%
对照组第 7 日留存率
7 日留存 p 值
0.0016
双比例 z-test,显著
贝叶斯概率
99.92%
P(gate_30 > gate_40),7 日留存
SRM 检验
p = 0.0086
大样本放大随机误差,判断为正常

methodology

三步分析路径

先验证实验设计的合理性,再用频率派检验给出显著性结论,最后用贝叶斯框架交叉验证,给出直觉友好的概率形式结论。

step 01
SRM 检验
实验设计合理性验证

期望分组比例 1:1,实际偏差 0.89%。卡方检验 p=0.0086 虽统计显著,但属于大样本(9 万)放大微小随机误差,并非分流故障信号。同等偏差在 1000 人样本下不会触发显著性,实验结论有效。

step 02
频率派检验
双比例 z-test

对 1 日留存和 7 日留存分别做双比例 z-test,输出 p 值与 95% 置信区间。7 日留存 p=0.0016,CI 下限 0.31%,在行业留存基准(约 15-18%)下具有业务意义。1 日留存 p=0.0744,CI 跨零,方向不明。

step 03
贝叶斯验证
Beta-Binomial + Monte Carlo

Beta(1,1) 均匀无信息先验,对两组各采样 100,000 次逐次比较。7 日留存 P(gate_30 > gate_40)=0.9992,1 日留存 P=0.9627。两套框架方向完全一致,结论置信度高。

findings

分析结论

1

1 日留存:频率派 p=0.0744,95% CI [-0.0006, 0.0124] 跨零,未达统计显著;贝叶斯 P(gate_30 > gate_40)=0.9627,方向倾向 gate_30 但不确定性较高。两套框架均无法对 1 日留存给出明确结论。

2

7 日留存:频率派 p=0.0016,95% CI [0.0031, 0.0133],gate_30 显著优于 gate_40;贝叶斯 P(gate_30 > gate_40)=0.9992。两套框架方向完全一致,7 日留存差异稳健可信。

3

效应量解读:CI 下限 0.31%,在行业 7 日留存基准约 15-18% 的背景下,1% 量级的提升具有实际业务意义。p 值确认显著性,CI 给出效应量范围,两者回答不同维度的问题。

4

业务建议:不上线 gate_40。7 日留存在两套框架下均指向 gate_30 更优,1 日留存无正向信号,gate_40 无任何优势证据。在变现数据缺失的情况下,这是保守但有据可查的判断。

数据局限与补充建议

本次分析不含变现数据。若产品团队认为"玩更多关卡 → 更多付费",建议补充以下指标后再决策:各分组 ARPU(每用户平均收入)、两组 sum_gamerounds 分布差异、付费转化率对比。在变现数据缺失的情况下,仅凭留存结论建议不上线。

visualization

核心可视化

retention_compare

1 日 / 7 日留存率对比

gate_30 在 1 日和 7 日留存上均高于 gate_40。7 日留存差距(0.1902 vs 0.1820)在频率派和贝叶斯框架下均显著,是最终建议的主要依据。

留存率对比
bayesian · retention_1

1 日留存后验分布

两组后验分布重叠较多,P(gate_30 > gate_40)=0.9627,与频率派 p=0.0744 方向一致但置信度不足,1 日留存结论不确定。

1日留存贝叶斯后验
bayesian · retention_7

7 日留存后验分布

两组后验分布几乎完全分离,P(gate_30 > gate_40)=0.9992,与频率派 p=0.0016 完全印证,7 日留存结论高度可信。

7日留存贝叶斯后验

code highlight

关键代码片段

展示贝叶斯分析的核心实现。完整四步分析代码(EDA、SRM、频率派、贝叶斯)保留在 GitHub 仓库中。

bayesian_analysis.py · Beta-Binomial 贝叶斯验证

用 Beta 共轭先验对两组留存率建模,100,000 次 Monte Carlo 采样计算 gate_30 胜出概率。贝叶斯框架不依赖 p 值阈值,直接给出概率形式的结论。

04_bayesian.py
import numpy as np
from scipy import stats

# 从数据中提取成功次数与失败次数
# gate_30 7日留存
s30 = retention_7_gate30.sum()   # 成功(留存)
f30 = len(retention_7_gate30) - s30  # 失败(流失)

# gate_40 7日留存
s40 = retention_7_gate40.sum()
f40 = len(retention_7_gate40) - s40

# Beta 共轭先验:Beta(1, 1) 均匀无信息先验
# Posterior 更新:Beta(1 + 成功, 1 + 失败)
post_gate30 = stats.beta(1 + s30, 1 + f30)
post_gate40 = stats.beta(1 + s40, 1 + f40)

# Monte Carlo 采样:各采样 100,000 次
np.random.seed(42)
n_samples = 100_000
samples_30 = post_gate30.rvs(n_samples)
samples_40 = post_gate40.rvs(n_samples)

# 计算 gate_30 胜出概率
prob_30_wins = (samples_30 > samples_40).mean()

print(f"P(gate_30 > gate_40) | 7日留存 = {prob_30_wins:.4f}")
# 输出:P(gate_30 > gate_40) | 7日留存 = 0.9992

data

数据与实验设计

数据来源Cookie Cats 手游公开数据集(Kaggle)
实验背景付费门从第 30 关(对照组)移至第 40 关(实验组)
样本量90,189 用户(gate_30: 44,700 / gate_40: 45,489)
核心字段userid、version、sum_gamerounds、retention_1、retention_7
异常值处理sum_gamerounds 最大值 49,854(14 天内),可视化时过滤 95 分位以上,统计检验不删除

limitations

局限性

实验不含变现数据(ARPU、付费转化率),无法评估 gate_40 对收入的潜在影响,结论局限于留存维度。
SRM 检验 p=0.0086 存在轻微分组不均衡,虽判断为大样本放大随机误差,但在严格实验环境下仍需复查分流机制。
数据仅覆盖 14 天行为,长期留存与生命周期价值无法评估。

project value

项目价值

本项目覆盖了实验设计合理性验证(SRM)、频率派假设检验(双比例 z-test)、贝叶斯推断(Beta-Binomial + Monte Carlo)的完整 A/B 测试分析流程,重点体现实验分析思维、双框架结论交叉验证能力,以及效应量解读与业务建议的落地意识。