1.列联表是按两个或多个特征分类的频数数据,一般以表格形式组成。
2.判断两个或多个属性之间有无关联,即判别属性之间是否独立。
3.检验步骤
-
建立原假设
H0: 两属性相互独立
H1: 两属性之间不独立 -
计算自由度
-
计算卡方统计量
-
拒绝域
-
对照卡方分布的临界值表,找到对应的卡方值,判断是否在拒绝域内
-
列联表独立性检验的python实现
'''
(1)假设检验重要知识
H0:A与B相互独立 H1:A与B不相互独立
若卡方值大于临界值,拒绝原假设,表示A与B不相互独立,A与B相关
函数中re返回为1表示拒绝原假设,0表示接受原假设
(2)参数说明
输入:
alpha --- 置信度,用来确定临界值
data --- 数据,请使用numpy.array数组
输出:
g --- 卡方值,也就是统计量
p --- P值(统计学名词),与置信度对比,也可进行假设检验,P值小于置信度,即可拒绝原假设
dof --- 自由度
re --- 判读变量,1表示拒绝原假设,0表示接受原假设
expctd--- 原数据数组同维度的对应理论值
(3)应用场景
要求样本含量应大于40且每个格子中的理论频数不应小于5
理论知识详见博客:
'''
# 卡方独立性检验
import numpy as np
from scipy.stats import chi2_contingency
from scipy.stats import chi2
def chi2_independence(alpha, data):
g, p, dof, expctd = chi2_contingency(data)
if dof == 0:
print('自由度应该大于等于1')
elif dof == 1:
cv = chi2.isf(alpha * 0.5, dof)
else:
cv = chi2.isf(alpha * 0.5, dof-1)
if g > cv:
re = 1 # 表示拒绝原假设
else:
re = 0 # 表示接受原假设
return g, p, dof, re, expctd
实例测试
# test
alpha1 = 0.05 # 置信度,常用0.01,0.05,用于确定拒绝域的临界值
data1 = np.array([[367, 342,266,329], [56,40,20,16]])
g, p, dof, re, expctd = chi2_independence(alpha1, data1)
输出结果:
其中:p值为0.0002, re=1为拒绝原假设,表示两属性之间有关联