目录
一、数据及分析对象
二、目的及分析任务
三、方法及工具
四、数据读入
五、数据理解
六、数据准备
七、模型构建
八、模型预测
九、模型评价
CSV格式的数据文件——“Advertising.csv”
数据集链接:https://download.csdn.net/download/m0_70452407/88520033
数据集包含了200个不同市场的产品销售额,每个销售额对应3中广告媒体投入成本,分别是TV、radio和newspaper,主要属性如下:
(1)Number:数据集的编号。
(2)TV:电视媒体的广告投入。
(3)radio:广播媒体的广告投入。
(4)newspaper:报纸媒体的广告投入。
(5)sales:商品的销量。
理解机器学习方法在数据分析中的应用——采用多元回归方法进行回归分析。
(1)数据预处理,绘制TV、radio、newspaper这3个自变量与因变量sales的相关关系图。
(2)采用两种不同方法进行多元回归分析——统计学方法和机器学习方法。
(3)进行模型预测,得出模型预测结果。
(4)对预测结果进行评价。
Python语言及pandas、Seaborn、matplotlib、statsmodels、scikit-learn等包。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
data=pd.read_csv("D:\\Download\\JDK\\数据分析理论与实践by朝乐门_机械工业出版社\\第3章 回归分析\\Advertising.csv")
data.head()
对数据框进行探索性分析,这里采用的实现方式为调用Seaborn包中的pairplot()方法,绘制TV、radio、newspaper这3个变量与sales变量之间的关系图,其中kind参数设置为“reg"。为非对角线上的散点图拟合出一条回归直线,可以更直观地显示变量之间的关系,height参数为7,aspect参数为0.8,表明每个构面的高度为7,宽高比为0.8。调用matplotlib.pyplot.show()方法显示图形。
sns.pairplot(data,
x_vars=['TV','radio','newspaper'],
y_vars='sales',
height=7,
aspect=0.8,
kind='reg')
plt.show()
进行多元回归分析前,应准备好模型所需的特征矩阵(X)和目标向量(y)。这里采用drop()方法删除数据框data中的Number以及sales两列返回另一个DataFrame对象Data,并显示Data数据集,即特征矩阵的前5行数据。
#第一步:构建特征矩阵和目标数组
Data=data.drop(['Number','sales'],axis=1)
Data.head()
确定目标向量sales为data数据框中的sales列,并显示其数据类型:
sales=data['sales']
type(sales)
pandas.core.series.Series
输出结果显示了sales的数据类型为pandas的Series。
将目标向量sales的数据转换为NumPy中的ndarray,这里采用的实现方法为调用NumPy包中的ravel()方法返回数组。
import numpy as np
sales=np.ravel(sales)
type(sales)
numpy.ndarray
输出结果显示sales的数据类型为NumPy的ndarray数组对象。
采用统计学方法,检验模型的线性显著性。在这里调用statsmodels统计建模工具包,通过statsmodels.api(基于数组)接口进行访问。采用add_constant()方法加上一列常数项,反映线性回归模型的截距。采用OLS()方法用最小二乘法来建立myModel模型。采用模型的fit()方法返回一个回归结果对象results,该对象results包含了估计的模型参数和其他的诊断。在results上调用summary()方法可以打印出一个模型的诊断细节。
#第一种分析方法——基于统计学的建模
import statsmodels.api as sm
X_add_const=sm.add_constant(Data.to_numpy())
myModel=sm.OLS(sales,X_add_const)
results=myModel.fit()
print(results.summary())
OLS Regression Results ============================================================================== Dep. Variable: y R-squared: 0.897 Model: OLS Adj. R-squared: 0.896 Method: Least Squares F-statistic: 570.3 Date: Thu, 09 Nov 2023 Prob (F-statistic): 1.58e-96 Time: 20:01:27 Log-Likelihood: -386.18 No. Observations: 200 AIC: 780.4 Df Residuals: 196 BIC: 793.6 Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ const 2.9389 0.312 9.422 0.000 2.324 3.554 x1 0.0458 0.001 32.809 0.000 0.043 0.049 x2 0.1885 0.009 21.893 0.000 0.172 0.206 x3 -0.0010 0.006 -0.177 0.860 -0.013 0.011 ============================================================================== Omnibus: 60.414 Durbin-Watson: 2.084 Prob(Omnibus): 0.000 Jarque-Bera (JB): 151.241 Skew: -1.327 Prob(JB): 1.44e-33 Kurtosis: 6.332 Cond. No. 454. ============================================================================== Notes: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
重点考虑参数R-squared、Prob(F-statistic)以及P>|t|的两个值,通过这4个参数就能判断模型是否线性显著,同时知道显性的程度。
其中,R-squared(决定系数)=SSR/SST,取值范围为[0,1],其值越接近1,说明回归效果越好。在这里,R-squared的值为0.897,接近于1,说明回归效果好。F-statistic(F检验)的值越大越能推翻原假设,原假设是“我们的模型不是线性模型”。Prob(F-statistic)是F-statistic的概率,这个值越小越能拒绝原假设,这里为1.58e-96,该值非常小,足以证明是线性显著的。
接着,采用机器学习的方法再进行建模,以便进行两者的对比分析。为了采用机器学习方法,需要拆分训练集和测试机。在这里通过调用sklearn.model_selection中的train_test_split()方法进行训练姐和测试集的拆分,random_state为1,采用25%的数据测试,75%的数据训练。
#第二种分析方法——基于机器学习
#拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(Data,sales,random_state=1,test_size=0.25)
查看训练数据和测试数据的数量:
#查看训练数据和测试数据的数量
print(X_train.shape)
print(X_test.shape)
(150, 3) (50, 3)
在训练集上训练模型。这里调用sklearn.linear_model中默认参数的LinearRegression对训练集进行线性回归。
from sklearn.linear_model import LinearRegression
linreg=LinearRegression()
model=linreg.fit(X_train,y_train)
print(model)
LinearRegression()
在此基础上,查看多元线性回归模型的回归系数:
model.coef_
array([0.04656457, 0.17915812, 0.00345046])
查看回归模型的截距:
model.intercept_
2.8769666223179335
最后,调用score()方法返回预测的R-squared(决定系数),即模型的准确率:
#准确率
model.score(X_test,y_test)
0.9156213613792232
采用predict()方法使用线性模型进行预测,返回模型的预测结果y_pred:
y_pred=linreg.predict(X_test)
y_pred
array([21.70910292, 16.41055243, 7.60955058, 17.80769552, 18.6146359 , 23.83573998, 16.32488681, 13.43225536, 9.17173403, 17.333853 , 14.44479482, 9.83511973, 17.18797614, 16.73086831, 15.05529391, 15.61434433, 12.42541574, 17.17716376, 11.08827566, 18.00537501, 9.28438889, 12.98458458, 8.79950614, 10.42382499, 11.3846456 , 14.98082512, 9.78853268, 19.39643187, 18.18099936, 17.12807566, 21.54670213, 14.69809481, 16.24641438, 12.32114579, 19.92422501, 15.32498602, 13.88726522, 10.03162255, 20.93105915, 7.44936831, 3.64695761, 7.22020178, 5.9962782 , 18.43381853, 8.39408045, 14.08371047, 15.02195699, 20.35836418, 20.57036347, 19.60636679])
对预测结果评价,这里采用matplotlib.pyplot的plot()函数绘制预测结果与真实值图,两条线分别表示模型预测值和观察值。
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
plt.plot(range(len(y_pred)),y_test,'r',label="test")
plt.legend(loc="upper right")
plt.xlabel("the number of sales")
plt.ylabel("value of sales")
plt.show()
从运行结果可以看出,预测结果与真实值的折线趋于重合,此结果说明模型的预测结果较好。