卡方检验(Chi-square test)-概述和python代码案例实操

文摘   2024-07-03 11:29   重庆  

统计学,机器学习建模经常遇到卡方分箱算法ChiMerge。卡方分箱在是逻辑回归评分卡的核心,让分箱具有统计学意义(单调性)。卡方分箱在生物医药领域可以比较两种药物或两组病人是否具有显著区别。但很多建模人员搞不清楚卡方分箱原理。先给大家介绍一下经常被提到的卡方分布和卡方检验是什么。欢迎各位同学学习更多相关知识。

卡方检验(Chi-square test)是一种用来检验两个或多个分类变量之间是否存在相关性的统计方法。在英语中,Chi-square test又叫做 Goodness-of-fit test 或 Independence test,具体取决于所使用的模型以及研究问题的不同。

Goodness-of-fit test 主要用于检验一个分类变量的实际观察值与理论预期值之间的拟合程度,通常用于检验一个分类变量是不是符合某种特定的分布。

Independence test 主要用于检验两个或多个分类变量之间是否存在统计学上的独立性,即它们之间是否有关联或相互影响。

通过卡方检验,我们可以得出结论,确定变量之间是否存在显著的关联,或者一个分类变量的分布是否与一个特定的理论模型相符。


分类变量检验方法

 

卡方分布绘图

如果多个符合正态分布的独立随机变量z1,z2,z3.....zk,
z1+z2+z3+....z_k呈现卡方分布,自由度k.
有几个正态分布相加,就有几个自由度

# -*- coding: utf-8 -*-'''Python生物信息学SCI案例复现:https://study.163.com/course/courseMain.htm?courseId=1213752824&share=2&shareId=400000000398149微信公众号:python生物信息学定制服务商务咨询QQ:231469242'''import numpy as npimport matplotlib.pyplot as pltimport scipy.stats as statsimport seaborn as snsimport math,pylab,matplotlib,numpyfrom matplotlib.font_manager import FontProperties
#设置中文字体font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=15)
n=10
#绘制自由度为n的卡方分布图,n表示生成卡方数组的个数def Get_chisquareDatas(n): #标准正太分布 normalDistribution=stats.norm(0,1) list_data=[] for i in range(n): normal_data=normalDistribution.rvs(30) chisquare_data=normal_data**2 list_data.append(chisquare_data) return list_data
def Plot_chisquare(n): list_data=Get_chisquareDatas(n) sum_data=sum(list_data) plt.hist(sum_data)
Plot_chisquare(2)Plot_chisquare(3)Plot_chisquare(10)

官方绘图代码

# -*- coding: utf-8 -*- '''Python生物信息学SCI案例复现:https://study.163.com/course/courseMain.htm?courseId=1213752824&share=2&shareId=400000000398149微信公众号:python生物信息学定制服务商务咨询QQ:231469242'''from scipy.stats import chi2import matplotlib.pyplot as pltimport numpy as npfig, ax = plt.subplots(1, 1)
df = 20mean, var, skew, kurt = chi2.stats(df, moments='mvsk')
#绘制函数的起始点和终止点#pdf为概率密度函数#百分比函数(PPF) :the inverse of the CDF. PPF 函数和连续分布函数CDF相逆,#比如输入哪一个点,可以得到低于等于20的概率?#ppf(0.01, df)表示输入哪个点,得到概率低于0.01initial=chi2.ppf(0.01, df)end=chi2.ppf(0.99, df)x = np.linspace(initial,end, 100)
#概率密度函数用于绘图ax.plot(x, chi2.pdf(x, df), 'r-', lw=5, alpha=0.6, label='chi2 pdf')plt.title("df is %d"%df)plt.show()

卡方检验代码

