scipy.stats.

chisquare#

scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0, *, sum_check=True)[源代码]#

执行皮尔逊卡方检验。

皮尔逊卡方检验[1]是对具有给定概率的多项分布的拟合优度检验;也就是说,它评估零假设,即观察到的频率(计数)是通过从具有给定期望频率的分类分布中独立采样N个观测值而获得的。

参数:
f_obsarray_like

每个类别中的观察频率。

f_exparray_like,可选

每个类别中的期望频率。默认情况下,假设类别具有相同的可能性。

ddofint,可选

“自由度增量”:对p值的自由度进行调整。p值是使用自由度为k - 1 - ddof的卡方分布计算的,其中k是类别的数量。ddof 的默认值为 0。

axisint 或 None,可选

应用测试的 f_obsf_exp 的广播结果的轴。如果 axis 为 None,则 f_obs 中的所有值都将被视为单个数据集。默认值为 0。

sum_checkbool,可选

是否执行 sum(f_obs) - sum(f_exp) == 0 的检查。 如果为 True(默认),当相对差异超过数据类型精度的平方根时引发错误。有关基本原理和可能的例外情况,请参见注释。

返回值:
res: Power_divergenceResult

包含属性的对象

statisticfloat 或 ndarray

卡方检验统计量。如果 axis 为 None 或 f_obsf_exp 为 1 维,则该值为浮点数。

pvaluefloat 或 ndarray

检验的 p 值。如果 ddof 和结果属性 statistic 为标量,则该值为浮点数。

另请参阅

scipy.stats.power_divergence
scipy.stats.fisher_exact

对 2x2 列联表进行费舍尔精确检验。

scipy.stats.barnard_exact

无条件精确检验。对于小样本量,是卡方检验的替代方法。

卡方检验

扩展示例

注释

当每个类别中观察到的或期望的频率太小时,此测试无效。一个典型的规则是所有观察到的和期望的频率都应至少为 5。根据[2],建议观测值的总数大于 13,否则应使用精确检验(例如巴纳德精确检验),因为它们不会过度拒绝。

默认自由度 k-1 用于未估计分布的任何参数的情况。如果通过高效的最大似然估计 p 个参数,则正确的自由度为 k-1-p。如果参数以不同的方式估计,则自由度可以在 k-1-p 和 k-1 之间。但是,渐近分布也可能不是卡方分布,在这种情况下,此测试不适用。

对于皮尔逊卡方检验,观察到的总计数和期望的总计数必须匹配,以便 p 值准确反映在零假设下观察到如此极端的统计值的概率。此函数可用于执行其他不需要总计数相等的统计检验。例如,为了检验零假设 f_obs[i] 服从期望为 f_exp[i] 的泊松分布,设置 ddof=-1sum_check=False。 此测试源于以下事实:均值和方差为 f_exp[i] 的泊松随机变量近似为具有相同均值和方差的正态分布;卡方统计量将观测值标准化、平方和求和;n 个平方标准正态变量之和服从自由度为 n 的卡方分布。

参考文献

[1]

“皮尔逊卡方检验”。维基百科https://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test

[2]

Pearson, Karl. “关于相关变量系统中给定偏差系统与概率的偏差系统,可以合理地假设它是由随机抽样引起的准则”,哲学杂志。系列 5. 50 (1900), pp. 157-175.

示例

当仅给出强制性的 f_obs 参数时,假设期望频率是均匀的,并由观察到的频率的平均值给出

>>> import numpy as np
>>> from scipy.stats import chisquare
>>> chisquare([16, 18, 16, 14, 12, 12])
Power_divergenceResult(statistic=2.0, pvalue=0.84914503608460956)

可选的 f_exp 参数给出期望频率。

>>> chisquare([16, 18, 16, 14, 12, 12], f_exp=[16, 16, 16, 16, 16, 8])
Power_divergenceResult(statistic=3.5, pvalue=0.62338762774958223)

f_obs 为二维时,默认情况下测试应用于每一列。

>>> obs = np.array([[16, 18, 16, 14, 12, 12], [32, 24, 16, 28, 20, 24]]).T
>>> obs.shape
(6, 2)
>>> chisquare(obs)
Power_divergenceResult(statistic=array([2.        , 6.66666667]), pvalue=array([0.84914504, 0.24663415]))

通过设置 axis=None,测试将应用于数组中的所有数据,这等效于将测试应用于展平的数组。

>>> chisquare(obs, axis=None)
Power_divergenceResult(statistic=23.31034482758621, pvalue=0.015975692534127565)
>>> chisquare(obs.ravel())
Power_divergenceResult(statistic=23.310344827586206, pvalue=0.01597569253412758)

ddof 是对默认自由度所做的更改。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=1)
Power_divergenceResult(statistic=2.0, pvalue=0.7357588823428847)

p 值的计算是通过广播卡方统计量与 ddof 完成的。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=[0, 1, 2])
Power_divergenceResult(statistic=2.0, pvalue=array([0.84914504, 0.73575888, 0.5724067 ]))

f_obsf_exp 也被广播。在以下示例中,f_obs 的形状为 (6,),f_exp 的形状为 (2, 6),因此广播 f_obsf_exp 的结果的形状为 (2, 6)。为了计算所需的卡方统计量,我们使用 axis=1

>>> chisquare([16, 18, 16, 14, 12, 12],
...           f_exp=[[16, 16, 16, 16, 16, 8], [8, 20, 20, 16, 12, 12]],
...           axis=1)
Power_divergenceResult(statistic=array([3.5 , 9.25]), pvalue=array([0.62338763, 0.09949846]))

有关更详细的示例,请参见卡方检验