Python Scipy中的双样本Kolmogorov-Smirnov检验

Aka*_*all 60 python statistics numpy distribution scipy

我无法弄清楚如何在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)
Run Code Online (Sandbox Code Playgroud)

这意味着在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)
Run Code Online (Sandbox Code Playgroud)

并测试x和z是否相同

我试过天真:

test_stat = kstest(x, z)
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

TypeError: 'numpy.ndarray' object is not callable
Run Code Online (Sandbox Code Playgroud)

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

先感谢您

DSM*_*DSM 95

您正在使用单样本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)
Run Code Online (Sandbox Code Playgroud)

  • @FaCoffee 这就是 scipy 文档所说的:“_如果 KS 统计量很小或 p 值很高,那么我们不能拒绝两个样本的分布相同的假设。_” (4认同)
  • 你如何解释这些结果?仅通过查看“statistic”和“p-value”,您能说样本来自相同的分布吗? (2认同)

小智 7

这就是 scipy 文档所说的:

如果 KS 统计量很小或 p 值很高,那么我们不能拒绝两个样本的分布相同的假设。

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

  • p 值高很可能来自相同的分布,p 值小可能不是。@MDAbidHasan 倒退了。事实上,他们给出的文档中的例子给出了一个例子:```对于相同的分布,我们不能拒绝原假设,因为 p 值很高,41%:>>> >>> rvs4 = stats.norm.rvs (size=n2, loc=0.0, scale=1.0) >>> stats.ks_2samp(rvs1, rvs4) (0.07999999999999996, 0.41126949729859719)``` (3认同)