我有一个要测试正态性的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))如果您不知道musigma,估计参数会使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/

10-12 17:53
查看更多