Python实现多元线性回归分析教程及代码分享
很多人在做数据分析时会经常用到一元线性回归,这是描述两个变量间统计关系的最简单的回归模型。但现实问题中,我们往往会碰到多个变量间的线性关系的问题,这时就要用到多元线性回归,多元线性回归是一元回归的一种推广,其在实际应用中非常广泛,本文就用python代码来展示一下如何用多元线性回归来解决实际问题。
图1. 多元回归模型中要用到的公式
如图1所示,我们假设随机变量y与一般变量x1、x2、...、xp
之间线性回归模型为(1)式,式中y
为因变量,x1、x2、...、xp
是自变量,β1、β2、...、βp
是回归系数,β0
是回归常数。对于一个实际问题,如果我们获得n组观测数据(xi1,xi2,...,xip;y)(i = 1,2,...,n)
,则我们可以把这n组观测数据写成矩阵形式y=Xβ+ε
。
在求出了回归方程之后,我们往往还要对回归方程进行显著性检验。这里的显著性检验主要包括三部分。第一个是F检验,也就是检验自变量x1、x2、...、xp
从整体上对y是否有明显的影响,主要用到(2)、(3)、(4)式,其中(2)和(3)式是一个式子,不过是用不同符号表示;第二个是t
检验,是对每个自变量进行显著性检验,就是看每个自变量是否对y有显著性影响,这和前面从整体上检验还是有区别的;第三个是拟合优度,也就是R2
,其取值在0到1之间,越接近1,表明回归拟合的效果越好,越接近于0,则效果越差,但R
只能直观反映拟合的效果,不能代替F
检验作为严格的显著性检验。
上面是多元线性回归的一个简单介绍,其详细原理内容较多,有兴趣的读者可以去查阅一下相关文献,这里不再赘述,只重点讲解如何用python进行分析。下面我们还是用代码来展示一下多元线性回归的分析过程。
这里我们用到的数据来源于2013年《中国统计年鉴》,数据以居民的消费性支出为因变量y
,其他9个变量为自变量,其中x1
是居民的食品花费,x2
是衣着花费,x3
是居住花费,x4
是医疗保健花费,x5
是文教娱乐花费,x6
是职工平均工资,x7
是地区的人均GDP,x8
是地区的消费价格指数,x9
是地区的失业率。在这所有变量里面,x1
至x7
以及y
的单位是元,x9
是百分数,x8
没有单位,因为其是消费价格指数。数据的总体大小为31x10,即31行、10列,大体内容如图2所示。
图2. 数据集部分内容
首先还是导入需要的库。
import numpy as np
import pandas as pd
import statsmodels.api as sm
接下来是数据预处理,因为原数据的列标太长,我们要处理一下,去除其中的中文,只留下英文名称。
file = r'C:\Users\data.xlsx'
data = pd.read_excel(file)
data.columns = ['y', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9']
然后我们就开始生成多元线性模型,代码如下。
x = sm.add_constant(data.iloc[:,1:]) #生成自变量
y = data['y'] #生成因变量
model = sm.OLS(y, x) #生成模型
result = model.fit() #模型拟合
result.summary() #模型描述
很明显,这里的自变量是指x1
到x9
这9个自变量,代码data.iloc[:,1:]
就是去掉原数据中第一列,也就是y那一列的数据,result.summary()
则是生成一份结果描述,其内容如图3所示。
图3. 包含所有自变量的回归结果
在这个结果中,我们主要看“coef”
、“t”
和“P>|t|”
这三列。coef
就是前面说过的回归系数,const
这个值就是回归常数,所以我们得到的这个回归模型就是y = 320.640948 + 1.316588 x1 + 1.649859 x2 + 2.17866 x3 - 0.005609 x4 + 1.684283 x5 + 0.01032 x6 + 0.003655 x7 -19.130576 x8 + 50.515575 x9
。而“t”
和“P>|t|”
这两列是等价的,使用时选择其中一个就行,其主要用来判断每个自变量和y
的线性显著关系,后面我们会讲到。从图中还可以看出,Prob (F-statistic)
为4.21e-20
,这个值就是我们常用的P值,其接近于零,说明我们的多元线性方程是显著的,也就是y
与x1、x2、...、x9
有着显著的线性关系,而R-squared
是0.992,也说明这个线性关系比较显著。理论上,这个多元线性方程已经求出来了,而且效果还不错,我们就可以用其进行预测了,但这里我们还是要进行更深一步的探讨。前面说过,y
与x1、x2、...、x9
有着显著的线性关系,这里要注意x1
到x9
这9个变量被看作是一个整体,y
与这个整体有显著的线性关系,但不代表y与其中的每个自变量都有显著的线性关系,我们在这里要找出那些与y
的线性关系不显著的自变量,然后把它们剔除,只留下关系显著的,这就是前面说过的t
检验,t
检验的原理内容有些复杂,有兴趣的读者可以自行查阅资料,这里不再赘述。我们可以通过图3中“P>|t|”
这一列来判断,这一列中我们可以选定一个阈值,比如统计学常用的就是0.05、0.02或0.01,这里我们就用0.05,凡是P>|t|
这列中数值大于0.05的自变量,我们都把它剔除掉,这些就是和y线性关系不显著的自变量,所以都舍去,请注意这里指的自变量是x1
到x9
,不包括图3中const
这个值。但是这里有一个原则,就是一次只能剔除一个,剔除的这个往往是P值最大的那个,比如图3中P
值最大的是x4
,那么就把它剔除掉,然后再用剩下的x1、x2、x3、x5、x6、x7、x8、x9
来重复上述建模过程,再找出P
值最大的那个自变量,把它剔除,如此重复这个过程,直到所有P
值都小于等于0.05,剩下的这些自变量就是我们需要的自变量,这些自变量和y的线性关系都比较显著,我们要用这些自变量来进行建模。
我们可以将上述过程写成一个函数,命名为looper
,代码如下。
def looper(limit):
cols = ['x1', 'x2', 'x3', 'x5', 'x6', 'x7', 'x8', 'x9']
for i in range(len(cols)):
data1 = data[cols]
x = sm.add_constant(data1) #生成自变量
y = data['y'] #生成因变量
model = sm.OLS(y, x) #生成模型
result = model.fit() #模型拟合
pvalues = result.pvalues #得到结果中所有P值
pvalues.drop('const',inplace=True) #把const取得
pmax = max(pvalues) #选出最大的P值
if pmax>limit:
ind = pvalues.idxmax() #找出最大P值的index
cols.remove(ind) #把这个index从cols中删除
else:
return result
result = looper(0.05)
result.summary()
其结果如图4所示。从结果中可以看到最后剩下的有效变量为x1
、x2
、x3
和x5
,我们得到的多元线性模型为y = -1694.6269 + 1.3642 x1 + 1.7679 x2 + 2.2894 x3 + 1.7424 x5
,这个就是我们最终要用到的有效的多元线性模型。
图4. 剔除无效变量后的回归模型
那么问题来了,前面我们得到的包含所有自变量的多元线性模型和这个剔除部分变量的模型,我们要选择哪一个,毕竟第一个模型的整体线性效果也挺显著,依据笔者的经验,这个还是要看具体的项目要求。因为我们实际项目中遇到的问题都是现实生活中真实存在的例子,不再是单纯的数学题了,比如本例中的x8消费价格指数和x9地区的失业率,这两个肯定对y是有一定影响的,如果盲目剔除,可能会对最终的结果产生不良影响,所以我们还是要根据实际需求来做决定。
最后还有一个问题要讨论一下,就是本例中没有对原始数据进行数据标准化。那么我们在数据分析中是否要对原始数据进行标准化?
这个也是要视情况而定。像本例中这些数据都是带有具体的量纲和单位,那么就不要对其进行标准化,我们得到的这个线性回归模型是在原始变量基础上进行拟合所得的结果,这个式子是包含物理单位的,说白了它们都是有一定实际意义的。在这种情况下,我们输入特定的自变量的值,即可得到相应的y值,预测效果直截了当,这是采取原始数据进行线性拟合的好处。
如果我们对原始数据采取了标准化处理,情况就不同了。标准化处理后自变量、因变量的物理单位没有了,我们拿此时的模型做预测时就会十分麻烦,要对新的自变量取值进行标准化,得到的y还是一个标准化后的数据,一眼看不到它的实际大小和物理意义。当然有些纯数学问题,其变量没有单位,这时候可以对其进行标准化,这会有利于对问题的分析。所以这个还是要视情况而定。
本文源码和数据下载方式请见文末,讨论本文内容可以添加文末“Python小助手”进入微信群交流!
作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望能和业内朋友多学习交流。
赞 赏 作 者
Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、****等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的*机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
长按扫码添加“Python小助手”
后回复“多元”获取本文源码数据
▼点击成为社区会员 喜欢就点个在看吧
上一篇: 用R语言进行多元线性回归的回归分析教程
下一篇: 简单易懂的SPSS多元线性回归步骤指南
推荐阅读
-
Python实现多元线性回归分析教程及代码分享
-
用Python的sklearn库实现多元线性回归分析
-
包婷婷 (201550484)作业一 统计软件简介与数据操作-SPSS(Statistical Product and Service Solutions),"统计产品与服务解决方案"软件。最初软件全称为"(SolutionsStatistical Package for the Social Sciences),但是随着SPSS产品服务领域的扩大和服务深度的增加,SPSS公司已于2000年正式将英文全称更改为"统计产品与服务解决方案",标志着SPSS的战略方向正在做出重大调整。为IBM公司推出的一系列用于统计学分析运算、数据挖掘、预测分析和决策支持任务的软件产品及相关服务的总称SPSS,有Windows和Mac OS X等版本。 1984年SPSS总部首先推出了世界上第一个统计分析软件微机版本SPSS/PC+,开创了SPSS微机系列产品的开发方向,极大地扩充了它的应用范围,并使其能很快地应用于自然科学、技术科学、社会科学的各个领域。世界上许多有影响的报刊杂志纷纷就SPSS的自动统计绘图、数据的深入分析、使用方便、功能齐全等方面给予了高度的评价。 R统计软件介绍 R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输出,可实现分支、循环,用户可自定义功能。 与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。 该语言的语法表面上类似 C,但在语义上是函数设计语言(functional programming language)的变种并且和Lisp 以及 APL有很强的兼容性。特别的是,它允许在"语言上计算"(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。 R是一个免费的*软件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免费下载和使用的。在R主页那儿可以下载到R的安装程序、各种外挂程序和文档。在R的安装程序中只包含了8个基础模块,其他外在模块可以通过CRAN获得。 二、R语言 R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个*、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 R作为一种统计分析软件,是集统计分析与图形显示于一体的。它可以运行于UNIX,Windows和Macintosh的操作系统上,而且嵌入了一个非常方便实用的帮助系统,相比于其他统计分析软件,R还有以下特点: 1.R是*软件。这意味着它是完全免费,开放源代码的。可以在它的网站及其镜像中下载任何有关的安装程序、源代码、程序包及其源代码、文档资料。标准的安装文件身自身就带有许多模块和内嵌统计函数,安装好后可以直接实现许多常用的统计功能。[2] 2.R是一种可编程的语言。作为一个开放的统计编程环境,语法通俗易懂,很容易学会和掌握语言的语法。而且学会之后,我们可以编制自己的函数来扩展现有的语言。这也就是为什么它的更新速度比一般统计软件,如,SPSS,SAS等快得多。大多数最新的统计方法和技术都可以在R中直接得到。[2] 3. 所有R的函数和数据集是保存在程序包里面的。只有当一个包被载入时,它的内容才可以被访问。一些常用、基本的程序包已经被收入了标准安装文件中,随着新的统计分析方法的出现,标准安装文件中所包含的程序包也随着版本的更新而不断变化。在另外版安装文件中,已经包含的程序包有:base一R的基础模块、mle一极大似然估计模块、ts一时间序列分析模块、mva一多元统计分析模块、survival一生存分析模块等等.[2] 4.R具有很强的互动性。除了图形输出是在另外的窗口处,它的输入输出窗口都是在同一个窗口进行的,输入语法中如果出现错误会马上在窗口口中得到提示,对以前输入过的命令有记忆功能,可以随时再现、编辑修改以满足用户的需要。输出的图形可以直接保存为JPG,BMP,PNG等图片格式,还可以直接保存为PDF文件。另外,和其他编程语言和数据库之间有很好的接口。[2] 5.如果加入R的帮助邮件列表一,每天都可能会收到几十份关于R的邮件资讯。可以和全球一流的统计计算方面的专家讨论各种问题,可以说是全世界最大、最前沿的统计学家思维的聚集地.[2] R是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。 R的语法是来自Scheme。R的使用与S-PLUS有很多类似之处,这两种语言有一定的兼容性。S-PLUS的使用手册,只要稍加修改就可作为R的使用手册。所以有人说:R,是S-PLUS的一个“克隆”。 但是请不要忘了:R是免费的(R is free)。R语言源代码托管在github,具体地址可以看参考资料。[3] 。 R语言的下载可以通过CRAN的镜像来查找。 R语言有域名为.cn的下载地址,有六个,其中两个由Datagurn,由 中国科学技术大学提供的。R语言Windows版,其中由两个下载地点是Datagurn和 USTC提供的。 三、stata Stata 是一套提供其使用者数据分析、数据管理以及绘制专业图表的完整及整合性统计软件。它提供许许多多功能,包含线性混合模型、均衡重复反复及多项式普罗比模式。用Stata绘制的统计图形相当精美。 新版本的STATA采用最具亲和力的窗口接口,使用者自行建立程序时,软件能提供具有直接命令式的语法。Stata提供完整的使用手册,包含统计样本建立、解释、模型与语法、文献等超过一万余页的出版品。 除此之外,Stata软件可以透过网络实时更新每天的最新功能,更可以得知世界各地的使用者对于STATA公司提出的问题与解决之道。使用者也可以透过Stata. Journal获得许许多多的相关讯息以及书籍介绍等。另外一个获取庞大资源的管道就是Statalist,它是一个独立的listserver,每月交替提供使用者超过1000个讯息以及50个程序。 四、PYTHON