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

news2024/11/16 13:46:21

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.coloradmin.cn/o/1595319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统

文章目录 大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统一、项目概述二、深度学习卷积神经网络(Convolutional Neural Networks,简称CNN)三、部分数据库架构四、系统实现系统模型部分核心代码模型训…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文: 在 Java 中一共存在 4 种引用:强、软、弱、虚。它们主要指的是,在进行垃圾回收的时候,对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…

Qt 中默认代码

目录 主函数 widget的声明 widget的定义 form file .pro 文件 主函数 #include "widget.h" ​ #include <QApplication> ​ int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 上面就是 Qt 刚创建的一…

Redis入门到通关之Set命令

文章目录 ⛄ 概述⛄ Set类型的常见命令⛄RedisTemplate API❄️❄️ 添加Set缓存(值可以是一个&#xff0c;也可是多个)❄️❄️设置过期时间(单独设置)❄️❄️根据key获取Set中的所有值❄️❄️根据value从一个set中查询,是否存在❄️❄️获取Set缓存的长度❄️❄️移除指定的…

集合体系java

Collection:单列集合&#xff1a;每个元素只包含一个值 Collection集合存储的是地址 Collection的三种遍历方法如下 //迭代器是用来遍历集合的专用方式&#xff08;数组没有迭代器&#xff09;&#xff0c;在java中迭代器的代表是Iterator //boolean hasNext():询问当前位置…

9【原型模式】复制一个已存在的对象来创建新的对象

你好&#xff0c;我是程序员雪球。 今天我们来学习23种设计模式之原型模式&#xff0c;在平时开发过程中比较少见。我带你了解什么是原型模式&#xff0c;使用场景有哪些&#xff1f;有什么注意事项&#xff1f;深拷贝与浅拷贝的区别&#xff0c;最后用代码实现一个简单的示例…

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中&#xff0c;通过增大模型训练数据集和训练特征的方式去优化模型的性能&#xff0c;本文将记录第三方种优化方式&#xff0c;通过调整随机森林创建模型参数的方…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面&#xff0c;即便对于摄影新手&#xff0c;也能快速上手。软件支持RAW格式照片处理&#xff0c;能够完整保留照片原始信息&#xff0c;让后期调整更加灵活。 在功能方面&#…

[Linux][基础IO][一][系统文件IO][文件描述符fd]详细解读

目录 0.预备知识1.系统文件I/O1.open2.write/read/close/lseek 2.文件描述符fd1.[0 & 1 & 2]2.什么是文件描述符&#xff1f;3.文件描述符的分配规则4.重定向5.使用dup2系统调用 -- 完成重定向6.FILE 0.预备知识 什么叫做文件呢&#xff1f; 站在系统的角度&#xff0…

【全网独家】oceanbase容器重启时报obshell failed错误,无法正常启动的问题处理

正常运行的oceanbase容器&#xff0c;重新启动该容器却启动不了&#xff0c;重启服务器也无法恢复&#xff0c;报obshell failed错误&#xff0c;无法正常启动&#xff0c;本文记录了问题处理过程。 一、问题现象 1、正常运行的oceanbase容器&#xff0c;重启却启动不了 2、运…

CSS中:root伪类的说明和使用

定义和用法 :root选择器用匹配文档的根元素。在HTML中根元素始终是HTML元素&#xff0c;所以也可以把:root理解为html根元素选择器&#xff0c;但是比html根元素的优先级高&#xff0c;:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。CSS :root 选择器 | …

Win11 WSL2 install Ubuntu20.04 and Seismic Unix

Win11系统&#xff0c;先启用或关闭Windows功能&#xff0c;勾选“适用于Linux的Windows子系统”和“虚拟机平台”两项 设置wsl默认版本为wsl2&#xff0c;并更新 wsl --list --verbose # 查看安装版本及内容 wsl --set-default-version 2 # 设置wsl默认版本为wsl2 # 已安装…

Go微服务: go-micro集成consul的注册中心和配置中心

微服务与注册中心的关系图 这个图很好说明了微服务之间的关系&#xff0c;以及consul注册中心的重要性 环境准备 1 &#xff09;consul 集群 假设consul 集群已经搭建&#xff0c;已有5台server和2台client这里2台client被nginx做负载均衡&#xff0c;假设最终本地的访问地址…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

蓝桥杯:握手问题和小球反弹问题

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#xff08;且仅有一次&#x…

Hadoop概述及集群搭建

文章目录 一、Hadoop介绍二、Hadoop发展简史三、Hadoop核心组件四、Hadoop架构变迁1、Hadoop 1.02、Hadoop 2.03、Hadoop 3.0 五、Hadoop集群简介六、Hadoop部署模式七、Hadoop 集群搭建第一步&#xff1a;创建虚拟机第二步&#xff1a;安装Linux镜像第三步&#xff1a;网络配置…

Spring Cloud 集成 RabbitMQ

目录 前言步骤引入相关maven依赖添加相关配置 使用方法配置消息序列化创建第一个消息队列和交换机使用方法 总结 前言 在当今的微服务架构盛行的时代&#xff0c;消息队列作为一种重要的通信机制&#xff0c;在分布式系统中扮演着不可或缺的角色。RabbitMQ&#xff0c;作为一款…

(七)C++自制植物大战僵尸游戏关卡数据加载代码讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 打开LevelData.h和LevelData.cpp文件。文件位置如下图所示。 LevelData.h 此头文件中定义了两个类&#xff0c;分别是OpenLevelData、LevelData&#xff0c;其中OpenLevelData用于加载文件数据。LevelData解析数据…

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表&#xff0c;并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook &#xff0c;从⽽…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…