假设检验之卡方检验

article/2025/11/6 4:31:36

之前我对卡方检验的了解都是一知半解的,即知道作用是对离散变量分布差异的比较,根据期望频数和观察频数的差异计算出来一个卡方值,之后根据自由度和显著性水平查卡方分布对应的临界值,比较大小得出有无明显差异的结论。

一般我们都说单元格期望数最好不小于5,也就是期望频数不小于5,但这里我个问题:

为什么要求期望频数不小于5?假设期望频数小于5会有什么后果?

这两个问题相信不少人都不是很清楚,今天我们就来讲下这两个问题。

标准化残差是将残差与期望频数平方根相除得到的,太小的期望频数很可能任性地放大了残差,进而导致卡方统计量过大,有可能造成“弃真”错误(第1类错误),所以,期望频数接近最小的硬性指标5时,就需要检查相应单元格的残差时不是特别大。

换句话说,假如我们做出了接受原假设的结论,即使此时有些期望频数小于5也无所谓,因为他们只会导致更大的卡方值。

而当我们做出了拒绝原假设的结论时,就需要特别注意是不是有些期望频数小于5,这个时候我们有可能会因为有些期望频数小于5这个因素过大的计算了卡方值,进而造成“弃真”错误。此时需要重点关注相应单元格的残差时不是特别大。

1.导入数据

import pandas as pd
data=pd.read_clipboard()
data.head()

请添加图片描述

2.统计观察频数

data.columns=['city','answer','score','driver_num']
data1=pd.pivot_table(data=data,index=['answer'],columns=['city'],values=['driver_num'],\aggfunc='sum',fill_value=0)
data1.columns=data1.columns.droplevel(level=0)
data1.reset_index(drop=False,inplace=True)
data2=data1.melt(id_vars=['answer'],value_name='观察频数')
data2.head()

请添加图片描述

3.统计各组总数目和总体的期望分布

rate=(data2.groupby(['answer'])['观察频数'].sum()/data2.groupby(['answer'])['观察频数'].sum().sum()).reset_index()
rate.columns=['answer','rate']
group_sum=data2.groupby(['city'])['观察频数'].sum().reset_index()
group_sum.columns=['city','司机数']
group_sum

请添加图片描述

4.计算期望频数和卡方值

import math
data3=pd.merge(data2,group_sum,on=['city'],how='left')
data3=pd.merge(data3,rate,on=['answer'],how='left')
data3['期望频数']=data3['司机数']*data3['rate']
data3['卡方值']=data3.apply(lambda x: math.pow((x.期望频数-x.观察频数),2)/x.期望频数,axis=1)
data3['残差']=data3.apply(lambda x: (x.观察频数-x.期望频数),axis=1)
data3.head()

请添加图片描述

5.根据自由度查表得出结论

卡方分布表查询

data3['卡方值'].sum()

请添加图片描述
由于此时是拒绝了原假设,需要特别注意有无期望频数小于5的情况。若有,还需要关注对应的残差的大小情况。

6.两两比较

由于3个城市整体来看并不是无明显差异,所以可以进一步两两比较,这个时候可以直接调用
python的chi2_contingency函数用于计算。

def chi2_contingency_my(data_input,city1,city2):values1=data_input[data_input['city']==city1]['观察频数'].tolist()values2=data_input[data_input['city']==city2]['观察频数'].tolist()data = np.array([values1, values2])try:kf = chi2_contingency(data)print('--------------')print('chisq-statistic=%.4f, p-value=%.4f, df=%i expected_frep=%s'%kf)#第一个值为卡方值,第二个值为P值,第三个值为自由度,第四个为与原数据数组同维度的对应理论值if kf[1]<0.05:print("{}与{}的选择存在显著差异".format(city1,city2))else:print("{}与{}的选择无显著差异".format(city1,city2))except:print('--------------')print("{}与{}的某选项均为0,无法计算".format(city1,city2))
city_list=data3['city'].unique().tolist()
for i in range(0,len(city_list)-1):for j in range(i+1,len(city_list)):chi2_contingency_my(data3,city_list[i],city_list[j])

