测试两款套餐收入均值差异时t检验p-value返回NaN的问题排查
错误原因定位
- 检验方法与传入参数完全不匹配
你要验证两个独立分组(surf套餐用户、ultimate套餐用户)的月收入均值是否相等,却误用了单样本t检验st.ttest_1samp,且传入的两个参数都是已经计算完成的均值标量,而非原始样本观测值。
st.ttest_1samp的参数要求:
- 第一个参数:待检验的样本观测值一维序列,样本量需≥2
- 第二个参数:待对比的假设总体均值,为单个标量
你当前的传入逻辑相当于给单样本t检验传入了一个长度为1的样本,计算t统计量时自由度为n-1=0,无法得到有效计算结果,因此p-value直接返回NaN。
- 检验输入逻辑错误
即使换用适配双样本均值比较的检验方法,也不能直接把两个组的均值作为输入。t检验需要结合每个组的原始观测值、样本量、样本标准差计算统计量,仅靠两个均值完全无法完成检验。
你之前计算均值时pandas.Series.mean()默认开启skipna=True,自动跳过了monthly_revenue列的NaN值,因此能得到正确的均值结果,但这和t检验需要的输入类型完全不同。
修正步骤
- 提前提取两个分组的非空月收入序列,不要提前计算均值
# 提取surf套餐的有效月收入,自动过滤NaN surf_rev = call_plan_merge.query('tariff == "surf"')['monthly_revenue'].dropna() # 提取ultimate套餐的有效月收入,自动过滤NaN ultimate_rev = call_plan_merge.query('tariff == "ultimate"')['monthly_revenue'].dropna()
- 改用独立双样本t检验
st.ttest_ind,传入两个原始观测序列
# 建议加equal_var=False,使用Welch's t检验,无需提前假设两组方差相等 results = st.ttest_ind(surf_rev, ultimate_rev, equal_var=False)
- 后续的p值显著性判断逻辑可保持不变。
内容的提问来源于stack exchange,提问作者lm.bertrand
相关产品推荐
相关产品推荐

