用python和Excel进行列联表分析(卡方检验)

用python和Excel进行列联表分析

卡方检验回顾(独立性检验)

行(\(r_i\))列(\(c_j\)) \(j=1\) \(j=2\) \(\cdots\) 合计
\(i=1\) \(f_{11}\) \(f_{12}\) \(r_1\)
\(i=2\) \(f_{21}\) \(f_{22}\) \(r_2\)
\(\vdots\) \(\vdots\) \(\vdots\) \(\vdots\)
合计 \(c_1\) \(c_2\) \(\cdots\) \(n\)
  1. 建立原假设和备择假设

    \[H_0:\text{两变量独立 }vs\text{ }H_1:\text{两变量不独立 } \]

  2. 计算自由度和理论频数

    自由度:\((r-1)*(c-1)\),其中\(r,c\)分别是行数和列数

    我们将实际频数记作\(f_{ij}\),期望(理论)频数记作\(e_{ij}\),且\(e_{ij}=\frac{r_i*c_j}{n}\)

  3. 计算卡方统计量

    \[\chi^{2}=\sum\limits_{i=1}^{r} \sum\limits_{j=1}^{c} \frac{\left(f_{i j}-\mathrm{e}_{i j}\right)^{2}}{\mathrm{e}_{i j}} \sim \chi^{2}(d f) \]

    实际观察次数与理论次数之差的平方再除以理论次数得到的统计量近似服从卡方分布

  4. 查χ2方分布临界值表,确定接受域

    \[\chi_{1-\frac{\alpha}{2}}^{2}(\mathrm{df})<\chi^{2}<\chi_{\frac{\alpha}{2}}^{2}(\mathrm{df}) \]

数据示例

真实频数 总计
未流失 29699 8954 38653
流失 9660 2762 12422
总计 39359 11716 51075

Excel操作

计算期望频数

期望频数 总计
未流失 29786.46 9572.54 39359
流失 8866.54 2849.46 11716
总计 38653 12422 51075

以及真实频数和期望频数的差值

0.257 0.799
0.863 2.684
  • p值:excel用=CHISQ.TEST(真实频数,期望频数),wps用=CHITEST(真实频数,期望频数)来计算。
  • 卡方统计量:用=SUM()合计差值区域即可
  • 自由度:如前文所述
  • 1-置信水平:一般选0.1,0.05,0.01
  • 接受域上下界:excel用=CHISQ.INV.RT(置信水平/2,自由度),wps用=CHISQ.INV(置信水平/2,自由度)

所给数据计算结果如下:

p值 0.031916
卡方统计量 4.603016363
自由度 1
\(\alpha\) 0.01
上界 3.92704E-05
下界 6.634896601

Python代码解决方案

使用scipy.stats.chi2_contingency来进行卡方检验。

import numpy as np
from scipy.stats import chi2_contingency
#性别
d = np.array([[29699,9660], [8954,2762]])
chi2_contingency(d, correction = False)
#默认correction = True,这里是为了和excel计算结果一致

关于correction参数,如果为True,且自由度为1,则应用Yates校正以保持连续性。 校正的效果是将每个观察值向相应的期望值调整0.5。

Yates correction资料点击此处,总之它会使得卡方统计量更接近卡方分布。

输出结果如下

(4.60301636324016,
 0.03191575584773069,
 1,
 array([[29786.45965737,  8866.54034263],
        [ 9572.54034263,  2849.45965737]]))

输出结果分别为

  • 卡方统计量
  • p值
  • 自由度
  • 期望频数

这题p值约为0.032,也就是说当显著性水平\(\alpha\)大于0.032时我们会拒绝原假设,当\(\alpha<0.032\)时我们会接受原假设。如果选择\(\alpha=0.05\),那么拒绝原假设,认为性别与流失是不独立的。

posted @ 2020-06-10 13:35  大超Zeo  阅读(3431)  评论(0编辑  收藏  举报