A/B测试是产品迭代中最常用的决策工具,但很多团队都遇到过这样的尴尬局面:实验跑了两周,结果是"不显著",于是有人主张延长实验时间再观察,有人认为效果本来就不存在应该直接下线,争论不休却谁也说服不了谁。事实上,大多数"不显著"的结果并非因为方案真的无效,而是在实验设计阶段就没有算清楚到底需要多少样本。本文将从统计功效的原理出发,系统讲解样本量的计算方法和统计检验的选择策略,帮助你从源头上解决实验结果不显著的问题。

为什么你的A/B实验总是不显著:理解统计功效
要理解"不显著"的本质,必须先弄清楚假设检验的两类错误。第一类错误(α错误)是把没有差异误判为有差异,通常我们把它控制在5%,这就是常说的显著性水平。第二类错误(β错误)是把真实存在的差异误判为没有差异,而1-β就是我们所说的统计功效(Power),代表当差异真实存在时,我们能检测出它的概率。
业界普遍建议将统计功效设定在80%,也就是说,即使方案确实有效,仍有20%的概率得出"不显著"的结论。如果你的实验功效只有50%,那结果就相当于抛硬币——即使效果真实存在,你也有整整一半的概率错过它。更糟糕的是,很多团队在检测微小提升时(比如转化率从3.0%提升到3.2%),需要的样本量可能达到几十万,而实际流量远远不够,这样的实验从一开始就注定不显著。
因此,当实验结果p值在0.05到0.1之间徘徊时,正确的思考顺序是:先反推当前实验的实际功效是多少,判断是样本量不足还是效果真的不存在,而不是盲目延长实验周期。延长实验虽然能增加样本,但同时会引入新奇效应衰减、时间周期混杂等新问题,得不偿失。
样本量计算:四个参数决定实验成败
计算所需样本量需要四个关键输入:基线转化率(当前版本的指标值)、最小可检测效应MDE(你希望可靠检测出的最小提升幅度)、显著性水平α(通常取0.05)以及统计功效(通常取0.8)。其中MDE是最容易被忽视的参数,它直接决定了实验的成本与可行性。检测从3%到3.5%的变化(相对提升16.7%)可能只需要每组建1万人,而检测从3%到3.1%的变化(相对提升3.3%)则可能需要每组数十万人。
对于比例类指标(如转化率、点击率),双侧检验的样本量计算公式为:
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
baseline = 0.03 # 基线转化率 3%
mde = 0.003 # 希望检测出 0.3 个百分点的绝对提升
alpha = 0.05 # 显著性水平
power = 0.80 # 统计功效
# 计算效应量(Cohen's h)
effect_size = proportion_effectsize(baseline + mde, baseline)
# 计算每组所需样本量
analysis = NormalIndPower()
sample_size = analysis.solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
ratio=1.0,
alternative='two-sided'
)
print(f"每组所需样本量: {int(sample_size) + 1}")
上面的代码会输出每组大约需要8万人左右。你可以调整mde参数感受一下敏感程度:将mde改为0.001,样本量会暴增到接近70万每组。这就是为什么在实验设计评审时,一定要问清楚"我们到底想检测多大的提升"。如果业务方期望的提升幅度对应的天文数字样本量远超产品流量,那么要么扩大MDE的接受范围,要么放弃这个实验想法,把资源投入到更有影响力的改动上。
对于均值类指标(如人均使用时长、客单价),计算思路类似,但效应量需要用均值差除以合并标准差来估计。此时历史数据的质量至关重要,标准差估计不准会导致样本量计算严重偏差。
统计检验怎么选:Z检验、卡方检验与t检验的适用场景
选定样本量之后,分析阶段的检验方法同样要匹配指标类型。对于比例类指标,两比例Z检验和卡方检验在数学上是等价的,二选一即可。下面是Python实现:
import numpy as np
from scipy import stats
# 对照组:12000 名用户,360 人转化
# 实验组:12000 名用户, 396 人转化
n1, x1 = 12000, 360
n2, x2 = 12000, 396
p1, p2 = x1 / n1, x2 / n2
p_pool = (x1 + x2) / (n1 + n2)
# 合并标准误
se = np.sqrt(p_pool * (1 - p_pool) * (1 / n1 + 1 / n2))
z = (p2 - p1) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
print(f"Z统计量: {z:.3f}, p值: {p_value:.4f}")
对于均值类指标,当样本量较大(每组大于30基本可依赖中心极限定理)时使用两样本t检验;样本量小且方差未知时,应先做方差齐性检验(Levene检验),再决定用标准t检验还是Welch t检验。 Welch t检验不假设两组方差相等,在互联网场景中通常是更稳妥的默认选择,因为实验组和对照组的方差往往因为处理效应本身而不同。
需要特别提醒的是检验方向的选择。如果你在实验前就有明确的 directional 假设(例如新方案只可能提升不可能降低),可以使用单侧检验,它需要的样本量比双侧少约20%。但单侧检验意味着你完全放弃检测反向效果的能力,一旦方案实际上线后出现负向影响,统计上你将无法察觉,因此多数团队仍坚持双侧检验以求稳妥。
结果解读的常见误区与进阶注意事项
即使样本量和检验方法都正确,结果解读阶段仍有几个高频踩坑点。第一是偷看结果(peeking):实验还没跑到预定样本量就反复查看p值并在显著时提前停止,这会大幅膨胀第一类错误。正确做法是使用序贯检验方法(如Alpha Spending或Bayesian方法)来支持提前决策,否则就严格等样本量攒够再分析。
第二是多重比较问题。如果你同时观察5个指标,每个指标都在0.05水平上检验,那么至少一个指标"假装显著"的概率高达23%。解决方案包括Bonferroni校正(将α除以指标数,简单但保守)、Holm逐步校正,或在实验设计阶段就预先声明一个唯一的主指标。
第三是样本比率失衡(SRM)。开实验前检查两组流量分配是否符合预期,如果对照组和实验组实际比例是49:51而你设定的是50:50,说明分流逻辑存在bug,此时任何统计结论都不可信。这个检查只需要一个卡方拟合优度检验,成本极低,建议作为所有实验的标准前置步骤。
最后要强调实验单位的统一:分流单位和分析单位必须一致。如果按用户ID分流,分析时就不能以页面浏览为单位统计,否则组内相关性会严重低估标准误,得出虚假的显著结论。把样本量计算前置、检验方法匹配指标类型、解读时守住统计纪律,这三点做到位,A/B测试才能真正成为可靠的决策工具,而不是数字游戏。