scipy.stats.

chisquare#

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

执行皮尔逊卡方检验。

皮尔逊卡方检验 [1] 是一种多项分布的拟合优度检验,用于检验观察到的频数(计数)是否来自具有给定期望频数的分类分布的独立抽样;也就是说,它评估观察到的频数是否能由具有给定期望频数的分类分布独立抽样得到。

参数:
f_obsarray_like

每个类别的观测频率。

f_exparray_like, optional

各类的期望频数。默认情况下,假定各类别是等可能出现的。

ddofint, optional

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

axisint 或 None, 默认: 0

如果为 int,则为输入沿其计算统计量的轴。输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。如果为 None,则在计算统计量之前将输入展平。

sum_checkbool, optional

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

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

定义如何处理输入 NaN。

  • propagate:如果计算统计量的轴切片(例如,行)中存在 NaN,则输出的相应条目将为 NaN。

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

  • raise:如果存在 NaN,将引发 ValueError

keepdimsbool, 默认: False

如果设置为 True,则减少的轴将保留在结果中,作为大小为一的维度。使用此选项,结果将与输入数组正确广播。

返回:
res: Power_divergenceResult

一个包含属性的对象

statisticfloat 或 ndarray

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

pvaluefloat 或 ndarray

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

另请参阅

scipy.stats.power_divergence
scipy.stats.fisher_exact

Fisher 精确检验,用于 2x2 列联表。

scipy.stats.barnard_exact

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

卡方检验

扩展示例

附注

当各类别的观察频数或期望频数太小时,此检验无效。通常的规则是,所有观察频数和期望频数都应至少为 5。根据 [2],建议总观察数大于 13,否则应使用精确检验(如 Barnard 的精确检验),因为它们不会过度拒绝。

默认自由度 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 个自由度的卡方分布。

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

数组 API 标准支持

chisquare 除了 NumPy 外,还对符合 Python Array API Standard 的后端提供了实验性支持。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 来测试这些功能,并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

[1]

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

[2]

Pearson, Karl。“关于一个给定的偏差系统与变量的相关系统偏离其概率的判定是否可以合理地假定是由于随机抽样产生的”,Philosophical Magazine。系列 5. 50 (1900),页 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 为 2-D 时,默认情况下,该检验应用于每一列。

>>> 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]))

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