老饼讲解:一步一步上手学习
卡方拟合性检验是卡方检验(chi-square Test)的一种,属于一种假设性检验,它用于检验单个变量各组取值之间的差异是否显著,在机器学习中往往也会用于分析变量与y的相关性,下面我们就来讲讲卡方拟合性检验的原理、具体计算流程和代码实现,通过本文的例子就知道卡方拟合性检验用来干什么了。
卡方检验包括独立检验和拟合性检验,它们基于卡方值解决不同的问题,卡方独立检验可参考文章《卡方检验-拟合性检验》,下面我们来讲一下卡方拟合性检验。
卡方-拟合性检验解决的问题为:
一个单变量,有n组,检验各组别的取值是否有显著区别。

例如,小明的的成绩,语文、数学、英语分别是60、70、80分,问小明的各科成绩是否有显著差异。
简单来说,卡方拟合性检验,就是检查变量各组取值有没有区别。
卡方-拟合性检验的思路如下:
一、假设没区别,算出期望值
先假设组别间没有区别,计算此时每个值的期望值
期望的计算公式为:
二、计算期望值与事实值差异的概率
计算期望值与事实值的差异(构造成符合卡方分布的)
差异度量值为:
三、根据概率,确定假设成不成立
由于从服卡方分布,所以可以通过卡方累计分布函数,得到它发生的概率,也就是差异发生的概率,如果是小概率,则说明假设不合理,即组别间存在区别。
好了,下面我们就用个具体的例子,来具体展示一下卡方拟合性检验每一步是如何计算的。
问题:小明的成绩,语文、数学、英语分别是60、70、80分,下面使用卡方拟合性检验来检验小明的各科成绩是否有显著差异。
具体计算流程如下:
一、没有差异时的期望值
假设没有差异,则期望分数为:
二、事实值与期望值的差异
根据公式可计算事实值与期望值的差异为:
三、差异发生的概率
1. 计算自由度df
(即组数-1)
2. 计算p值
其中,是自由度为2的卡方累积分布函数
卡方值不能直接显式计算,一般通过查表或计算机程序获得,不妨使用 python的scipy.stats.chi2.cdf进行计算卡方值,现 , 自由度 , 则代码如下:

可得到:p = 0.23966815498431937,这就是"假设没有区别时,期望值与事实值的差异发生的概率",现在差异发生的概率是23.96%,它还不算是一个小概率事件 ,说明差异不够显著。所以我们的结论是:没有区别。
一般来说,我们都会将置信水平设为0.05,也就是p<0.05时,就拒绝假设,认为有区别。
下面我们来看看在python中怎么实现卡方独立检验,在平时使用时,可以直接使用scipy来实现,但我们也可以基于卡方独立检验的流程,自己来实现,下面我们就说说这两种方法在python中都是怎么实现的。
在python中要实现卡方独立检验,可以直接调用scipy的chisquare函数,具体代码如下:
'''
本代码用于展示如何用scipy实现卡方拟合性检验
本代码来自《老饼讲解-机器学习》www.bbblearn.com
'''
import numpy as np
import scipy
A = np.array([60, 70, 80]) # 三个类别的观察值
chi2_stat, p_value = scipy.stats.chisquare(A) # 卡方拟合性检验
print("\n卡方统计量 (Chi2):", chi2_stat) # 输出卡方统计量
print("P值:", p_value) # 输出p值
alpha = 0.05 # 设定显著性水平为0.05
if p_value < alpha: # 如果p小于显著性水平
print("结果:拒绝原假设,组别之间存在显著差异") # 则拒绝假设,存在显著差异
else: # 否则
print("结果:接受原假设,组别之间差异不显著") # 接受假设,不存在显著差异代码运行结果如下:

从结果中可以看到,p值较大,这说明还不是小概率事件,因此接受假设,即组别之间差异不显著。
好了,为了加深对卡方拟合性检验的理解,我们不妨自己实现一下拟合性检验,这也是很简单的,只需按照上面所说的步骤进行实现就可以了,具体代码如下:
'''
本代码用于展示如何自行实现卡方拟合性检验
本代码来自《老饼讲解-机器学习》www.bbblearn.com
'''
import numpy as np
import scipy
def cal_chi2(A):
chi2 = ((A-A.mean())**2/A.mean()).sum() # 计算卡方值
df = A.shape[0]-1 # 计算自由度
p = 1-scipy.stats.chi2.cdf(df=df, x=chi2) # 计算p值
return chi2,p # 返回卡方值与p值
A = np.array([60, 70, 80]) # 三个类别的观察值
chi2_stat, p_value = cal_chi2(A) # 卡方拟合性检验
print("\n卡方统计量 (Chi2):", chi2_stat) # 输出卡方统计量
print("P值:", p_value) # 输出p值
alpha = 0.05 # 设定显著性水平为0.05
if p_value < alpha: # 如果p小于显著性水平
print("结果:拒绝原假设,组别之间存在显著差异") # 则拒绝假设,存在显著差异
else: # 否则
print("结果:接受原假设,组别之间差异不显著") # 接受假设,不存在显著差异代码运行结果如下:

可以看到,自写代码实现卡方拟合性检验也只需要几行代码,它的结果与调用scipy的结果是一致的。
卡方拟合性检验就是用来检查单个变量的各个取值有没有差异,它也是一种假设检验,就是先假设没有差异,然后再看看"没有差异"是不是小概率事件,如果是小概率事件,就拒绝假设,认为有差异。
评论