多元线性回归分析销售量与三种不同广告投入之间的关系

现在就是要确定对于不同的广告投入对于销售量的影响,以此确定最优的广告投入,达到最大的销售量。 

 

根据上图中的数据我们可以看到此时有三个自变量TV.Radio.Newspaper,有一个因变量Sales,共有200个样本。 

 

 现在公司决策层需要了解的问题要如何优化投入成本才能达到最大的销量,哪一个广告渠道是最值得投入的,能得到最大的产出,同时在对三种不同的投入确定不同的数值时,最终的销量是多少。

 

 将因变量销量与每个自变量单独做出散点图之后可以得到如上图所示的图形,可以单独分析其每一种广告形式与产出之间的关系。

 

 

 与一元线性回归类似,多元线性回归也是要使得每个点与所拟合的曲线之间的差值最小,最终求出各个参数。

 

 做出多元线性回归曲线图之后,我们通过对比预测值与实际值之间的曲线对比,来衡量拟合程度。

 

 通过各回归系数的绝对值我们也能判断出哪种广告渠道对销量的影响最大,正系数越大代表对最后的广告投入越有促进作用,负系数越大代表对最后的广告投入越有减弱作用。

 同时可以通过对已经求出的关系式输入确定的数值来推测最终销量是多少。

 

'''step1 调用包'''
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

'''step2 导入数据'''
data0 = pd.read_csv('data_advertising.csv')
data1 = DataFrame(data0)

'''step3 数据预处理'''
#数据清洗,比如第一列有可能是日期或序号,
#这样的话我们就只需要从第二列开始的数据,
#这个情况下,把下面中括号中的0改为1就好。
data = data1.iloc[:,1:]
 
#绘制Y与每个xi的散点图
#通过seaborn添加一条最佳拟合直线和95%的置信区间,
#直观判断相关关系
sns.pairplot(data, x_vars=['TV','radio','newspaper']
          , y_vars='sales', height=7, 
          aspect=0.8, kind='reg')  
plt.show()
'''step4 划分数据集'''
#(将带类标号数据#划分为训练集(80%)
#和检验集(20%)

#将类别列和特征列拆分,
#便于下面调用划分函数
X = data.iloc[:,:3]
y = data.iloc[:,3]
#调用sklearn中的函数划分上述数据
X_train,X_test,Y_train,Y_test = train_test_split(
              X,y,train_size=0.8,random_state=0)

'''step5 模型计算(训练、检验、评价)'''
#step5.1 训练模型
#调用线性规划包
model = LinearRegression()
model.fit(X_train,Y_train) #线性回归训练
 
a = model.coef_#回归系数
b = model.intercept_#截距
print('\n 判别函数系数:xi系数:\n',np.round(a,3))
print('\n判别函数系数:截距:\n' ,np.round(b,2))

#step5.2 检验模型
Y_pred = model.predict(X_test)
#对测试集数据,用predict函数预测

 #step5.3 模型评价(准确率)
#这里Y_test为真实检验集的y值
#Y_pred为模型预测的检验集的y值
#比较二者误差即可得到模型准确程度
plt.plot(range(len(Y_pred)),Y_pred,'red', 
         linewidth=2.5,label="预测值")
plt.plot(range(len(Y_test)),Y_test,'blue',
         label="真实值")
plt.legend(loc=2)
plt.show()#显示预测值与测试值曲线

#计算相关模型评价指标
from sklearn.metrics import mean_squared_error          #均方误差
from sklearn.metrics import r2_score                    #R square
mse = mean_squared_error(Y_test,Y_pred)
rmse = np.sqrt(mse)
r_squared = r2_score(Y_test,Y_pred)
#显示结果
print("\n 均方误差(MSE):",np.round(mse,4))
print("\n 均方根误差(RMSE):",np.round(rmse,4))
print("\n 调整的R方(拟合优度,R Squared):"
              ,np.round(r_squared,4))

'''Step6 应用--预测'''
Y_pred2 = model.predict([[43.2,11.7,56.7]])
#对明年销量数据,用predict函数预测
print('明年销量为:',np.round(Y_pred2,2))

 接下来将按照以上六步进行分步阐述如何应用:

1.调用所需的包

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

在多元线性回归方法之下此时便需要从 sklearn 中调用划分函数,将训练集和检验集按照一定比例进行划分,同时调用线性回归函数。

2.导入数据

'''step2 导入数据'''
data0 = pd.read_csv('data_advertising.csv')
data1 = DataFrame(data0)

 

 3.数据预处理

#数据清洗,比如第一列有可能是日期或序号,
#这样的话我们就只需要从第二列开始的数据,
#这个情况下,把下面中括号中的0改为1就好。
data = data1.iloc[:,0:] 
#绘制Y与每个xi的散点图
#通过seaborn添加一条最佳拟合直线和95%的置信区间,
#直观判断相关关系
sns.pairplot(data, x_vars=['TV','radio','newspaper']
          , y_vars='sales', height=7, 
          aspect=0.8, kind='reg')  
plt.show()

这段代码使用seaborn库的pairplot方法绘制了data数据框的PairGrid图。具体来看:- sns.pairplot: 调用seaborn的pairplot方法绘制PairGrid图。

- data: 需要绘制的Pandas DataFrame数据。

- x_vars=['TV','radio','newspaper']: 指定绘制图的x轴变量为TV、radio和newspaper列。

- y_vars='sales': 指定绘制图的y轴变量为sales列。

- height=7: 设置图的高度为7。

- aspect=0.8: 设置图的宽高比为0.8。

- kind='reg': 表示绘制回归模型的线。

