卡方的原理及python代码实现
本篇内容主要讲解"卡方的原理及python代码实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"卡方的原理及python代码实现"吧!
卡方检验的原理:
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合,也就是不相关。也就是:偏离越大,相关性越大。
注意:卡方检验针对分类变量。
检验方法(独立样本四格表):
假设有两个分类变量X和Y,它们的值域分别为{x1, x2}和{y1, y2},其样本频数列联表为
若要推断的论述为H1:"X与Y有关系",可以利用独立性检验来考察两个变量是否有关系,并且能较精确地给出这种判断的可靠程度。具体的做法是,由表中的数据算出检验统计量
的值。
其中A为实际值,也就是第一个四格表里的4个数据,T为理论值,也就是理论值四格表里的4个数据。
x2用于衡量实际值与理论值的差异程度(也就是卡方检验的核心思想),包含了以下两个信息:
实际值与理论值偏差的绝对大小(由于平方的存在,差异是被放大的)
差异程度与理论值的相对大小
卡方分布的临界值
既然已经得到了x2值,我们又怎么知道x2值是否合理?也就是说,怎么知道无关性假设是否可靠?答案是,通过查询卡方分布的临界值表。
这里需要用到一个自由度的概念,自由度等于V = (行数 - 1) * (列数 - 1),对四格表,自由度V = 1
对V = 1,卡方分布的临界概率是:
如果一个类别特征有多个分类,那么自由度就会变,同样对应的卡方分布的临界值和临界概率也要做出调整。
举例1:类别特征相关关系检验
这个实例你可以理解为目标变量属于或者不属于娱乐与自变量是否包含吴亦凡是否是相关,辅助做类别性特征的变量筛选,或者对于两个类别特征只是单纯的看一下两个特征是否相关。
举个例子,假设我们有一堆新闻标题,需要判断标题中包含某个词(比如吴亦凡)是否与该条新闻的类别归属(比如娱乐)是否有关,我们只需要简单统计就可以获得这样的一个四格表:
通过这个四格表我们得到的第一个信息是:标题是否包含吴亦凡确实对新闻是否属于娱乐有统计上的差别,包含吴亦凡的新闻属于娱乐的比例更高,但我们还无法排除这个差别是否由于抽样误差导致。那么首先假设标题是否包含吴亦凡与新闻是否属于娱乐是独立无关的,随机抽取一条新闻标题,属于娱乐类别的概率是:(19 + 34) / (19 + 34 + 24 +10) = 60.9%
def Chi2(df, total_col, bad_col):
#:param df: 包含全部样本总计与坏样本总计的数据框
#:param total_col: 全部样本的个数
#:param bad_col: 坏样本的个数
#:return: 卡方值
df2 = df.copy()
# 求出df中,总体的坏样本率和好样本率
badRate = sum(df2[bad_col])*1.0/sum(df2[total_col])
# 当全部样本只有好或者坏样本时,卡方值为0
if badRate in [0,1]:
return 0
df2['good'] = df2.apply(lambda x: x[total_col] - x[bad_col], axis = 1)
goodRate = sum(df2['good']) * 1.0 / sum(df2[total_col])
# 期望坏(好)样本个数=全部样本个数*平均坏(好)样本占比
df2['badExpected'] = df[total_col].apply(lambda x: x*badRate)
df2['goodExpected'] = df[total_col].apply(lambda x: x * goodRate)
badCombined = zip(df2['badExpected'], df2[bad_col])
goodCombined = zip(df2['goodExpected'], df2['good'])
badChi = [(i[0]-i[1])**2/i[0] for i in badCombined]
goodChi = [(i[0] - i[1]) ** 2 / i[0] for i in goodCombined]
chi2 = sum(badChi) + sum(goodChi)
return chi2
到此,相信大家对"卡方的原理及python代码实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!