请添加图片描述


http://chatgpt.dhexx.cn/article/WsAG9vYR.shtml

相关文章

计量经济学及Stata应用 陈强 第七章异方差习题7.2

7.2 房价回归是否存在异方差&#xff1f;数据集hprice2a.dta包含美国波士顿506个社区的房屋中位数价格的横截面数据&#xff0c;考虑以下特征价格回归: 其中&#xff0c;lprice为房价的对数&#xff0c;lnox为空气污染程度的对数&#xff0c;ldist为社区到就业中心距离的对数&a…

R 两组样本t检验 wilcoxon检验、卡方、fisher精确检验

一般统计方法R实现 文章目录 一、读入数据二、连续性变量1.正态性和方差齐性检验2.描述统计量3.独立样本t检验和wilcoxon秩和检验 三、四格表卡方或fisher精确检验&#xff08;OR【95%CI】&#xff09;1.计算各组频数和相对频率2.整理数据进行检验 总结 一、读入数据 library(…

计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.5

9.5美国的汽油需求函数是否稳定&#xff1f;使用数据集gasoline.dta&#xff0c;估计美国1953-2004年的汽油需求函数: 其中&#xff0c;被解释变量lgasq为人均汽油消费量的对数&#xff0c;解释变量lincome为人均收入对数&#xff0c;lgasp为汽油价格指数的对数&#xff0c;lpn…

统计学 假设检验(Hypothesis Testing)

什么是假设检验&#xff1a; 通过设定一个假设&#xff0c; 然后通过收集数据、计算等操作来判断这个假设是否成立。 假设检验的步骤&#xff1a; 1. 设定 null hypothesis 和 alternative hypothesis 2. 收集数据 3. 基于收集的数据&#xff0c;来判断 拒绝 或者 接受 nul…

卡方检验 (Chi-square test / Chi-square goodness-of-fit test)

卡方检验 &#xff08;Chi-square test / Chi-square goodness-of-fit test) 1. 什么是卡方检验 卡方检验是一种以 χ 2 \chi^2 χ2分布为基础的用途广泛的假设检验方法。是一种非参数检验方法。它的无效假设 H 0 H_0 H0​为&#xff1a;观察频数与期望频数没有显著性差异。 …

【零基础Eviews实例】01异方差的检验与修正

使用说明 本文档主要介绍有关线性回归模型关于异方差常见的判断方法&#xff08;包括图像法、辅助回归、怀特检验三种&#xff09;以及修正方式&#xff08;加权最小二乘法&#xff09;。使用软件为Eviews&#xff0c;和上一篇文章相同&#xff0c;此处也仅仅关注操作性的东西…

计量经济学笔记5-Eviews操作-异方差的检验与消除(White检验与加权最小二乘)

完成期末作业的同时来更一下博客 问题背景&#xff1a; 对中国储蓄存款总额&#xff08;Y&#xff0c;亿元&#xff09;与GDP&#xff08;亿元&#xff09;两个变量进行一元线性回归&#xff0c;检验并消除异方差。 White检验是通过一个辅助回归式进行异方差检验。用残差平方对…

stata学习笔记|异方差问题

异方差无法用OLS进行估计的根源问题&#xff1a;方差较大的数据包含的信息量较小&#xff0c;但OLS是对所有数据进行相同的处理。异方差的问题并不会影响估计量的无偏性、一致性、渐近正态性&#xff0c;只是效率较低使得t检验和F检验失效。 说白了就是回归出来的系数不会改变…

计量经济学及Stata应用 陈强 第七章异方差习题7.3

7.3恩格尔曲线是否存在异方差&#xff1f;数据集food.dta包含有关每周食物开支&#xff08;food_exp&#xff09;与每周收入&#xff08;income&#xff09;的40个观测值。 &#xff08;1&#xff09;将food_exp与income的散点图与线性拟合图画在一起。根据此图&#xff0c;是…

