首页 > 编程知识 正文

多重共线性在多元线性回归模型中普遍存在的主要原因,多元线性回归中的多重共线性指的是

时间:2023-05-06 05:28:06 阅读:276970 作者:3033

多元线性回归多重共线性的危害

作者:居居
日期:2021-11-05

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题) #载入数据:data=pd.read_clipboard()data.columns=["日期","需求量","本品价格","竞品价格","平均收入水平","广告投入"]

这是一份真实的数据,来自美国某高校商学院的示例数据库。阿三国(印度)某地方企业的芥末油(调味品)产品的需求量和其他影响因素的统计数据见下表。

研究目标是,根据统计数据,研究本品的"需求量"和其他的四个变量究竟有没有关系,注意:时间维度并不影响需求量

data.head(10) 日期需求量本品价格竞品价格平均收入水平广告投入0Apr-111289065.0069.224343.171170.001May-111285065.9070.674347.591162.262Jun-111318065.4074.774356.441164.063Jul-111378565.3475.004369.711193.134Aug-111388066.0075.004387.401241.555Sep-111268069.0077.294409.511254.156Oct-111329069.0079.064436.051149.577Nov-111349869.2581.374467.011200.068Dec-111198074.5684.004502.401220.409Jan-121208578.0091.614542.201082.70

通常,我们会先画出因变量与其他四个自变量的关系,也就是绘制散点图。

从下面四张图中我们可以看出,4个自变量和因变量之间似乎存在线性关系。

fig,ax=plt.subplots(1,4,figsize=(18,4),dpi=150)for i,xName in zip(np.arange(0,4,1),data.columns[2:]): ax[i].scatter(data.loc[:,"需求量"],data.loc[:,xName]) ax[i].set_xlabel("需求量") ax[i].set_ylabel(xName)

然后我们进行多元线性回归

import statsmodels.api as smX=data.loc[:,["本品价格","竞品价格","平均收入水平","广告投入"]]#解释变量X["const"]=1#添加常数项Y=data['需求量']#被解释变量model = sm.OLS(Y, X).fit()#模型拟合model.summary2()#统计信息汇总 Model:OLSAdj. R-squared:0.670Dependent Variable:需求量AIC:869.0905Date:2021-11-05 11:53BIC:879.0355No. Observations:54Log-Likelihood:-429.55Df Model:4F-statistic:27.96Df Residuals:49Prob (F-statistic):4.07e-12R-squared:0.695Scale:5.2354e+05 Coef.Std.Err.tP>|t|[0.0250.975]本品价格-136.616844.8461-3.04630.0037-226.7384-46.4952竞品价格117.407839.31162.98660.004438.4081196.4074平均收入水平-0.28230.1511-1.86880.0676-0.58600.0213广告投入7.86511.04747.50930.00005.76039.9699const5024.57531945.09482.58320.01281115.76098933.3897 Omnibus:1.001Durbin-Watson:1.434Prob(Omnibus):0.606Jarque-Bera (JB):0.556Skew:-0.241Prob(JB):0.757Kurtosis:3.123Condition No.:115795

以上结果在我们通常看来是非常漂亮的,调整后的R2=0.67,F检验和T检验都在0.05水平显著。

然后结论就是:

在其他变量都保持不变的情况下,需求量

1.跟本品价格成负相关

2.跟竞品价格成正相关

3.跟收入水平成负相关

4.跟广告投入成正相关

这些结论貌似很合理?!

我们来做一个相关系数矩阵看看,竞品价格和本品价格存在共线性,相关系数大于0.7,为0.95,几乎就是完全相关。

import seaborn as snssns.heatmap(data.corr(), cmap='Blues', annot=True)

绘制本品价格和竞品价格的散点图,可以看出本品和竞品真的相关性极强,回归方程的R2高达0.896。

plt.scatter(data["本品价格"],data["竞品价格"])plt.xlabel("本品价格")plt.ylabel("竞品价格")plt.show()X=data.loc[:,["竞品价格"]]#解释变量X["const"]=1#添加常数项#添加常数项Y=data['本品价格']#被解释变量model = sm.OLS(Y, X).fit()#模型拟合model.summary2()#统计信息汇总

Model:OLSAdj. R-squared:0.896Dependent Variable:本品价格AIC:258.5114Date:2021-11-05 11:53BIC:262.4893No. Observations:54Log-Likelihood:-127.26Df Model:1F-statistic:459.1Df Residuals:52Prob (F-statistic):1.82e-27R-squared:0.898Scale:6.7736 Coef.Std.Err.tP>|t|[0.0250.975]竞品价格0.76490.035721.42550.00000.69330.8366const9.03523.41502.64580.01082.182615.8878 Omnibus:4.083Durbin-Watson:0.724Prob(Omnibus):0.130Jarque-Bera (JB):3.626Skew:0.550Prob(JB):0.163Kurtosis:2.366Condition No.:922 fig,ax=plt.subplots(figsize=(15,3),dpi=150)plt.plot(data.loc[:,"日期"],data.loc[:,"竞品价格"]-data.loc[:,"本品价格"])plt.xlabel("日期")plt.ylabel("竞品-本品价格差")for tick in ax.get_xticklabels(): tick.set_rotation(90)

