python - 当我在python中使用ks测试时,为什么我的p值等于0而统计量等于1?
问题描述
感谢任何先看的人。
我的代码是:
import numpy as np
from scipy.stats import kstest
data=[31001, 38502, 40842, 40852, 43007, 47228, 48320, 50500, 54545, 57437, 60126, 65556, 71215, 78460, 81299, 96851, 106472, 108398, 118495, 130832, 141678, 155703, 180689, 218032, 222238, 239553, 250895, 274025, 298231, 330228, 330910, 352058, 362993, 369690, 382487, 397270, 414179, 454013, 504993, 518475, 531767, 551032, 782483, 913658, 1432195, 1712510, 2726323, 2777535, 3996759, 13608152]
x=np.array(data)
test_sta=kstest(x, 'norm')
print(test_sta)
kstest 的结果是 KstestResult(statistic=1.0, pvalue=0.0)。代码有什么问题还是数据根本不正常?
解决方案
我以前没有用过这个,但我认为你正在测试你的数据是否是标准正态的(即平均值=0,方差=1)
绘制直方图显示它更接近对数正态。因此,我会这样做:
x = np.log(data)
x -= np.mean(x)
x /= np.std(x)
kstest(x, 'norm')
这给了我 0.095 的检验统计量和 0.75 的 p 值,确认我们不能拒绝它不是对数正态的。
检查这类事情的一个好方法是生成一些随机数据(来自已知分布),然后看看测试会给你什么。例如:
kstest(np.random.normal(size=100), 'norm')
给我接近 1 的 p 值,而:
kstest(np.random.normal(loc=13, size=100), 'norm')
给我接近 0 的 p 值。
对数正态分布只是意味着它在对数转换后呈正态分布。如果您真的想针对正态分布进行测试,您只需不记录转换数据,例如:
x = np.array(data, dtype=float)
x -= np.mean(x)
x /= np.std(x)
kstest(x, 'norm')
这给了我一个 7e-7 的 p 值,表明我们可以可靠地拒绝它是正态分布的假设。
推荐阅读
- python - 使用用户输入获取来自类 python3 的信息
- scala - 如何将动态数据加载到 cassandra 表中?如何读取带有标题的csv文件?
- python - Numpy:基于单独的向量交换二维数组的值
- javascript - iframe 中的 PDF - 适用于 Firefox,但不适用于 OSX 上的 Chrome
- php - 用于更改 SEO 友好 URL 的 WordPress 查询字符串
- angular - 具有 3 种以上颜色的 Angular 主题
- silverstripe - Silverstripe 安装 - 友好的 URL 不起作用
- r - 使用 Dplyr 将两个 Dataframe 相乘并使用结果创建另一个
- xpath - XSLT 中的条件 For-Each
- python - 如何在字符串中存储多行并回显该字符串以在 CSHELL 脚本中打印输出?