- plt.show(): 显示绘制的图。

所以这段代码总结起来就是:使用data数据,绘制TV、radio、newspaper列为x轴,sales列为y轴的PairGrid图,图的大小为宽高比0.8,高度7的图,并在每个子图中绘制了线性回归模型的线。最后调用plt.show()显示出这张PairGrid图。

 

 在seaborn的pairplot()函数中,通过kind参数可以指定绘制不同类型的回归模型线:

- 'reg': 普通线性回归,默认值

- 'resid': 残差回归

- 'kde': 核密度估计图

- 'hist': 直方图

下面这张图就是将参数调整为 hist 之后画出的直方图,更多应用大家可以自行探索呀。

 4.划分数据集

'''step4 划分数据集'''
#(将带类标号数据#划分为训练集(80%)
#和检验集(20%)
#将类别列和特征列拆分,
#便于下面调用划分函数
X = data.iloc[:,:3]
y = data.iloc[:,3]
#调用sklearn中的函数划分上述数据
X_train,X_test,Y_train,Y_test = train_test_split(
              X,y,train_size=0.8,random_state=0)

首先是对 x 和 y 进行的划分,将类别列和特征列进行划分开来,根据我们刚才读取到的数据,x 是选取的前三列,也就是0,1,2列,此时因为前开后闭的原则第三列取不到,y 是取的最后一列;对列划分完之后接下来就是对行的划分,要按照比例进行划分,看需要多少的比例进行训练,多少的比例用来进行检验。此时划分训练集和检验集的比例可通过train_size = 0.8 或者  test_size = 0.2都可以,划分出的数据是相同的,train_size 确定了选取多少比例的训练数据之后,random_state 就开始确定选取哪一部分的训练数据,它并不是说 train_size 为0.8 ,它就会默认选取前 80%数据,而是从全部的数据中随机抽取这一比例的数据,random_state 也可以随机选择任何一个数,它所选取的数值是众多随机选择中的一种。

5.模型计算

''step5 模型计算(训练、检验、评价)'''
#step5.1 训练模型
#调用线性规划包
model = LinearRegression()
model.fit(X_train,Y_train) #线性回归训练
 
a = model.coef_#回归系数
b = model.intercept_#截距
print('\n 判别函数系数:xi系数:\n',np.round(a,3))
print('\n判别函数系数:截距:\n' ,np.round(b,2))

这里我们调用线性规划包之后使用事先划分好的训练集来进行模型拟合,同时求出模型的回归系数保留三位小数,求出模型的截距保留两位小数。

#step5.2 检验模型
Y_pred = model.predict(X_test)
#对测试集数据,用predict函数预测

拟合好模型之后现在用之前划分的 x 检验集用现在求出的模型进行预测y,再利用之前留出的检验集 y 与预测出的 y 来进行对比,检验其预测的准确性如何。

#step5.3 模型评价(准确率)
#这里Y_test为真实检验集的y值
#Y_pred为模型预测的检验集的y值
#比较二者误差即可得到模型准确程度
plt.plot(range(len(Y_pred)),Y_pred,'red', 
         linewidth=2.5,label="预测值")
plt.plot(range(len(Y_test)),Y_test,'blue',
         label="真实值")
plt.legend(loc=2)
plt.show()#显示预测值与测试值曲线

#计算相关模型评价指标
from sklearn.metrics import mean_squared_error          #均方误差
from sklearn.metrics import r2_score                    #R square
mse = mean_squared_error(Y_test,Y_pred)
rmse = np.sqrt(mse)
r_squared = r2_score(Y_test,Y_pred)
#显示结果
print("\n 均方误差(MSE):",np.round(mse,4))
print("\n 均方根误差(RMSE):",np.round(rmse,4))
print("\n 调整的R方(拟合优度,R Squared):"
              ,np.round(r_squared,4))

评判其准确率的最直观的方法就是可视化看其的拟合程度,通过分别作出预测值与真实值的曲线,

判断拟合曲线拟合程度常用的评判指标主要有:

(1). R-squared(R^2):
确定系数,用来判断自变量对因变量变异的解释程度。值越接近1表示自变量解释因变量的变异越多,拟合效果越好。

(2). Mean Squared Error(MSE):
均方误差,预测值和真实值偏差的平方的平均值。值越小表示误差越小,拟合效果越好。

(3). Mean Absolute Error(MAE):
平均绝对误差,预测值和真实值偏差的绝对值的平均值。值越小表示误差越小,拟合效果越好。

(4). Root Mean Squared Error(RMSE):
均方根误差,预测值和真实值偏差的平方的平均值的算术平方根。值越小表示误差越小,拟合效果越好。

(5). Mean Absolute Percentage Error(MAPE):
平均绝对百分比误差,预测值和真实值偏差的绝对值与真实值之比的平均值。

(6). AIC/BIC:
Akaike信息准则/贝叶斯信息准则,用于比较不同模型的相对质量。值越小表示模型质量越好。综合这些指标可以比较全面的评价拟合曲线的效果。实际中常用R-squared、MSE、MAE、RMSE等。

在本题中我们使用 mse 、 rmse 、调整 的 r 方来评判其拟合优度,对于使用的mse、调整的 r方 都需要从sklearn中调用,执行代码之后我们可以看到此时都是保留的四位小数。

6.预测和应用

Y_pred2 = model.predict([[43.2,11.7,56.7]])
#对明年销量数据,用predict函数预测
print('明年销量为:',np.round(Y_pred2,2))

 求出具体的函数之后现在就可以带入具体的数值来进行预测,我们带入三个具体的数值之后我们看到预测的明年具体数值也显现出来了。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值