当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.kurtosistest用法及代码示例


本文简要介绍 python 语言中 scipy.stats.kurtosistest 的用法。

用法:

scipy.stats.kurtosistest(a, axis=0, nan_policy='propagate', alternative='two-sided')#

测试数据集是否具有正常峰度。

此函数检验零假设,即从中抽取样本的总体的峰度是正态分布的峰度。

参数

a 数组

样本数据的数组。

axis int 或无,可选

计算测试的轴。默认值为 0。如果没有,则计算整个数组 a。

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

定义当输入包含 nan 时如何处理。以下选项可用(默认为‘propagate’):

  • ‘propagate’:返回 nan

  • ‘raise’:引发错误

  • ‘omit’:执行忽略 nan 值的计算

alternative {‘双面’,‘less’, ‘greater’},可选

定义备择假设。可以使用以下选项(默认为“双面”):

  • “双面”:样本分布的峰度与正态分布的峰度不同

  • ‘less’:样本基础分布的峰度小于正态分布的峰度

  • ‘greater’:样本基础分布的峰度大于正态分布的峰度

返回

statistic 浮点数

此测试的计算 z-score。

pvalue 浮点数

假设检验的 p 值。

注意

仅对 n>20 有效。该函数使用 [1] 中说明的方法。

参考

[1] (1,2)

参见例如F. J. Anscombe,W. J. Glynn,“正常样本的峰度统计量 b2 的分布”,Biometrika,第一卷。 70,第 227-234 页,1983 年。

[2]

夏皮罗,S.S. 和威尔克,M.B. (1965)。正态性方差检验分析(完整样本)。生物计量学,52(3/4),591-611。

[3]

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

[4]

帕纳吉奥塔科斯,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 re-use 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()
scipy-stats-kurtosistest-1_00_00.png

比较通过 p 值进行量化:零分布中比统计观察值极端或更极端的值的比例。在统计量为正的双边测试中,大于观察到的统计量的零分布元素和小于观察到的统计量的负值的零分布元素均被视为 “more extreme”。

>>> 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()
scipy-stats-kurtosistest-1_01_00.png
>>> res.pvalue
0.0211764592113868

如果 p 值为 “small” - 也就是说,如果从正态分布总体中采样数据产生统计数据的极值的概率较低 - 这可以作为反对零假设的证据另一种选择:权重不是从正态分布中得出的。注意:

  • 反之则不成立;也就是说,检验不用于为原假设提供证据。

  • 将被视为 “small” 的值的阈值是在分析数据之前应做出的选择 [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()
scipy-stats-kurtosistest-1_02_00.png
>>> res.pvalue
0.0272  # may vary

此外,尽管具有随机性,以这种方式计算的 p 值可用于精确控制原假设的错误拒绝率 [4]。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.kurtosistest。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。