2022年 11月 4日

python 假设检验

目录

一、为什么要使用假设性检验?

二、假设检验基础原理与使用条件

三、怎么使用?

3.1 假设检验的步骤

1、H0(零假设)和H1(备择假设)

2、计算P值

3、确认显著性水平

3.2 常见的统计量

四、假设检验中存在的两类错误&需要注意的问题

3.1 假设检验中的两类错误

3.2 假设检验中需要注意的问题

六、案例(t检验)

6.1 单样本t检验

6.1.1 scipy 方法实现

6.1.2 statsmodels 方法实现

6.2 两样本t检验

6.2.1 scipy 方法实现

6.2.2 statsmodels 方法实现

6.3 配对t检验


一、为什么要使用假设性检验?

假设检验是一个工具,能够穿越复杂的现象,得到一个靠谱的结论。

比如去医院检查身体,医生会先假设这个人没有病,然后通过一系列检查,看看能不能找到患者的症状。

二、假设检验基础原理与使用条件

1、概率分布是假设检验的基础:对于很多复杂的随机事件,需要把随机事件的概率分布图拿出来,并根据在图中位置确定P值的大小。只有这样,才能和显著性水平比较,才能判断H0能不能被推翻。假设检验是基于概率的反证法,而要用概率的反证法,就要用到概率分布。

2、假设检验的原理:是如果能够证明一个结论发生的概率特别小,我们就可以推翻这个结论,接受和它相反的结论,这个推论的过程就叫“假设检验”。

3、适用条件:

        1)独立性:各观察值间相互独立,不能相互影响

        2)正态性:理论上要求样本取自正态总体

        3)方差齐性:两样本所对应的总体方差相等

三、怎么使用?

3.1 假设检验的步骤

1、H0(零假设)和H1(备择假设)

这是一对假设,只要互相对立就行,一般情况H0是会被拒绝的假设。

2、计算P值

就是在H0这个假设下,当前现象以及更加极端现象出现的概率。如果P值特别大,我们就不能推翻H0这个假设,更不能去相信H1;而如果P值特别小,就可以认为H0几乎不可能发生,转而去相信H1。

p值得计算中,有单侧和双侧两种

双侧检验:不知道样本所在总体和假定总体的相应指标谁高谁低。得到拒绝结论更困难,因此相应的结果也更稳妥。

单侧检验:在专业上可知所在总体的相应指标不可能更高/更低于假定总体值。

3、确认显著性水平

就是是否推翻H0的边界,一般使用5%,即只要P值小于5%,就推翻H0,相信H1;如果P值大于5%,就没有办法推翻H0。

3.2 常见的统计量

1、z统计量:

2、t 统计量

3、卡方统计量

4、F统计量

四、假设检验中存在的两类错误&需要注意的问题

3.1 假设检验中的两类错误

第一类错误:指在原假设成立的情况下错误低拒绝了原假设;

第二类错误:和第一类错误相反,指没有成功拒绝不成立的原假设。

在假设检验中,如何平衡两类错误。在假设检验的过程中,通常会预先设定犯第一类错误的上限,也就是定义显著性水平 \alpha,1-\alpha 被称为置信度 \alpha一般设定为5%。在显著性水平固定的情况下,认为设定,需要减少第二类错误\beta发生的概率,1-\beta 对应与规避第二类错误的概率,用power表示,也称为检验效能,power 的大小可以通过增加样本量来提高,通常需要power达到80%或者更好的水平。

3.2 假设检验中需要注意的问题

1、忽略小概率事件,假设检验要用个别推导全部,就一定会忽略一些极端的小概率情况,但是小概率事件,不代表一定不会发生。

2、系统性偏差。因为P值可以影响我们最终的结论,而选择不同的样本就会得到不同的P值。只要不断改变样本,就能不断改变P值,最终总能找到一个非常小的P值,也就能推翻原假设,得到一个自己想要的结论。【例子:著名的邮件骗局】

3、显著性水平设置不好会导致错误。显著性水平是约定俗称的,不同的领域,需要选择不同的标准。

4、用错分布导致错误结论。

六、案例(t检验)

6.1 单样本t检验

实例:ccss项目基期的信心数据被设定为100,但这是全部城市的平均水平,请考察基期时广州信心指数均值是否和基准值有差异。

可以使用的方式:scipy、statsmodels 。

6.1.1 scipy 方法实现

  1. import pandas as pd
  2. ccss = pd.read_excel("CCSS_sample.xlsx", sheet_name = 'CCSS')

数据样式:

 使用scipy.stat包可以实现各种常见的检验方法,但并未配备详细选项,例如不能指定检验的单双侧。

  1. #scipy 中相关参数
  2. scipy.stats.ttest_1samp(
  3.         a:类list格式的样本数值
  4.         popmean:H0所对应的总体均数
  5. )
  1. ccss.query("s0 == '广州' & time == '2022704'") #数据查询
  2. ccss.query("s0 == '广州' & time == '2022704'").index1.describe #数据描述
  3. ccss.query("s0 == '广州' & time == '2022704'").index1.hist #数据直方图

直方图用于展示数据的形态,以上图形大致符合正态分布。

  1. # t检验
  2. from scipy import stats as ss #导入对应的包
  3. ss.ttest_1samp(ccss.query("s0 == '广州' & time == '200704'").index1, 100) #t检验
  4. #输出结果 Ttest_1sampResult(statistic=-1.3625667518512996, pvalue=0.17611075148299993)
  5. #statistic:统计量值,pvalue:p值

