Python大数据分析——一元与多元线性回归模型

Python大数据分析——一元与多元线性回归模型

  • 相关分析
    • 概念
    • 示例
  • 一元线性回归模型
    • 概念
    • 理论分析
    • 函数
    • 示例
  • 多元线性回归模型
    • 概念
    • 理论分析
    • 示例
  • 线性回归模型的假设检验
    • 模型的F检验
      • 理论分析
      • 示例
    • 模型的T检验
      • 理论分析
      • 示例

相关分析

概念

在这里插入图片描述
a 正相关;b 负相关;c 不相关;d 存在关系但不存在线性关系

相关系数的计算:
在这里插入图片描述
相关系数ρ一定是取[-1,1]之间的数

示例

对于一元的:

# 导入第三方模块
import pandas as pd
income = pd.read_csv('D:\pythonProject\data\Salary_Data.csv')
# 查看变量有哪些
income.columns
# 查看两者的相关性
income.Salary.corr(income.YearsExperience)

输出:

0.9782416184887598

对于多元的:

# 导入第三方模块
import pandas as pd
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 查看变量有哪些
Profit.columns
# 查看多对一的相关性(要删除其中的离散变量)
Profit.drop('State', axis=1).corrwith(Profit['Profit'])

输出:
在这里插入图片描述
如果在多元中找两两的相关性用:

# 导入第三方模块
import pandas as pd
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 查看变量有哪些
Profit.columns
# 查看两两的相关性(要删除其中的离散变量)
Profit.drop('State', axis=1).corr()

输出:
在这里插入图片描述

一元线性回归模型

概念

一元线性回归是分析只有一个自变量(自变量x和因变量y)线性相关关系的方法。一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析。
在这里插入图片描述

理论分析

首先观察点的分布

在这里插入图片描述
1、两边变量之间存在明显的线性关系;
2、根据常识,工作年限是因,薪资水平是果;
3、是否存在某个模型(即图中的一次函数)可以刻画两个变量
之间的关系呢?

可以根据一元线性函数可得

在这里插入图片描述
1、模型中的x称为自变量,y称为因变量;
2、a为模型的截距项,b为模型的斜率项,ε为模型的误差项;
3、误差项ε的存在主要是为了平衡等号两边的值,通常被称为模型
无法解释的部分;

那么接下来就要考虑a和b如何求解

为了确保生成的线与点的距离靠近,也就是距离最近。
思路:
1、如果拟合线能够精确地捕捉到每一个点(即所有散点全部落在拟
合线上),那么对应的误差项ε应该为0;
2、所以,模型拟合的越好,则误差项ε应该越小。进而可以理解为:
求解参数的问题便是求解误差平方和最小的问题;
在这里插入图片描述
那么公式就为

为什么是平方,因为当点在生成线的下面时,差值为负,为了防止正负相消,我们取平方的值保障为正。
在这里插入图片描述
1、J(a,b)为目标函数,需求这个函数的最小值
2、我们求J最小值,求解方法便是计算目标函数关于参数a和b的两个偏导数,最终令偏导数为0即可。(因为当函数的导数=0的时候,函数取极值)

数学推导过程

1、展开目标函数中的平方项
在这里插入图片描述
2、计算a和b的偏导数,并令其为0
在这里插入图片描述
3、转换公式
在这里插入图片描述
4、化简为a和b为0的形式
在这里插入图片描述
不难发现a的两个求和再除以n的计算为y和x的平均值,并再次化简a和b为
在这里插入图片描述

函数

#导入第三方模块
import statsmodels.api as sm
sm.ols(formula, data, subset=None, drop_cols=None)
formula:以字符串的形式指定线性回归模型的公式,如’y~x’就表示简单线性回归模型
data:指定建模的数据集
subset:通过bool类型的数组对象,获取data的子集用于建模
drop_cols:指定需要从data中删除的变量

其中ols,我们指的是最小二乘法

示例

# 导入第三方模块
import pandas as pd
import statsmodels.api as sm
income = pd.read_csv('D:\pythonProject\data\Salary_Data.csv')
# 利用收入数据集,构建回归模型
fit = sm.formula.ols('Salary ~ YearsExperience', data = income).fit()
# 返回模型的参数值
fit.params

输出:
在这里插入图片描述
a也就是Intercept,截距
b也就是YearsExperience,斜率

多元线性回归模型

概念

对于一元线性回归模型来说,其反映的是单个自变量对因变量的影响,然而实际情况中,影响因变量的自变量往往不止一个,从而需要将一元线性回归模型扩展到多元线性回归模型。
在这里插入图片描述
其中,xij 代表第 i 行的第 j 变量值。如果按照一元线性回归模型的逻辑,那么多元线性回归模型应该就是因变量y与自变量X的线性组合。

所以,基于一元线性回归模型的扩展,可以将多元线性回归模型表示为:
在这里插入图片描述
进一步,根据线性代数的知识,可以将上式表示为矩阵的形式:

