
1. 从涨了8块钱说起假设检验到底在解决什么真实问题运营同学上午跑过来说新版落地页上线三天平均客单价从 128 元涨到了 136 元问能不能全量推。这个时候如果你直接回答涨了就是好推那你其实还没进入数据分析的门。因为 136 和 128 这两个数字之间隔着的东西比你想象的多得多——样本的随机波动、流量的结构性差异、时间维度的干扰甚至是统计口径的变化。假设检验hypothesis testing就是用来回答这一类问题的核心工具我们观察到的差异究竟是真实存在的效应还是抽样随机性带来的巧合这个问题之所以重要是因为业务世界里的绝大多数决策都是两个数字比大小式的。A 方案和 B 方案哪个转化率高、新药和安慰剂哪个有效、这条产线的次品率是不是真的比那条线高、这个班级用新教学法之后平均分是不是真的提升了——所有这些问题表面上是比较底层都是同一个统计问题。假设检验给了我们一套标准动作把我觉得有差异变成在多大把握下可以认为有差异。我见过太多人跳过这一步。有人拿两组各 30 个样本的埋点数据算出转化率一个是 3.1% 一个是 3.4%直接下结论说 B 版本更好也有人看到 p 值小于 0.05 就欢呼完全不管效应量小到没有商业价值。这两种错误方向相反根源却一样没有理解假设检验的完整原理链条只记住了几个操作步骤和几个阈值。这篇内容适合三类人一是刚入门数据分析、在课程表里看到Python 数据分析与应用假设检验这些词但没搞明白的人二是已经在做业务分析、天天跑 A/B 测试但结论经常被挑战的人三是需要用 R 或者 Python 写分析报告、希望把自己的推断过程讲清楚的人。我会从原理一路讲到代码落地中间穿插我自己踩过的坑和判断经验尽量做到你看完就能直接抄作业。需要先说明一个容易混淆的点假设检验不是证明某件事是对的的工具它的逻辑是反证法。我们没办法直接证明A 和 B 有差异但我们可以假设它们没有差异然后看在这个假设下观察到当前数据的可能性有多低。低到一定程度我们就反过来推翻这个假设。理解这一点后面所有的步骤都会顺理成章。2. 反证法、小概率事件与 p 值假设检验的三块地基2.1 假设检验本质上是数学版的反证法中学几何里证两条直线平行常用做法是先假设它们不平行然后推出与已知条件矛盾从而证明原命题成立。假设检验用的是同一套骨架只是把矛盾换成了概率极低。具体来说我们先把想要否定的那个陈述立为原假设H₀通常是没有差异没有效果没有关系。比如新版和旧版的平均客单价相等就是 H₀。然后我们构造一个备择假设H₁代表我们真正想找的证据比如新版和旧版平均客单价不相等。接着我们在 H₀ 成立的前提下计算观测到当前这组数据的概率。如果这个概率小到不像是偶然我们就拒绝 H₀转而接受 H₁。这里有个新手最容易卡住的点为什么原假设要设成没有差异因为没有差异是一个精确、可计算的假设。如果我假设两组均值相差 0.3 元那我得先知道 0.3 是不是合理的这本身就是个问题。而假设相差 0两组数据就来自同一个分布所有统计量的分布都是已知的计算才有落脚点。这不是数学上的无奈妥协而是逻辑上的必然选择。2.2 小概率事件原理与那个著名的 0.05小概率事件原理说在一次试验中概率很小的事件几乎不会发生如果它发生了我们就倾向于怀疑前提不成立。你抛一枚硬币 10 次全是正面概率大约是 0.098%这个概率太小了小到你更愿意相信这枚硬币被动过手脚而不是我今天运气好。那概率很小到底多小算小这就是显著性水平 α的作用。约定俗成取 0.05意思是允许自己犯 5% 的错。这个数字不是天条它来自统计学的历史惯例在工业质控里常用 0.01 甚至 0.001在一些探索性研究里有人放宽到 0.1。你完全可以根据业务风险自己定如果错误拒绝 H₀ 的代价很高比如要下架一个投入巨大的功能α 就该收紧如果只是筛一批候选特征α 放宽一点问题不大。α 对应的是第一类错误H₀ 本来是成立的你却拒绝了它也就是冤枉了好人。与之相对的是 β第二类错误H₀ 本来不成立你却没拒绝也就是放跑了坏人。α 和 β 是一对跷跷板样本量固定时你压低 αβ 就会上升。真正能让两个都变小的方法只有一个增加样本量。这也是后面讲功效分析时要展开的核心。概念符号含义日常类比原假设H₀默认成立、想被推翻的命题被告无罪推定备择假设H₁希望找到证据支持的命题检方指控成立显著性水平α允许犯第一类错误的概率误判有罪的门槛第一类错误α拒绝真 H₀冤枉好人第二类错误β未拒绝假 H₀放跑坏人检验功效1−β正确拒绝假 H₀ 的概率抓出坏人的能力2.3 p 值到底在说什么以及它到底不是什么p 值的准确定义是在 H₀ 成立的前提下出现当前观测结果或更极端结果的概率。注意两个关键词一是H₀ 成立的前提下二是当前或更极端。它不是H₀ 为真的概率也不是结论错误的概率更不是效应很大的概率。我用一句话帮自己记p 值衡量的是数据有多意外不是假设有多可信。这两者在数学上是完全不同的东西需要贝叶斯方法才能从前者推到后者。关于 p 值有三个高频误读我在评审别人的分析报告时几乎每次都能碰到误读一p 0.03说明 H₀ 为真的概率是 3%。错。p 值是条件概率 P(数据 | H₀)而H₀ 为真的概率是 P(H₀ | 数据)两者通过贝叶斯公式连接还差一个先验概率。误读二p 0.06说明两组没有差异。错。不拒绝 H₀ 只代表证据不足不代表证明了无差异。样本量不够、噪声太大都会导致检验不显著但这和数据本身有没有差异是两回事。这就是统计里那句老话缺乏证据不等于证据缺乏。误读三p 越小效应越大。错。p 值同时受效应量和样本量影响。样本量足够大时0.01 元的差异也能跑出极小的 p 值。理解了这三条你对假设检验的理解就已经超过大部分只会调库的人了。2.4 拒绝域、临界值与单尾双尾的选择拒绝域是统计量取值空间中让我们拒绝 H₀的那部分区域它的边界叫临界值。以双侧 z 检验、α 0.05 为例临界值是 ±1.96统计量落在 (−∞, −1.96] 或 [1.96, ∞) 就拒绝原假设。单侧检验则把整个 0.05 的尾巴放在一边临界值变成 1.645 或 −1.645。单双尾怎么选判断标准只有一个备择假设里有没有方向性。如果你关心的是新版比旧版好单向用单尾如果关心的是新版和旧版不一样双向用双尾。这里有个实操中的高频问题很多人先跑双侧发现 p 0.08转头改跑单侧拿到 p 0.04然后写进报告说显著. 这是典型的统计操作舞弊学术上叫 HARKing。我的建议很直接在收集数据之前就写死检验方向写在分析方案里事后不许改。业务场景下如果实在拿不准方向一律用双侧宁可结论保守一点。3. 从零走完一次完整检验五个步骤的逐层推演3.1 第一步把业务问题翻译成统计假设这一步听起来简单实际上是最容易翻车的地方。业务语言和统计语言之间存在一道鸿沟跨不过去后面全是白做。举个例子业务方问新推荐算法是不是比老的更受欢迎。你得先定义受欢迎是什么指标点击率、人均停留时长、次日回访率指标不同对应的检验方法完全不同。假设定成点击率那更受欢迎翻译成统计假设就是H₀新算法组的点击率 老算法组的点击率H₁新算法组的点击率 ≠ 老算法组的点击率或者 取决于是否有方向预期同时还要确认样本的独立性同一个用户是不是可能同时出现在两组里如果会那就不是独立样本得改用配对检验。这一步的细节没定清楚后面算得再精确也没意义。我个人的习惯是每次做检验之前先在文档里写三行指标定义、比较对象、方向预期。写不出来就说明需求没想清楚先回去对齐。3.2 第二步选择统计量并确认它的抽样分布统计量就是把数据压缩成一个数的规则比如样本均值、样本比例、方差、秩和。选定统计量之后关键是要知道在原假设成立时这个统计量的分布长什么样——这个分布决定了我们怎么算 p 值。举几个常见组合比较单个样本均值与已知值且总体方差未知 → 统计量 t 服从自由度 n−1 的 t 分布比较两个独立样本均值 → 统计量 t 服从 Welch 或合并方差的 t 分布比较两个比例 → 大样本下 z 近似正态小样本可用 Fisher 精确检验比较多个组均值 → F 统计量服从 F 分布检验两个分类变量的独立性 → 卡方统计量服从 χ² 分布这里有一个隐含前提抽样分布是理论分布它成立需要一些条件比如观测独立、数据近似正态、方差齐性等。这些条件不满足时用 t 检验算出来的 p 值就是错的而且是悄无声息地错。第 4 节会专门讲怎么检查这些前提。3.3 第三步确定显著性水平与拒绝域α 定下来之后拒绝域就确定了。以双侧 t 检验为例自由度 df 2340 时t 临界值约等于 1.96自由度大时 t 分布逼近标准正态。我们只需要关心算出来的 t 值是否超过这个边界。实践中还有一个替代做法直接用 p 值和 α 比较。两者在数学上等价但 p 值给出了更多信息多大程度上显著所以现代软件输出几乎都只给 p 值。不过我不建议完全丢掉临界值这个视角因为它在解释差多少才算够时更直观。3.4 第四步代入数据算出统计量和 p 值到这一步就是纯计算了。我拿一个真实的电商改版案例把整个过程走一遍。场景A 组旧版样本量 n₁ 1150平均客单价 x̄₁ 128 元样本标准差 s₁ 44 元B 组新版n₂ 1200x̄₂ 136 元s₂ 45 元。问新版是否显著提升客单价。用 Welch t 检验不假设方差齐性这是默认更稳妥的选择均值差136 − 128 8标准误SE √(45²/1200 44²/1150) √(1.6875 1.6835) √3.371 ≈ 1.836t 统计量8 / 1.836 ≈ 4.357自由度Welch 公式近似约 2340双侧 p 值远小于 0.001结论拒绝 H₀新版客单价显著高于旧版。再看一个对比案例。假设这是一个只有 n₁ n₂ 30 的小流量灰度测试均值差和标准差都不变SE √(45²/30 44²/30) √(67.5 64.5) √132 ≈ 11.49t 8 / 11.49 ≈ 0.696df ≈ 58双侧 p 值约 0.489同样是 8 块钱的差距样本量从上千降到 30结论就从显著翻转成不显著。这就是抽样波动的威力也是为什么我一直强调在实验设计阶段就要算样本量而不是等数据收了再纠结。3.5 第五步下结论并把它翻译回业务语言统计结论只说到拒绝 H₀或不拒绝 H₀业务方听不懂。你得把这一步翻译回去拒绝了 H₀数据支持新版和旧版存在差异。但差异是否值得上线取决于效应量、成本、风险这是下一步的事。没有拒绝 H₀当前数据不足以证明存在差异。可能确实没差异也可能样本量不够、噪声太大。要如实说明不要含糊成两者差不多。我见过最糟糕的报告是把没有拒绝 H₀写成验证了两者无差异白纸黑字写进 PPT然后基于这个错误的确定性做资源分配。这种错误对业务的伤害比不做检验还大。4. 方法选型什么时候用 t 检验什么时候该换别的4.1 一张表把常见场景和方法对应起来选错检验方法是最常见也最隐蔽的错误。下表是我自己做项目时贴在工位上的速查表直接对照场景找方法研究场景指标类型推荐方法主要前提单组均值 vs 已知值连续单样本 t 检验近似正态或 n 足够大两组独立样本均值连续独立样本 t / Welch t独立抽样近似正态同一批对象前后对比连续配对 t 检验差值为近似正态三组及以上均值连续单因素方差分析正态、方差齐、独立两组比例比较分类两比例 z 检验 / 卡方每格期望频数 ≥ 5分类变量相关性分类卡方独立性检验期望频数 ≥ 5不满足正态的小样本连续Mann-Whitney U / Wilcoxon分布形状相近多组非正态比较连续Kruskal-Wallis独立抽样连续变量相关强度连续Pearson / SpearmanPearson 要求线性正态方差齐性检验连续Levene / BartlettBartlett 要求正态选型的基本顺序是先看指标类型连续还是分类再看组数一、二、多再看前提是否满足正态、方差齐、样本量最后看设计独立还是配对。4.2 正态性检验到底要不要做怎么做很多人被正态性这三个字吓住觉得不满足就没法做 t 检验。这里有两个事实需要澄清。第一t 检验关心的是均值的抽样分布是否近似正态而不是原始数据是否正态。根据中心极限定理样本量足够大实践中常参考每组 30 以上数据偏态严重时建议 50 以上时均值的抽样分布会接近正态即使原始数据是右偏的收入、时长这类指标。第二正态性检验本身在小样本时没功效在大样本时过于敏感。Shapiro-Wilk 检验在 n 10 时几乎检不出问题在 n 10000 时会因为一点点偏度就报 p 0.001。所以我个人的做法是看图形比看 p 值重要。画个 QQ 图或者密度图肉眼判断偏离程度再结合样本量决定要不要换非参数方法。如果确实要用检验Python 里scipy.stats.shapiro适合 n 5000 的情况更大的样本可以用scipy.stats.kstest或anderson。R 里shapiro.test的样本量上限是 5000。4.3 t 检验的三种变体别一上来就默认用独立样本独立样本 t 检验用于两组互不相干的对象比如随机分流的 A/B 测试。默认建议用 Welch 版本不假设方差齐性因为它在方差齐性成立时表现几乎和合并方差版本一样好在不成立时明显更稳。Python 的scipy.stats.ttest_ind里把equal_varFalse设上就行R 的t.test默认就是 Welch。配对 t 检验用于同一个对象前后测量比如同一批用户改版前一周和改版后一周的行为对比。它的做法是先算每个人前后差值再对这个差值序列做单样本 t 检验。配对检验通常比独立检验更敏感因为把个体差异从这个变量里消掉了。单样本 t 检验用于把一组数据和某个基准比较比如我们门店的平均客单价和行业均值 130 元比有没有差异。我曾经犯过一个错误一个留存分析里实验组和对照组是随机分流的但用户量少我就把同一用户的前后数据拿来配对分析想提升功效。结果是把组间差异和组内变化混到了一起结论完全不可解释。配对和独立的选择由实验设计决定不能为了凑显著性随便换。4.4 方差分析为什么不能两两做 t 检验假设有四个版本的设计方案要比较转化率。有人会做 6 次两两 t 检验4 组两两组合共 6 对。问题在于每次检验都有 5% 的假阳性概率做 6 次之后至少犯一次第一类错误的概率是 1 − 0.95⁶ ≈ 26%是单次检验的五倍多。这叫族错误率膨胀。方差分析ANOVA用一个 F 检验一次性回答这几个组均值是否全相等把整体错误率控制在 α。如果 F 检验显著才继续做事后两两比较而且事后比较必须做多重比较校正。事后检验的常用方法有 Tukey HSD要求组间样本量接近、方差齐、Games-Howell不要求方差齐、Bonferroni保守但通用。Python 里可以用statsmodels.stats.multicomp.pairwise_tukeyhsdR 里TukeyHSD或者multcomp包的glht。4.5 非参数检验什么时候放弃 t 检验非参数检验不依赖分布假设用秩次代替原始数值代价是功效略低大约相当于丢弃了 5%~15% 的样本信息。以下几种情况我会考虑换样本量小每组低于 20且明显非正态数据是有序分类比如满意度五级量表数据存在极端离群值且无法合理剔除分布严重偏斜且样本量不足以靠中心极限定理兜底两独立样本用 Mann-Whitney U也叫 Wilcoxon 秩和配对用 Wilcoxon 符号秩多组用 Kruskal-Wallis。需要注意的是非参数检验比较的是分布位置中位数意义上的不是均值。如果你的分析结论要讲平均提升多少元用非参数方法就会对不上口径报告里要写清楚。5. Python 和 R 双线落地把公式变成能跑的代码5.1 Python 路线scipy 打底statsmodels 补全Python 做假设检验的主力是scipy.stats覆盖了绝大多数常用方法。下面是一段从原始数据到结论的完整脚本我按实际项目习惯写了注释。import numpy as np from scipy import stats # 模拟两组客单价数据实际项目里换成你的 DataFrame 列 rng np.random.default_rng(42) group_a rng.normal(loc128, scale44, size1150) # 旧版 group_b rng.normal(loc136, scale45, size1200) # 新版 # 1. 正态性快速检查大样本只作参考重点看图 print(A组 Shapiro p , stats.shapiro(group_a[:4500]).pvalue) print(B组 Shapiro p , stats.shapiro(group_b[:4500]).pvalue) # 2. 方差齐性检验决定用哪种 t lev stats.levene(group_a, group_b) print(Levene p , lev.pvalue) # p 大 - 方差齐用 equal_varTrue 更高效 # 3. Welch t 检验更稳的默认选择 t_stat, p_val stats.ttest_ind(group_b, group_a, equal_varFalse) print(ft {t_stat:.3f}, p {p_val:.6f}) # 4. 效应量Cohens d n1, n2 len(group_a), len(group_b) s1, s2 group_a.std(ddof1), group_b.std(ddof1) pooled np.sqrt(((n1-1)*s1**2 (n2-1)*s2**2) / (n1n2-2)) d (group_b.mean() - group_a.mean()) / pooled print(fCohens d {d:.3f}) # 5. 均值差的置信区间手动算比只看 p 值更有信息量 diff group_b.mean() - group_a.mean() se np.sqrt(s1**2/n1 s2**2/n2) df (s1**2/n1 s2**2/n2)**2 / ((s1**2/n1)**2/(n1-1) (s2**2/n2)**2/(n2-1)) crit stats.t.ppf(0.975, df) print(f95% CI [{diff - crit*se:.2f}, {diff crit*se:.2f}])跑完你会看到 p 值极小、Cohens d 只有 0.18 左右、置信区间大概是 [4.4, 11.6]。这三个数合起来才是完整的结论差异真实存在但幅度不大提升范围大致在 4 到 12 元之间。除此之外几个常用的补充工具值得记住statsmodels.stats.proportion.proportions_ztest两比例 z 检验statsmodels.stats.contingency_tables.Table卡方检验 期望频数 效应量scipy.stats.f_oneway单因素方差分析statsmodels.stats.multicomp.pairwise_tukeyhsdTukey 事后比较statsmodels.stats.power.TTestIndPower样本量与功效计算5.2 R 路线一行 t.test 但别只看输出R 在统计检验上特别顺手核心函数都是内置的。# 模拟数据 set.seed(42) group_a - rnorm(1150, mean 128, sd 44) group_b - rnorm(1200, mean 136, sd 45) # 正态性与方差齐性 shapiro.test(sample(group_a, 500)) var.test(group_a, group_b) # F 检验方差齐性 car::leveneTest(c(group_a, group_b), factor(c(rep(A, 1150), rep(B, 1200)))) # Welch t 检验R 默认就是 Welch res - t.test(group_b, group_a) print(res) # 效应量用 effsize 包 effsize::cohen.d(group_b, group_a) # 卡方检验示例 tab - matrix(c(120, 980, 160, 940), nrow 2, byrow TRUE) chisq.test(tab) prop.test(c(160, 120), c(1100, 1100)) # 两比例检验R 的t.test输出里包含置信区间这点比 scipy 直接但效应量和前提检验还是得自己补。我一般在项目里写一个包装函数把前提检验、主检验、效应量、置信区间一次性输出成一张表避免每次手工跑一堆命令。5.3 把检验结果整理成可交付的输出分析报告里只放一个 p 值是最容易被质疑的写法。我习惯输出的表格包含这几列组别、样本量、均值或比例、标准差、组间差异、95% 置信区间、检验方法、统计量、p 值、效应量。这样无论对方是业务方还是更资深的数据同事都能一眼看到结论的强度和局限。指标对照组 n1150实验组 n1200差异95% CI方法p 值Cohens d客单价元128.0 ± 44.0136.0 ± 45.08.0[4.4, 11.6]Welch t 0.0010.18下单转化率10.9%14.5%3.6pp[1.2pp, 6.1pp]两比例 z 0.001—这张表的信息量比p 0.05显著提升要大得多因为它同时告诉你有差异和差异有多少。6. 踩坑实录p 值误读、多重比较与样本量陷阱6.1 坑一把 p 值当成了结论正确的概率这是我见过频率最高的错误。有同学在汇报时说p 0.02说明我们有 98% 的把握新版更好。这句话在统计上是错的但更麻烦的是它让整个决策看起来比实际更牢靠。正确处理方式是p 值只回答在无差异假设下数据有多意外。要说把握有多大要么走贝叶斯路线算后验概率要么转换成置信区间——我们有 95% 的把握真实提升在 4.4 到 11.6 元之间这个表述既严谨又有决策价值。6.2 坑二多重比较把假阳性堆起来了真实案例一个团队做了 20 个指标的 A/B 检验点击率、停留时长、加购率、退款率……发现有 2 个指标 p 0.05于是宣布实验组在两个关键指标上显著提升。问题在于就算实验组和对照组完全一样20 个指标里出现至少一个假阳性的概率也有 1 − 0.95²⁰ ≈ 64%。他们看到的显著很可能纯粹是运气。多重比较校正的做法有几种按保守程度排Bonferroni把 α 除以检验次数。20 个指标阈值变成 0.0025。简单粗暴但检验次数多时会过度保守。Holm-BonferroniBonferroni 的改进版按 p 值排序后逐步放宽阈值功效更高。Benjamini-HochbergFDR控制错误发现率而不是族错误率适合探索性分析、基因差异表达这类允许少量假阳性但不能大规模误报的场景。在 R 里直接p.adjust(p_values, method BH)Python 用statsmodels.stats.multitest.multipletests。我在所有涉及多指标对比的项目里都会默认加上 FDR 校正并且在报告里注明已做多重比较校正这能省掉很多后续的扯皮。6.3 坑三样本量太小和太大两个方向都会坏事样本量太小是最直观的问题功效不足真实存在的效应检不出来。我见过一个项目两组各 40 个用户想检出 1% 的转化率差异这个设计在数学上根本不可能成功——需要的样本量是每组上万。样本量太大则是更隐蔽的坑。样本量大到几十万时任何微小的系统偏差都能跑出 p 0.001。比如你的埋点在新版上多记录了一次曝光转化率就会天然高出 0.05%在百万级样本下这个差异显著但业务上毫无意义。怎么判断样本量是否合适我的做法是三点一是事前做功效分析确定能检出目标效应的最小样本量二是事后看效应量和置信区间别只看 p三是问自己一个问题——如果这个差异是真的我愿意为它改产品吗 如果答案是不值得那 p 值再小也不该推动决策。6.4 坑四忽略前提假设p 值算得再准也是假的t 检验需要独立性和近似正态卡方检验需要每格期望频数不小于 5方差分析需要方差齐性和正态性。这些前提不满足时p 值的计算基础就崩了。卡方的期望频数问题尤其常见。做用户分群和流失的列联表时如果某个分群样本只有十几个人那一格的期望频数可能小于 1卡方统计量的分布会严重偏离 χ² 分布。遇到这种情况应该改用Fisher 精确检验scipy.stats.fisher_exact或 R 的fisher.test或者把小类别合并。6.5 坑五单尾双尾、剔除离群值、停止规则上的灵活性统计作弊的三种常见形态看数据后再定单双尾。前面说过事先定好不许改。试了多种剔除离群值的方式选一个出显著结果的。正确做法是事前写清处理规则或者至少同时报告剔除前后的结果。不等预设样本量就跑看到显著就停止。这叫可选停止optional stopping会显著抬高第一类错误率。标准做法是等样本量跑满或者使用序贯检验sequential testing这类专门为此设计的方法。这些操作之所以被称为作弊不是因为技术上做不到而是因为它们让 p 值失去了原本的含义。p 值的有效性建立在分析方案事先确定的基础上事后调整等于把概率计算的基石抽掉了。6.6 坑六统计显著和业务显著傻傻分不清这个坑值得单独拿出来讲因为它最容易造成实际损失。举个我参与过的例子某功能改动让用户人均使用时长提升了 0.4 秒样本量 50 万p 0.001绝对算统计显著。但为了这个改动工程团队要多维护一套逻辑每季度多花三个人天。这 0.4 秒的收益大概率抵不过这个成本。反过来也有某个针对小众人群的优化样本量只有 800p 0.12不显著。但从用户访谈看这批人的满意度提升非常明显。这时候硬按 p 值砍掉功能是另一种形式的错误。我的建议是在分析报告里同时给出三个维度统计显著性p 值、效应大小Cohens d 或相对提升幅度、业务成本与收益的估算。三者都过才推全量只有一个过就再想想。数据永远只是决策的输入不是决策本身。7. 从显著到有用效应量、置信区间与一个可复用的决策框架7.1 Cohens d 怎么读直观标尺是什么效应量是把差异有多大标准化的指标。对两组均值比较最常用的是 Cohens d 均值差 / 合并标准差。经验标尺是0.2 小、0.5 中、0.8 大。但这个标尺来自心理学领域用的时候要结合场景——在教育、社会科学的干预研究里d 0.2 可能就算不错在推荐系统这类工程场景里转化率相对提升 1% 通常就值得重视。除了 Cohens d还有几个常见选择相对提升实验组均值 / 对照组均值 − 1业务方最容易理解Glasss Δ分母只用对照组标准差适合对照组作为基准的场景Cliffs delta非参数版本的效应量配合 Mann-Whitney 使用Cramérs V卡方检验的效应量η² / ω²方差分析的效应量选哪个不重要重要的是一定要报。只报 p 值的报告等于告诉读者有差异但我不告诉你多大。7.2 置信区间比 p 值信息量大在哪里p 值是一个点置信区间是一个范围。同样一个结论提升了 8 元p 值只告诉你这个差异在统计上站得住置信区间还能告诉你精度。假设两个实验的置信区间分别是 [4.4, 11.6] 和 [0.2, 15.8]两者的点估计都是 8 元p 值可能都在 0.05 以下但决策含义完全不同。前者说明提升至少有 4 元比较确定后者说明最坏情况是几乎没提升风险大得多。如果只能报告一个数字我会选置信区间而不是 p 值。计算置信区间的通用模式是点估计 ± 临界值 × 标准误。均值差用 Welch 自由度比例差用正态近似或者 Wilson 区间比率类指标比如 CTR/转化率的比值可以用 Delta 方法或者 Bootstrap。Bootstrap 特别实用遇到没有解析解的复杂指标时重抽样一万次就能得到经验分布和置信区间几行代码搞定。7.3 功效分析和样本量估算的完整操作功效分析回答的问题是要检出大小为 d 的效应在 α 和 1−β 给定的情况下需要多少样本以两独立样本 t 检验为例每组样本量的粗略公式是 n ≈ 16 / d²α 0.05功效 0.8。代入几个常见 d 值目标效应量 d每组所需样本量近似适用场景0.8大26干预效果明显如课程提分0.5中64一般产品改动0.2小394细微体验优化0.1极小1574排序、推荐微调0.05微弱6291超精细优化需海量流量精确计算用工具from statsmodels.stats.power import TTestIndPower analysis TTestIndPower() n analysis.solve_power(effect_size0.2, alpha0.05, power0.8, ratio1) print(f每组需要 {n:.0f} 人)library(pwr) pwr.t.test(d 0.2, sig.level 0.05, power 0.8, type two.sample) pwr.2p.test(h ES.h(0.10, 0.12), sig.level 0.05, power 0.8)比例类指标要先算效应量 hCohens hR 里pwr::ES.h可以直接算。这一步在实验设计阶段做能避免大量跑完发现没功效的无效实验。我参与过的项目里凡是提前做了功效分析的实验周期和结论争议都明显更少。7.4 一套我自己常用的决策清单跑完检验之后我会按顺序问自己这几个问题全部通过才给出建议推进的结论前提检查过了吗正态性、方差齐性、独立性、期望频数有没有明显违背样本量是按功效分析定的吗事后样本量是否达到预设有没有中途偷看p 值是多少是否经过多重比较校正单双尾是否事前确定效应量有多大相对提升是多少在业务上算大还是小置信区间是什么范围最坏情况能否接受成本收益算得过来吗工程投入、维护成本、潜在风险对比收益。结论能复现吗换个时间窗、换个分群、换个统计口径结论还稳不稳这七条里任何一条答不上来我都会在报告里标注结论暂定需要补充验证。这不是怯懦是对数据负责。最后分享一个我个人的小习惯每次做完假设检验我都会在笔记本上记一行这次检验我最不确定的地方是什么。攒了两年之后回头看这些记录几乎是最高效的学习材料——因为统计工具本身不难难的是知道自己什么时候可能用错了。假设检验的公式在教科书里躺了几十年真正分出水平高低的是你对它的边界条件的清醒认识以及愿不愿意在数字漂亮的时候多问一句真的吗。