6.1.2 statsmodels 方法实现

该方法中数据为DescrStatsW,DescrStatsW类中的confint_mean可以计算可信区间,ttest_mean则可直接实现单样本t检验。

  1. # statsmodels中tconfint_mean相关参数
  2. #计算均值的可信区间
  3. DescrStatsW.tconfint_mean(
  4.         alpha = 0.05 #显著性水平
  5.         alternative = 'two-sided' #选择是双侧检验还是还是单侧检验
  6. )
  7. #进行单样本t检验
  8. DescrStatsW.ttest_mean(
  9.         value = 0 #H0所对应的总体均数
  10.          alternative = 'two-sided' | 'larger' | 'smaller'
  11. )
  1. # 使用得第二种方法 statsmodels 这种方法可以计算可信区间,也可以实现单样本的t检验
  2. from statsmodels.stats import weightstats as ws
  3. test_samp_data = ccss.query("s0 == '广州' & time == 200704").index1 #样本数据
  4. des = ws.DescrStatsW(test_samp_data) #使用该检验数据必须是DescrStatsW类
  5. des.tconfint_mean() #计算可信区间,默认95% 对应的参数 alpha = 0.05 alternative = 'two-sided'
  6. #输出结果 (93.03590418536487, 101.29354984884586)
  7. des.ttest_mean(100) #默认是双侧
  8. #输出结果 (-1.3625667518512996, 0.17611075148299993, 99.0) 分别为t值、p值、自由度
  9. des.ttest_mean(100,'smaller') #单侧检验
  10. #输出结果 (-1.3625667518512996, 0.08805537574149996, 99.0) t值和双侧检验相同,p值是双侧检验的一半

6.2 两样本t检验

案例:研究不同婚姻状况的信心指数均值可能存在差异。

两样本的t检验需要检验样本的方差齐性检验。

同样可以使用scipy和statsmodels两种方式 。

6.2.1 scipy 方法实现

  1. #进行两样本t检验
  2. scipy.stats.ttest_ind(
  3.         a,b:类数据格式的两组数值
  4.         equal_var = true #两组方差是否齐同,方差不齐时给出welch's t检验结果
  5.         nan_policy = propagate #缺失值的处理方式
  6.                 propagate #返回nan
  7.                 raise #是否抛出错误
  8.                 omit #忽略nan
  9. )

方差齐性检验

  1. #常用的方差齐性检验
  2. scipy.stats.bartlett() #bartlett 方差齐性检验
  3. scipy.stats.levene() #levene 方差齐性检验,该结果针对非正泰总体稳健,相对更加常用
  4. #案例中使用
  5. ss.levene(ccss.index1[ccss.s7 == "未婚"],ccss.index1[ccss.s7 == '已婚'])
  6. #输出结果 LeveneResult(statistic=0.6178737960192996, pvalue=0.43200314605212653)
  7. # H0是两个样本具有一样的方差,p值大于0.05接受原假设 即两个样本方差齐

进行样本t检验

  1. #进行样本t检验
  2. ss.ttest_ind(ccss.index1[ccss.s7 == "未婚"],ccss.index1[ccss.s7 == "已婚"])
  3. #输出结果 Ttest_indResult(statistic=2.405261376009453, pvalue=0.016320721789339597)
  4. #Ho两个样本均值一致不具有差异性 p值小于0.05拒绝原假设,即两个样本均值存在差异
  5. #如果在上面的方差检验中,方差不是齐性的,则需要在t检验中进行参数设置
  6. ss.ttest_ind(ccss.index1[ccss.s7 == '未婚'],ccss.index1[ccss.s7 == '已婚'],equal_var= False)

6.2.2 statsmodels 方法实现

statsmodels可以实现t检验的所有功能,但是无法完成方差齐性检验。

  1. statsmodels.stats.weightstats.CompareMeans(d1, d2)
  2. # d1, d2均为DescrStatsW对象,如果只有d1为DescrStatsW对象,也可以使用d1.get_compare(other)直接转换
  3. CompareMeans.ttest_ind(
  4. alternative = 'two-sided' : 'larger' | 'smaller'
  5. usevar='pooled' : 'pooled' or 'unequal',方差是否齐同
  6. value = 0 : H0假设所对应的均数差值
  7. )
  8. #两样本的statsmodels实现
  9. d1 = ws.DescrStatsW(ccss.index1[ccss.s7 == '未婚'])
  10. d2 = ws.DescrStatsW(ccss.index[ccss.s7 == '已婚'])
  11. comp = ws.CompareMeans(d1,d2)
  12. comp.ttest_ind()
  13. #输出结果 (-26.42469575169767, 3.1575849989673495e-120, 1131.0) 统计量 p值 自由度

6.3 配对t检验

案例:为保证数据质量,接受过ccss访问的受访家庭半年内不会在进行访问,单半年后会进行抽样回访。现通过回访采集了88个有效样本,希望比较这些样本的信心值是否发生变化。

进行配对p检验时需要使用相关分析进行相关性检验。

  1. ccss_p = pd.read_excel("CCSS_sample.xlsx", sheet_name = 'CCSS_pair') #导入数据
  2. ccss_p.loc[:, ['index1', 'index1n']].describe()
  3. ss.pearsonr(ccss_p.index1, ccss_p.index1n) #相关性检验
  4. ss.ttest_1samp(ccss_p.index1 - ccss_p.index1n, 0) #检验