R费希尔精确检验(Fisher‘s exact test)

R费希尔精确检验(Fishers exact test) Fisher精确检验是一种显著性检验(significance想),当样本量较小时,用它来代替22表的卡方检验。 # 如何在R中进行Fisher精确测试。 # 为了在R中进行Fisher检验,我们只需要一个22的数据集。使用下面的代码,我生成一个仿真的22数据…

超几何分布检验(hypergeometric test)与费歇尔精确检验(fisher‘s exact test)

1&#xff0c;超几何分布检验常用来对venn图两个圈overlap的显著性进行检验&#xff0c;费歇尔精确检验常用来对2x2的列联表进行检验。 2&#xff0c;假设有如下的统计数据&#xff1a; smokenon-smokelung cancer106normal112 现在对其进行费歇尔精确检验&#xff0c;有两种…

【Python计量】异方差性的检验

目录 一、画残差图 二、BP检验 &#xff08;一&#xff09;手动编制函数进行BP检验 &#xff08;二&#xff09;调用statsmodels的函数进行BP检验 三、怀特检验 &#xff08;一&#xff09;手动编制函数进行White检验 &#xff08;二&#xff09;调用statsmodels的函数进…

stata 异方差专题【计量经济系列(四)】

stata 异方差专题【计量经济系列&#xff08;四&#xff09;】 文章目录 1. 异方差检验方法2. 散点图法3. BP检验4. 怀特检验5. FWLS 可行权的最小二乘法6. 小练习 ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯…

Python的strip()函数

在python API中这样解释strip()函数&#xff1a; 声明&#xff1a;s为字符串&#xff0c;rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头、结尾处&#xff0c;位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头处&#xff0c;位于 rm删除序列的字符 …

.strip().split('t')和.strip().split()

.strip().split(t) line nihao, zhenhao,dajiahao print(line).strip().split(t) .strip().split() line nihao, zhenhao,dajiahao print(line.strip().split())

Python Strip()使用详解

一、函数定义 可使用快捷键ctrlb&#xff0c;查看函数的定义。 函数功能&#xff1a;默认删除字符前后的空格&#xff0c;如果有指定字符删除自定字符前后指定字符。 注意&#xff0c;该函数只能删除字符前后的字符&#xff0c;不能删除字符中间的字符。 二、默认情况下删除…

python中的strip()和split()

一.strip() strip()简单来说就是&#xff1a; 返回删除前导和尾随空格的字符串副本。如果给定了chars而不是None&#xff0c;则删除chars中的字符。 下面来举几个例子&#xff1a; 1.strip()括号内无任何字符 2.strip()括号内存在字符 二.split() split()函数通常是对字符…

python中strip的使用

今天聊聊python去除字符串空格的函数&#xff1a;strip&#xff08;&#xff09;和replace&#xff08;&#xff09; 1.strip(): 函数功能描述&#xff1a;Python strip() 方法用于移除字符串头尾指定的字符&#xff08;默认为空格或换行符&#xff09;或字符序列。 注意&#…

Python 中strip()方法怎么用?

Python strip() 方法用于去除字符串开头和结尾处指定的字符(默认为空格或换行符)或字符序列&#xff0c;不会去除字符串中间对应的字符。 相关函数有lstrip()和rstrip() 。用法与strip()相同。 lstrip()方法用于去除左边(开始)的空白字符; rstrip()方法用于去除右边(末尾)的…

Linux中source filename .(点)filename ./filename sh filename的区别

在shell中source filename 和 . filename是一样的&#xff0c;但source和 ./filename.sh的执行结果有很大区别&#xff0c;借用一张网上的图。如下 可以看到通过./filename.sh执行shell脚本&#xff0c;脚本内执行的命令和设置的环境变量不影响执行shell脚本的shell环境变量…