在这里插入图片描述

理论分析

首先构造目标函数(跟一元思路一样)
在这里插入图片描述
展开平方项

在线性代数里,Σz^2=z’*z(z’为z的转置)
为了方便理解举个例子:
在这里插入图片描述
那么我们就可得
在这里插入图片描述
求偏导为0

这里要补充点矩阵求导知识点
在这里插入图片描述
更多矩阵求导内容请点击这里
根据上面计算,由此我们可得
在这里插入图片描述
计算偏回归函数
在这里插入图片描述

示例

数据内容为
在这里插入图片描述
数据集包含5个变量,分别是产品的研发成本、管理成本、市场营销成本、销售市场和销售利润。

# 导入第三方模块
import pandas as pd
import statsmodels.api as sm
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 将数据集拆分为训练集和测试集,测试集为20%
train, test = model_selection.train_test_split(Profit, test_size = 0.2, random_state=1234)
# 根据train数据集建模,默认为连续的数学变量,而State变成了分类变量
model = sm.formula.ols('Profit ~ RD_Spend+Administration+Marketing_Spend+C(State)', data = train).fit()
print('模型的偏回归系数分别为:\n', model.params)
# 删除test数据集中的Profit变量,用剩下的自变量进行预测
test_X = test.drop(labels = 'Profit', axis = 1)
pred = model.predict(exog = test_X)
print('对比预测值和实际值的差异:\n',pd.DataFrame({'Prediction':pred,'Real':test.Profit}))

输出:
在这里插入图片描述
Intercept 为截距;其余的为系数变量
在预测与实际值比较,差异小说明拟合好,差异大说明不好

注意!
x变量要是全是连续变量p,那么输出的变量也是一致的,也是p
但若出现字符串,那么我们想要字符串也变成数字变量,我们就需要改成分类变量,也就是x2_1, x2_2等,在这里面就是New York和Florida,拆分成了两个x2,那为什么不是全部的?因为在分类变量里,二者会出现强相关内部关系,p会大,不满足线性回归的假设前提,我们需要抛去一个(不过程序会默认砍掉一个)

那么当然我们也可以自己选择删除的变量
默认情况下,对于离散变量State而言,模型选择California值作为对照组。

# 导入第三方模块
import pandas as pd
import statsmodels.api as sm
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 生成由State变量衍生的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集水平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State变量和California变量(因为State变量已被分解为哑变量,New York变量需要作为参照组)
Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True)
# 拆分数据集Profit_New
train, test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state=1234)
# 建模
model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data = train).fit()
print('模型的偏回归系数分别为:\n', model2.params)

输出:
我们可以看到没了纽约,而有了其他的
在这里插入图片描述
那最后函数可写成:Profit=58068.05+0.80RDSpend-0.06Administation+0.01Marketing_Spend+1440.86Florida
+513.47California

线性回归模型的假设检验

做假设检验的目的,是看我们构造的模型合不合理。

模型的F检验

F检验是检验模型的合理性

1、提出问题的原假设和备择假设
2、在原假设的条件下,构造统计量F
3、根据样本信息,计算统计量的值
4、对比统计量的值和理论F分布的值,当统计量值超过理论值时,拒绝原假设,否则接受原假设

理论分析

首先构造假设

H0叫原假设;H1叫备择假设在这里插入图片描述
再构造统计量
在这里插入图片描述
n是变量数目,p是样本数目
计算的F与分布的理论F(p, n-p-1)两者相互比对

其中:
在这里插入图片描述
TSS=ESS+RSS
ESS叫离差/残差平方和
RSS叫回归平方和
TSS叫总差平方和

示例

我们先建模,然后做F检验

# 导入第三方模块
import pandas as pd
import statsmodels.api as sm
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 生成由State变量衍生的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集水平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State变量和California变量(因为State变量已被分解为哑变量,New York变量需要作为参照组)
Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True)
# 拆分数据集Profit_New
train, test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state=1234)
# 建模
model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data = train).fit()
# print('模型的偏回归系数分别为:\n', model2.params)# 导入第三方模块
import numpy as np
# 计算建模数据中因变量的均值
ybar = train.Profit.mean()
# 统计变量个数和观测个数
p = model2.df_model
n = train.shape[0]
# 计算回归离差平方和
RSS = np.sum((model2.fittedvalues-ybar) ** 2)
# 计算误差平方和
ESS = np.sum(model2.resid ** 2)
# 计算F统计量的值
F = (RSS/p)/(ESS/(n-p-1))
print('F统计量的值:',F)

输出:

F统计量的值: 174.63721716733755

接着对比实际

# 导入模块
from scipy.stats import f
# 计算F分布的理论值
F_Theroy = f.ppf(q=0.95, dfn = p,dfd = n-p-1)
print('F分布的理论值为:',F_Theroy)

输出:

F分布的理论值为: 2.502635007415366

我们发现,计算出来的F统计量值174.64远远大于F分布的理论值2.50,所以应当拒绝原假设,即认为多元线性回归模型是显著的,也就是说回归模型的偏回归系数都不全为0。

模型的T检验

T检验是检验系数的合理性

理论分析

首先提出假设
在这里插入图片描述
构造统计量
在这里插入图片描述
ε是误差项;cjj是(X’X)^-1的对角线,也就是(X’X)逆的对角线

示例

利用model的方法

# 导入第三方模块
import pandas as pd
import statsmodels.api as sm
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'D:\pythonProject\data\Predict to Profit.xlsx')
# 生成由State变量衍生的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集水平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State变量和California变量(因为State变量已被分解为哑变量,New York变量需要作为参照组)
Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True)
# 拆分数据集Profit_New
train, test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state=1234)
# 建模
model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data = train).fit()
# print('模型的偏回归系数分别为:\n', model2.params)# 有关模型的概览信息
model2.summary()

输出:
在这里插入图片描述
对比下结论
p≤0.05时才通过,或者叫t的绝对值大于2
从返回的结果可知,只有截距项Intercept和研发成本RD Spend对应的p值小于0.05,其余变量都没有通过系数的显著性检验,即在模型中这些变量不是影响利润的重要因素。

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

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

相关文章

Python数据分析案例42——基于Attention-BiGRU的时间序列数据预测

承接上一篇的学术缝合,排列组合模型,本次继续缝合模型演示。 Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测-CSDN博客 案例背景 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领…

VK1618 SOP18/DIP18高稳定LED驱动IC防干扰数显驱动控制器计量插座数显芯片 FAE支持

产品型号:VK1618 产品品牌:永嘉微电/VINKA 封装形式:SOP18/ DIP18 原厂,工程服务,技术支持! 概述 VK1618是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数…

Java GUI制作双人对打游戏(上)

文章目录 前言什么是Java GUI一、打开IDEA 新建一个Maven项目(后续可以打包、引入相关依赖也很容易)二、引入依赖三.绘制UI界面四.绘制JPanel面板总结 前言 什么是Java GUI Java UI,即Java用户界面,是指使用Java编程语言创建的图形用户界面&#xff08…

【MATLAB源码-第41期】基于压缩感知算法的OFDM系统信道估计和LS算法对比仿真。

操作环境: MATLAB 2013b 1、算法描述 压缩感知(Compressed Sensing, CS)是一种从稀疏或可压缩信号中重构完整信号的数学理论和技术。下面详细介绍压缩感知和它在OFDM信道估计中的应用。 1. 压缩感知基本概念 在传统采样理论中&#xff0c…

【C++】C++11 lambda表达式

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 C11引入『 lambda表…

25. 【Android教程】列表控件 ListView

在学习了 ScrollView 及 Adapter 两节内容之后,大家应该对 ListView 有了一些基本的了解,它是一个列表样式的 ViewGroup,将若干 item 按行排列。ListView 是一个很基本的控件也是 Android 中最重要的控件之一。它可以帮助我们完成多个 View 的…

ROS2从入门到精通1-3:详解ROS2动作通信机制与自定义动作

目录 0 专栏介绍1 动作通信模型2 动作模型实现(C)3 动作模型实现(Python)4 自定义动作 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情&a…

【Linux深造日志】运维工程师必会Linux常见命令以及周边知识!

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位宝子们好啊!我是博主鸽芷咕。日志这个东西我相信大家都不陌生,在 linxu/Windows 系统…

暖宝轻工机械有限公司现已加入2024第13届生物发酵展

参展企业介绍 公司坐落于富饶的长江三角洲,美丽的瓯越山水---温州,成立20多年来,专业从事换热器新品研发、应用设计、生产制造、销售服务为一体的综合性生产企业。 公司致力于食品、饮料、果酒、制药、暖通、化工等行业领域的加热冷却、蒸发…

微信定时发送指定消息

微信定时发送消息 简介: 该项目为微信定时发送消息机器人,可以扫码登录微信,输入微信好友名称或群聊名称,添加定时任务内容(时间、内容、图片),便可在指定时间发送该设置好的内容。 该项目包…

爬虫的目的是做什么

通过网站域名获取HTML数据解析数据,获取想要的信息存储爬取的信息如果有必要,移动到另一个网页重复过程 这本书上的代码的网址是 : GitHub - REMitchell/python-scraping: Code samples from the book Web Scraping with Python http://shop.…

51单片机-独立按键模块

1. 独立按键控制LED状态 轻触按键实现原理&#xff1a;按下时&#xff0c;接通&#xff0c;通过金属弹片受力弹动来实现接通和断开。 松开按键 按下之后&#xff1a;就会被连接 同时按下K1和K2时&#xff0c;P2_0,接口所连LED灯才亮。 #include <REGX52.H> void ma…