我有一个要测试正态性的N个数据集。
我知道scipy.stats有一个kstest function
但是没有关于如何使用它以及如何解释结果的示例。
这里有人可以给我一些建议吗?
根据文档,使用kstest返回两个数字,即KS测试统计量D和p值。
如果p值大于显着性水平(例如5%),则我们不能拒绝数据来自给定分布的假设。
当我通过从正态分布中提取10000个样本并测试高斯来进行测试时:
import numpy as np
from scipy.stats import kstest
mu,sigma = 0.07, 0.89
kstest(np.random.normal(mu,sigma,10000),'norm')
我得到以下输出:
p值小于5%,这意味着我们可以拒绝数据呈正态分布的假设。但是样本是从正态分布中提取的!
有人可以在这里给我理解和解释吗?
(是否进行正态性测试假设mu = 0和sigma = 1?如果是,我如何测试我的数据是否呈高斯分布,但mu和sigma不同?)
最佳答案
您的数据是使用mu = 0.07和sigma = 0.89生成的。
您正在针对平均值为0,标准偏差为1的正态分布测试此数据。
零假设(H0
)是您的数据作为样本的分布等于标准正态分布,平均值为0,标准差为1。
较小的p值表示预期具有概率p值的D的测试统计量。
换句话说,(p值为〜8.9e-22)H0
不太可能为真。
这是合理的,因为均值和标准偏差不匹配。
将您的结果与:
In [22]: import numpy as np
In [23]: import scipy.stats as stats
In [24]: stats.kstest(np.random.normal(0,1,10000),'norm')
Out[24]: (0.007038739782416259, 0.70477679457831155)
要测试您的数据是否为高斯,您可以对其进行移位和重新缩放,以使其平均值为0且标准差为1时是正常的:
data=np.random.normal(mu,sigma,10000)
normed_data=(data-mu)/sigma
print(stats.kstest(normed_data,'norm'))
# (0.0085805670733036798, 0.45316245879609179)
警告:(many thanks to user333700(aka scipy开发人员Josef Perktold))如果您不知道
mu
和sigma
,估计参数会使p值无效:import numpy as np
import scipy.stats as stats
mu = 0.3
sigma = 5
num_tests = 10**5
num_rejects = 0
alpha = 0.05
for i in xrange(num_tests):
data = np.random.normal(mu, sigma, 10000)
# normed_data = (data - mu) / sigma # this is okay
# 4915/100000 = 0.05 rejects at rejection level 0.05 (as expected)
normed_data = (data - data.mean()) / data.std() # this is NOT okay
# 20/100000 = 0.00 rejects at rejection level 0.05 (not expected)
D, pval = stats.kstest(normed_data, 'norm')
if pval < alpha:
num_rejects += 1
ratio = float(num_rejects) / num_tests
print('{}/{} = {:.2f} rejects at rejection level {}'.format(
num_rejects, num_tests, ratio, alpha))
打印
20/100000 = 0.00 rejects at rejection level 0.05 (not expected)
这表明
stats.kstest
可能不会拒绝预期的原假设数量如果使用样本的均值和标准差对样本进行归一化
normed_data = (data - data.mean()) / data.std() # this is NOT okay
关于python - 在python scipy中实现Kolmogorov Smirnov测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7903977/