scipy.stats.

kstest#

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

执行 (单样本或双样本) Kolmogorov-Smirnov 拟合优度检验。

单样本检验将样本的潜在分布 F(x) 与给定分布 G(x) 进行比较。双样本检验比较两个独立样本的潜在分布。这两个检验仅对连续分布有效。

参数:
rvsstr、类数组或可调用对象

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

cdfstr、类数组或可调用对象

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

argstuple、序列,可选

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

Nint,可选

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

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

定义原假设和备择假设。默认为 ‘two-sided’。请参阅下面的注释中的解释。

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

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

  • ‘auto’:选择其他选项之一。

  • ‘exact’:使用检验统计量的精确分布。

  • ‘approx’:用单侧概率的两倍来近似双侧概率

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

axisint 或 None,默认:0

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

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

定义如何处理输入 NaN。

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

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

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

keepdimsbool,默认:False

如果设置为 True,则会将缩减的轴作为大小为 1 的维度留在结果中。使用此选项,结果将与输入数组正确广播。

返回:
res: KstestResult

一个包含属性的对象

statisticfloat

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

pvaluefloat

单尾或双尾 p 值。

statistic_locationfloat

在单样本检验中,这是与 KS 统计量对应的 rvs 的值;也就是说,在这个观测值处测量经验分布函数和假设的累积分布函数之间的距离。

在双样本检验中,这是与 KS 统计量对应的 rvscdf 的值;也就是说,在这个观测值处测量经验分布函数之间的距离。

statistic_signint

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

在双样本检验中,如果 rvs 的经验分布函数在 statistic_location 处超过 cdf 的经验分布函数,则为 +1,否则为 -1。

另请参阅

ks_1sampks_2samp

备注

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

  • two-sided:原假设是两个分布相同,对于所有 x,F(x)=G(x);备择假设是它们不相同。

  • less:原假设是对于所有 x,F(x) >= G(x);备择假设是对于至少一个 x,F(x) < G(x)。

  • greater:原假设是对于所有 x,F(x) <= G(x);备择假设是对于至少一个 x,F(x) > G(x)。

请注意,备择假设描述的是潜在分布的CDF,而不是观测值。例如,假设 x1 ~ F 且 x2 ~ G。如果对于所有 x,F(x) > G(x),则 x1 中的值往往小于 x2 中的值。

从 SciPy 1.9 开始,np.matrix 输入(不建议用于新代码)会在执行计算之前转换为 np.ndarray。在这种情况下,输出将是一个标量或具有适当形状的 np.ndarray,而不是二维 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)

正如预期的那样,0.92 的 p 值不低于我们的 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)

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