当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.ks_2samp用法及代码示例


本文简要介绍 python 语言中 scipy.stats.ks_2samp 的用法。

用法:

scipy.stats.ks_2samp(data1, data2, alternative='two-sided', method='auto')#

执行两个样本 Kolmogorov-Smirnov 拟合优度检验。

该测试比较了两个独立样本的基本连续分布 F(x) 和 G(x)。有关可用的无效假设和替代假设的说明,请参见注释。

参数

data1, data2 数组,一维

假设从连续分布中提取的两个样本观察数组,样本大小可以不同。

alternative {‘双面’,‘less’, ‘greater’},可选

定义原假设和备择假设。默认为“双面”。请参阅下面注释中的说明。

method {‘auto’, ‘exact’, ‘asymp’},可选

定义用于计算 p 值的方法。以下选项可用(默认为‘auto’):

  • ‘auto’ : use ‘exact’ for small size arrays, ‘asymp’ for large

  • ‘exact’ : use exact distribution of test statistic

  • ‘asymp’ : use asymptotic distribution of test statistic

返回

资源:KstestResult

包含属性的对象:

统计 浮点数

KS 检验统计量。

p值 浮点数

One-tailed 或 two-tailed p 值。

statistic_location 浮点数

data1 或 data2 中与 KS 统计量对应的值;即,在该观察中测量经验分布函数之间的距离。

statistic_sign int

如果 data1 的经验分布函数超过 statistic_location 处 data2 的经验分布函数,则 +1,否则 -1。

注意

可以使用替代参数选择零和相应替代假设的三个选项。

  • less:原假设是对于所有 x,F(x) >= G(x);另一种方法是对于至少一个 x,F(x) < G(x)。该统计量是样本的经验分布函数之间的最小(最负)差异的大小。

  • 更大:原假设是对于所有 x,F(x) <= G(x);另一种方法是对于至少一个 x,F(x) > G(x)。该统计量是样本的经验分布函数之间的最大(最正)差异。

  • 双面:原假设是两个分布相同,对于所有 x,F(x)=G(x);另一种情况是它们不相同。统计量是样本的经验分布函数之间的最大绝对差。

请注意,替代假设说明了CDF基本分布的值,而不是数据的观测值。例如,假设 x1 ~ F 和 x2 ~ G。如果对于所有 x,F(x) > G(x),则 x1 中的值往往小于 x2 中的值。

如果 KS 统计量很大,则 p 值会很小,这可以作为反对零假设、支持替代方案的证据。

如果 method='exact'ks_2samp 尝试计算精确的 p 值,即在零假设下获得与根据数据计算的值一样极端的检验统计值的概率。如果 method='asymp' ,则使用渐近 Kolmogorov-Smirnov 分布来计算近似 p 值。如果 method='auto' ,如果两个样本大小都小于 10000,则尝试精确的 p 值计算;否则,使用渐近方法。在任何情况下,如果尝试精确的 p 值计算但失败,则会发出警告,并返回渐近 p 值。

“双面”‘exact’ 计算计算互补概率,然后从 1 中减去。因此,它可以返回的最小概率约为 1e-16。虽然算法本身是精确的,但对于大样本量,数值误差可能会累积。它最适合其中一个样本量只有几千个的情况。

我们通常遵循 Hodges 对 Drion/Gnedenko/Korolyuk 的治疗 [1]。

参考

[1]

Hodges, J.L. Jr.,“Smirnov 双样本检验的显著性概率”,Arkiv fiur Matematik,3,第 43 期 (1958),469-86。

例子

假设我们希望检验两个样本来自同一分布的原假设。我们选择置信度为95%;也就是说,如果 p 值小于 0.05,我们将拒绝原假设并支持替代假设。

如果第一个样本来自均匀分布,而第二个样本来自标准正态分布,我们预计会拒绝原假设。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> sample1 = stats.uniform.rvs(size=100, random_state=rng)
>>> sample2 = stats.norm.rvs(size=110, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.5454545454545454, pvalue=7.37417839555191e-15)

事实上,p 值低于我们的阈值 0.05,因此我们拒绝原假设,转而支持默认的 “two-sided” 替代方案:数据并非来自相同的分布。

当两个样本都来自相同的分布时,我们期望数据在大多数情况下与原假设一致。

>>> sample1 = stats.norm.rvs(size=105, random_state=rng)
>>> sample2 = stats.norm.rvs(size=95, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.10927318295739348, pvalue=0.5438289009927495)

正如预期的那样,p 值 0.54 不低于我们的阈值 0.05,因此我们不能拒绝原假设。

然而,假设第一个样本是从向更大值移动的正态分布中抽取的。在这种情况下,基础分布的累积密度函数 (CDF) 往往是较少的比第二个样本下的 CDF。因此,我们期望原假设被拒绝alternative='less'

>>> sample1 = stats.norm.rvs(size=105, loc=0.5, random_state=rng)
>>> stats.ks_2samp(sample1, sample2, alternative='less')
KstestResult(statistic=0.4055137844611529, pvalue=3.5474563068855554e-08)

事实上,当 p 值小于我们的阈值时,我们拒绝零假设,转而支持替代方案。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.ks_2samp。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。