python分析数据差异的方法_用Python的两种方法进行方差分析

62cdbdb694d71ccd55af8d2376fbf7ce.jpg-wh_651x-s_1813353261.jpg

在进行数据分析时,我们往往会遇到要对某个变量的影响因素进行分析的情况,而影响一事物的因素往往是很多的。比如在化工生产中,有温度、压力、剂量、反应时间等因素。每一因素的改变都有可能影响产品的数量和质量。我们往往要找出对产品质量有显著影响的那些因素。而方差分析就是根据试验的结果进行分析,鉴别各个有关因素对试验结果影响的有效方法,本文主要讲述如何用python中的两种方法来进行方差分析。

首先,还是先简介一下方差分析。

方差分析(Analysis of Variance,ANOVA)又称“变异数分析”或“F检验”,是由罗纳德·费舍尔(Ronald Aylmer Fisher)发明的,用于两个及两个以上样本均数差别的显著性检验,其原理是认为不同处理组的均数间的差别基本来源有两个:

(1) 实验条件,即不同的处理造成的差异,称为组间差异。用变量在各组的均值与总均值之偏差平方和的总和表示,记作SSa,组间自由度dfa。

(2) 随机误差,如测量误差造成的差异或个体间的差异,称为组内差异,用变量在各组的均值与该组内变量值之偏差平方和的总和表示, 记作SSe,组内自由度dfe。

总偏差平方和 SSt = SSa + SSe。

组内SSe、组间SSa除以各自的自由度(组内dfe =n-m,组间dfa=m-1,其中n为样本总数,m为组数),得到其均方MSe和MSa,一种情况是处理没有作用,即各组样本均来自同一总体,MSa/MSe≈1。另一种情况是处理确实有作用,组间均方是由于误差与不同处理共同导致的结果,即各样本来自不同总体。那么,MSa>>MSe(远大于)。

MSa/MSe比值构成F分布。用F值与其临界值比较,推断各样本是否来自相同的总体。

然后,我们再说明一下数据集。

数据集非常简单,只有5组数值,每组数值有4个,共20个数字。分别命名为group1、group2、group3、group4和group5,数值都是随意设置的,没有什么要求,这里大家也可以根据自己的意愿设置数据。在这里,笔者专门将数据量设置得比较小,这样方便观察数据的之间的差异,我们的重点是方差分析的方法,而这里我们主要讲的是单因素方差分析法。

group1 = [29.6, 24.3, 28.5, 32.0]

group2 = [27.3, 32.6, 30.8, 34.8]

group3 = [5.8, 6.2,11.0, 8.3]

group4 = [21.6, 17.4, 18.3, 19.0]

group5 = [29.2, 32.8, 25.0, 24.2]

设u1、u2、u3、u4和u5分别是这5个样本所属总体的均值,我们用单因素方差分析来检验下面的假设。

H0:u1=u2=u3=u4=u5

H1:u1、u2、u3、u4和u5不全相等

为了能更直观了解这5组数据,我们首先手工计算一下这些数据的相关参数。这5组数据的总体情况如图1所示。

510aa3a5eab52dd7bd410651721dab9a.png

图1. 所用数据的基本情况

在图1中,每列数据就是一个水平,这是一个统计学用语,水平和就是每组4个数值的总和,每组数据平均值分别是a1=28.6,a2=31.375,a3=7.825,a4=19.075,a5=27.8,全部20个数据的平均值为A=(a1+a2+a3+a4+a5)/5=114.675/5=22.935。所以总偏差平方和为ST=1616.65,此值为20个数据中每个数据与A的差的平方的总和,误差平方和为SE=135.82,此值为每组数据中每个数据与这组数据的平均值的差的平方之和,效应平方和为SA=1480.83,此值为每组数据的平均值与A的差的平方之和,也等于ST减去SE的差。由此我们可以得出本例的方差分析表,如图2所示。

4fea03438bfd678180a73692fb5eef1e.png

图2. 方差分析表

图2中的因素就是各组数据间的差异,这个可以是随机的,也可以是人为的,而误差就是每组数据的之间差异。我们可以看到本例中得到的F值为40.8848,远大于查表得到的F值F0.05(4,15),其值为3.06,至于F0.05(4,15)的值我们同样可以用python得出,后面会有讲解。

以上就是这个例子的手工计算过程,下面我们用python来计算一下该例。