# -*- coding: utf-8 -*-'''Python生物信息学SCI案例复现:https://study.163.com/course/courseMain.htm?courseId=1213752824&share=2&shareId=400000000398149微信公众号:python生物信息学定制服务商务咨询QQ:231469242''''''卡方公式(o-e)^2 / e期望值和收集到数据不能低于5,o(observed)观察到的数据,e(expected)表示期望的数据(o-e)平方,最后除以期望的数据e'''
import numpy as npfrom scipy import statsfrom scipy.stats import chisquare list_observe=[30,14,34,45,57,20]list_expect=[20,20,30,40,60,30]

std=np.std(data,ddof=1)print(chisquare(f_obs=list_observe, f_exp=list_expect))p=chisquare(f_obs=list_observe, f_exp=list_expect)[1]'''返回NAN,无穷小'''
if p>0.05 or p=="nan": print"H0 win,there is no difference"else: print"H1 win,there is difference"

contigency table联立表

测试数据

第一行:草本药1,草本药2,安慰剂

第二行:生病和非生病

H0:草本药和疾病无关系

H1:草本药和疾病有关系

可汗学院计算出来的卡方值2.53;自由度2,显著性0.1,的关键值4.6

卡方值2.53<关键值4.6,  H0成立,两者无关系

 

1

python代码与可汗学院算出结果一致,此版本体现算法推导过程。缺点就是要自己计算出期望值列表<br><br>

 

# -*- coding: utf-8 -*-<br>'''<br>卡方公式(o-e)^2 / e<br>期望值和收集到数据不能低于5,o(observed)观察到的数据,e(expected)表示期望的数据<br>(o-e)平方,最后除以期望的数据e<br>联立表contigency table计算<br>'''<br><br>from scipy.stats import chisquare   <br><br>list_observe=[34,38,28,50]<br>list_expect=[29.76,42.2,32.24,45.77]<br><br>row=2<br>colume=2<br><br><br><br>def Contigency_table(row,colume,list_observe,list_expect):<br>    degreeFreedom=(row-1)*(colume-1)<br>    print(chisquare(f_obs=list_observe, f_exp=list_expect,ddof=degreeFreedom))<br>    p=chisquare(f_obs=list_observe, f_exp=list_expect)[1]<br><br><br>    if p>0.05 or p=="nan":<br>       print"H0 win,there is no difference"<br>    else:<br>       print"H1 win,there is difference"<br><br>Contigency_table(row,colume,list_observe,list_expect)

此版本不用算出期望值,更加方便,参考的是2*2联立表,自由度=1,critical value=2.7

# -*- coding: utf-8 -*- '''腾讯云课堂:python金融风控评分卡模型和数据分析:https://ke.qq.com/course/package/31250?tuin=dcbf0ba微信公众号:pythonEducation模型和统计项目QQ:231469242'''#独立性检验test for independence,也是卡方检验chi_square#前提条件:a,b,c,d 必须大于5
#2.706是判断标准(90概率),值越大,越有关,值越小,越无关def value_independence(a,b,c,d): if a>=5 and b>=5 and c>=5 and d>=5: return ((a+b+c+d)*(a*d-b*c)**2)/float((a+b)*(c+d)*(a+c)*(b+d))
#返回True表示有关#返回False表示无关def judge_independence(num_independence): if num_independence>2.706: print ("there is relationship") return True else: print("there is no relationship") return False
a=34b=38c=28d=50chi_square=value_independence(a,b,c,d)relation=judge_independence(chi_square)

python官网版本,更加方便和科学

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html

import scipy.stats as stats
data = np.array([[43,9],[44,4]])V, p, dof, expected = stats.chi2_contingency(data)print(p)

例子:


大家可以微信扫描下面二维码,收藏课程《Python生物信息学SCI案例复现》,学习更多相关内容。

商务合作

如果您们对疾病科研,人工智能预测模型项目感兴趣,欢迎各大医疗机构,科研机构,生物医药企业,研究生博士生论文联系。

项目联系人:重庆未来之智信息技术咨询服务有限公司,Toby老师,QQ:231469242

python生物信息学
python编程,生物,医药,疾病预测模型,机器学习,人工智能
 最新文章