基于Python的假设检验实现
本文作者:谭 可,中南财经政法大学统计与数学学院
本文编辑:刘光中
技术总编:孙一博
Stata and Python 数据分析
由李春涛教授和团队成员司海涛、薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!
购书链接:
引言
一、假设检验
1、基本思想
假设检验的基本思想是小概率反证法思想。小概率思想是指小概率事件(P<0.01或P<0.05)在一次试验中基本上不会发生。反证法思想是先提出假设(检验假设H0),再用适当的统计方法确定假设成立的可能性大小,如可能性小,则认为假设不成立,若可能性大,则还不能认为不假设成立。
2、基本步骤
(1)根据实际问题提出原假设H0和备择假设H1。(2)选择适当的显著性水平α(通常取α=0.05或α=0.01)以及样本容量n。(3)构造合适的检验统计量,常用的参数统计量有z统计量、t统计量、χ2统计量和F统计量等。(4)根据检验统计量和显著性水平,找出拒绝域。(5)根据样本观测值,计算出检验统计量的观测值。(6)做出判断。若检验统计量的观测值落在拒绝域,则拒绝原假设H0;否则不拒绝原假设H0。二、假设检验——Python实现
■ Statsmodels是Python中,用于实现统计建模和计量经济学的工具包,主要包括描述统计、统计模型估计和统计推断。
■ Scipy是一个数学、科学和工程计算Python工具包,主要包括统计,优化,整合,线性代数等等与科学计算有关的包。
下面以Python自带的鸢尾花数据集为例,来实现假设检验。
1、导入数据import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
# 导入IRIS数据集
iris = load_iris()
iris = pd.DataFrame(iris.data, columns=['sepal_length', 'sepal_width', 'petal_legth', 'petal_width'])
print(iris)
输出的鸢尾花属性特征数据如下:问题:鸢尾花花瓣长度的总体均值是否为4.1?
提出假设:
H0:鸢尾花花瓣平均长度是4.1
H1:鸢尾花花瓣平均长度不是4.1
由于该数据集为大样本,故采用z检验。
import statsmodels.stats.weightstats
#进行单样本z检验
z, p = statsmodels.stats.weightstats.ztest(iris['petal_legth'], value=4.1)
print(z, p)
输出:由输出结果可知,z统计量等于-2.37,p值为0.018,小于显著性水平0.05,故拒绝原假设,即鸢尾花花瓣平均长度不是4.1。
3、一个总体均值的t检验问题:现取总体中前20个样本的数据记为iris20数据集,探究前20个样本中鸢尾花花瓣长度的总体均值是否为1.4?
提出假设:
H0:鸢尾花花瓣平均长度是1.4
H1:鸢尾花花瓣平均长度不是1.4
由于此时样本量为20,故为小样本,而总体方差未知,故采用t检验。
import scipy.stats
iris20=iris.iloc[:20] #前20个样本
t, p = scipy.stats.ttest_1samp(iris20['petal_legth'], popmean=1.4)
print(t,p)
输出:
问题:对于iris20数据集,现将总体分为两类,花瓣宽度小于0.25的为一类,剩下的为另一类,两者的花瓣宽度是否存在差异?
提出假设:
H0: 两种鸢尾花花瓣宽度一样
H1: 两种鸢尾花花瓣宽度不一样
下面使用scipy和statsmodels两种方式来解决该问题。
(1)scipy 方法实现#两样本t检验
scipy.stats.ttest_ind(
a,b:两组数值
equal_var = true #两组方差是否相同,方差不同时给出welch's t检验结果
nan_policy = propagate #缺失值的处理方式
propagate #返回nan
raise #是否抛出错误
omit #忽略nan
)
两样本的t检验需要检验样本的方差齐性检验:# 常用的方差齐性检验
scipy.stats.bartlett() #bartlett方差齐性检验
scipy.stats.levene() #levene方差齐性检验,该结果针对非正态总体也稳健,更常用
两样本t检验具体步骤的代码如下:# 取两个样本
iris_1 = iris20[iris20.petal_width >= 0.25]
iris_2 = iris20[iris20.petal_width < 0.25]
print(np.mean(iris_1['petal_width']))
print(np.mean(iris_2['petal_width']))
t1, p1 = scipy.stats.levene(iris_1['petal_width'], iris_2['petal_width']) #方差齐性检验
t2, p2 = scipy.stats.ttest_ind(iris_1['petal_width'], iris_2['petal_width']) #两样本t检验
print(t1, p1)
print(t2, p2)
statsmodels也可以实现t检验的所有功能。
# 两样本的statsmodels实现
d1 = statsmodels.stats.weightstats.DescrStatsW(iris_1['petal_width'])
d2 = statsmodels.stats.weightstats.DescrStatsW(iris_2['petal_width'])
comp = statsmodels.stats.weightstats.CompareMeans(d1, d2)
print(comp.ttest_ind()) # 输出结果为(统计量 p值 自由度)
读完本文,是不是基本掌握了利用Python实现常用的假设检验呢?大家也可以自己尝试着解决更多的假设检验问题。今天给大家分享的这篇文章到这里就结束了,希望对大家有所帮助!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
Stata绘图系列—NBER Working paper仿图
Camelot:从PDF中提取表格数据 Stata之计算财务指标——融资约束Stata绘图系列——玩转绘图通用选项之坐标轴玩转地图的好帮手--pyecharts
爬虫俱乐部又又又输送了一位研究助理!!! 【数据分析】一文教你玩转DataFrame【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新
带你玩转Stata编码一言不合就teamviewer 教你用Stata爬取全国疫情风险地区数据,原来这么简单!【数据结构】集合的使用方法 Stata爬取七普人口数据 关于我们微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可
以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。