方法1:scipy

方法1用的库是scipy,这是python中科学计算最常用的库,其代码如下,记得输入前面的5组数据。

from scipy import stats

F, p=stats.f_oneway(group1, group2, group3, group4, group5)

F_test=stats.f.ppf((1-0.05), 4, 15)

print('F值是%.2f,p值是%.9f' % (F,p))

print('F_test的值是%.2f' % (F_test))

if F>=F_test:

print('拒绝原假设,u1、u2、u3、u4、u5不全相等')

else:

print('接受原假设,u1=u2=u3=u4=u5')

结果如图3所示。

a3e0c2ada77928658db572134761ba69.png

图3. 方法1的计算结果

scipy的单因素方差分析比较简单,只要调用stats模块的f_oneway方法即可,在f_oneway中输入各组数据,然后会自动返回两个数值F与p,第一个数值F就表示我们算出的F值,和图2中的F值一样,而第二个值p就是这个F值所对应的概率,也就是假设检验问题中,由检验统计量的样本观察值得出的原假设可被拒绝的最小显著性水平。在这里我们既可以通过F值来判断,也可以通过p值来判断,因为F大于F_test,落入了拒绝域,所以拒绝原假设,而p值也远小于α分位数(这里为0.05),所以也拒绝原假设。而这里的F_test就是图2中的F0.05(4,15),计算方法就是用stats.f.ppf((1-0.05), 4, 15),这里ppf的意思是Percent point function,也就是百分点函数,它是Cumulative distribution function(累积分布函数)的逆运算,这里需要注意的是ppf的第一个参数要输入1-0.05,0.05也就是我们设定的显著性水平α,其值通常取0.05,而第二个和第三个参数是两个自由度,这两个自由度分别是4和15,其求法在前面原理部分已经讲过。

方法2:statsmodels

方法2用的是python的另一个统计学库statsmodels,其代码如下。

import statsmodels.api as sm

import pandas as pd

from statsmodels.formula.api import ols

num=sorted(['g1', 'g2', 'g3','g4', 'g5']*4)

data=group1+ group2 + group3 + group4 + group5

df=pd.DataFrame({'num':num, 'data': data})

mod=ols('data ~ num',data=df).fit()

ano_table=sm.stats.anova_lm(mod,typ=2)

print(ano_table)

结果如图4所示。

74b8496ca97eb2e044d8c525dcb5d933.png

图4. 方法2的计算结果

从图4中我们可以看到,得出的结果和前面手算以及scipy的结果一样(部分小数精度问题可以忽略不计),图中sum_sq列就表示平方和,df列就代表了自由度,这里还给出了p值就是PR(>F)列,信息比scipy要丰富一些。

从代码上来看,statsmodels也同样很简单,只比scipy稍微复杂了一点,但却提供了更多的信息。这里有几点要注意的。一是我们生成了一个名为num的变量和一个名为data的变量,这两个都是list类型,又用二者生成了名为df的pandas.DataFrame变量,这样做的原因是statsmodels中普遍使用DataFrame数据格式,如果使用list类型会更麻烦一些。而data是把前面group1到group5中的数据放在了一个list中,num则是存放每个数据所对应的数据组信息,g1就代表这个数值属于group1,g2则是对应group2,以此类推。这里还有一点要注意,就是num中数据格式最好是字符格式的,比如’a1’、‘num3’这样的,不要是数字格式的,比如1、3、6.9这样的,因为数字格式的数据很有可能会参与计算,最终的结果可能会出错。第二点是mod = ols('data ~ num', data=df).fit()中的公式data ~ num,很多人对这一点很困惑,这种公式的使用方法来自于python的另一个库patsy,其主要用于描述统计模型(尤其是线性模型),符号~前面的部分代表了y轴数据,后面的部分代表了x轴数据,根据这二者生成一个线性模型,ols中第二个参数data则是要输入的数据源,一般是DataFrame格式,前面公式中符号~前后的名称都要是data中的列名,这种方法确实有些奇怪,部分原因是patsy借鉴了R语言的一些用法。第三点是ano_table = sm.stats.anova_lm(mod, typ=2)中,typ=2的意思是DataFrame,typ共有3个值,分别是1、2和3,其中2代表了DataFrame格式。

总结

