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, array_like, 或 callable

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

cdfstr, array_like 或 callable

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

参数tuple, 序列, 可选

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

Nint, 可选

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

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

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

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

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

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

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

  • ‘approx’ : 近似于两倍的一侧概率的双侧概率

  • ‘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 检验统计量,可以是 D+、D- 或 D(两者的最大值)

p值浮动

单尾或双尾 p 值。

统计位置浮动

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

在两样本检验中,这是从 rvscdf 得到的值,对应于 KS 统计量;即,经验分布函数之间的距离是在此观测值处测量的。

统计显著性整数

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

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

参见

ks_1samp, ks_2samp

注释

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

  • 双侧: 原假设是两个分布相同,即对所有 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,而不是一个 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的阈值,因此我们不能拒绝零假设。