scipy.stats.

ks_2samp#

scipy.stats.ks_2samp(data1, data2, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[源代码][源代码]#

执行两样本 Kolmogorov-Smirnov 检验以评估拟合优度。

此测试比较两个独立样本的底层连续分布 F(x) 和 G(x)。有关可用零假设和备择假设的描述,请参见注释。

参数:
数据1, 数据2类似数组, 一维

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

替代方案{‘双侧’, ‘小于’, ‘大于’}, 可选

定义零假设和备择假设。默认是’双侧’。请参见下面的注释中的解释。

方法{‘auto’, ‘exact’, ‘asymp’}, 可选

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

  • ‘auto’ : 对于小尺寸数组使用 ‘exact’,对于大尺寸数组使用 ‘asymp’

  • ‘exact’ : 使用测试统计量的精确分布

  • ‘asymp’ : 使用检验统计量的渐近分布

int 或 None, 默认值: 0

如果是一个整数,表示输入数据中要计算统计量的轴。输入数据的每个轴切片(例如行)的统计量将出现在输出的相应元素中。如果为 None,则在计算统计量之前会将输入数据展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入的 NaN。

  • propagate: 如果在计算统计量的轴切片(例如行)中存在 NaN,则输出的相应条目将为 NaN。

  • omit: 在执行计算时,NaN 将被省略。如果在计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise: 如果存在 NaN,将引发 ValueError

keepdimsbool, 默认值: False

如果设置为True,被减少的轴将作为尺寸为1的维度保留在结果中。通过此选项,结果将正确地与输入数组进行广播。

返回:
res: KstestResult

一个包含属性的对象:

统计浮动

KS 检验统计量。

p值浮动

单尾或双尾 p 值。

统计位置浮动

来自 data1data2 的值对应于 KS 统计量;即,经验分布函数之间的距离在此观测值处测量。

统计显著性整数

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

注释

对于零假设和相应的备择假设,可以使用 alternative 参数选择三种选项。

  • less: 零假设是对于所有 x,F(x) >= G(x);备择假设是至少存在一个 x,使得 F(x) < G(x)。统计量是样本的经验分布函数之间最小(最负)差异的幅度。

  • greater: 零假设是对于所有 x,F(x) <= G(x);备择假设是至少存在一个 x,使得 F(x) > G(x)。统计量是样本经验分布函数之间的最大(最正)差异。

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

请注意,备择假设描述的是基础分布的*累积分布函数(CDFs)*,而不是数据的观测值。例如,假设 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 值。

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

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

从 SciPy 1.9 开始,np.matrix 输入(不推荐用于新代码)在计算执行前被转换为 np.ndarray。在这种情况下,输出将是一个标量或适当形状的 np.ndarray,而不是一个 2D 的 np.matrix。同样,虽然掩码数组的掩码元素被忽略,但输出将是一个标量或 np.ndarray,而不是一个 mask=False 的掩码数组。

参考文献

[1]

Hodges, J.L. Jr., “Smirnov两样本检验的显著性概率,” Arkiv fiur Matematik, 3, No. 43 (1958), 469-486.

示例

假设我们希望检验两个样本是从同一分布中抽取的零假设。我们选择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,
             statistic_location=-0.014071496412861274,
             statistic_sign=-1)

确实,p值低于我们0.05的阈值,因此我们拒绝原假设,支持默认的“双侧”备择假设:数据并非来自同一分布。

当两个样本都从同一分布中抽取时,我们预期数据在大多数情况下与零假设一致。

>>> 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,
             statistic_location=-0.1670157701848795,
             statistic_sign=-1)

如预期,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,
             statistic_location=-0.13249370614972575,
             statistic_sign=-1)

事实上,由于p值小于我们的阈值,我们拒绝原假设,支持备择假设。