对比scipy和statsmodels这两种方法,可以说是各有优势。scipy是一个通用型库,其包含了科学计算的多种模块,统计分析只是其中一部分,而statsmodels是一个专门进行统计分析的库,二者在功能上有一些差别,statsmodels在统计分析上更专业一些。而scipy的语法更符合python常用的语法,statsmodels的语法有些接近于R语言,对初学者可能有些陌生。所以大家可以根据自己的需要来选择合适的方法。

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 图片 渐变_AI教程!5分钟教你绘制超酷炫的字体效果

图一所示的图片就是我们今天要学的AI教程啦。为什么想起来要做这个呢?因为前两天有两个粉丝私信我问这种效果的字体怎么做。觉得大家应该对这类字体比较感兴趣的,所以今天就给大家出个教程啦。第一眼看上去是不是感觉很酷炫?其实步骤也不多&a…

6的变换_电源学报 | 2020年第3期:quot;高性能双向直流变换技术及其应用quot;专辑征稿启事...

往期精选:【电源学报•热点论文】贝尔福-蒙贝利亚技术大学(UTBM)高非教授-多物理域质子交换膜燃料电池建模仿真及实验测试专辑主编:张云 研究员(天津大学)吴红飞 教授(南京航空航天大学)专辑刊期: 2020年第3期(2020年5月)专辑介绍双向直流变换…

flash大作业一分钟源文件_「百树云课堂」一写作业就像被雷劈,是什么“病”?...

一写作业就闹心,大部分都是因为在培养习惯的时候基础没打好。比如:对时间不敏感、对效率不敏感、专注力低下等等!今天咱就系统说下“习惯培养”的重点。1大部分娃写不完作业,最主要的一点就是对时间不敏感。写一个字,喝…

bzoj5147bzoj2121loj6701 字符串游戏

做不出来杂题,到处找题做 看到$loj$上新出了一道题,觉得很神仙不错, 还记得Censoring吗(一个AC自动机的题) 这个题求最优解,数据范围$150$ 题解 数据范围非常小,首先贪心肯定不行,考虑AC自动机上$dp$? 好吧其实是区间$dp$ 一个直接的想法是维护$f[l][r]0/1$表示是否可以清空$l…

7个相同小球4个不同盒子_【计算启蒙】4个游戏陪娃玩懂“数拆分”,加减法都不用愁!...

前几天我们整理了能锻炼孩子“数-量匹配”知识的家庭生活小游戏:7个家庭数-量匹配小游戏,让孩子摆脱“机械数数”!​mp.weixin.qq.com所以今天,助教就来分享一些借助实物的“数拆分”小游戏吧!已经学会数量对应&#x…

python怎么使用预训练的模型_Keras使用ImageNet上预训练的模型方式

我就废话不多说了,大家还是直接看代码吧! import keras import numpy as np from keras.applications import vgg16, inception_v3, resnet50, mobilenet #Load the VGG model vgg_model vgg16.VGG16(weightsimagenet) #Load the Inception_V3 model in…

NOIP模拟测试49·50「养花·折射·画作·施工·蔬菜·联盟」

一套题 养花 题解 分块\主席树 这里我用的是主席树 查询分段$1-(k-1)$找最大的,能向右找就向右找 for(ll nowl1,nowrk-1;nowl<maxx;nowlk,nowrk,nowrmin(nowr,maxx)){if(ansmod-1) break;chose(rt[r],rt[l-1],nowl,nowr,1,maxx);} 复杂度分析,调和级数$√n*log(n)$ 代码 #in…

宏任务和微任务执行顺序_确保任务的执行顺序

宏任务和微任务执行顺序有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况&#xff1a;我们使用NIO从多个连接中读取数据。 我们需要确保来自给定连接的事件按顺序执行&#xff0c;但是不同连接之间的事件可以自由混合。 我想提出…

c语言中aver是什么意思_Linux系统top命令中的io使用率,到底是什么意思?

最近在做连续数据流的缓冲系统&#xff0c;C语言代码实现后&#xff0c;粗略测试了下&#xff0c;功能上应该没有问题。那么&#xff0c;接下来就该测试性能了。输入 top 命令&#xff0c;的确可以看到一系列 cpu 使用率&#xff0c;其中一个值得注意的子项就是 io 使用率了&am…

wireshark捕获选项不能用_wireshark的一些基础用法,欢迎收藏

