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,可选
分布参数,在 rvs 或 cdf 是字符串或可调用的对象时使用。
- 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 的值;即,按此观察值衡量经验分布函数与假设的累积分布函数之间的距离。
在二样本检验中,这是与rvs 或cdf 对应的 KS 统计量;即,按此观察值衡量两个经验分布函数之间的距离。
- statistic_sign整数
在一样本检验中,如果 KS 统计量是经验分布函数与假设累积分布函数之间的最大正差异 (D+),则此值为 +1;如果 KS 统计量是最大负差异 (D-),则此值为 -1。
在二样本检验中,如果在statistic_location 处rvs 的经验分布函数超过cdf 的经验分布函数,则此值为 +1;否则为 -1。
注释
使用替代参数可以选择零和对应的备择假设的三个选项。
双向:原假设是所有 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
,而不是 2Dnp.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,因此我们无法拒绝原假设。