Python Scipy 中的两个样本 Kolmogorov-Smirnov 测试

Posted

技术标签:

【中文标题】Python Scipy 中的两个样本 Kolmogorov-Smirnov 测试【英文标题】:Two-sample Kolmogorov-Smirnov Test in Python Scipy 【发布时间】:2012-06-08 17:23:35 【问题描述】:

我不知道如何在 Scipy 中进行双样本 KS 测试。

看完文档scipy kstest

我可以看到如何测试分布与标准正态分布相同的位置

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
#>>> test_stat
#(0.021080234718821145, 0.76584491300591395)

这意味着在 p 值为 0.76 时,我们不能拒绝两个分布相同的原假设。

但是,我想比较两个分布,看看是否可以拒绝它们相同的原假设,例如:

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
z = np.random.normal(1.1,0.9, 1000)

并测试x和z是否相同

我尝试了天真:

test_stat = kstest(x, z)

并得到以下错误:

TypeError: 'numpy.ndarray' object is not callable

有没有办法在 Python 中进行两个样本的 KS 测试?如果是这样,我该怎么做?

提前致谢

【问题讨论】:

你能把线路和回溯贴出来吗? 【参考方案1】:

您正在使用单样本 KS 测试。您可能想要两个样本测试ks_2samp

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 
>>> np.random.seed(12345678)
>>> x = np.random.normal(0, 1, 1000)
>>> y = np.random.normal(0, 1, 1000)
>>> z = np.random.normal(1.1, 0.9, 1000)
>>> 
>>> ks_2samp(x, y)
Ks_2sampResult(statistic=0.022999999999999909, pvalue=0.95189016804849647)
>>> ks_2samp(x, z)
Ks_2sampResult(statistic=0.41800000000000004, pvalue=3.7081494119242173e-77)

结果可以解释如下:

    您可以根据您的样本大小将 python 给出的statistic 值与KS-test critical value table 进行比较。当statistic值高于临界值时,两种分布不同。

    或者您可以将p-value 与显着性水平a 进行比较,通常a=0.05 或0.01(由您决定,a 越低,越显着)。如果p值低于a,那么这两个分布很可能不同。

【讨论】:

这正是我想要的。非常感谢! 您如何解释这些结果?看看statisticp-value,你能说样本来自同一个分布吗? @FaCoffee 这就是 scipy 文档所说的:“如果 KS 统计量很小或 p 值很高,那么我们不能拒绝两个样本的分布是一样。"【参考方案2】:

这是 scipy 文档所说的:

如果 K-S 统计量较小或 p 值较高,则不能拒绝两个样本的分布相同的假设。

不能拒绝不代表我们确认。

【讨论】:

你能更详细地解释你的答案吗?提前致谢! @KingReload 表示当p值非常小时,说明这两个样本Not来自同一个分布的概率非常大低的。换句话说,这两个样本来自同一分布的概率非常高。但是您不能 100% 确定这一点,因此 p 值永远不会为零。 (有时它们显示为 0,但实际上,它永远不会为零)。这就是为什么说我们未能拒绝原假设而不是我们接受原假设。接受零假设 = 两个样本的分布相同 p 值高很可能它们来自同一分布,p 值小很可能它们不是。 @MDAbidHasan 倒退了。确实,他们在文档中举了一个例子:For an identical distribution, we cannot reject the null hypothesis since the p-value is high, 41%: >>> >>> rvs4 = stats.norm.rvs(size=n2, loc=0.0, scale=1.0) >>> stats.ks_2samp(rvs1, rvs4) (0.07999999999999996, 0.41126949729859719)

以上是关于Python Scipy 中的两个样本 Kolmogorov-Smirnov 测试的主要内容,如果未能解决你的问题,请参考以下文章

Scipy t-test统计中的一个样本?

python Scipy - 一个样本t检验

层次聚类及scipy中的层次聚类python代码解释

`python`中的加权高斯核密度估计

对于k样本的scipy Anderson-Darling检验中的数学溢出错误

为啥 SciPy 在样本方差为 0 的 t 检验中返回“nan”?