为何Scipy与Excel的两样本t检验p值存在细微差异?
关于Scipy与Excel双样本异方差t检验p值差异的原因解析
你在对比Scipy和Excel的双样本异方差t检验结果时,肯定疑惑过:明明t值完全一致,怎么p值会有微小的差异(Scipy给出0.108425721876,Excel是0.1082…)?其实这个差异的核心原因,是两者计算自由度的方式不一样,具体来说:
- Scipy的
stats.ttest_ind(wt, mut, equal_var=False)采用的是Welch-Satterthwaite公式的精确计算版本,会保留自由度的小数部分(比如这次计算出来的自由度大概是3.87),然后用这个非整数自由度去查询t分布计算p值,结果会更精准。 - 而Excel的「t-检验:双样本异方差假设」功能,会把Welch公式算出的非整数自由度向下取整为整数(也就是把3.87改成3),再用整数自由度来计算p值。正是这个取整操作,导致了p值出现细微偏差。
我们可以手动验证一下自由度的计算:
先计算两组的样本方差(用无偏估计,即ddof=1):
import numpy as np wt = np.array([71.93636,71.34689,72.2162]) mut = np.array([71.58995,70.82698,70.89562]) s1_sq = np.var(wt, ddof=1) # 约0.198 s2_sq = np.var(mut, ddof=1) # 约0.147 n1, n2 = len(wt), len(mut)
代入Welch-Satterthwaite公式:
df = (s1_sq/n1 + s2_sq/n2)**2 / ( (s1_sq/n1)**2/(n1-1) + (s2_sq/n2)**2/(n2-1) )
算出来的自由度约为3.87,Scipy用这个精确值计算p值,Excel则取整为3,两者的p值自然会有细微差别。
这种差异在样本量较小的时候会比较明显,当样本量增大,自由度的小数部分对p值的影响会越来越小,两者的结果就会几乎一致了。
内容的提问来源于stack exchange,提问作者lanselibai
相关产品推荐
相关产品推荐

