有个朋友前不久跑来问我他要给一个按钮换颜色A/B 测试跑了一周两组转化率看起来差了不少但统计结果就是“不显著”。他问我是不是样本量不够我反问他“你上线之前算过样本量吗”他沉默了几秒说“感觉两三万用户应该够吧。”这个问题我见过太多次了。很多人把“样本量”当成一个事后解释工具——结果不显著就怪样本不够结果显著就闭眼上线。但“Sample Size”样本量其实是实验设计阶段就要先定下来的东西它决定了你的实验要做多久、要花多少流量、结论到底可不可信。这篇文章就来聊透样本量这件事它背后的统计逻辑是什么、怎么根据业务目标算出一个靠谱的样本量、哪些场景下要换算法、以及我踩过的那些坑。适合做 A/B 测试的增长工程师、做用户调研的产品经理、以及训练机器学习模型的算法同学参考。1. 先说清楚样本量到底在解决什么问题1.1 为什么“样本越多越好”是个伪命题很多人潜意识里觉得样本量嘛越多越准多多益善。这话在纯理论研究里没错但在真实业务里完全行不通。原因很简单。第一流量是有限的。你一天就那点日活样本量定得太大实验就得跑一个月这一个月里竞争对手早把新功能上线了。第二样本量大意味着更多用户暴露在实验组里万一新方案是负向的多跑一天就多损失一天的业务指标。第三样本量过大会让实验“过度敏感”——你可能会检测出统计显著、但业务上完全没有意义的微小差异比如按钮点击率提升 0.01%这在统计上是真实的但放到业务里根本不值得投入开发资源。所以样本量的本质是在“可接受的错误风险”和“可承担的实验成本”之间找一个平衡点。它不是越大越好而是“刚刚好”最好。什么叫刚刚好就是如果方案真的有效你有足够概率发现它如果方案无效你有足够把握别被噪声骗了。1.2 四个参数自由度比你想的多要说清楚样本量必须先认识四个关键参数。它们之间的关系就像摆摊做菜——你决定要多大锅、多大火、多咸多淡最后才知道要买多少菜。第一个是显著性水平通常用 α 表示行业默认取 0.05。可以理解成“我允许自己犯错的概率”——也就是说就算方案真的没效果我也有 5% 的概率错误地判断它有效。第二个是统计功效通常用 1-β 表示行业默认取 0.8。意思是如果方案真的有效果我有 80% 的概率能检测出来。剩下那 20% 就是“漏报”的概率。第三个是最小可检测差异MDE也就是你希望实验能分辨出来的最小业务差异。第四个是数据本身的波动性对于比例类指标比如转化率来说这个取决于基线的数值对于均值类指标比如客单价来说这个取决于标准差。这四个参数不是随便拍的。α 和功效是行业共识MDE 是业务目标波动性是数据本身的性质。样本量计算本质上就是在给定这四个参数之后反推需要的规模。你改任何一个参数样本量都会跟着变。1.3 公式背后是“信号”对“噪声”的比例样本量公式看起来吓人其实背后的逻辑很直观。拿最常见的转化率 A/B 测试来说计算每组所需样本量的近似公式是n (Z_α/2 Z_β)^2 × [p1(1-p1) p2(1-p2)] / (p1-p2)^2其中 p1 是对照组的预期转化率p2 是实验组的预期转化率。Z_α/2 是在显著性水平 α0.05 时取 1.96Z_β 是在功效 80% 时取 0.84。拆开看这个公式其实在算一件事你的业务差异p1-p2信号相对于数据本身的波动p(1-p)噪声来说够不够大。差异越小你需要越多数据去“放大”这个信号波动越大你也需要越多数据去“压平”这个噪声。这就像在一场嘈杂的聚会里听人说话——对方声音越小、环境越吵你就得靠得越近增加样本才能听清。这也是我经常跟非统计背景同事解释样本量时用的类比你不可能喝完一整锅汤才知道咸淡舀一勺就够了但如果这锅汤搅拌得不匀或者你只想尝出“淡了一点点”的差别那一勺就不够了得多舀几勺。2. 从业务目标到样本量一套能直接抄的流程2.1 第一步把业务问题翻译成统计参数算样本量最难的从来不是套公式而是把模糊的业务问题翻译成清晰的统计参数。这个环节被很多人跳过导致后面算出来的数字根本不贴合实际。举个例子。产品经理说“我想看看新注册流程能不能提高转化率”。翻译一下对照组是当前注册流程实验组是新注册流程核心指标是注册转化率基线转化率可能是当前的 20%业务上认为提升到 22% 才值得上线也就是说绝对提升 2 个百分点相对提升 10%。到这里参数已经出来了p10.20p20.22MDE0.02。如果你连 p1 都说不出来说明你还没有想清楚实验到底要改变什么、业务上什么程度才算成功。我建议在写实验文档的时候就把这几个问题固定下来不然后续全是在猜。2.2 第二步没有历史数据时基线怎么定这里有一个实操中避不开的问题新功能上线前根本没有历史数据p1 怎么来通常有三个办法。第一用大盘数据。比如你后台能看到全站的注册转化率那就拿它当 p1。第二用同类功能或行业经验值。如果是全新的业务线可以参考行业公开报告或者竞品的公开数据哪怕是粗略估计也比没有强。第三最稳妥的办法先跑一段“空跑期”也叫 A/A 测试——让实验组和对照组都走同一个旧流程收集几天数据用这组数据来估计基线和方差。我自己的习惯是能拿真实数据就不用估计值。因为 p 值如果估偏了样本量可能会差出一倍多。比如 p 从 0.2 估成 0.1算出来的样本量直接翻倍。你要是实在没有数据也别慌用“最保守”的估计——对比例类指标来说p0.5 时方差最大算出来的样本量最保险但代价是实验周期变长。稳妥起见先用保守值算跑起来之后再用真实数据重新估算一次。2.3 第三步选最小可检测差异MDE别贪MDE 是最考验业务判断力的参数。它不是统计指标而是业务决策指标——它回答的是“方案得比现在好多少才值得我花成本上线”这里最常见的错误是把 MDE 设得特别小比如转化率提升 0.1% 就想检测出来。为什么说是错误因为样本量对 MDE 是平方级反比关系。差异每缩小一半样本量就要扩大四倍。想检测一个 0.1% 的提升你的实验可能得跑两三个月——到那时候这个优化早就没有意义了。一个比较务实的做法是MDE 至少定在基线值的 5% 到 20% 之间。比如当前转化率 20%那最小可检测的绝对提升通常在 1 到 4 个百分点之间。具体定多少取决于这个改动对业务的价值和上线成本。如果改动成本很低比如换个文案MDE 可以定小一点如果改动要动核心链路、牵扯大量研发资源MDE 就得定大一些。2.4 第四步代入公式计算并用代码复核参数齐了接下来就是算。拿刚才的例子来走一遍p10.20p20.22α0.05功效0.8。手动代入公式n (1.96 0.84)^2 × [0.20×0.80 0.22×0.78] / (0.22-0.20)^2 7.84 × 0.3316 / 0.0004 ≈ 6500也就是说每组大约需要 6500 个用户两组合计约 13000。如果你每天的可用流量是 5000那这个实验大约需要 3 天左右能跑完。这个数字是不是比你拍脑袋想的“两三万”少很多但注意我这里算的是理想情况没有考虑流量在不同日期、不同渠道的波动实际中通常会在计算结果上再加 20% 到 30% 的余量。手动算容易错更推荐直接用代码复核。下面这段是 Python 实现可以直接复制运行import math def sample_size_for_proportion(p1, p2, alpha0.05, power0.8): z_alpha 1.96 z_beta 0.84 delta abs(p1 - p2) n (z_alpha z_beta) ** 2 * (p1 * (1 - p1) p2 * (1 - p2)) / (delta ** 2) return math.ceil(n) print(sample_size_for_proportion(0.20, 0.22))如果你想用更严谨的统计功效库statsmodels 也能做只是调用方式稍微绕一点from statsmodels.stats.power import NormalIndPower from statsmodels.stats.proportion import proportion_effectsize effect_size proportion_effectsize(0.20, 0.22) n NormalIndPower().solve_power(effect_size, alpha0.05, power0.8, ratio1, alternativetwo-sided) print(round(n))这段代码输出的是单组样本量记得乘以 2 才是总样本量。我实际工作中习惯写一个封装好的函数把 α 和功效也当参数传进去方便后来者调整参数看对样本量的影响。3. 不同场景下的样本量逻辑AB测试、问卷调研、模型评估3.1 AB测试两组对比核心是转化率差值A/B 测试是样本量计算最经典的场景。上面我用的例子就是转化率型指标。但要注意如果核心指标不是“转化率”而是“人均时长”、“客单价”这种连续型指标公式就不一样了需要在公式里引入标准差n (Z_α/2 Z_β)^2 × 2σ^2 / δ^2这里的 σ 是指标的标准差δ 是你想检测的均值差异。标准差越大所需样本量越大。难点在于连续型指标的标准差往往比你想的大得多。以客单价为例如果大部分用户不买、少数用户一单买几千块标准差会非常夸张算出来的样本量能让人眼前一黑。实操中遇到这种情况我一般会给原始指标做一层变换比如对交易金额取对数或者直接用“是否购买”作为主指标把“客单价”降级成次要指标。这样能把方差压下来样本量也会回到一个可控的范围内。3.2 问卷调研误差边界与置信水平决定规模问卷调研的样本量逻辑跟 A/B 测试不太一样。A/B 测试关心的是“两组之间差异能不能被检测出来”问卷调研关心的是“我这个比例估计得准不准”。最常见的目标是以 95% 的置信水平把误差控制在 ±3% 以内。这时候样本量的公式是n Z^2 × p(1-p) / E^2Z 取 1.96E 是允许的误差边界比如 0.03p 是预期的比例。当 p 未知时取 p0.5 最保守。带入 E0.03算出来约 1068。这就是为什么很多调研报告里写着“样本量 1000 左右”——因为这是 95% 置信区间和 3% 误差边界下最省钱的方案。很多人不知道的是如果目标是某个特定人群比如“过去 30 天内购买过两次以上的用户”那么这个占比如果很小光靠随机抽样是不够的要确定你抽到的样本里真的包含足够多的目标人群。这种情况下通常需要做分层抽样或者从目标人群的名单里直接抽。别让样本量公式背这个锅。3.3 模型评估你的验证集该留多少做机器学习的人也应该关心样本量只不过叫法换成“验证集大小”。模型训练完之后在验证集上的指标能不能真实反映线上表现本质上也是样本量问题。分类模型里最基础的经验法则是验证集里每个类别最好至少有几百个样本否则准确率、召回率这些指标会非常飘。算一下假设线上正样本占比是 1%你想在验证集里看到 500 个正样本那就需要 50000 个样本。如果不做任何采样验证集就得有 50000 条。这时候很多人才反应过来为什么模型在离线指标上很好、一上线就拉胯——不是模型差是验证集太小特别是少数类样本太少指标方差太大。还有一些更专业的场景比如点击率预估模型的 AUC 提升 0.002 有没有意义也需要用假设检验来算样本量。只不过公式换成了专门针对 AUC 的方法。这里不展开但逻辑是一样的你的离线测评集要有足够的样本量才能分辨出两个模型之间微小的性能差异。4. 实战中的坑我没少在这几处翻车4.1 算完样本量却发现没那么多流量这是我见过最多的死法。理想计算需要每组 6500 人一周总流量只有 8000这实验根本没法做。遇到这种情况翻车是其次关键是提前发现比强行上线好得多。解决办法有几个思路。第一个是降低功效从 0.8 降到 0.7样本量能省一部分但漏报概率会升高。第二个是放宽 MDE比如从 2 个百分点放宽到 2.5 个百分点样本量大幅下降。第三个是改用分层实验或者减少实验组数量——很多人做实验一次性开三四个实验组流量被摊薄每组都不够。先收敛到一个实验组和一个对照组把关键的实验验证了再说。还有一种思路是换指标。如果“全站转化率”的基线太低、方差太大导致样本量爆炸而功能只影响某一条特定链路那就应该把实验范围限定在进入该链路的用户上而不是全站流量。用更精准的人群做实验样本量小很多结论也更聚焦。4.2 跑了两周还不显著能继续吗“再等等吧可能还不够显著”——这是实验分析里最危险的自我欺骗。你每多看一眼数据就多一次犯错的机会。实验跑了一周没显著第二周显著了你以为方案有效但如果你每天都看数据哪怕方案毫无效果两周内至少有一天出现假显著的概率也会明显上升。正确做法是在实验设计阶段就定好两个东西固定样本量和固定的实验周期。样本量到了、时间到了不管结果显著不显著都直接下结论。如果你实在担心第一周只是随机波动那就用“序贯检验”这类更高级的方法它会根据数据累积情况动态调整停止条件而不是让你主观判断“要不要继续”。这个方案实现起来复杂一些但能有效避免人为偷看数据带来的偏差。4.3 多重检验和辛普森悖论另一个容易被忽略的坑是一个实验里同时看了十几个指标总有一个“碰巧”显著。看 20 个指标在 5% 的显著性水平下即使所有方案都没效果平均也会有一个指标显著。这就像买 20 张彩票中一张不奇怪但你不能因此说自己选号能力很强。处理方式有两种一种是把核心指标限定为一个到两个实验开始前写死另一种是对看多个指标做多重检验校正比如把显著性水平从 0.05 下调到 0.01或者用 Bonferroni 校正。至于辛普森悖论更常见于分层分析——整体显著按新老用户分开看却都不显著或者方向相反。遇到这种情况不要急着欢呼先排查是不是分层变量和实验分组存在相关性再去下结论。5. 常见问题速查看完直接对着用问题可能原因解决思路样本量算出来太大流量不够MDE 设得太小或基线波动太大调整 MDE、降低功效、精确到受影响人群实验到期了但不显著样本量不足或效果真的有限按预定规则下结论避免反复偷看数据样本量够了但指标波动剧烈连续型指标标准差过大对指标做变换或用转化率作为主指标整体显著细分人群都不显著辛普森悖论或分层变量失衡检查分层变量的分布谨慎下结论同时看一堆指标总有一个显著多重检验问题实验前限定主指标或做多重检验校正新功能没有历史基线数据无法估计 p1先做 A/A 空跑或用行业经验值验证集上模型指标很飘少数类样本太少增加验证集样本或对少数类做采样这张表基本覆盖了我实际被业务方问到的 80% 的问题。你会发现大多数问题的根源都在实验设计阶段没有把参数定清楚而不是实验跑完之后的“补救”能解决的。这也是为什么我一直强调样本量计算是实验设计的一部分不是统计师的事是每个做数据驱动决策的人都应该掌握的常识。我个人的习惯是每一份实验需求单里必须有一个固定的板块写清楚基线值、MDE、α、功效、算出来的样本量、预计实验天数。没有这些数字的实验我不会让它上线。看起来繁琐但长期做下来能帮你省下大量“跑完不知道信不信”的尴尬时间。样本量这个工具说到底是在给你自己的决策上保险。你可以不做假设检验就上线功能就像你可以不让保险就开车上路——但一旦遇到噪声大、差异小的情况你会发现提前算好样本量比事后反复分析要靠谱太多。