文章目录
- 基本介绍
- 卡方分布
- 卡方检验
- 操作步骤
- 举例说明
- 代码实现
- 应用场景及python实现
- 两组类别样本之间分布差异比较
- 判定两组类别变量之间的相关性
- 机器学习中的监督分箱
- 特征选择
基本介绍
卡方检验是一种用途很广的计数资料的假设检验方法。属于非参数检验,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想在于比较理论频数和实际频数的吻合程度或者拟合优度问题。参考链接
应用条件:
要求样本含量应大于40且每个格子中的理论频数不应小于5。当样本含量大于40但有1=<理论频数<5时,卡方值需要校正,当样本含量小于40或理论频数小于1时只能用确切概率法计算概率。参考链接
卡方分布
在介绍卡方检验之前,首先了解一下卡方分布。
如果,,,,服从标准正态分布的样本,那么统计量
服从自由度为的卡方分布。
卡方分布的概率密度函数为:
其中,的定义为
卡方概率密度函数的图形表示为:
卡方检验
操作步骤
卡方检验是研究两个类别样本之间有没有显著的差异。其操作步骤为:
- 提出假设。
- 原假设:两个样本之间没有显著差异。
- 备择假设:两个样本之间存在显著差异。
- 计算卡方值。
卡方值的计算公式为:
有些书上的公式也写为:
为每个两个样本每种组合的频数,为其对应的期望频数。自由度 - 根据和计算置信度。与选定的的置信水平比较,确定是否显著。
置信度的计算结果指的是概率密度曲线值取时左侧的曲线面积。
一般是使用工具来根据卡方值和自由度来计算置信度。或者通过查表的方式,根据选定的显著水平和置信度,来确定显著水平下的值,比较实际卡方值和置信水平下的卡方值,从而确实是否否定原假设。
举例说明
- 原数据如下所示:样本R有两个类别R1和R2,样本C有两个类别C1和C2,在两个类别联合条件下的频数如表所示。
C1 | C2 | C3 | |
R1 | a | b | c |
R2 | d | e | f |
- 计算期望
C3 | ||||
以对应的单元格为例:
表示在整个数据集上的占比。
表示的是,如果两者没有显著差异,那么在中的比例,和在所有数据集上的比例应该是相同的。所以所有的为乘以相应的比例,就能够得到的期望数量。其他组合下的期望值也是如此。
- 结合上述两张表,套用卡方公式,就可以算出相应的卡方值。
代码实现
- 手动计算卡方值。代码如下所示:
这里要求传入的是一张交叉表,表的样式如3.2所示。 行和列各表示一组变量的值,表内指对应的数量。
from scipy import stats
import numpy as np
import pandas as pd
def my_chi2(df, q=0.95):
# make cross table for calculation
cross_table = df.groupby([0,1]).value_counts().unstack().fillna(0).values
expect_table = np.zeros(cross_table.shape)
# calculate expectation
row_count, col_count = cross_table.shape
dof = (row_count-1)*(col_count-1)
indexer = [[row, col] for row in range(row_count)
for col in range(col_count)]
for i, j in indexer:
expect_table[i,j] = np.sum(cross_table[:,j])*np.sum(cross_table[i,:])/np.sum(cross_table)
chi2 = np.sum((cross_table-expect_table)**2/expect_table)
# get theoretical chi2 value by confidence
std_chi2 = stats.chi2.ppf(q=0.95,df=dof)
return chi2, dof, chi2>std_chi2
- 另外还可以调用scipy中stats模块中的函数来实现。
其中,返回的结果中
- chi2为卡方值
- p为置信度
- dof为自由度
- expect为实际期望。
chi2,p,dof,expected = stats.chi2_contingency(obs)
应用场景及python实现
两组类别样本之间分布差异比较
这是卡方检验最常用的应用场景。当这样表述的时候,其实是站在列的视角上看待这个问题。如果两个列的分布完全相同,算出来的卡方值应该为0。
原假设为两个模型之间没有明显差异。
备择假设为两个模型之间有明显差异。
变量 | Y1 | Y2 |
X1 | a | b |
X2 | c | d |
如果方差大于置信度设定的方差,则否定原假设,就不能认为两个样本之间没有明显差异。
判定两组类别变量之间的相关性
在机器学习中,通常要判定两组自变量之间的相关性。当这样表述的时候,是从行(X)和列(Y)进行比较来看待这个问题的。X变量和Y变量完全不相关时,算出来的卡方值应该是0。完全相关时,卡方值应该最大。换一种思考方式是,Y1和Y2两列分布相同,说明Y1和Y2的分布不受X1和X2的影响,也就说明了X和Y是没有关系的。
变量 | Y1 | Y2 |
X1 | a | b |
X2 | c | d |
将上一节的原假设和备择假设进行转换为:
原假设:两个变量之间完全不相关。
备择假设:两个变量之间存在相关关系。
如果方差大于置信度设定的方差,则否定原假设,就不能认为两个样本之间没有明显差异。
机器学习中的监督分箱
利用卡方检验,结果进行有监督分箱。
其原理是,对于连续变量X和类别变量Y,通过划定X的最佳分箱位置,使得分开的两个类别X1和X2对于Y的差异最大,也就是X1和X2与Y的相关性最大。也就是卡方值最大,达到分箱的目的。
特征选择
其原理和4.2是一样的,通过判断每一组特征和y特征之间的相关性,从而选出相关性比较大(卡方值大)的特征,舍弃相关性小(卡方值小)的特征。
在sklearn中,使用selectKBest模型进行特征选择,并指定chi2的评估方法。特征选择我们会在专门的章节中进行介绍。
from sklearn.feature_selection import SelectKBest