如何解决检验假设的 P 值显示 NaN
在尝试测试电话计划冲浪的收入平均值与最终计划的收入平均值相同的零假设时,我得到了 p.value 的 NaN。我不明白我做错了什么。我假设它可能与我的 DataFrame call_plan_merge
有关。 monthly_revenue
列中有一些 NaN 值(在我在这里发布的内容中不可见)。这可能是原因吗?但同时计算的均值(我们可以看到是在忽略 monthly_revenue
列中的 NaN 时正确计算的)已经在用于检验假设的变量中,所以我不明白会生成 NaN对于 p 值。
这是我的代码:
#The average revenue from users of Ultimate and Surf calling plans differs.
average_rev_surf = call_plan_merge.query('tariff == "surf"')
average_rev_surf = average_rev_surf['monthly_revenue'].mean()
average_rev_ultimate = call_plan_merge.query('tariff == "ultimate"')
average_rev_ultimate = average_rev_ultimate['monthly_revenue'].mean()
alpha = 0.05 # critical statistical significance
results = st.ttest_1samp(average_rev_surf,average_rev_ultimate)
print('p-value:',results.pvalue)
if results.pvalue < alpha:
print('We reject the null hypothesis')
else:
print("We can't reject the null hypothesis")
print('Average revenue for the surf plan is: {:.2f}$'.format(average_rev_surf))
print('Average revenue for the ultimate plan is: {:.2f}$'.format(average_rev_ultimate))
输出:
p-value: nan
We can't reject the null hypothesis
Average revenue for the surf plan is: 35.77$
Average revenue for the ultimate plan is: 36.32$
这就是 call_plan_merge
的样子:
user_id call_month total_calls duration tariff reg_month churn_month state monthly_revenue
0 1000.0 12.0 16.0 124.0 ultimate 12 13.0 GA 70.00
1 1001.0 8.0 27.0 182.0 surf 8 13.0 WA 20.00
2 1001.0 9.0 49.0 315.0 surf 8 13.0 WA 20.00
3 1001.0 10.0 65.0 393.0 surf 8 13.0 WA 90.09
4 1001.0 11.0 64.0 426.0 surf 8 13.0 WA 60.00
5 1001.0 12.0 56.0 412.0 surf 8 13.0 WA 60.00
6 1002.0 10.0 11.0 59.0 surf 10 13.0 NV 20.00
7 1002.0 11.0 55.0 386.0 surf 10 13.0 NV 60.00
8 1002.0 12.0 47.0 384.0 surf 10 13.0 NV 20.00
9 1003.0 12.0 149.0 1104.0 surf 1 13.0 OK 158.12
非常感谢您的帮助!
解决方法
您的错误是由 average_rev_surf = average_rev_surf['monthly_revenue'].mean()
引起的。此外,您不是在与单个群体打交道。您正在处理两个独立的 组,因此您使用了错误的函数。
ttest_1samp()
必须接收一个类似数组的结构作为 a
和一个在原假设下的总体均值作为 popmean
。通过传递 a=average_rev_surf
,您正在使函数计算 t 具有 1 - 1 = 0 自由度的统计量,这显然返回 NaN
统计量和 p 值。
好像你有很多不同的用户,每个用户都有自己的资费。为了测试他们的收入是否不同,您应该使用 scipy.stats.ttest_ind()
,因为您的样本是独立的。
尝试以下方法:
# Monthly revs of surf users
surf = average_rev_surf.loc[average_rev_surf['tariff'].eq('surf'),'monthly_revenue']
# Monthly revs of ultimate users
ulti = average_rev_surf.loc[average_rev_surf['tariff'].eq('ultimate'),'monthly_revenue']
# t-test for independent samples
results = st.ttest_ind(a=surf,b=ultimate)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。