
做数据分析这行久了被问得最多的一个问题是这个 t 值到底是怎么算出来的为什么我查的 t 分布表和软件给的临界值对不上尤其是刚接触假设检验的朋友手里攥着一摞数据对着那张密密麻麻的 t 分布表行是自由度、列是显著性水平看半天不敢下手。t 检验、t 分布、t 分布表这三样东西说白了是一套流水线上的三个环节t 分布告诉你“在只有样本的情况下均值偏差长什么样”t 分布表把这种分布压缩成一张可查的临界值清单t 检验则是拿你手上的数据算出统计量再去和表里的临界值比大小。三者的关系搞清楚了很多看似玄学的结论就通了。这篇内容面向的是需要真正把 t 检验用起来的人写论文要做组间比较的、做 A/B 实验要判断差异是否显著的、做质量抽检要判断批次是否偏移的以及被软件输出的一堆数字搞晕、想弄明白背后原理的。我不会只给你一个公式就完事而是把 t 分布的形状由什么决定、t 分布表怎么读才不出错、三类 t 检验各自的适用边界、手算和代码两条路径怎么互相验证全部拆开讲一遍。中间会穿插我自己在做实验分析和抽样评估时踩过的坑比如单尾双尾搞反、方差齐性没检查就直接套公式、自由度取整方式不同导致 p 值差一截这些细节在教材里往往一句话带过但在实际工作里足够让你重跑一遍分析。1. 先搞清楚 t 分布到底在解决什么问题1.1 从“总体标准差未知”这个现实困境说起正态分布好用但它有个前提你得知道总体的标准差 σ。现实里绝大多数场景拿不到这个东西。你做一个批次的产品抽检总体是整条产线的全部产出你不可能全测你做一次用户行为实验总体是全部潜在用户你更测不完。你手上只有样本标准差 s它是从有限的 n 个观测值里算出来的本身带随机性样本量越小s 对 σ 的估计就越飘。如果把 s 直接塞进正态分布的公式里会系统性地低估尾部概率——也就是说你会过于自信地认为“这个差异很显著”。二十世纪初这个问题困扰了很多人后来有一位统计学者业内通常用他的笔名 Gossip 来称呼这段历史通过大量小样本模拟发现用 s 替代 σ 之后统计量的分布不再是标准正态而是一个尾部更厚、峰值略低的对称分布形状还会随样本量变化。这就是 t 分布也叫学生分布。它的关键贡献在于承认了“我用 s 估计 σ 是有误差的”并把这个误差纳入到分布形状里。所以 t 分布不是正态分布的替代品而是正态分布在“σ 未知、只能用 s 估计”这个约束条件下的正确版本。样本量越大s 越接近 σt 分布就越贴近正态分布样本量趋于无穷时两者完全重合。理解这一点后面所有关于“大样本可以直接用 z 值”的经验规则就都顺理成章了。1.2 t 统计量的构造逻辑信号除以噪声单样本场景下t 统计量的形式是t (x̄ - μ) / (s / √n)拆开看分子x̄ - μ是样本均值与假设总体均值之间的偏离可以理解为“信号”分母s / √n是样本均值的标准误可以理解为“噪声”。这个比值本质上是在问你观察到的偏离相当于多少个标准误偏离 1 个标准误说明很可能是抽样波动偏离 3 个标准误说明这么巧的事不太容易发生于是你倾向于认为假设的 μ 有问题。这种“信号除以噪声”的结构在统计里反复出现理解一次就够用一辈子。独立样本 t 检验的分母换成两组均值差的标准误配对 t 检验的分母换成差值的标准误形式变了内核完全一样。很多人记不住三个公式是因为把注意力放在分子分母的具体写法上而没有抓住“差值除以差值的不确定度”这条主线。我建议你先把单样本这一条吃透后面两条都是它的变形。还有一个细节值得说为什么分母里有 √n。因为样本均值的方差是 σ²/n标准差是 σ/√n。样本量翻四倍标准误才减半这条“平方根法则”直接决定了你要花多少成本才能把检验精度提上去。我在做实验设计的时候经常用这条规则快速估算如果当前样本量下 p 值在 0.1 附近想稳定压到 0.05 以下大致需要把样本量扩大一倍以上而不是加个百分之二三十就够。1.3 一张图看懂 t 分布与正态分布的差别在哪如果把标准正态分布和自由度分别为 1、5、30 的 t 分布画在同一张坐标图上你会看到很直观的三层结构自由度 1 的 t 分布几乎像个“山”字被压扁中间低、两边厚尾部概率大得惊人自由度 5 的时候已经明显收敛但尾部仍然比正态厚自由度 30 的时候两者肉眼几乎分不出来只在极端的尾部区域还有细微差异。这个“尾部厚”意味着什么意味着在同样的小样本条件下你需要更大的 t 值才能达到同样的显著性水平。举个具体的数双侧 0.05 显著性水平下标准正态的临界值是 1.96自由度 10 的 t 临界值是 2.228自由度 5 是 2.571自由度 1 是 12.706。同样是 0.05 的门槛小样本的门槛高出一大截这就是对“σ 未知”的惩罚。很多新手看到自己算出来 t 2.1凭记忆觉得“超过 1.96 就显著”结果样本只有 8 个查表发现临界值是 2.365结论直接反转。我个人的习惯是只要样本量小于 30就一律不凭记忆用 1.96老老实实查表或者用代码算精确值。这不是保守而是代价太低——多敲一行代码的事换来的是结论不出错。2. t 分布的形状、自由度与临界值表怎么读2.1 自由度决定分布形状的唯一参数t 分布只有一个参数叫自由度通常记作 df 或 ν。单样本 t 检验里 df n - 1独立样本等方差情形 df n1 n2 - 2配对样本 df 配对数 - 1。为什么是 n - 1 而不是 n因为你在计算样本标准差 s 的时候已经用掉了一个信息——样本均值。给定均值之后n 个观测值里只有 n - 1 个是可以自由变动的最后一个被均值“锁死”了。这个解释很多人听过但没真正消化。换个说法自由度是“独立信息的个数”。你从 n 个数据里提取了一个均值用于估计散布程度的信息就只剩 n - 1 份。这也是为什么小样本必须用 t 分布——你损失的那一份信息在小样本里占比很大n 5 时损失 20%n 100 时只损失 1%影响自然就小了。实操中有个容易出错的地方Welch 近似不等方差情形下的自由度不是整数。它的计算公式是df (s1²/n1 s2²/n2)² / [ (s1²/n1)²/(n1-1) (s2²/n2)²/(n2-1) ]算出来可能是 13.47 这样的数。有些老软件会直接向下取整到 13有些会保留小数查表插值现代的统计软件则直接用连续自由度计算精确 p 值。这三种做法在小样本、方差不齐的时候可能给出不同的结论。你一定要知道自己用的工具是怎么处理的尤其是当 p 值落在 0.04 到 0.06 这个敏感区间时取整方式的影响足以改变“显著/不显著”的判定。2.2 一张 t 分布表里到底有什么行、列与两个方向标准的 t 分布临界值表是二维的。行是自由度从 1 一路排到 30然后跳到 40、60、120最后一行是 ∞对应正态分布。列是显著性水平通常分单尾和双侧两套标注表头可能写 0.10、0.05、0.025、0.01、0.005单尾也可能写 0.20、0.10、0.05、0.02、0.01双侧。表体里填的是对应的临界值。用的时候有个固定的查法先确定你的检验是单尾还是双侧再确定显著性水平 α然后在表头找到对应的那一列接着在行里找到你的自由度行列交叉的格子就是临界值。算出 t 统计量之后取绝对值如果大于临界值就拒绝原假设。这是查表法。我见过最常见的两种错误。第一种是把单尾和双侧的列搞混。同样是 α 0.05单尾的临界值对应的是双侧表的 0.10 那一列差得不多但足够让边缘情形翻盘。第二种是自由度落在两个表行之间不知道怎么处理。严格的做法是取较小的那个自由度这样得到的临界值偏大结论偏保守能不插值就不插值因为线性插值在 t 分布这种非线性曲线上误差不好控制。真要精确直接用软件算。下面是从常见表格里摘的一小段方便你对照理解双侧 α 0.05自由度 df临界值 t(0.975)常见场景112.706极端小样本几乎不用52.5716 个观测值的单样本102.22811 个观测值或两组各 6 个的独立样本202.08621 个观测值302.04231 个观测值602.000大样本接近 1.96∞1.960理论上的正态分布从这张小表就能看出趋势自由度从 5 涨到 10临界值掉了 0.34从 30 涨到 60只掉了 0.04。这就是所谓的“边际收益递减”想靠堆样本量把临界值压到 1.96 以下是不现实的只能无限逼近。2.3 “精确完整图”的意义为什么我不建议你依赖纸质表标题里提到的“精确完整图”我理解有两层意思。第一层是完整的 t 分布临界值表覆盖更多自由度、更多显著性水平解决纸质表只给几个离散点的问题。第二层是 t 分布的概率密度曲线图用来直观判断你的统计量落在什么位置。纸质表的局限很明确自由度只给到 30中间跳过 31 到 39遇到 df 37 就只能取 30结论偏保守α 只给几个固定档位你想用 0.03 就没辙精度只有三位小数边缘判定容易失真。现在完全没必要受这个限制——任何一个有概率分布函数的工具都能在毫秒内给出任意自由度、任意 α 的精确临界值。我自己现在的工作流是日常判断用代码一行出结果需要给别人解释的时候才画图。画图的价值不在于精确而在于沟通。把 t 分布曲线、你的统计量位置、左右两侧的拒绝域一起画出来非技术背景的合作方一眼就能看懂“我们的观测值离假设的中心有多远”。这比甩一张 p 值表格有效得多。提示如果你要报告结果给外部看t 分布表本身不是必须的但一定要写清楚自由度、是单尾还是双侧、用的什么检验方法。这三点缺一个结论就无法被复核。3. 三类 t 检验的计算方法逐一拆解3.1 单样本 t 检验拿一组数据和一个基准值比单样本 t 检验回答的问题是这组数据的均值和一个给定的基准值有没有实质差异。典型场景是某批次产品的平均尺寸是否偏离设计值、某个班的平均成绩是否偏离年级均值、某渠道的用户平均停留时长是否偏离整体水平。计算步骤只有四步我按实际动手的顺序写算样本均值 x̄ 和样本标准差 s注意分母是 n - 1不是 n。算标准误 SE s / √n。算 t (x̄ - μ₀) / SE其中 μ₀ 是待检验的基准值。查 t 分布表或用软件算出 p 值df n - 1。举个具体的某批 12 个样品的测量值均值是 51.3样本标准差是 2.8设计基准是 50。SE 2.8 / √12 ≈ 0.808t (51.3 - 50) / 0.808 ≈ 1.61df 11。查双侧 0.05 的临界值是 2.2011.61 小于它所以不能拒绝“均值等于 50”的原假设。这个例子有个值得注意的点1.61 对应的双侧 p 值大约 0.136离 0.05 有距离但如果样本量翻到 48SE 会减半到 0.404t 变成 3.22结论直接反转为显著。同一批数据的“本质差异”没变变的只是测量精度。这说明显著性和实际重要性是两回事看到显著不要激动看到不显著也别急着放弃先看看是不是样本量不够。单样本检验里最容易忽略的是前提假设观测值要近似独立数据不能有严重的偏态或极端离群值。均值对离群值极度敏感一个异常点就能把 x̄ 拽偏t 值随之失真。我一般会先看一眼箱线图或直接用中位数对比一下如果均值和中位数差得远就得警惕。3.2 独立样本 t 检验两组互不相关的人/物比高低独立样本检验回答的是两组彼此独立的观测均值有没有差异。A 组用方案一、B 组用方案二这个车间的产品对比那个车间的产品实验组对比对照组。关键词是“独立”——两组之间没有配对关系一个人的数据不会出现在另一组里。它的计算分两条路取决于方差是否齐性。方差齐性时用合并方差sp² [(n1-1)s1² (n2-1)s2²] / (n1 n2 - 2) t (x̄1 - x̄2) / [ sp * √(1/n1 1/n2) ] df n1 n2 - 2方差不齐时用 Welch 校正分母不做合并自由度用前面提过的 Satterthwaite 公式单独算。这两条路的选择不是可选项而是必须先做判断。判断方法通常用 Levene 检验或 F 检验看方差的差异是否显著。但我个人的经验是除非有强证据表明两组方差接近比如样本量都很大、来源同质否则默认用 Welch。原因很实在——Welch 在方差齐性成立时效能损失极小而在方差不齐时等方差方法会明显抬高第一类错误率也就是假阳性。很多教材默认教等方差版本是因为公式好看、手工算方便但那已经是计算器时代的遗产了。我用一个模拟场景说明后果两组真实均值相同但一组方差是另一组的 3 倍样本量各 15。如果强行用等方差方法实际的第一类错误率可能从名义的 0.05 涨到 0.08 甚至更高。这意味着你每做 100 次检验本来该有 5 次误报实际会有 8 次。在需要多重比较的场景里这个偏差会被放大得更厉害。实际报告的时候如果是 Welch 结果自由度会写成带小数的形式比如 t(14.3) 2.41, p 0.030。看到这种写法就说明用了校正不用觉得奇怪。3.3 配对样本 t 检验同一批对象前后比配对检验回答的是同一批对象在两种条件下有没有差异。服药前后的指标、同一批样品用两种仪器测的结果、同一群人在两个时间点的评分。它的精髓在于“配对”把个体差异消掉了。计算上它其实就是一个伪装成单样本的单样本检验先把每对的差值 d 后 - 前算出来得到一组差值然后检验这组差值的均值是否等于 0。d_i x_i(后) - x_i(前) t d̄ / (s_d / √n) df n - 1这里 n 是配对数不是观测总数。8 对数据就是 n 8df 7不是 n 16。配对设计为什么要比独立设计更“省样本”因为个体之间的差异被消掉了。比如测某种干预对心率的影响人群基础心率从 50 到 90 都有个体差异极大。独立设计里这部分变异全进了噪声项把信号淹没了配对设计里每个人自己和自己比基础水平被抵消剩下的只有干预带来的变化信噪比立刻提升。同一个效应量配对设计往往只需要独立设计三分之一到二分之一的样本就能检出。但配对设计有代价一旦配对关系搞错结论就废了。我曾经见过一个案例两组数据本来是按时间顺序一一对应的结果在整理表格时被排序打乱了配对关系全错t 值算出来接近 0。这种错误很难从结果里看出来因为“没有显著差异”本身不是异常信号。所以做配对检验之前务必确认配对键比如受试者编号、样品编号在数据里是唯一且正确的。还有一个常见误区配对检验要求的是差值近似服从正态而不是原始数据服从正态。如果差值有极端离群同样要处理。3.4 三个公式的共同骨架与选择决策树把三个公式摆在一起看会发现骨架完全一样都是“估计值减去假设值”除以“这个估计值的标准误”。单样本里估计值是 x̄假设值是 μ₀独立样本里估计值是 x̄1 - x̄2假设值是 0配对样本里估计值是 d̄假设值也是 0。选哪个取决于你的数据结构可以用三个问题快速定位问题回答结论你是拿一组数据和固定值比吗是单样本 t 检验你有两组数据且观测之间毫无关联吗是独立样本 t 检验你有两组数据且存在一一对应关系吗是配对样本 t 检验你有三组及以上—不能用 t 检验改方差分析最后一行特别重要。做三组两两比较用三次 t 检验会把假阳性率显著抬高。三组两两比是 3 次检验如果每次 α 0.05整体至少犯一次错的概率约 14%五组两两比是 10 次整体错误率接近 40%。这时候要么用方差分析加事后校正要么对 p 值做多重比较调整。我在审阅分析报告时看到“三组数据做了三次 t 检验、p 值都是 0.04”这种表述基本会直接打回去重做。4. 实操从原始数据到 p 值的完整走一遍4.1 手算流程与现场记录手算的价值在于校验。代码跑多了容易麻木输出的数字对不对心里没底手算一遍能让你对量级有感觉。我拿一组模拟数据完整走一次独立样本流程。A 组 9 个观测12.4, 13.1, 11.8, 12.9, 13.5, 12.2, 12.7, 13.0, 12.6 B 组 8 个观测13.8, 14.2, 13.5, 14.6, 13.9, 14.1, 13.4, 14.3第一步算均值。A 组和约 114.2x̄1 ≈ 12.689B 组合约 111.8x̄2 ≈ 13.975。差值约 -1.286。第二步算样本标准差。A 组离差平方和约 1.749除以 8 得方差约 0.2186s1 ≈ 0.4676。B 组离差平方和约 1.055除以 7 得方差约 0.1507s2 ≈ 0.3882。第三步判断方差齐性。两组方差比约 1.45样本量又接近一般可以认为齐性成立走合并方差这条路。合并方差 (8 × 0.2186 7 × 0.1507) / 15 ≈ (1.749 1.055) / 15 ≈ 0.1869sp ≈ 0.4323。标准误 0.4323 × √(1/9 1/8) ≈ 0.4323 × 0.4859 ≈ 0.2101。第四步t -1.286 / 0.2101 ≈ -6.12df 15。双侧 0.05 临界值约 2.131|-6.12| 远超p 值远小于 0.001。这组数据的效应很明显所以算出来毫不意外。手算的意义在于你会亲眼看到合并方差是怎么把两组的方差按自由度加权平均的也会明白为什么分母里要出现 √(1/n1 1/n2) 这个因子——它是两组均值差的标准误等于各自方差除以各自样本量之和再开方。如果把同一组数据用 Welch 算自由度大约是 14.9t 值约 -6.09p 值几乎不变。这也印证了前面的说法方差接近的时候两种方法结果基本一致。4.2 代码实现三条路选你顺手的Python 是最通用的选择涉及统计的部分直接调用成熟的库不建议自己从头写分布函数。import numpy as np from scipy import stats a np.array([12.4, 13.1, 11.8, 12.9, 13.5, 12.2, 12.7, 13.0, 12.6]) b np.array([13.8, 14.2, 13.5, 14.6, 13.9, 14.1, 13.4, 14.3]) # 独立样本默认不假设方差齐性Welch t_stat, p_val stats.ttest_ind(a, b, equal_varFalse) print(fWelch: t{t_stat:.4f}, p{p_val:.6f}) # 等方差版本 t_stat2, p_val2 stats.ttest_ind(a, b, equal_varTrue) print(fPooled: t{t_stat2:.4f}, p{p_val2:.6f}) # 手算临界值df15双侧 0.05 crit stats.t.ppf(1 - 0.025, df15) print(f临界值: {crit:.4f}) # 单样本 one stats.ttest_1samp(a, popmean12.0) print(f单样本: t{one.statistic:.4f}, p{one.pvalue:.6f}) # 配对 before np.array([70, 72, 68, 75, 71, 69, 73, 74]) after np.array([68, 70, 67, 73, 69, 68, 71, 72]) paired stats.ttest_rel(before, after) print(f配对: t{paired.statistic:.4f}, p{paired.pvalue:.6f})几个要点提醒。ttest_ind的equal_var参数默认是 True等方差很多人不知道这一点直接调用就用了合并方差在方差不齐时结论会偏。我习惯显式写出来代码本身就是文档。另外ttest_rel接受的顺序是有意义的它计算的是第一个数组减第二个数组差值方向决定了 t 值的正负虽然不影响 p 值但报告时要写清楚是哪边减哪边。R 语言在这块更贴近教材写法a - c(12.4, 13.1, 11.8, 12.9, 13.5, 12.2, 12.7, 13.0, 12.6) b - c(13.8, 14.2, 13.5, 14.6, 13.9, 14.1, 13.4, 14.3) t.test(a, b, var.equal FALSE) t.test(a, mu 12.0) t.test(before, after, paired TRUE)如果用电子表格函数名要记准T.INV.2T(0.05, 15)返回双侧 0.05、自由度 15 的临界值T.DIST.2T(2.131, 15)返回 t 值对应的双侧 p 值T.TEST(区域1, 区域2, 尾数, 类型)其中类型 1 是配对、2 是等方差独立、3 是 Welch。老版本的TINV只接受双侧参数容易和新函数搞混用之前确认一下。注意不同工具对“尾数”的定义一致但参数顺序和默认值不一样。交接分析任务时把代码和输出一起给出去别只给结论否则对方复现不出来。4.3 自己生成一张精确完整的临界值表如果你需要一张自己的表——比如要放进报告附录或者想覆盖 1 到 100 的全部自由度用几行代码就能生成比到处找现成的表可靠。import numpy as np import pandas as pd from scipy import stats dfs list(range(1, 31)) [40, 50, 60, 80, 100, 120, 200, 500] alphas_two [0.20, 0.10, 0.05, 0.02, 0.01] alphas_one [0.10, 0.05, 0.025, 0.01, 0.005] rows [] for df in dfs: row {df: df} for a in alphas_two: row[f双侧{a}] round(stats.t.ppf(1 - a/2, df), 4) for a in alphas_one: row[f单尾{a}] round(stats.t.ppf(1 - a, df), 4) rows.append(row) table pd.DataFrame(rows) table.to_csv(t_critical_table.csv, indexFalse, encodingutf-8-sig) print(table.head(10).to_string(indexFalse))生成的时候有两个细节必须处理对。一是ppf的参数双侧 α 要传1 - α/2因为 t 分布对称两侧各占 α/2单尾 α 传1 - α。传错了得到的是完全不同的数而且错得不明显容易被忽略。二是自由度这一列别只取整数Welch 校正出来的小数自由度用ppf一样能算直接传进去就行不需要取整。想要图的话用几行代码就能画出分布曲线并标出拒绝域import matplotlib.pyplot as plt from scipy import stats df, alpha 15, 0.05 crit stats.t.ppf(1 - alpha/2, df) x np.linspace(-4, 4, 800) y stats.t.pdf(x, df) plt.plot(x, y, colorblack, linewidth1.5) plt.fill_between(x, y, where(x -crit), colorgray, alpha0.4) plt.fill_between(x, y, where(x crit), colorgray, alpha0.4) plt.axvline(-6.12, colorred, linestyle--, labelobserved t) plt.title(ft distribution, df{df}, two-sided alpha{alpha}) plt.legend() plt.tight_layout() plt.savefig(t_dist_plot.png, dpi200)这套图我经常放进分析结论的第一页。数据显示出来的效果很直接观测值远远落在灰色拒绝域里任何人看一眼就明白结论有多稳。反过来如果观测值刚好贴着临界线这张图也会诚实地告诉你“这个结论很脆弱”比一句“p 0.048显著”有说服力得多。5. 常见问题与排查技巧实录5.1 p 值在 0.049 和 0.051 之间不是玄学是精度问题这是被问得最多的一类问题同一批数据两次算出来的 p 值一个有差异、一个没差异到底哪个对原因通常有三类。第一类是尾数设置不一致。同时做了单侧和双侧的检验双侧 p 值是单侧的两倍对称分布下0.049 的两倍就是 0.098跨度很大。第二类是自由度处理方式不同。有的实现向下取整有的保留小数有的用了不同的校正。在方差不齐、样本量小的场景里这几种做法给出的 p 值能差出零点零几。第三类是统计量本身的定义差异比如方差的分母用 n 还是 n - 1、是否先做了数据转换。这类差异在样本量小时最明显。排查的思路是固定的先确认检验类型和尾数再确认自由度最后核对原始输入。我习惯在代码里把中间量全打印出来——两组均值、标准差、样本量、计算的自由度、t 值——然后跟另一个工具的结果逐项对。只要中间量一致p 值必然一致中间量对不上问题就出在那一步。还有一个心态问题如果你的结论正好卡在 0.05 附近那这个结论本身就是脆弱的。这时候正确做法不是纠结用哪种算法让它变显著而是承认证据不足或者补充数据。我见过太多人为了把 0.051 变成 0.049 而反复调整分析方式这在方法上是站不住的。5.2 独立样本到底选等方差还是 Welch一个实用判断标准的教科书流程是先做方差齐性检验齐性成立就用合并方差。这个流程有个隐藏问题方差齐性检验本身也有功效样本量小的时候检验不出来明明不齐却说齐样本量大的时候又过于敏感差异很小也判不齐。所以“先检验再选择”这条路上第一种情况会导致假阳性第二种情况会让你在大样本下无谓地用 Welch。我的做法是小样本每组少于 15时看一眼两组标准差的比值如果在 0.5 到 2 之间用哪个都行报告里写清楚方法即可超过这个范围一律 Welch。中大样本时直接用 Welch几乎没坏处。只有在样本量很小、又确信两组同源同质的情况下才用合并方差版本因为它能多榨出一点效能。还有一条容易被忽略的两组样本量悬殊的时候比如 10 对 100即使方差相近也建议用 Welch。等方差方法在这种不平衡设计下对第一类错误的控制会变差。5.3 常见问题速查表现象可能原因排查与处理t 值算出 NaN 或无穷某组标准差为 0检查是否所有观测值相同或数据录入错误p 值和别人的结果差很多单尾/双侧设置不同确认尾数双侧 p 约等于单侧的两倍自由度是小数的用了 Welch 校正正常现象直接使用无需取整结论在 0.05 附近反复横跳边缘证据补充样本或报告效应量与置信区间配对检验 t 值接近 0配对关系错乱核对配对键是否唯一、顺序是否对应两组均值差很大但不显著组内变异过大或样本太小算效应量判断是功效不足还是确实无差异多个组两两比较方法选错改用方差分析并做事后校正加了几个样本结论反转样本量不足导致不稳定事前做样本量估算别事后补这张表覆盖了我实际遇到的大部分问题。其中“均值差大但不显著”这一条最值得展开很多人在这个节点会怀疑方法用错了实际上可能只是样本量不够噪声太大。这时候算一下 Cohens d如果效应量不小比如 0.6那说明差异是有的只是被噪声掩盖加样本就能看出来如果效应量本身就很小0.1 左右那即使加大样本得到显著结果实际意义也有限。提示报告结果时把均值差、置信区间、效应量一起写出来。单独的 p 值说明不了差异有多大只能说明“如果假设成立观察到这么极端结果的概率很小”。6. 效应量与样本量比 p 值更值得花时间的两件事6.1 Cohens d把差异换算成统一单位p 值告诉你“有没有差异”效应量告诉你“差异有多大”。这两件事在报告里同等重要但后者往往被省略。常用的效应量是 Cohens d定义是均值差除以合并标准差d (x̄1 - x̄2) / sp单样本场景下 d (x̄ - μ₀) / s配对场景下 d d̄ / s_d。这些 d 值可以直接横向比较因为它已经除以了数据的自然波动。行业里有一套流传较广的经验基准d 约 0.2 算小效应0.5 算中等0.8 算大。但要提醒一句这个基准是从社会科学领域总结出来的用在其他领域未必合适。工业质检里0.2 的效应如果对应的是关键尺寸偏移实际意义可能非常大用户行为实验里0.1 的提升可能已经是值得全量推广的改进。判断标准要结合业务场景别生搬硬套。我自己做分析报告时有个固定动作把 d 值算出来再换算回原始单位。比如“某方案让平均停留时长提升了 8 秒标准化效应量 d 0.35”这样写业务方能同时看到绝对量和相对量。6.2 样本量估算开工之前先算一笔账样本量估算的逻辑是反过来的先定下你想检出的最小效应量再定下可接受的假阳性和假阴性水平然后倒推需要多少样本。粗略的公式是每组 n ≈ 2 * (z_{1-α/2} z_{1-β})² / d²α 取 0.05 时 z 约 1.96β 取 0.2即功效 80%时 z 约 0.84两者相加约 2.8平方约 7.85。所以每组 n ≈ 15.7 / d²。d 0.5 时约 63d 0.8 时约 25d 0.3 时约 175。这个公式是近似精确计算要用非中心 t 分布迭代求解但用来做量级判断足够。我在做实验设计的时候会先用它估个数再用工具函数核对一遍。Python 里有现成的库能做精确计算R 里也有对应函数不展开。有个现实问题要提前想清楚样本量估算出来的数往往比想象中大。d 0.5 需要每组 60 多个这在很多场景下是拿不到的。这时候的理性选择是接受更低的功效比如 60%或者重新评估要检出的效应量是否定得太小。最不可取的做法是“先做一小批看看显不显著不显著再加数据”——这种做法会破坏第一类错误率的控制因为你在不断地“偷看”结果本质上和反复掷骰子等六点出现没什么区别。我在实际操作中的体会是样本量这件事最省力的时刻是实验开始之前最贵的时刻是实验结束之后。事前花半小时算一下能避免事后一个月的返工和扯皮。还有个小技巧如果你不得不用小样本那就把设计做得更精细——用配对设计消除个体差异、用重复测量提高精度、严格控制测量误差这些都能在样本量受限的情况下把信噪比拉回来。至于那张 t 分布表或者更准确地说那套精确的临界值计算能力真正用起来之后你会发现它只是个工具不是目的。目的始终是搞清楚手上的数据到底说明了什么而这件事的判断力来自你对每一个环节为什么这么做的理解。