卡方检验python函数 numpy卡方检验

白话“卡方检验” 卡方检验是假设检验的一种 , 用于分析两个类别变量的相关关系,是一种非参数假设检验,得出的结论无非就是“两个变量相关”或者“两个变量”不相关 , 所以有的教材上又叫“独立性检验” 。如果不是很清楚“假设检验”的朋友们,就要好好翻一下本科阶段《概率论与数理统计》的教材了 。
关于假设检验的关键字有:总体、样本、点估计、区间估计、显著性水平、置信区间、统计量、枢轴量、分位点、三大分布、中心极限定理(明确正态分布的重要地位)、抽样分布定理 。
如果这些关键字你还比较生疏的话,可以翻翻本科的《概率论与数理统计》教材 , 在“数理统计”部分,你可以找到它们 。
它的流程基本是这样的:我感觉变量 A 和变量 B 存在相关关系,于是我提出假设“变量 A 和变量 B 存在相关关系”,然后我要用严格的数学方法证明“变量 A 和变量 B 存在相关关系”这个假设成立 。
类别变量就是取值为离散值的变量 , “性别”就是一个类别变量,它的取值只有“男”和“女”,类似还有”婚否“、”国籍“等 。
以我们熟知的 Kaggle 平台上的泰坦尼克号幸存者预测提供的数据为例,”性别“对于”是否幸存“的关系研究,就属于这方面的内容 。研究表明,泰坦尼克号上的乘客秉承”女士优先,照顾弱势群体“的基本原则,因此女性幸存的概率比男性要大,这就说明,”性别“对于”是否幸存“有相关关系 , 我们后面会使用卡方检验来验证这一事实 。
假设检验,顾名思义,就是提出一个假设,然后检验你提出的假设是否正确 。假设检验的流程其实是固定的,关键其实在于理解假设检验的设计原则 。
这里说一句题外话,“提出假设 , 然后证明假设”其实我们一点都不陌生 , 人类探索未知事物、真理用的都是这个思路 。聪明的祖先根据经验和直觉,提出一个猜想,然后再用严格的理论去论证这个猜想,例如我们熟知的“万有引力定律”、“地球是圆的”,这些说法刚刚提出来的时候 , 就只是科学家们的猜想 , 随后(很可能是很久很久以后),才被证明他们的猜想是正确的、伟大的 。只不过在统计学中 , “提出猜想”叫“提出假设”,“证明猜想”叫“检验” 。
那么我们假设什么呢?这里就要引入“原假设”和“备择假设”的概念了 。“原假设”是“备择假设”的对立面 。
下面这个原则很重要:
重要的事情,我再写两遍:如果你想通过种种论证,证明一件事情,就要把这件事情写成“备择假设” 。bfont size='3' color='ff0000'备择假设通常用于表达研究者自己倾向于支持的看法(这很主观) , 然后就是想办法收集证据拒绝原假设,以支持备择假设/font/b 。
特别要说明的一点是:如果你不遵守这个“原假设”和“备择假设”设计的基本原则,你很可能会得到相反的结论 。
假设检验很像司法界对于一个事实的认定,本着“疑罪从无”的原则,如果你要说明一个人有罪 , 你必须提供充足的证据,否则被告人的罪名就不能成立,这个说法叫“没有充分的证据证明被告有罪” 。
因此,如果我们最后的结论是“原假设”成立 , 我们一般不这么说,即我们不说“原假设”成立,我们不说“原假设”是真的 。我们说 不能拒绝“原假设”,或者说 没有充分的证据拒绝“原假设” ,或者说 没有充分的证据证明“备择假设”成立。
因为我们做假设检验一定是觉得两个类别变量有关系,才去做检验 。再想想那个“疑罪从无”原则,我们是觉得一个人有罪,才去举证 。因此卡方检验的“原假设”一定是假设独立,“备择假设”一定是假设相关,即:
这一点是极其重要且明确的,请你一定记住它,在统计软件中都是这样设定的 。
做“检验”这件事情,就很像我们以前做的“反证法”,我们假定要证明的结论的对立面成立,然后推出矛盾,即说明了我们的假设是错误的,即原命题成立 。请看下面这个例子:
请你证明:这个餐厅的菜很难吃 。
证明:假设这个餐厅的菜很好吃,那么周末的晚上生意一定很好 , 然而实际观察下来,顾客流量和平时一样,推出矛盾 , 所以假设不成立,即这个餐厅的菜很难吃 。
用假设检验的思路,在这个例子中:
原假设:这个餐厅的菜很好吃;
备择假设:这个餐厅的菜很难吃 。
我们把倾向于要证明的结论设置为“备择假设” , 而推理是基于“原假设”成立进行的,推理得出矛盾,说明“原假设”错误,从错误的起点推出了错误的结论 , 因此“原假设”不成立,这就是假设检验里面说的“拒绝原假设” 。
因此,检验其实很简单 , 就是一个是非论证的过程,是单选题,只有两个选项 , 选择其一 。
假设检验的论证流程其实是固定的 。论证依据的事实是“ 小概率事件在一次试验中几乎不可能发生 ” , 通常,我们得到的矛盾就在于:通过计算统计量,发现通过一次试验得到这个统计量是一个“小概率事件”,“小概率事件”在一次试验中,居然发生了,我们就认为这是很“诡异”的,一定是之前的某个环节出了问题,即“原假设”不成立,于是拒绝“原假设”,即证明了“备择假设”成立 。
“卡方检验”即利用“卡方分布”去做“假设检验” 。
“卡方分布”(也写作 “分布”)是统计学领域的三大分布之一,另外两个分布是“分布”与“分布”,这些分布都是由正态分布推导出来的 , 可以认为它们是我们熟知的分布,因为它们可以取哪些值,以及取这些值的概率都是完全弄清楚了的 。
注:忘记了三大分布的朋友们,请一定要翻翻自己本科的教材,看看这些分布用来做什么?为什么出现在“数理统计”中,理解使用这些分布是为了从样本中估计总体的信息 。
统计学的研究任务是通过样本研究总体,因为我们无法把所有的总体都做一次测试,一般可行的做法就是从总体中抽取一部分数据 , 根据对这一部分数据的研究 , 推测总体的一些性质 。
而“三大分布”就是我们研究样本的时候选取的参照物 。一般我们研究的思路是这样的:如果经过分析 , 得出待研究的样本符合这些我们已知的分布之一,因为三大分布是被我们的统计学家完全研究透了的,可以认为是无比正确的,就可以通过查表得到这些分布的信息,进而得到样本的一些性质 , 帮助我们决策 。
这里举一个例子,比如你是一个面试官 , 你手上掌握着“北京”、“上海”、“广州”三个省市的人才信息库,来了一个面试者,从简历中得知这个人来自“北京”,那么我们就可以直接从“北京”市的人才信息库中查阅到他的详细履历,掌握到他更全面的信息 。
上面提到的“北京”、“上海”、“广州” 这 3 个城市的人才信息库,就相当于统计学中的三大分布,你不用记住它,你不用随身携带它,但是你可以查阅它 , 它会告诉你你想知道的信息 。
做假设检验的时候,我们也是类似的思路,我们需要利用总体的样本构造出合适的统计量(或枢轴量),并使其服从或近似地服从已知的确定分布,这样我们就可以查阅这些确定分布的相关信息 , 得到待研究样本所反映出来的总体的一些性质 。
上面说到了“统计量”和“枢轴量”,下面简单谈一谈 。
如果忘记了的朋友们一定要翻翻以前的教程,“抽样分布定理”是非常重要的 。根据抽样分布定理,我们经常是这样用的:样本的某个含有未知参数的函数符合某个已知分布 , 已知分布可以查表,因此未知参数的性质就知道了 。求“置信区间”与做“假设检验”通常就是这样的思路 。
说明:是观测频数(实际值),是期望频数(可以认为是理论值),期望频数的计算公式我们马上会介绍到 。这个统计量服从自由度为的分布 , 为行数,为列数 。
下面举个例子 , 说明卡方检验的基本流程 。
以下例子选自中国人民大学龙永红主编《概率论与数理统计》(第三版)P190 “独立性检验”一节例 5.32 。
研究青少年行为与家庭状况的关系,调查结果如下:
分析:“青少年行为”是离散型变量,有“犯罪”与“未犯罪”两个取值;“家庭状况”是也离散型变量,有“离异家庭”与“和睦家庭”两个取值,从直觉上 , 我们认为它们是相关的 。因此
上面这张表,我们可以称之为 观察频数表 ,观察依据事实 。下面我们会计算一张“理论频数表”,理论依据假设 。
原假设:“青少年行为”与“家庭状况”独立 。
备择假设:“青少年行为”与“家庭状况”不独立 。
要计算出检验统计量,关键是计算出期望频数 。我们之前说到了,假设检验是基于原假设进行论证,因此我们的期望频数应该是基于【“青少年行为”与“家庭状况”独立】得到的,即: 两个类别的交叉项的概率可以根据独立事件的概率乘法公式得到。具体是这样做的 , 上面那张表中,把交叉项隐藏起来:
在【“青少年行为”与“家庭状况”独立】这个假设下有:
我们要计算期望频数,就把上面这个概率分别乘以样本总数就可以了,于是我们得到 理论频数表 :
下面我们就套公式了 , 将每个单元格的加起来 , 就可以得到统计量:
上面说服从自由度为的分布 , 为行数 , 为列数,即服从的分布,接下来 , 我们就要看得到这个统计量的概率有多大:
得到图像如下:
可以看到,都不在能图像显示到的范围之内,说明这个概率很低 。下面我们查表或者使用 Python 查一下 , 这个概率是多少:
得到:,确实是一个几乎为的数 。这说明了什么呢?
说明了 , 在我们的假设【“青少年行为”与“家庭状况”独立】下,得到这组观测数据的概率很低很低 , 基于bfont size='3' color='ff0000' 小概率事件在一次试验中几乎不会发生 /font/b,但它却发生了,就证明了我们的“原假设”是不正确的,即有充分证据决绝“原假设” 。(这一部分有点绕,其实很简单,多看几遍就非常清楚了 。)
其实到这里 , 我们对卡方检验就已经介绍完了,是不是觉得很简单 。但是在实际操作的过程中,我们还会引入值,很多统计软件也会帮我们计算出值,这个值是个什么鬼呢?下面先给出我的结论:
说明:以下我根据对值的理解自己总结的,是人话,但不一定准确 。
得到“检验统计量”有个缺点 , 就是它是一个很“死”的数字,我们看到,我们只能直观感觉它很大,因为如果观察频数与理论频数大约相等,这个值应该很?。荒芰炕飧鲋涤卸啻?。这只是统计量服从某个自由度的卡方分布的情况 。
那么问题来了,如果统计量服从其它分布呢?统计量这个干巴巴的数字,你怎么知道这个这个分布取到这个统计量的概率有多大?因此还差一步,我们还必须查表。所以得到值的过程就是帮你查表了,值是一个概率值,它介于和之间 , 值是 当前分布取到这个统计量的概率到当前分布极端值(指的是概率很小的极端值)这个区间的累计概率之和,即取到这个值 , 到比这个值更“差”的概率之和,如果值很大,说明统计量取当前值的概率在一个正常的范围(一般是认为设定成),如果值很小 , 说明这个统计量取当前值的概率也非常小 。
特别说明: 对于连续型随机变量来说,取到某个值的概率其实是,因此上面才用到了对于区间取概率之和 。
说明:上面所说的累积概率之和如果很小 , 小于一个临界值,这个临界值我们称之为“显著性水平”,用表示,一般取。多说一句,这个显著性水平其实是我们在原假设成立的情况下,拒绝原假设的概率 , 即犯第一类错误的概率,具体就不展开了,请参考相关《概率论与数理统计》教材 。
所以我们总结一下:
1、值统一了假设检验的比较标准,把计算统计量的概率大小统一变成计算值,如果这个值小于一个预先设定好的很小的数,则拒绝原假设,如果值大于这个预先设置好的很小的数,则说明没有充分证据拒绝原假设;
2、使用值进行假设检验的时候 , 会更便利 。因此 , 使用值进行假设检验的评判标准就只要一个,就是记住这句话“小拒大接”,即比?。?就拒绝“原假设”,比大,结论是“没有理由拒绝原假设” 。
值在不同的检验问题中,计算的方式会有一些不同,区别就在于概率极端值是在一侧还是在两侧 。在这里,我们就以卡方检验为例,如果我们计算出来的统计量的值为 , 那么看图:
这个时候,统计量取的概率就很高了,从图中可以看出大于。我们作如下分析:
(说明:累计积分和分位点的概念都是十分重要的,在这里就不赘述了 , 读者可以查阅相关统计学的教材 。)
于是,对于卡方检验而言 , 得到的统计量,我们可以计算这个从统计量到正无穷的积分,如果这个积分值小于“显著性水平”,即 认为这个统计量的概率一定在“显著性水平”所确定的临界点的右边,即它是比“小概率事件”发生的概率还小的“小概率事件”。
下面,我们自己写一个函数来实现卡方检验相关的计算 , 实现和scipy软件包提供的卡方检验同样的效果 。
下面验证我们编写的卡方检验函数的正确性:
显示:
1、结合日常生活的例子,了解什么是卡方检验
2、假设检验之八:p值是什么:
python用卡方检验,自动分箱 , 结果是否可靠有待验证def calc_chiSquare(sampleSet, feature, target):
'''
计算某个特征每种属性值的卡方统计量
params:
sampleSet: 样本集
feature: 目标特征
target: 目标Y值 (0或1) Y值为二分类变量
return:
卡方统计量dataframe
feature: 特征名称
act_target_cnt: 实际坏样本数
expected_target_cnt:期望坏样本数
chi_square:卡方统计量
'''
# 计算样本期望频率
target_cnt = sampleSet[target].sum()
sample_cnt = len(sampleSet[target])
expected_ratio = target_cnt * 1.0/sample_cnt
# 对变量按属性值从大到小排序
df = sampleSet[[feature, target]]
col_value = https://www.04ip.com/post/list(set(df[feature]))
# 计算每一个属性值对应的卡方统计量等信息
chi_list = []; target_list = []; expected_target_list = []
for value in col_value:
df_target_cnt = df.loc[df[feature] == value, target].sum()
df_cnt = len(df.loc[df[feature] == value, target])
expected_target_cnt = df_cnt * expected_ratio
chi_square = (df_target_cnt - expected_target_cnt)**2 / expected_target_cnt
chi_list.append(chi_square)
target_list.append(df_target_cnt)
expected_target_list.append(expected_target_cnt)
# 结果输出到dataframe, 对应字段为特征属性值, 卡方统计量, 实际坏样本量, 期望坏样本量
chi_stats = pd.DataFrame({feature:col_value, 'chi_square':chi_list,
'act_target_cnt':target_list, 'expected_target_cnt':expected_target_list})
return chi_stats[[feature, 'act_target_cnt', 'expected_target_cnt', 'chi_square']]
def chiMerge_maxInterval(chi_stats, feature, maxInterval=5):
'''
卡方分箱合并--最大区间限制法
params:
chi_stats: 卡方统计量dataframe
feature: 目标特征
maxInterval:最大分箱数阈值
return:
卡方合并结果dataframe, 特征分割split_list
'''
group_cnt = len(chi_stats)
split_list = [chi_stats[feature].min()]
# 如果变量区间超过最大分箱限制,则根据合并原则进行合并
while(group_cntmaxInterval):
min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]
# 如果分箱区间在最前,则向下合并
if min_index == 0:
chi_stats = merge_chiSquare(chi_stats, min_index 1, min_index)
# 如果分箱区间在最后,则向上合并
elif min_index == group_cnt-1:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
# 如果分箱区间在中间,则判断与其相邻的最小卡方的区间,然后进行合并
else:
if chi_stats.loc[min_index-1, 'chi_square']chi_stats.loc[min_index 1, 'chi_square']:
chi_stats = merge_chiSquare(chi_stats, min_index, min_index 1)
else:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
group_cnt = len(chi_stats)
chiMerge_result = chi_stats
split_list.extend(chiMerge_result[feature].tolist())
return chiMerge_result, split_list
def chiMerge_minChiSquare(chi_stats, feature, dfree=4, cf=0.1, maxInterval=5):
'''
卡方分箱合并--卡方阈值法
params:
chi_stats: 卡方统计量dataframe
feature: 目标特征
maxInterval: 最大分箱数阈值, default 5
dfree: 自由度, 最大分箱数-1, default 4
cf: 显著性水平, default 10%
return:
卡方合并结果dataframe, 特征分割split_list
'''
threshold = get_chiSquare_distuibution(dfree, cf)
min_chiSquare = chi_stats['chi_square'].min()
group_cnt = len(chi_stats)
split_list = [chi_stats[feature].min()]
# 如果变量区间的最小卡方值小于阈值,则继续合并直到最小值大于等于阈值
while(min_chiSquarethreshold and group_cntmaxInterval):
min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]
# 如果分箱区间在最前,则向下合并
if min_index == 0:
chi_stats = merge_chiSquare(chi_stats, min_index 1, min_index)
# 如果分箱区间在最后,则向上合并
elif min_index == group_cnt-1:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
# 如果分箱区间在中间,则判断与其相邻的最小卡方的区间,然后进行合并
else:
if chi_stats.loc[min_index-1, 'chi_square']chi_stats.loc[min_index 1, 'chi_square']:
chi_stats = merge_chiSquare(chi_stats, min_index, min_index 1)
else:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
min_chiSquare = chi_stats['chi_square'].min()
group_cnt = len(chi_stats)
chiMerge_result = chi_stats
split_list.extend(chiMerge_result[feature].tolist())
return chiMerge_result, split_list
def get_chiSquare_distuibution(dfree=4, cf=0.1):
'''
根据自由度和置信度得到卡方分布和阈值
params:
dfree: 自由度, 最大分箱数-1, default 4
cf: 显著性水平, default 10%
return:
卡方阈值
'''
【卡方检验python函数 numpy卡方检验】percents = [0.95, 0.90, 0.5, 0.1, 0.05, 0.025, 0.01, 0.005]
df = pd.DataFrame(np.array([chi2.isf(percents, df=i) for i in range(1, 30)]))
df.columns = percents
df.index = df.index 1
# 显示小数点后面数字
pd.set_option('precision', 3)
return df.loc[dfree, cf]
def merge_chiSquare(chi_result, index, mergeIndex, a = 'expected_target_cnt',
b = 'act_target_cnt', c = 'chi_square'):
'''
params:
chi_result: 待合并卡方数据集
index: 合并后的序列号
mergeIndex: 需合并的区间序号
a, b, c: 指定合并字段
return:
分箱合并后的卡方dataframe
'''
chi_result.loc[mergeIndex, a] = chi_result.loc[mergeIndex, a]chi_result.loc[index, a]
chi_result.loc[mergeIndex, b] = chi_result.loc[mergeIndex, b]chi_result.loc[index, b]
chi_result.loc[mergeIndex, c] = (chi_result.loc[mergeIndex, b] - chi_result.loc[mergeIndex, a])**2 /chi_result.loc[mergeIndex, a]
chi_result = chi_result.drop([index])
chi_result = chi_result.reset_index(drop=True)
return chi_result
for col in bin_col:
chi_stats = calc_chiSquare(exp_f_data_label_dr, col, 'label')
chiMerge_result, split_list = chiMerge_maxInterval(chi_stats, col, maxInterval=5)
print(col, 'feature maybe split like this:', split_list)
python怎么做卡方检验创建结构元素:clear;close allSE = strel('rectangle',[40 30]); %注意:结构元素必须具有适当的大小,既可以删电流线又可以删除矩形.
卡方检验详解为什么要叫“卡方”?因为原名是“chi-squared”,一半是音译,一半是意译 。其中,chi 是希腊字母的读音,其实读音更像是“开”,而不是“卡” 。square表示平方,因此在英语中,卡方分布写作distribution 。
在理解卡方检验之前,应当理解卡方分布 。卡方分布是一种连续概率分布 。
如果一个随机变量服从标准正态分布,即,那么就服从自由度为1的卡方分布 。记作或者
而如果都服从标准正态分布,那么它们的平方和服从自由度为的卡方分布,记作:
或者写作。
对于非负自变量的自由度为的卡方分布的概率密度函数 (简称"pdf"):
(1)为什么非负?因为根据定义,卡方分布的自变量是一个平方和 。
(2)这里的是一个函数 。关于这个函数具体是什么,以及上门的概率密度函数如何推导,这里不展开,只需要知道有这么个函数即可 。实在是好奇的,可以 参考这里。
(3)卡方分布的均值为,而标准差为。
(4)自由度越大,该函数图像越对称 。
(5)为什么这里需要正态分布,我的理解是,如果零假设为真,那么观测值和期望值之间的波动程度 , 应该是正态分布的,或者说“噪声”应该是正态分布的 。
卡方检验有两个用途:
拟合优度检验 chi-squared test goodness of fit
独立性检验 chi-squared test of independence
某新闻说某个篮球明星的原地两连投的单次命中率是0.8 , 根据历次比赛的数据汇总得到下面的表格:
意思是说,在比赛中,有5次两连投是一次都没中,有82次是在两连投中命中1次 。现在,我们来用卡方检验验证新闻说的0.8的命中率是否正确 。零假设如下:
:两连投的成功次数符合二项分布,且概率为
(1)先根据零假设计算“期望”的命中次数分布:
由于总的观察次数为,于是在成立的前提下 , 可以计算每种两连投结果的期望次数:
0次命中:
1次命中:
2次命中:
显然,期望的观察次数和实际的观察次数是有偏差的,那么问题在于这个偏差是否大到具有统计显著性,进而可以否定零假设 。
(2)我们来构造卡方检验统计量(chi-squared test statistic):
这个值是把表里每个格子的实际值和期望值进行对比 。为什么要用平方?目的在于规避正负号的影响 。为什么要除以期望值?目的在于消除数量绝对值的影响 。例如你预算3块钱的水,商家加价50元 , 那么这个波动是你无法忍受的,而你预算20万的车,商家加价50元 , 则变得可以忍受 。也就是说,除以期望值目的在于聚焦于变化率,而不是变化量 。
之后,把这些“变化率”加总得到。而计算自由度有一个公式:
其中 R 表示行数,C 表示列数 。对于本例:
从另一个角度解释为什么:前面的定义是如果是个符合标准正态分布的相加 , 则自由度是,但是这里自有两个格子可以自由变化,第三个格子可以用总观察数减出来 , 例如。
因此,真正自由的只有2个格子,所以自由度是2 。
好了,将格子的数据代入,求出检验统计量:
(3)根据自由度为2的卡方分布,找到检验统计量对应的位置:
不难理解 , 随着统计量增大,表示预期的分布和实际的分布的差异也就越来越大 。
另外,由于通常意义上 , p值是越小越能推翻零假设,那么显然我们需要用右侧的面积来表示p值,这里用Python计算来代替查表:
输出:statistic: 17.26, pvalue: 0.0002
由于p值很?。偕栉颐堑南灾运降?.05),那么我们可以推翻零假设 。
进一步的,我们来探索下,该运动员的两连投的成功次数分数是否真的符合二项分布 。零假设:
:两连投的成功次数符合二项分布 。
既然符合二项分布,那么我们需要先估算一下最合理的概率,那当然是用总命中数除以总投篮数来计算了:
然后,用该概率值重复之前的计算 , 也就是先计算出一个期望的表格:
注意,这里的,这是因为,我们每从数据估计一个参数 , 那么我们就损失一个自由度 。这里用了一个平均命中的概率,因此自由度只有。
这时候,在使用 Python 进行计算时,注意调整默认的自由度:
这里的 ddof 就是额外损失的自由度,本意是“delta degree of freedom”
输出:statistic: 0.34, pvalue: 0.56
可以看到p值很大 , 因此不足以推翻零假设,也就是说该运动员的投篮命中次数可能真的是二项分布 。
下面表格表示喝酒频率和与警察发生麻烦的频数 。
以第一列为例,表示从不喝酒的人中 , 4992人不发生麻烦,71人会发生麻烦 。
现在的问题是,能否从以下数据推断说喝酒频率和与警察发生麻烦这两个事件相互独立?
我们的零假设应该如何设计?如果要说明两者相互独立 , 那么上表的分布应该满足乘法公式 。也就是说两个独立事件一起发生的概率等于分别发生的概率之积 。
于是我们有:
发生麻烦的总人数除以总人数
不喝酒的总人数除以总人数
进一步,根据总人数算出不喝酒而发生麻烦的人数的期望(下标表示零假设):
用类似的算法,计算每一个格子在零假设成立的情况下的值 , 写在原表数据下的括号里:
仔细观察可以看出,其实每个格子就是对应的:
另外可以看到,零假设下的各个格子的行列之和与原来相同 。这不是偶然的,我们用字母代替计算一下就知道了:
于是第一列的两个格子应该是:
对于其他格子、行的总和,都一样,这里不多说了 。
好 , 继续分析 。我们直接用上表计算卡方统计量和p值:
这部分计算方法和拟合优度是一样的,就不赘述了 。计算发现这个p值非常?。?接近0,因此我们可以推翻零假设 。也就是说,喝酒的频率和被警察找麻烦的并不是独立的,而是相关的 。
关于独立性检验,有一个比卡方检验更精准的检验,叫 fisher's exact test 。它通过直接计算否定零假设的概率,也就直接得到了一个准确的p值 。有一个经典的女士品茶的统计学故事 。有一个女士号称可以区分出一杯茶是先倒入了奶还是先倒入了茶 。统计学家 Fisher 为了验证她的说法,做了一个实验 。拿了8杯茶 , 4杯是先茶后奶 , 4杯是先奶后茶 。
实验结果是全部说对了 。那么问题是,这是否具有统计显著性呢?比如说一个人猜对了一次硬币,他的预测能力靠谱吗?
我们假设女士的判断是完全随机的,这个是我们的零假设 。那么8杯里面抽中4杯全对的概率是:
如果显著性水平是0.01,那么我们不能推翻零假设,即不敢确定这位女士真有这个识别能力 。如果显著性水平定在0.05,则我们可以认为她确实有这个识别能力 。
如果让实验结果有更大的说服力呢?一个简单的办法就是增加茶的数量,比如我们设定为两种茶各10杯,要求10杯都判断正确,那么p值为多少呢?
这个算起来比较麻烦,这里我写一个 python 脚本来计算:
计算结果:
这个p值就小得很夸张了,基本可以断定零假设不成立了 。
那么,回到实验本身,如果女士只选对了三杯,那么在零假设的前提下,这个发生的概率是多少?
这个概率比较大了 , 原大于通常使用的显著性水平 0.05,因此我们没有办法推翻零假设 。为什么要这样乘呢?这个是因为一共有这么多种取法 。你把所有可能的取法罗列处理,就是16种,然后除以总的取法数,就是随机取到这样结果的概率 。
比较 Fisher's exact test 和 chi-squared test,可以 参考这篇文章。
一般来说,两者都适用的情况下,应该优先选择 Fisher's exact test,因为它是精确值 。如果实验观察的数量很?。ㄐ∮?0),应该不使用 chi-squared test 。
下面使用一个脚本来计算:
关于卡方检验python函数和numpy卡方检验的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读