我正在尝试测试数据是否遵循“正态”分布,但是kstest无法正常运行。通过使用numpy中的normal
,可以“从正态(高斯)分布中抽取随机样本”。
from scipy.stats import kstest, norm
from numpy.random import seed, normal
seed(42)
data = normal(80, 6, 1000)
# data = norm.rvs(loc=80, scale=6, size=1000)
ksstat, p_value = kstest(data, "norm")
if p_value > 0.05:
print('it looks like Gaussian (fail to reject H0)')
else:
print('it doesnt looks like Gaussian (reject H0)')
我已经检查了使用numpy
和scipy
生成正态分布的两种方法,但这并不能给出正态分布。
但是,通过转换(data - np.mean(data))/np.std(data)
,我得到的是正态分布。
我在这里想念的是什么? 为什么此检验不直接证明正态结果?
答案 0 :(得分:1)
scipy.stats.kstest
使用给定的分布参数(如果有)针对给定的分布测试数据。当您使用kstest(data, "norm")
时,分布是 standard 正态分布,均值为0,标准偏差为1。您生成的数据的均值为80,标准偏差为6,因此自然不匹配
您可以按照问题中显示的方式对数据进行归一化,或者,如果碰巧知道参数,则可以使用kstest
参数将其传递给args
:
ksstat, p_value = kstest(data, "norm", args=(80, 6))
或者,您可以根据数据估算参数:
ksstat, p_value = kstest(data, "norm", args=(data.mean(), data.std()))