scipy.stats中t-test的p-value不符合预期问题咨询
问题原因与解决办法
问题出在样本传入顺序和alternative参数的对应逻辑上,先明确scipy.stats.ttest_ind的核心规则:
- 函数计算的统计量公式是:
(mean(第一个样本) - mean(第二个样本)) / 标准误 alternative参数定义的是备择假设的方向:"less":备择假设为「第一个样本均值 < 第二个样本均值」,原假设是「第一个样本均值 >= 第二个样本均值」"greater":备择假设为「第一个样本均值 > 第二个样本均值」,原假设是「第一个样本均值 <= 第二个样本均值」- 不设置时是双侧检验,备择假设为「两个样本均值不相等」
你传入的第一个样本是B类(均值1541.8),第二个是A类(均值1243.8),统计量为正(≈3.417),这时候设置alternative="less",相当于要求检验「B类均值 < A类均值」——但实际数据是B均值更高,这个结果完全落在原假设的范围内,所以p值接近1(0.9996),这是统计逻辑的正常输出,不是异常。
再看双侧检验的结果:p值0.00078是双侧的,对应的单侧p值约为0.00039,这个数值就是「B类均值 > A类均值」的单侧检验p值,远小于0.05,说明可以拒绝原假设,符合你“A类均值更低”的预期。
正确的代码写法
如果要验证「A类均值 < B类均值」,有两种正确方式:
调换样本顺序,A在前B在后,设置
alternative="less":ttest_ind(table2[A], table[B], alternative="less", equal_var=False)此时统计量为负(≈-3.417),p值会是约0.00039,小于0.05,拒绝原假设,支持你的结论。
保持原样本顺序,设置
alternative="greater":ttest_ind(table[B], table2[A], alternative="greater", equal_var=False)此时备择假设是「B类均值 > A类均值」,统计量为正,p值约0.00039,同样符合预期。
关于p值的理解
p值是原假设成立时,观察到当前统计量或更极端值的概率。当你设定的备择假设和实际数据趋势相反时,p值就会接近1,这不是你理解错了p值,而是没匹配好样本顺序和参数方向。
内容的提问来源于stack exchange,提问作者ampersander
相关产品推荐
相关产品推荐