About WiresharkWireshark是世界上最重要和使用最广泛的网络协议分析器。它让您在微观层次上看到网络上正在发生的事情&#xff0c;并且是许多商业和非营利性企业、政府机构和教育机构事实上(通常也是法律上)的标准。Wireshark的发展得益于全球网络专家的志愿贡献&#xff0c;并…

管理沟通-沟通框架

背景 管理三明治的承托&#xff0c;管理沟通。离开了沟通&#xff0c;所有的工作都将搁浅而无法前进。 常见话题&#xff1a; 向上沟通员工激励团队凝聚力提升向下沟通工作特点 工作职责说明技术开发计算机&#xff0c;编程语言&#xff0c;设计算法&#xff0c;开发功能&#…

NetBeans 9抢先体验

Java 9即将来临&#xff0c;NetBeans 9也即将来临。在本文中&#xff0c;我们将看到NetBeans 9 Early Access为开发人员提供的支持&#xff0c;以帮助他们构建Java 9兼容的应用程序。 Java 9提供了许多&#xff08;大约90种&#xff09; 新功能&#xff0c;包括Modules和JShel…

块裁剪后的矩形边界如何去掉_手持拍摄画面太抖?这节课教你如何快速稳定抖动的画面...

手持相机进行拍摄&#xff0c;画面会有较为明显的抖动&#xff0c;这节课就教大家如何稳定视频画面。素材导入到PR后&#xff0c;为素材添加变形稳定器效果&#xff0c;软件会自动开始分析。当前素材上方会显示在后台分析&#xff0c;这时候我们可以剪辑其他部分&#xff0c;并…

怎么把空字符串去掉_Python知识点字符串转整数需注意

↑↑↑关注后"星标"简说Python人人都可以简单入门Python、爬虫、数据分析简说Python严选 来源&#xff1a;简说Python 作者&#xff1a;老表One old watch, like brief python大家好&#xff0c;我是老表&#xff5e;Python知识点系列&#xff0c;学习了记得点赞、…

android-x86 镜像iso下载_Windows 10(1909)最新12月更新版MSDN官方简体中文原版ISO镜像下载+激huo工ju...

微软已于11月中旬开始大规模推送Windows 10操作系统的最新版本1909。此次更新官方未放出具体更新日志&#xff0c;但没有太多大功能更新&#xff0c;主要还是“修修补补”为主。现在&#xff0c;为大家带来本次官方最新原版ISO镜像下载&#xff0c;具体内部版本号为18363&#…

32查运行内存的map文件_Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比

本文首先介绍Spark中的两个配置参数: spark.shuffle.file.buffer map端内存缓冲 spark.shuffle.memoryFraction reduce端内存占比很多博客会说上面这两个参数是调节Spark shuffle性能的利器&#xff0c;实际上并不是这样的。以实际的生产经验来说&#xff0c;这两个参数没…

odoo self.ensure_one()

源码&#xff1a; def ensure_one(self): """ Verifies that the current recorset holds a single record. Raises an exception otherwise. """ try: # unpack to ensure there is only one value is faster than len when…

模板 字段_劲爆新功能:轻流文字识别(OCR)功能支持自定义识别模板啦

Hi&#xff0c;又和大家见面啦&#xff5e;前段时间我们的文字识别(OCR)功能推出后&#xff0c;由于只支持系统提供的固定识别模板&#xff0c;很多客户跟我们反馈说&#xff1a;希望可以自定义识别模板&#xff01;现应大家的要求&#xff0c;轻流「文字识别(OCR)」的「自定义…

Java 9中的进程处理

一直以来&#xff0c;用Java管理操作系统进程都是一项艰巨的任务。 这样做的原因是可用的工具和API较差。 老实说&#xff0c;这并非没有道理&#xff1a;Java并非出于此目的。 如果要管理OS进程&#xff0c;则可以使用所需的Shell&#xff0c;Perl脚本。 对于面临更复杂任务的…

拼音缩写是啥意思_NMSL?AWSL?这些拼音缩写到底是啥意思?

我绝对没有在骂你们&#xff0c;我只是单纯的举个例子而已。我们在网上冲浪时经常可以看到这些几个字母组成的拼音缩写&#xff0c;对于知道这些梗的人一眼就能GET到&#xff0c;但对于不明白的人来说猜来猜去也猜不出啥意思。所以今天就来给大家科普几个经常出现的拼音缩写&am…