机器学习-入门

【原理】一篇入门之-卡方检验(拟合性检验)

作者 : 老饼 发表日期 : 2022-11-28 10:43:12 更新日期 : 2024-12-24 21:11:54
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



卡方拟合性检验是卡方检验(Chi-square Test)中的一种,它基于卡方值来检验变量各组的值有没有区别

本文讲解卡方拟合性检验的用途、计算流程和原理,并通过一个具体的例子展示卡方拟合性检验的实际操作步骤

通过本文,可以快速了解卡方拟合性检验的是什么,如何使用卡方拟合性检验来检验变量各组的值有没有区别





   01. 什么是卡方-拟合性检验    




本节讲解卡方拟合性检验是什么,以及它的具体计算例子和流程





     卡方-拟合性检验是什么    


卡方检验包括独立检验和拟合性检验,它们基于卡方值解决不同的问题
 卡方独立检验可参考文章《卡方检验-拟合性检验》,本文只讲解卡方拟合性检验
  卡方-拟合性检验解决的问题如下:
 
一个单变量,有n组,检验各组别的取值是否有显著区别
  例子: 小明的的成绩,语文、数学、英语分别是60、70、80分
问小明的各科成绩是否有显著差异
 卡方拟合性检验的原理
 
 卡方-拟合性检验的思路如下:
一、假设没区别,算出期望值                                        
 
先假设组别间没有区别,计算此时每个值的期望值                        
期望的计算公式为:           
二、计算期望值与事实值差异的概率                                                        
计算期望值与事实值的差异(构造成符合卡方分布的)                    
 差异度量值为:       
 三、根据概率,确定假设成不成立                                                             
     由于从服卡方分布,所以可以卡方累计分布函数,计算出它的概率
                          计算差异发生的概率,如果是小概率,则说明假设不合理,即组别间存在区别        






      卡方拟合性检验-实例解说      


小明的成绩,语文、数学、英语分别是60、70、80分
下面使用卡方拟合性检验来检验小明的各科成绩是否有显著差异
 具体计算流程如下:    
 一、没有差异时的期望值                                                            
假设没有差异,则期望分数为     
二、事实值与期望值的差异                                                       
 根据公式可计算事实值与期望值的差异为:           
 
三、差异发生的概率                                                                 
1. 计算自由度df                                                            
 
(即组数-1)      
2. 计算p值                                                                   
                       
 其中,是自由度为2的卡方累积分布函数       
                        卡方值不能直接显式计算,一般通过查表或计算机程序获得
          不妨使用 python的scipy.stats.chi2.cdf进行计算卡方值 
    现  , 自由度  , 则代码如下: 
                     卡方检验P值计算代码
即可得到:p = 0.23966815498431937              
结论:
即可知差异发生的概率是23.96%, 还不是一个小概率事件,说明差异不够显著








    02. 卡方拟合性检验-代码实现    





本节展示卡方拟合性检验的代码实现,包括调包与自实现





    用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 




联系老饼