本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
卡方拟合性检验是卡方检验(Chi-square Test)中的一种,它基于卡方值来检验变量各组的值有没有区别
本文讲解卡方拟合性检验的用途、计算流程和原理,并通过一个具体的例子展示卡方拟合性检验的实际操作步骤
通过本文,可以快速了解卡方拟合性检验的是什么,如何使用卡方拟合性检验来检验变量各组的值有没有区别
本节讲解卡方拟合性检验是什么,以及它的具体计算例子和流程
卡方-拟合性检验是什么
卡方检验包括独立检验和拟合性检验,它们基于卡方值解决不同的问题
卡方独立检验可参考文章《卡方检验-拟合性检验》,本文只讲解卡方拟合性检验
卡方-拟合性检验解决的问题如下:
一个单变量,有n组,检验各组别的取值是否有显著区别
例子: 小明的的成绩,语文、数学、英语分别是60、70、80分
问小明的各科成绩是否有显著差异
卡方拟合性检验的原理
卡方-拟合性检验的思路如下:
一、假设没区别,算出期望值
先假设组别间没有区别,计算此时每个值的期望值
期望的计算公式为:
二、计算期望值与事实值差异的概率
计算期望值与事实值的差异(构造成符合卡方分布的)
差异度量值为:
三、根据概率,确定假设成不成立
由于从服卡方分布,所以可以卡方累计分布函数,计算出它的概率
计算差异发生的概率,如果是小概率,则说明假设不合理,即组别间存在区别
卡方拟合性检验-实例解说
小明的成绩,语文、数学、英语分别是60、70、80分
下面使用卡方拟合性检验来检验小明的各科成绩是否有显著差异
具体计算流程如下:
一、没有差异时的期望值
假设没有差异,则期望分数为
二、事实值与期望值的差异
根据公式可计算事实值与期望值的差异为:
三、差异发生的概率
1. 计算自由度df
(即组数-1)
2. 计算p值
其中,是自由度为2的卡方累积分布函数
卡方值不能直接显式计算,一般通过查表或计算机程序获得
不妨使用 python的scipy.stats.chi2.cdf进行计算卡方值
现 , 自由度 , 则代码如下:
即可得到:p = 0.23966815498431937
结论:即可知差异发生的概率是23.96%, 还不是一个小概率事件,说明差异不够显著
本节展示卡方拟合性检验的代码实现,包括调包与自实现
用scipy计算-卡方拟合性检验
要实现卡方拟合性检验,可以直接调用scipy的chisquare函数
具体代码如下:
import numpy as np
import scipy
# 本代码用于展示:卡方拟合性检验
# 本代码来自《老饼讲解-机器学习》www.bbbdata.com
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值较大
这说明还不是小概率事件,因此接受假设,即组别之间差异不显著
自实现-卡方拟合性检验
自写代码实现卡方拟合性检验也是较简单的,只需按照上文的步骤进行实现就可以了
具体代码如下:
import numpy as np
import scipy
# 本代码用于展示:自实现卡方拟合性检验
# 本代码来自《老饼讲解-机器学习》www.bbbdata.com
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的结果是一致的
好了,以上就是卡方检验中的拟合性检验的原理的计算方法了~
End