很多人在做数据分析的时候经常会用到线性回归,这是描述两个变量之间统计关系的最简单的回归模型。但在实际问题中,我们经常会遇到多个变量之间的线性关系问题。这时候就用到了多元线性回归。多元线性回归是一元回归的扩展,在实际应用中有着广泛的应用。本文只是用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.数据集的部分内容首先导入需要的库。importnumpyasnpimportpandasaspdimportstatsmodels.apiassm接下来是数据预处理,因为原始数据的列标签太长,我们需要对其进行处理,去除中文,只留下英文名称。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)#生成模型结果=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.316588x1+1.649859x2+2.17866x3-0.005609x4+1.684283x5+0.01032x6+0.003655x7-176.1x8+50.515575x9。两列“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检验的原理有些复杂,有兴趣的读者可以自行查阅资料,这里不再赘述。我们可以通过“P>|t|”这一列来判断在图3中。我们可以在此列中选择一个阈值。例如,常用的统计量是0.05、0.02或0.01。这里我们使用0.05。其中P>|吨|本栏剔除取值大于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,代码如下。deflooper(limit):cols=['x1','x2','x3','x5','x6','x7','x8','x9']foriinrange(len(cols)):datadata1=data[cols]x=sm.add_constant(data1)#生成自变量y=data['y']#生成因变量model=sm.OLS(y,x)#生成模型result=model.fit()#model拟合pvalues=result.pvalues#得到结果中所有的P值pvalues.drop('const',inplace=True)#得到constpmax=max(pvalues)#选择最大的P值ifpmax>limit:ind=pvalues.idxmax()#找出P值最大的索引cols.remove(ind)#将这个索引从cols中移除else:returnresultresult=looper(0.05)result.summary()结果如图4所示,从结果来看,可以看到剩下的有效变量是x1,x2,x3,x5,得到的多元线性模型是y=-1694.6269+1.3642x1+1.7679x2+2.2894x3+1.7424x5,这就是我们最终想要的使用的高效多元线性模型。图4.去除无效变量后的回归模型那么问题来了,在包含所有自变量的多元线性模型和去除部分变量的模型之间我们应该选择哪个,毕竟第一个模型的整体线性效果是也很明显。根据笔者的经验,这还是要看具体的项目需求。因为我们在实际项目中遇到的问题都是现实生活中的真实例子,不再是纯粹的数学问题,比如这个例子中的x8消费物价指数和x9地区的失业率,这两个肯定是很重要的y有一定影响。如果一味的淘汰,可能会对最终的结果产生负面影响,所以还是要根据实际需要来做决定。最后,还有一个问题需要讨论,就是本例中没有对原始数据进行归一化处理。那么我们在数据分析中是否需要对原始数据进行标准化呢?这也要视情况而定。在这个例子中,数据有特定的维度和单位,所以不要标准化它们。我们得到的线性回归模型是对原始变量进行拟合的结果。这个公式包含物理单位,说白了,它们都有一定的实际意义。这种情况下,我们输入一个特定的自变量的值,得到对应的y值,预测效果直接,这就是与原始数据线性拟合的好处。如果我们对原始数据进行归一化,情况就不同了。标准化后,自变量和因变量的物理单位都没有了。这时候我们用模型做预测的时候会很麻烦。我们需要对新自变量的值进行标准化处理,得到的y仍然是一个标准化数据。一眼望去,无法看出它的实际大小和物理意义。当然,在一些纯数学问题中,变量是没有单位的。这时候可以将它们标准化,这样会方便分析问题。所以还是要看情况。
