卡方检验 -- 统计学





中文名
卡方检验
外文名
chi-square test ;X,2-test
种    类
假设检验方法
应    用
分类资料统计推断
作    用
资料分析
定    义
观测值与理论值之间的偏离程度





定义


为什么要叫“卡方”?因为原名是 “chi-squared”,一半是音译,一半是意译。其中,chi 是希腊字母 X 的读音,其实读音更像是“开”,而不是“卡”。square 表示平方,因此在英语中,卡方分布写作 X distribution。



卡方检验属于非参数检验, 由于非参数检验不存在具体参数和总体正态分布的假设, 所有有时被称为自由分布检验.


参数和非参数检验最明显的区别是它们使用数据的类型.


卡方检验主要用于研究定类与定类数据之间的差异关系。一般使用卡方检验进行分析的目的是比较差异性。

如现状调查类问卷,以及一般调查问卷中,常使用卡方检验对样本背景信息题(性别、年龄等指标)与核心题项进行交叉分析,来说明样本背景这类指标对核心变量是否存在影响。



卡方分布


在理解卡方检验之前,应当理解卡方分布。卡方分布是一种连续概率分布。

如果一个随机变量 Z 服从标准正态分布,即 Z ~ N(0,1),那么 Z2 就服从自由度为 1 的卡方分布。记作 Z2 ~ X1或者 Z2  ~ X2(1)


而如果Z1, Z2, ... , Zk 都服从标准正态分布,那么它们的平方和服从自由度为 k 的卡方分布,记作:

Z12 + Z22 + ... + Zk2 ~ Xk2







基本原理


卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。

注意:卡方检验针对分类变量。


步骤


(1)提出原假设:
H0:总体 X 的分布函数为 F(x).
如果总体分布为离散型,则假设具体为
H0:总体 X 的分布律为 P{X=xi} = pi, i=1,2,...
(2)将总体 X 的取值范围分成 k 个互不相交的小区间 A1,A2,A3,…,Ak,如可取
A1=(a0,a1],A2=(a1,a2],...,Ak=(ak-1, ak),
其中 a0 可取 -∞,ak 可取 +∞,区间的划分视具体情况而定,但要使每个小区间所含的样本值个数不小于5,而区间个数k不要太大也不要太小。
(3)把落入第 i 个小区间的 Ai 的样本值的个数记作 fi,成为组频数(真实值),所有组频数之和 f1+f2+...+fk 等于样本容量 n。
(4)当 H0 为真时,根据所假设的总体理论分布,可算出总体 X 的值落入第 i 个小区间 Ai 的概率 pi,于是,npi 就是落入第 i 个小区间 Ai 的样本值的理论频数(理论值)。
(5)当 H0 为真时,多次试验中样本值落入第 i 个小区间 Ai 的频率 fi/n 与概率 pi 应很接近,当 H0 不真时,则 fi/n 与 pi 相差很大。基于这种思想,皮尔逊引进如下检验统计量 

,在0假设成立的情况下服从自由度为 k-1 的卡方分布。



检验方法



用途


拟合优度检验 chi-squared test goodness of fit


某新闻说某个篮球明星的原地两连投的单次命中率是 0.8,根据历次比赛的数据汇总得到下面的表格:

一次两连投中的命中次数 0 1 2
观察次数 5 82 251

意思是说,在比赛中,有5次两连投是一次都没中,有82次是在两连投中命中1次。现在,我们来用卡方检验验证新闻说的 0.8 的命中率是否正确。零假设如下:

H0:两连投的成功次数符合二项分布,且概率为 p=0.8

(1)先根据零假设计算“期望”的命中次数分布:
由于总的观察次数为 5+82+251=338,于是在 p=0.8 成立的前提下,可以计算每种两连投结果的期望次数:
0次命中: 338 \times C_2^00.8^0 (1-0.8)^2=13.52
1次命中: 338 \times C_2^10.8^1 (1-0.8)^1=108.16
2次命中: 338 \times C_2^20.8^2 (1-0.8)^0=216.32

一次两连投中的命中次数 0 1 2
实际的观察次数 (observed) 5 82 251
期望的观察次数 (expected) 13.52 108.16 216.32

