scipy.stats.

ks_2samp#

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

针对拟合优度进行二样本 Kolmogorov-Smirnov 检验。

此检验将两个独立样本的底层连续分布 F(x) 和 G(x) 进行了比较。有关可用原假设和备择假设的说明,请参阅备注。

参数:
data1, data2类数组,一维

两个样本观测数组,假定从连续分布中提取,样本量可能不同。

alternative{‘two-sided’, ‘less’, ‘greater’},可选

定义了原假设和备择假设。默认值为“two-sided”。有关说明,请参见以下备注。

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

定义了用于计算 p 值的方法。可用选项如下(默认值为“auto”)

  • “自动”:小数组用“完全”、大数组用“渐近”

  • “完全”:使用检验统计量的完全分布

  • “渐近”:使用检验统计量的渐近分布

axisint 或 Null,默认值为:0

如果为 int,则计算统计量时使用的输入的轴。输入的每个轴片段(例如行)的统计量将出现在输出的相应元素中。如果 None,则在计算统计量之前对输入进行展开。

nan_policy{'propagate', 'omit', 'raise'}

定义如何处理输入的 NaN。

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

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

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

keepdimsbool,默认值为:False

如果将其设置为 True,则会将缩减的轴作为一维保留在结果中。通过此选项,结果将针对输入数组正确地广播。

返回:
res: KstestResult

包含属性的对象

statisticfloat

KS 检验统计量。

pvaluefloat

单尾或双尾 p 值。

statistic_locationfloat

data1data2 的值与 KS 统计量相对应;也就是说,经验分布函数之间的距离在这次观察中得到衡量。

statistic_signint

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

注意

可以使用 alternative 参数选择的零假设和相应的备择假设有三个选项。

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

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

  • two-sided:零假设是对于所有 x,两个分布相同,F(x)=G(x);备择假设是它们不相同。统计量是在样本的经验分布函数的最大绝对差的幅度。

请注意,备择假设描述了底层分布的 CDF,而不是观察到的数据值。例如,假设 x1 ~ F 并且 x2 ~ G。如果 F(x) > G(x) 对于所有 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,而不是一个二维 np.matrix。同样地,尽管掩码数组的掩码元素会被忽略,但输出将是一个标量或 np.ndarray,而不是一个 mask=False 的掩码数组。

参考文献

[1]

霍奇斯,“Smirnov 二样本检验的显著性概率”,Arkiv fiur Matematik,3,第 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 值小于我们的临界值,我们将拒绝零假设并转而支持备择假设。