数据分析实战 | 多元回归——广告收入数据分析

目录

一、数据及分析对象

二、目的及分析任务

三、方法及工具

四、数据读入

五、数据理解

六、数据准备

七、模型构建

八、模型预测

九、模型评价


一、数据及分析对象

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()

从运行结果可以看出,预测结果与真实值的折线趋于重合,此结果说明模型的预测结果较好。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/191394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地跑项目解决跨域问题

跨域问题: 指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对 javascript 施加的安全限制。 同源策略: 是指协议(protocol)、域名(host)、端口号&…

【shardingjdbc】sharding-jdbc分库分表入门demo及原理分析

文章目录 场景配置:概念及原理:代码:思考: 本文中,demo案例涉及场景为sharding jdbc的分库情况。 通俗点说就是由原来的db0_table水平拆分为 db1 t_table ,db2.t_table。 demo本身很简单,难点在于分片策略配置到底该怎么写&#x…

智能巡检软件哪个好?中小企业如何提升工作效率与质量?

在当今数字化、智能化的时代,智能巡检软件作为一种高效的工具,已经在各行各业得到了广泛的应用。它利用物联网、大数据、人工智能等技术,为巡检工作提供了全面的解决方案,帮助企业实现数据化、智能化管理,提高工作效率…

copilot 产生 python工具函数并生成单元测试

stock.py 这个文件,我只写了注释(的开头),大部分注释内容和函数都是copilot # split a string and extract the environment variable from it # input can be , pathabc, pathabc;pathdef, pathabc;pathdef;pathghi # output i…

Leetcode-104 二叉树的最大深度

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

【深度学习】pytorch——常用工具模块

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 深度学习专栏链接: http://t.csdnimg.cn/dscW7 pytorch——常用工具模块 数据处理 torch.utils.data模块DatasetDataLoadersamplertorch.utils.data的使用 计算机视觉工具包 torchvisiontorchvision.d…

浙大恩特客户资源管理系统 fileupload.jsp 任意文件上传

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的…

深度学习_12_softmax_图片识别优化版代码

因为图片识别很多代码都包装在d2l库里了,直接调用就行了 完整代码: import torch from torch import nn from d2l import torch as d2l"获取训练集&获取检测集" batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(ba…

arcgis--浮点型栅格数据转整型

利用【Spatial Analyst工具】-【数学】-【转为整型】工具,将浮点型数据转为整型。如下: 【转为整型】对话框参数设计如下: 转换结果如下:

软件工程——名词解释

适用多种类型的软件工程教材,有关名词释义的总结较为齐全~ 目录 1. 软件 2. 软件危机 3. 软件工程 4. 软件生存周期 5. 软件复用 6. 质量 7. 质量策划 8. 质量改进 9. 质量控制 10. 质量保证 11. 软件质量 12. 正式技术复审 13. ISO 14. ISO9000 15.…

正交矩阵的定义

对于n阶矩阵A,如果,其中为单位矩阵,为A的转置矩阵,那么就称A为正交矩阵。 对于正交矩阵, 对于正交矩阵,其列向量都是单位向量,行向量都是单位向量

立体库堆垛机控制程序手动功能实现

手动操作功能模块 手动前后保护锁 *************提升手动程序段 手动上升,下降保护锁 **********货叉手动程序段

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用(二)

Com.Gitusme.Net.Extensiones.Core 扩展库 1.0.6 版本已发布。 1、版本变更说明 新增Sokcet套接字扩展。简化Socket操作,支持自定义命令封装,使用方便快捷,让您聚焦业务实现,而不必关心底层逻辑,提高开发效率。日志功…

UML软件建模软件StarUML mac中文版软件介绍

StarUML for mac是一款UML建模器,StarUML for mac提供了几个模版,帮助用户建立使用新的图表,是目前最流行的UML建模工具,给开发工作带来大大的便利。 StarUML mac软件介绍 StarUML 是一个流行的软件建模工具,用于创建…

(四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖…

优雅的Java编程:将接口对象作为方法参数

theme: smartblue 目录 概述 在Java编程中,方法的参数传递方式通常是通过基本类型、对象引用或者集合等方式。然而,一种更加优雅且灵活的设计模式是将接口对象作为方法的参数。这种方式为我们带来了许多好处,包括降低耦合性、实现多态性和可…

虚拟局域网

虚拟局域网(VLAN) VLAN建立于交换技术的基础之上 广播域(broadcast domain):其中任何一台设备发出的广播通信都能被该部分网络中的所有其他设备所接收,这部分网络就叫广播域利用以太网交换机可以很方便地实现虚拟局域网VLAN(Virtual LAN)对于一个主机和…

andorid 日历选择器

先看效果图: 主要代码 package com.example.flyimport android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import…

JavaWeb Day10 案例 准备工作

目录 一、需求说明 二、环境搭建 (一)数据库 (二)后端 ①controller层 1.DeptController.java 2.EmpController.java ②mapper层 1.DeptMapper.java 2.EmpMapper.java ③pojo层 1.Dept.java 2.Emp.java 3.Result.ja…

邻里注意Transformer(CVPR2023)

Neighborhood Attention Transformer 摘要1、介绍2、相关工作2.1 新的卷积基线 3、方法3.1 邻居注意力3.2 Tiled NA and NATTEN3.3 邻居注意力Transformer 4、结论 代码 摘要 我们提出邻居注意力(NA),第一个有效和可伸缩的滑动窗口的视觉注意机制。 NA是一种像素级…