显然,期望的观察次数和实际的观察次数是有偏差的,那么问题在于这个偏差是否大到具有统计显著性,进而可以否定零假设。


(2)我们来构造卡方检验统计量(chi-squared test statistic):


这个值是把表里每个格子的实际值和期望值进行对比。为什么要用平方?目的在于规避正负号的影响。为什么要除以期望值?目的在于消除数量绝对值的影响。例如你预算3块钱的水,商家加价50元,那么这个波动是你无法忍受的,而你预算20万的车,商家加价50元,则变得可以忍受。也就是说,除以期望值目的在于聚焦于变化率,而不是变化量。

之后,把这些“变化率”加总得到 X2


而计算自由度有一个公式:

DF = (R -1) (C - 1)

其中 R 表示行数,C 表示列数。对于本例:

DF = (2 - 1) (3 - 1) = 2


从另一个角度解释为什么 DF=2:

前面的定义是如果是 k 个符合标准正态分布的 Zi2 相加,则自由度是 k,但是这里自有两个格子可以自由变化,第三个格子可以用总观察数减出来,例如 338-13.52-108.16=216.32。
因此,真正自由的只有2个格子,所以自由度是2。

好了,将格子的数据代入,求出检验统计量:



(3)根据自由度为2的卡方分布,找到检验统计量对应的位置:


不难理解,随着统计量增大,表示预期的分布和实际的分布的差异也就越来越大。

另外,由于通常意义上,p 值是越小越能推翻零假设,那么显然我们需要用右侧的面积来表示p值,这里用 Python 计算来代替查表:

from scipy.stats import chisquare

observed = [5, 82, 251] 
expected = [13.52, 108.16, 216.32]

output = chisquare(observed, expected)
print('statistic: {:.2f}, pvalue: {:.4f}'.format(output.statistic, output.pvalue))

输出:statistic: 17.26, pvalue: 0.0002

由于p值很小(假设我们的显著性水平的0.05),那么我们可以推翻零假设。


进一步的,我们来探索下,该运动员的两连投的成功次数分数是否真的符合二项分布。零假设:

H0:两连投的成功次数符合二项分布。

既然符合二项分布,那么我们需要先估算一下最合理的p概率,那当然是用总命中数除以总投篮数来计算了:


然后,用该概率值重复之前的计算,也就是先计算出一个期望的表格:

一次两连投中的命中次数 0 1 2
实际的观察次数 (observed) 5 82 251
期望的观察次数 (expected) 6.26 79.48 252.26

注意,这里的DF\ne 2,这是因为,我们每从数据估计一个参数,那么我们就损失一个自由度。这里用了一个平均命中的概率,因此自由度只有 DF=(R-1)(C-1)-1=1。

这时候,在使用 Python 进行计算时,注意调整默认的自由度:

# 如果根据数据推断均值,则损失一个额外的自由度,因此 ddof = 1
# 自由度 = number of cells - 1 - ddof
observed = [5, 82, 251] 
expected = [6.26, 79.48, 252.26]
output = chisquare(observed, expected, ddof=1)
print(output.statistic, output.pvalue)
这里的 ddof 就是额外损失的自由度,本意是“delta degree of freedom”
输出:statistic: 0.34, pvalue: 0.56
可以看到p值很大,因此不足以推翻零假设,也就是说该运动员的投篮命中次数可能真的是二项分布。









独立性检验 chi-squared test of independence


下面表格表示喝酒频率和与警察发生麻烦的频数。
以第一列为例,表示从不喝酒的人中,4992人不发生麻烦,71人会发生麻烦。
现在的问题是,能否从以下数据推断说喝酒频率和与警察发生麻烦这两个事件相互独立?

Never Occasional Frequent Row total
Trouble with police 71 154 398 623
No trouble with police 4992 2808 2737 10537
Column total 5063 2962 3135 11160

我们的零假设应该如何设计?如果要说明两者相互独立,那么上表的分布应该满足乘法公式。也就是说两个独立事件一起发生的概率等于分别发生的概率之积。
于是我们有:
p(trouble)=\dfrac{623}{11160} 发生麻烦的总人数除以总人数
p(never)=\dfrac{5063}{11160} 不喝酒的总人数除以总人数
进一步,根据总人数算出不喝酒而发生麻烦的人数的期望(下标表示零假设):
E_0(trouble \cap never)=p(trouble)\cdot p(never)\cdot 11160=282.6
用类似的算法,计算每一个格子在零假设成立的情况下的值,写在原表数据下的括号里:

