卡方检验python程序_分类变量的相关性:五分钟掌握卡方检验「从理论到Python实战」...

卡方检验

当衡量两个连续变量间的线性关系时,我们可以使用Pearson相关系数。那么当我们面对的数据是两个分类变量呢?没错,看过下面这张图的应该还记得,我们可以用列联表结合卡方检验来分析分类变量间的相关性。

575fff8392a6459ea6d4fa07a806f104

一、列联表

列联表是一种常见的分类汇总表,它将两个变量的不同水平分别放在行和列中,中间对应着每组的频数。如下表:使用药物A且治愈了的病人有1800名,使用药物B且治愈了的病人有800名……

c0cf21d25e1b49da864ee56a3b5486a8

在pandas中,我们可以直接使用pd.crosstab(rows,columns,margins=True)来生成列联表。其中margins用于设置是否限制汇总列和汇总行。

有些时候我们可能需要百分比数据,这时我们直接用每个单元格除以汇总列或汇总行的数据即可。

二、卡方检验

卡方检验的思想在于比较期望频数和实际频数的吻合程度,实际频数就是上边表格里黄色区域的数字,而期望频数则是指行列变量相互独立的时候期望的频数。我们下边用一张图来演示如何计算期望频数。

52b07d3a03bb498b8ba5223b8f16d043

在第三张图中,每个单元格的期望频率为对应的行总计与列总计的乘积,比如第一个单元格的期望频率为66.67%*86.67%=57.78%。

事实上,我们也可以一步到位,用第一张图中行总计2000与列总计2600相乘,然后除以全部样本量3000,就可以得到1733,也就是第一个单元格的期望频数。不过这里为了方便理解,拆解成了三步。

接下来就是进行卡方检验了,卡方检验的零假设是期望频数等于实际频数(差异不显著),备择假设是期望频数不等于实际频数(差异显著,具有统计学意义),即两个变量相关。其计算公式为:

bd831bd9d95046229fe60ce4a7d6d344

Obs代表每个单元格内的观测频数(Observation),Exp代表每个单元格内的期望频数(Expection)。我们用上边这个例子演示一下:

ef050d27d45844159d3e76d7f9aff64a

到这里还没结束,我们需要根据求得的值从卡方分布中找到对应的概率。

卡方分布

卡方统计量服从自由度为(r-1)(c-1)的卡方分布(r=row,代表行数,c=column,代表列数)。我们用一张图来看一下:

9ef5e7b87c4140348177f751cfac09cb

其中k就是卡方分布的自由度。可以看到当自由度为1时,卡方分布是一个长尾型的分布。那么我们现在来看一下刚才的问题,两种药品的治愈效果一样吗?

from scipy.stats import chi2_contingency

import pandas as pd

df = pd.DataFrame({

'medical': ['A', 'A', 'B', 'B'],

'cured': [1, 0, 1, 0],

'count': [1800, 200, 800, 200]

})

cross_tab = pd.pivot_table(data=df,

values='count',

index='medical',

columns='cured',

margins=True,

aggfunc=np.sum)

print(cross_tab)

print('卡方={0}\nP值={1}'.format(

*chi2_contingency(cross_tab)[:2]))

81d3f33f2ab942edbf5a6e2c588cf804

c06dbb4d2128439a86b38c5bb7d2166b

可以看到,p值小于0.05,可以认为两个变量之间存在相关性。不过需要注意的是,卡方检验并不能得出两个分类变量相关性的强弱,只能展现出它们是否相关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值