scipy.stats.

kurtosistest#

scipy.stats.kurtosistest(a, axis=0, nan_policy='propagate', alternative='two-sided', *, keepdims=False)[source]#

测试数据集是否服从正态分布的峰度。

此函数检验此空假设,即所提取样本的人口的峰态与正态分布的峰态相同。

参数:
a数组

样本数据的数组。必须要包含至少五个观察值。

axisint 或 None,默认为 0

如果为 int,则为计算统计信息的输入轴。输入的每个轴切片(例如行)的统计信息将显示在输出的相应元素中。如果为 None,则在计算统计信息之前会对输入进行展开。

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

定义如何处理输入的 NaN。

  • propagate:如果在用于计算统计信息的轴切片(例如行)中存在 NaN,则输出的对应项将为 NaN。

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

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

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

定义备择假设。有以下选项可用(默认值为‘双边’)

  • ‘双边’:分布的峰度与正态分布的峰度不同

  • ‘小于’:分布的峰度小于正态分布的峰度

  • ‘大于’:分布的峰度大于正态分布的峰度

在版本 1.7.0 中添加。

保留维度bool,默认值:False

如果将其设置为 True,则减少的轴将以大小为 1 的尺寸的形式保留在结果中。使用此选项,结果将针对输入数组正确广播。

返回:
统计信息float

此检验的计算出的 z 分数。

p 值float

假设检验的 p 值。

备注

仅对 n>20 有效。此函数使用在 [1] 中描述的方法。

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

参考

[1] (1,2)

例如,请参阅 F. J. Anscombe、W. J. Glynn,“正态样本峰度统计信息 b2 的分布”,Biometrika,卷 70,第 227-234 页,1983 年。

[2]

Shapiro, S. S. 和 Wilk, M. B.(1965)。正态性分析方差检验(完整样本)。Biometrika,52(3/4),591-611。

[3]

B. Phipson 和 G. K. Smyth。“排列 P 值不应永远为零:在随机抽取排列时计算精确 P 值”。统计应用程序,用于遗传学和分子生物学,9.1(2010)。

[4]

Panagiotakos,D. B.(2008)。生物医学研究中 p 值的价值。开放心血管医学杂志,2,97。

示例

假设我们希望从测量结果中推断医学研究中成年男性体重分布是否不符合正态分布[2]。体重(磅)记录在以下数组 x 中。

>>> import numpy as np
>>> x = np.array([148, 154, 158, 160, 161, 162, 166, 170, 182, 195, 236])

来自[1]的峰度检验首先根据样本(过量/Fisher)峰度计算统计量。

>>> from scipy import stats
>>> res = stats.kurtosistest(x)
>>> res.statistic
2.3048235214240873

(检验警告我们的样本观察次数太少,无法执行检验。我们将在示例的末尾返回此问题。)由于正态分布具有零过量峰度(根据定义),对于从正态分布中提取的样本,该统计量的量级往往较低。

检验通过比较统计量的观测值与零分布执行:即在权重是从正态分布中提取的零假设下获得的统计量值的分布。

对于此检验,极大样本的统计量零分布是标准正态分布。

>>> import matplotlib.pyplot as plt
>>> dist = stats.norm()
>>> kt_val = np.linspace(-5, 5, 100)
>>> pdf = dist.pdf(kt_val)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> def kt_plot(ax):  # we'll reuse this
...     ax.plot(kt_val, pdf)
...     ax.set_title("Kurtosis Test Null Distribution")
...     ax.set_xlabel("statistic")
...     ax.set_ylabel("probability density")
>>> kt_plot(ax)
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_00_00.png

通过 p 值对比较进行量化:零分布中极端或比统计量极端观测值更极端的值的比例。在统计量为正值的双边检验中,大于观测统计量的零分布元素和小于观测统计量负值的零分布元素都认为是“更极端”。

>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> kt_plot(ax)
>>> pvalue = dist.cdf(-res.statistic) + dist.sf(res.statistic)
>>> annotation = (f'p-value={pvalue:.3f}\n(shaded area)')
>>> props = dict(facecolor='black', width=1, headwidth=5, headlength=8)
>>> _ = ax.annotate(annotation, (3, 0.005), (3.25, 0.02), arrowprops=props)
>>> i = kt_val >= res.statistic
>>> ax.fill_between(kt_val[i], y1=0, y2=pdf[i], color='C0')
>>> i = kt_val <= -res.statistic
>>> ax.fill_between(kt_val[i], y1=0, y2=pdf[i], color='C0')
>>> ax.set_xlim(-5, 5)
>>> ax.set_ylim(0, 0.1)
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_01_00.png
>>> res.pvalue
0.0211764592113868

如果 p 值“小”,即从产生统计量极端值的正态分布总体抽取数据的概率很低,则可以将其视为反对零假设、支持备择假设的证据:权重不是从正态分布中提取的。注意

  • 逆命题不成立;也就是说,检验不用于提供支持零假设的证据。

  • 将被视为“小”的阈值是应在数据分析前做出的一种选择[3],同时考虑假阳性(错误地否定零假设)和假阴性(未否定虚假零假设)的风险。

注意标准正态分布提供了零分布的渐近近似值;它仅适用于包含许多观察值的样本。这就是我们在示例开头收到警告的原因;我们的样本相当小。在这种情况下,scipy.stats.monte_carlo_test可能会提供对精确 p 值更准确但随机的近似值。

>>> def statistic(x, axis):
...     # get just the skewtest statistic; ignore the p-value
...     return stats.kurtosistest(x, axis=axis).statistic
>>> res = stats.monte_carlo_test(x, stats.norm.rvs, statistic)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> kt_plot(ax)
>>> ax.hist(res.null_distribution, np.linspace(-5, 5, 50),
...         density=True)
>>> ax.legend(['aymptotic approximation\n(many observations)',
...            'Monte Carlo approximation\n(11 observations)'])
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_02_00.png
>>> res.pvalue
0.0272  # may vary

此外,尽管存在随机性,但仍可以通过这种方法计算的 p 值来精确地控制错误拒绝零假设的比率 [4]