Never Occasional Frequent Row total
Trouble with police 71
(282.6)
154
(165.4)
398
(175.0)
623
No trouble with police 4992
(4780.4)
2808
(2796.6)
2737
(2960.0)
10537
Column total 5063 2962 3135 11160

仔细观察可以看出,其实每个格子就是对应的:
p = (row\_total \times column\_total) / total
另外可以看到,零假设下的各个格子的行列之和与原来相同。这不是偶然的,我们用字母代替计算一下就知道了:

Never Occasional Frequent Row total
Trouble with police a b c a+b+c
No trouble with police d e f d+e+f
Column total a+d b+e c+f a+b+c+d+e+f

于是第一列的两个格子应该是:
\begin{aligned}E_0(trouble \cap never)&=\dfrac{(a+d)(a+b+c)}{a+b+c+d+e+f}\cdot\dfrac{(a+d)(d+e+f)}{a+b+c+d+e+f} \\ &=\dfrac{(a+d)(a+b+c+d+e+f)}{a+b+c+d+e+f}=a+d\end{aligned}
对于其他格子、行的总和,都一样,这里不多说了。

好,继续分析。我们直接用上表计算卡方统计量和p值:

from scipy.stats import chisquare

observed = [71, 154, 398, 4992, 2808, 2737]
expected = [282.6, 165.4, 175.0, 4780.4, 2796.6, 2960.0]

output = chisquare(observed, expected)
print('statistic: {:.2f}, pvalue: {:.4f}'.format(output.statistic, output.pvalue))

这部分计算方法和拟合优度是一样的,就不赘述了。计算发现这个p值非常小,接近0,因此我们可以推翻零假设。也就是说,喝酒的频率和被警察找麻烦的并不是独立的,而是相关的。















reference

https://baike.baidu.com/item/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C/2591853#:~:text=%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C%E5%B0%B1%E6%98%AF%E7%BB%9F%E8%AE%A1,%E6%A0%B7%E6%9C%AC%20%E7%9A%84%E5%AE%9E%E9%99%85%E8%A7%82%E6%B5%8B%E5%80%BC%E4%B8%8E%E7%90%86%E8%AE%BA%E6%8E%A8%E6%96%AD%E5%80%BC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%81%8F%E7%A6%BB%E7%A8%8B%E5%BA%A6%EF%BC%8C%E5%AE%9E%E9%99%85%E8%A7%82%E6%B5%8B%E5%80%BC%E4%B8%8E%E7%90%86%E8%AE%BA%E6%8E%A8%E6%96%AD%E5%80%BC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%81%8F%E7%A6%BB%E7%A8%8B%E5%BA%A6%E5%B0%B1%E5%86%B3%E5%AE%9A%E5%8D%A1%E6%96%B9%E5%80%BC%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%8D%A1%E6%96%B9%E5%80%BC%E8%B6%8A%E5%A4%A7%EF%BC%8C%E4%BA%8C%E8%80%85%E5%81%8F%E5%B7%AE%E7%A8%8B%E5%BA%A6%E8%B6%8A%E5%A4%A7%EF%BC%9B%E5%8F%8D%E4%B9%8B%EF%BC%8C%E4%BA%8C%E8%80%85%E5%81%8F%E5%B7%AE%E8%B6%8A%E5%B0%8F%EF%BC%9B%E8%8B%A5%E4%B8%A4%E4%B8%AA%E5%80%BC%E5%AE%8C%E5%85%A8%E7%9B%B8%E7%AD%89%E6%97%B6%EF%BC%8C%E5%8D%A1%E6%96%B9%E5%80%BC%E5%B0%B1%E4%B8%BA0%EF%BC%8C%E8%A1%A8%E6%98%8E%E7%90%86%E8%AE%BA%E5%80%BC%E5%AE%8C%E5%85%A8%E7%AC%A6%E5%90%88%E3%80%82

https://www.jianshu.com/p/fcfac399de13