scipy.stats.

kstest#

scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[source]#

对是否符合整体分布性执行(单样本或双样本)Kolmogorov-Smirnov 检验。

单样本检验将样本的基本分布 F(x) 与给定的分布 G(x) 进行比较。双样本检验将两个独立样本的基本分布进行比较。这两个检验仅适用于连续分布。

参数:
rvs字符串、类似数组或可调用对象

如果是一个数组,它应该是随机变量观测的 1-D 数组。如果它是一个可调用的对象,它应该是一个生成随机变量的函数;它要求有一个关键字自变量 size。如果它是一个字符串,它应该是 scipy.stats 中分布的名称,该名称将用于生成随机变量。

cdfstr、array_like 或可调用对象

如果是 array_like,它应该是随机变量观测的 1-D 数组,应该执行双样本检验(rvs 必须是 array_like)。如果是可调用对象,该可调用对象将用于计算 cdf。如果是字符串,它应该是 scipy.stats 中分布的名称,该名称将用作 cdf 函数。

argstuple、sequence,可选

分布参数,在 rvscdf 是字符串或可调用的对象时使用。

Nint,可选

如果 rvs 是字符串或可调用对象时的样本量。默认值为 20。

alternative{‘双边’,‘小于’,‘大于’},可选

定义原假设和备择假设。默认值为“双边”。请参阅下文中的说明。

method{‘auto’,‘精确’,‘近似’,‘渐近’},可选

为计算 p 值而使用的分布。以下选项可用(默认值为“auto”)

  • “auto”:选择其他选项中的一个。

  • “精确”:使用检验统计量的精确分布。

  • “近似”:用双边概率的两倍来近似双边概率

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

axisint 或 None,默认值:0

如果是一个 int,它是在其上计算该统计量的输入的轴。输入的每个轴片(例如行)的统计量将出现在输出的对应元素中。如果 None,则在计算统计量之前,输入将被展开。

nan_policy{‘传播’,‘省略’,‘引发’}

定义如何处理输入的 NaN。

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

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

  • 引发:如果存在 NaN,则会引发 ValueError

保留维度布尔值,默认值:False

如果将此设置为 True,则所简化的轴会作为大小为一的维度保留在结果中。使用此选项,结果将针对输入数组正确地广播。

返回:
res:KstestResult

包含属性的对象

statistic浮点数

KS 检验统计量,D+、D- 或 D(两者的最大值)

pvalue浮点数

单尾或双尾 p 值。

statistic_location浮点数

在一样本检验中,这是与 KS 统计量对应rvs 的值;即,按此观察值衡量经验分布函数与假设的累积分布函数之间的距离。

在二样本检验中,这是与rvscdf 对应的 KS 统计量;即,按此观察值衡量两个经验分布函数之间的距离。

statistic_sign整数

在一样本检验中,如果 KS 统计量是经验分布函数与假设累积分布函数之间的最大正差异 (D+),则此值为 +1;如果 KS 统计量是最大负差异 (D-),则此值为 -1。

在二样本检验中,如果在statistic_locationrvs 的经验分布函数超过cdf 的经验分布函数,则此值为 +1;否则为 -1。

另请参阅

ks_1sampks_2samp

注释

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

  • 双向:原假设是所有 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。如果 F(x) > G(x) 适用于所有 x,则 x1 中的值往往小于 x2 中的值。

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

示例

假设我们希望检验样本根据标准正态分布的零假设。我们选择 95% 的置信度;也就是说,如果 p 值小于 0.05,我们将拒绝零假设而赞成备选假设。

在对均匀分布的数据进行检验时,我们会希望拒绝零假设。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> stats.kstest(stats.uniform.rvs(size=100, random_state=rng),
...              stats.norm.cdf)
KstestResult(statistic=0.5001899973268688,
             pvalue=1.1616392184763533e-23,
             statistic_location=0.00047625268963724654,
             statistic_sign=-1)

实际上,p 值低于我们的阈值 0.05,因此我们将拒绝零假设而赞成默认的“双边”备选假设:数据是根据标准正态分布的。

在对标准正态分布的随机变量进行检验时,我们希望大多数时候数据与零假设一致。

>>> x = stats.norm.rvs(size=100, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf)
KstestResult(statistic=0.05345882212970396,
             pvalue=0.9227159037744717,
             statistic_location=-1.2451343873745018,
             statistic_sign=1)

不出所料,p 值为 0.92,并不低于我们的阈值 0.05,因此我们无法拒绝零假设。

然而,假设随机变量根据向较大值偏移的正态分布。在这种情况下,基础分布的累积密度函数 (CDF) 往往小于标准正态分布的 CDF。因此,我们希望使用 alternative='less' 拒绝零假设

>>> x = stats.norm.rvs(size=100, loc=0.5, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

实际上,p 值小于我们的阈值,因此我们将拒绝零假设而赞成备选假设。

出于方便,可以使用分布的名称作为第二个参数来执行之前的检验。

>>> stats.kstest(x, "norm", alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

上面的示例都是单样本检验,与 ks_1samp 执行的检验相同。请注意,kstest 还可以执行两样本检验,与 ks_2samp 执行的检验相同。例如,当两个样本从同分布中抽取时,我们希望数据在大多数时候符合原假设。

>>> sample1 = stats.laplace.rvs(size=105, random_state=rng)
>>> sample2 = stats.laplace.rvs(size=95, random_state=rng)
>>> stats.kstest(sample1, sample2)
KstestResult(statistic=0.11779448621553884,
             pvalue=0.4494256912629795,
             statistic_location=0.6138814275424155,
             statistic_sign=1)

正如预期的那样,p 值 0.45 未低于我们的阈值 0.05,因此我们无法拒绝原假设。