scipy.stats.contingency.

chi2_contingency#

scipy.stats.contingency.chi2_contingency(observed, correction=True, lambda_=None, *, method=None)[源代码]#

列联表中变量独立性的卡方检验。

此函数计算卡方统计量和 p 值,用于检验列联表 [1] 中观察到的频率的独立性假设 observed。预期频率是基于独立性假设下的边际总和计算的;请参见 scipy.stats.contingency.expected_freq。自由度数为(使用 numpy 函数和属性表示)

dof = observed.size - sum(observed.shape) + observed.ndim - 1
参数:
observedarray_like

列联表。该表包含每个类别中的观察频率(即出现次数)。在二维情况下,该表通常被描述为“R x C 表”。

correctionbool, 可选

如果为 True,自由度为 1,则应用 Yates 连续性校正。校正的效果是将每个观察值向相应的预期值调整 0.5。

lambda_float 或 str, 可选

默认情况下,此测试中计算的统计量是皮尔逊卡方统计量 [2]lambda_ 允许使用 Cressie-Read 幂散度族 [3] 的统计量代替。有关详细信息,请参阅 scipy.stats.power_divergence

methodResamplingMethod, 可选

定义用于计算 p 值的方法。仅与 correction=False,默认的 lambda_ 和双向表兼容。如果 methodPermutationMethod/MonteCarloMethod 的实例,则使用 scipy.stats.permutation_test/scipy.stats.monte_carlo_test 以及提供的配置选项和其他适当的设置来计算 p 值。否则,p 值的计算如注释中所述。请注意,如果 methodMonteCarloMethod 的实例,则必须将 rvs 属性保留为未指定;蒙特卡洛样本始终使用 scipy.stats.random_tablervs 方法绘制。

在 1.15.0 版本中添加。

返回:
resChi2ContingencyResult

包含属性的对象

statisticfloat

检验统计量。

pvaluefloat

检验的 p 值。

dofint

自由度。如果 method 不是 None,则为 NaN。

expected_freqndarray,与 observed 的形状相同

基于该表的边际总和计算的预期频率。

注释

关于此计算有效性的一个经常引用的指导原则是,只有当每个单元格中的观察频率和预期频率都至少为 5 时,才应使用该测试。

这是对人口不同类别独立性的检验。只有当 observed 的维度为 2 或更大时,此测试才有意义。将测试应用于一维表将始终导致 expected 等于 observed 并且卡方统计量等于 0。

此函数不处理掩码数组,因为计算对于缺失值没有意义。

scipy.stats.chisquare 一样,此函数计算卡方统计量;此函数提供的便利是从给定的列联表计算出预期频率和自由度。如果这些已知,并且如果不需要 Yates 校正,则可以使用 scipy.stats.chisquare。也就是说,如果调用

res = chi2_contingency(obs, correction=False)

那么以下为真

(res.statistic, res.pvalue) == stats.chisquare(obs.ravel(),
                                               f_exp=ex.ravel(),
                                               ddof=obs.size - 1 - dof)

lambda_ 参数是在 scipy 的 0.13.0 版本中添加的。

参考文献

[3]

Cressie, N. 和 Read, T. R. C.,“Multinomial Goodness-of-Fit Tests”,J. Royal Stat. Soc. Series B, Vol. 46, No. 3 (1984), pp. 440-464。

示例

一个双向示例 (2 x 3)

>>> import numpy as np
>>> from scipy.stats import chi2_contingency
>>> obs = np.array([[10, 10, 20], [20, 20, 20]])
>>> res = chi2_contingency(obs)
>>> res.statistic
2.7777777777777777
>>> res.pvalue
0.24935220877729619
>>> res.dof
2
>>> res.expected_freq
array([[ 12.,  12.,  16.],
       [ 18.,  18.,  24.]])

使用对数似然比(即“G 检验”)而不是皮尔逊卡方统计量执行检验。

>>> res = chi2_contingency(obs, lambda_="log-likelihood")
>>> res.statistic
2.7688587616781319
>>> res.pvalue
0.25046668010954165

一个四向示例 (2 x 2 x 2 x 2)

>>> obs = np.array(
...     [[[[12, 17],
...        [11, 16]],
...       [[11, 12],
...        [15, 16]]],
...      [[[23, 15],
...        [30, 22]],
...       [[14, 17],
...        [15, 16]]]])
>>> res = chi2_contingency(obs)
>>> res.statistic
8.7584514426741897
>>> res.pvalue
0.64417725029295503

当双向表中元素的总和较小时,默认渐近近似产生的 p 值可能不准确。考虑将 PermutationMethodMonteCarloMethod 作为 method 参数传递,且 correction=False

>>> from scipy.stats import PermutationMethod
>>> obs = np.asarray([[12, 3],
...                   [17, 16]])
>>> res = chi2_contingency(obs, correction=False)
>>> ref = chi2_contingency(obs, correction=False, method=PermutationMethod())
>>> res.pvalue, ref.pvalue
(0.0614122539870913, 0.1074)  # may vary

有关更详细的示例,请参阅 列联表中变量独立性的卡方检验