You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类均值」,有两种正确方式:

  1. 调换样本顺序,A在前B在后,设置alternative="less":

    ttest_ind(table2[A], table[B], alternative="less", equal_var=False)
    

    此时统计量为负(≈-3.417),p值会是约0.00039,小于0.05,拒绝原假设,支持你的结论。

  2. 保持原样本顺序,设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:45:25