竞品在任何时间点上的价格都高于本品,说明价格上竞品没有优势。

所以我们完全可以忽略竞品价格的影响,消除多重共线性,剔除竞品价格再次进行回归得到以下结果:

X=data.loc[:,["本品价格","平均收入水平","广告投入"]]#解释变量X["const"]=1#添加常数项#添加常数项Y=data['需求量']#被解释变量model = sm.OLS(Y, X).fit()#模型拟合model.summary2()#统计信息汇总 Model:OLSAdj. R-squared:0.618Dependent Variable:需求量AIC:876.1214Date:2021-11-05 11:53BIC:884.0773No. Observations:54Log-Likelihood:-434.06Df Model:3F-statistic:29.61Df Residuals:50Prob (F-statistic):3.78e-11R-squared:0.640Scale:6.0647e+05 Coef.Std.Err.tP>|t|[0.0250.975]本品价格-9.104414.7697-0.61640.5404-38.770220.5614平均收入水平-0.00740.1289-0.05730.9546-0.26640.2516广告投入8.59761.09597.84500.00006.396310.7989const3420.31522012.07041.69990.0954-621.04717461.6774 Omnibus:0.946Durbin-Watson:1.749Prob(Omnibus):0.623Jarque-Bera (JB):0.336Skew:-0.093Prob(JB):0.846Kurtosis:3.338Condition No.:111271

突然本品价格和平均收入水平两个变量也不显著了,那么。。。。这个结果就很难看了。甚至此时,很多人可能会认为不能踢掉竞品价格,因为它会让模型的表现变差,但是。。。事实果真如此吗?

然后我们做出4个自变量和因变量的时序图

我们从最简单的分析开始:

1.图1可以看出,需求量一直在波动,而图4的人均收入一直在增长,讲真,关系不大。

2.图2和图3似乎也跟图1的相关性不明显,结合相关关系矩阵可以知道,他们线性相关性极弱。即便是在本品价格很高的时候,需求量也可以很大啊。。。

3.图5和图1的趋势几乎相同。

说明:

就数据而言,需求量真的就只和广告投入有关

fig,ax=plt.subplots(5,1,figsize=(15,28),dpi=100)for i,xName in zip(np.arange(0,5,1),data.columns[1:]): ax[i].plot(data.loc[:,"日期"],data.loc[:,xName],) ax[i].set_xlabel("日期") ax[i].set_ylabel(xName) for tick in ax[i].get_xticklabels(): tick.set_rotation(90)

于是乎,我们得到了正确的方程:

其实这个芥末油的推广模式就是。。。在小卖部贴小广告,每个月的花费只有1000多印度卢比,差不多只有100元人民币。

通过方程,我们可以很容易计算出,每多花10卢比贴海报,就可以多销售125瓶,是不是很划算?

X=data.loc[:,["广告投入"]]#解释变量X["const"]=1#添加常数项#添加常数项Y=data['需求量']#被解释变量model = sm.OLS(Y, X).fit()#模型拟合model.summary2()#统计信息汇总 Model:OLSAdj. R-squared:0.630Dependent Variable:需求量AIC:872.5980Date:2021-11-05 11:53BIC:876.5760No. Observations:54Log-Likelihood:-434.30Df Model:1F-statistic:91.12Df Residuals:52Prob (F-statistic):5.05e-13R-squared:0.637Scale:5.8831e+05 Coef.Std.Err.tP>|t|[0.0250.975]广告投入8.85270.92749.54580.00006.991710.7136const2361.8148993.49182.37730.0212368.22774355.4019 Omnibus:1.747Durbin-Watson:1.800Prob(Omnibus):0.417Jarque-Bera (JB):0.960Skew:-0.239Prob(JB):0.619Kurtosis:3.445Condition No.:10197

百度百科词条中,多重共线性存在的影响主要有:

(1)完全共线性下参数估计量不存在

(2)近似共线性下OLS估计量非有效

(3)参数估计量经济含义不合理

(4)变量的显著性检验失去意义,可能将重要的解释变量排除在模型之外

(5)模型的预测功能失效。变大的方差容易使区间预测的“区间”变大,使预测失去意义。

所以,第一个模型中,由于本品价格和竞品价格高度相关,所以得出的结果对我们产生了误导。

因此,正确使用统计学方法才能得到准确的结果,及时它是违背直觉的。你说。。。是吧?

多说两句,正确的结果可能会让你发不出论文(手动狗头),但是能给你企业省一大笔钱。就像上面的例子中,

现阶段我只要增加广告投入即可。 但是如果你只是关注模型的预测能力,似乎。。。你不关注共线性也行。。。

本文还有一些坑,需要填,因为时间关系,我并没有考察偏相关性。这个请大家自行验证。

然后,根据我老师的建议,如果大家想深入学习,可以阅读《统计反思》第五章关于多重共线的相关章节。

我不是经济学人,所以对竞品市场之类的概念不太懂,就数据论结果,欢迎交流,不喜勿喷。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。