什么是卡方检验
方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。
卡方检验的基本思想:
卡方分布为基础的一种常用假设检验方法,它的基本假设H0是:观察频数与期望频数没有差别。
它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。
例子1:四格卡方检验
以下为一个典型的四格卡方检验,我们想知道喝牛奶对感冒发病率有没有
| 感冒人数 | 未感冒人数 | 合计 | 感冒率 | |
|---|---|---|---|---|
| 喝牛奶组 | 43 | 96 | 139 | 30.94% |
| 不喝牛奶组 | 28 | 84 | 112 | 25.00% |
| 合计 | 71 | 180 | 251 | 28.29% |
通过简单的统计我们得出喝牛奶组和不喝牛奶组的感冒率为30.94%和25.00%,两者的差别可能是抽样误差导致,也有可能是牛奶对感冒率真的有影响。
为了确定真实原因,我们先假设喝牛奶对感冒发病率是没有影响的,即喝牛奶喝感冒时独立无关的,所以我们可以得出感冒的发病率实际是(43+28)/(43+28+96+84)= 28.29%
所以,理论的四格表应该如下表所示:
| 感冒人数 | 未感冒人数 | 合计 | |
|---|---|---|---|
| 喝牛奶组 | 139*0.2829 | 139*(1-0.2829) | 139 |
| 不喝牛奶组 | 112*0.2829 | 112*(1-0.2829) | 112 |
即下表:
| 感冒人数 | 未感冒人数 | 合计 | |
|---|---|---|---|
| 喝牛奶组 | 39.3231 | 99.6769 | 139 |
| 不喝牛奶组 | 31.6848 | 80.3152 | 112 |
| 合计 | 71 | 180 | 251 |
这里我们使用python实现一下
import scipy
import numpy as np
# 自己随便写的一串数字,但是他们之间是强相关的
array_1 = np.array([43,96])
array_2 = np.array([28,84])
chi2, p, dof, expected = scipy.stats.chi2_contingency([array_1,array_2])
print('卡方值', chi2)
print('p值', p)
print('自由度', dof)
卡方值 0.8043774474886893
p值 0.36978779888781643
自由度 1
p值小于0.95
如果喝牛奶喝感冒真的是独立无关的,那么四格表里的理论值和实际值差别应该会很小。
卡方检验
卡方检验的计算公式为:
卡方公式
其中,Ai为i水平的观察频数,Ei为i水平的期望频数,n为总频数,pi为i水平的期望频率。i水平的期望频数Ei等于总频数n×i水平的期望概率pi,k为单元格数。当n比较大时,χ2统计量近似服从k-1(计算Ei时用到的参数个数)个自由度的卡方分布
x2用于衡量实际值与理论值的差异程度(也就是卡方检验的核心思想),包含了以下两个信息:
- 实际值与理论值偏差的绝对大小(由于平方的存在,差异是被放大的)
- 差异程度与理论值的相对大小
例1卡方检验
根据卡方检验公式我们可以得出例1的卡方值为:
= (43 - 39.3231)平方 / 39.3231 + (28 - 31.6848)平方 / 31.6848 + (96 - 99.6769)平方 / 99.6769 + (84 - 80.3152)平方 / 80.3152 = 1.077
卡方分布的临界值:
上一步我们得到了卡方的值,但是如何通过卡方的值来判断喝牛奶和感冒是否真的是独立无关的?也就是说,怎么知道无关性假设是否可靠?
答案是,通过查询卡方分布的临界值表。
这里需要用到一个自由度的概念,自由度等于V = (行数 - 1) * (列数 - 1),对四格表,自由度V = 1。
对V = 1,喝牛奶和感冒95%概率不相关的卡方分布的临界概率是:3.84。即如果卡方大于3.84,则认为喝牛奶和感冒有95%的概率不相关。
显然1.077<3.84,没有达到卡方分布的临界值,所以喝牛奶和感冒独立不相关的假设不成立。
卡方值与p-value的关系
同一数据下,自由度一致,卡方值越大,p值越小,表示两组数据差异大












网友评论