python统计分析——线性模型的预测和评估

news2024/11/17 13:52:07

参考资料:用python动手学统计学

1、导入库

# 导入库
# 导入数据处理的库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
# 导入绘图的库
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
# 导入估计统计模型的库
import statsmodels.formula.api as smf
import statsmodels.api as sm

2、数据准备

data=pd.DataFrame({
    'beer':np.array([45.3, 59.3, 40.4, 38. , 37. , 40.9, 60.2, 63.3, 51.1, 44.9, 47. ,
                     53.2, 43.5, 53.2, 37.4, 59.9, 41.5, 75.1, 55.6, 57.2, 46.5, 35.8,
                     51.9, 38.2, 66. , 55.3, 55.3, 43.3, 70.5, 38.8]),
    'temp':np.array([20.5, 25. , 10. , 26.9, 15.8,  4.2, 13.5, 26. , 23.3,  8.5, 26.2,
                     19.1, 24.3, 23.3,  8.4, 23.5, 13.9, 35.5, 27.2, 20.5, 10.2, 20.5,
                     21.6,  7.9, 42.2, 23.9, 36.9,  8.9, 36.4,  6.4])
})
data.head()

3、线性模型拟合

# 利用普通最小二乘法(ordinary least squares)拟合线性模型
lm=smf.ols(formula="beer~temp",data=data).fit()
# 查看模型的系数
lm.params

4、预测

当模型拟合完成后,可以用predict函数进行预测。当参数为空时,输出的是训练集对应的拟合值,如下:

在预测时可以指定气温的值,参数为dataframe格式。估计temp为0时的beer值,如下:

也可以用模型估计的系数来直接计算出对应的期望值,如下:

# 用线性模型的系数计算当temp为0时beer的期望值
beta0=lm.params[0]
beta1=lm.params[1]
temp=0
beta0+beta1*temp

5、模型评估——残差

原则上,我们应该在预测之前评估模型。模型的评估以分析残差为主。正态线性模型的残差应该服从均值为0的正态分布,所以我们要检查残差是否满足这个条件。

# 获取残差
resid=lm.resid
resid.head(3)

下面我们按照残差的计算公式获取残差,残差的计算公式为:

residuals=y-\hat{y}

其中,y为实际值,\hat{y}为估计值(拟合值)。

计算过程如下:

# 计算估计值
y_hat=beta0+beta1*data.temp
# 计算残差
res=data.beer-y_hat
res.head(3)

6、模型评估——决定系数

        在summary函数的输出中,R-squared叫作决定系数。决定系数用来评估模型与已知数据的契合度。决定系数的计算式如下:

R^2=\frac{\sum_{i=1}^{N}(\hat{y}-\mu)^2}{\sum_{i=1}^{N}(y-\mu)^2}

其中,y为相应变量的实际值,\hat{y}是模型的估计值(预测值),μ是y的均值。

如果相应变量的估计值(预测值)和实际值相等,则R^2=1。

决定系数的获取方式如下:

# 方法一:直接获取
lm.rsquared
print("lm.rsquared: ",lm.rsquared)
# 方法二:按公式进行计算
mu=np.mean(data.beer)
y=data.beer
y_hat=lm.predict()
R_squared=np.sum((y_hat-mu)**2)/np.sum((y-mu)**2)
print("R_squared: ",R_squared)

下面介绍决定系数的具体含义:由残差的计算公式residuals=y-\hat{y}变形可得y=\hat{y}+residuals。决定系数的计算公式的分母可分解为下式:

\sum_{i=1}^{N}(y-\mu)^2=\sum_{i=1}^{N}(\hat{y}-\mu)^2+\sum_{i=1}^{N}residuals^2

相应变量的差异等于模型可预测的差异加上模型不可预测的残差平方和。因此,模型可以预测的差异在整体中所占的比例就是决定系数。决定系数的表达式也可以表示为:

R^2=1-\frac{\sum_{i=1}^Nresiduals^2}{\sum_{i=1}^N(y-\mu)^2}

当解释变量越多,决定系数越大。决定系数过大会导致过拟合,因此需要对决定系数进行修正(修正决定系数考虑了解释变量过多地惩罚制表,通过自由度修正了决定系数。)修正决定系数的数学公式如下:

R^2=1-\frac{\sum_{i=1}^Nresiduals^2/(N-s-1)}{\sum_{i=1}^N(y-\mu)^2/(N-1)}

其中,s为解释变量的个数。

修正决定系数的获取方式如下:

# 方法一:直接获取
lm.rsquared_adj
print("lm.rsquared_adj: ",lm.rsquared_adj)
# 方法二:按公式进行计算
n=len(data.beer)
s=1
mu=np.mean(data.beer)
y=data.beer
R_squared_adj=1-(np.sum(lm.resid**2)/(n-s-1))/(np.sum((y-mu)**2)/(n-1))
print("R_squared_adj: ",R_squared_adj)

7、模型评估——残差的直方图和散点图

要观察残差的特征,最简单的方法就是绘制出它的直方图。

根据残差的直方图,我们可知残差大致左右对称,形状接近正态分布。

sns.histplot(lm.resid,kde=True)

下面绘制横轴为拟合值、纵轴为残差的散点图,该图看起来是随机的,个数据都不相关也没有出现极端值。

sns.jointplot(x=lm.fittedvalues,y=lm.resid)

8、模型评估——残差的分位图

        分位图是用来比较理论分位数(theoretical quantiles)与实际分位数(sample quantiles)的散点图,也叫Q-Q图。正态分布的百分位数就是理论分位数,通过图形对比理论分位数与真实数据的分位数,可以直观地判断残差是否服从正态分布分布。具体原理可以参考excel统计分析——Q-Q图_excel 画q-q图-CSDN博客

由下图可以看出,残差基本服从正态分布分布。

# 绘制Q-Q图,line=‘s’表示绘制正态分布标准线。
# 如果散点落在线上表示数据服从正态分布。
sm.qqplot(lm.resid,line='s')

9、模型评估——根据summary函数的输出分析残差

利用summary函数查看其输出的第三个表:

Prob(Omnibus) 和 Prob(JB) 是残差的正态性检验结果。p值大于0.05,并不代表残差确实不服从正态分布,此处的检验只能用来判断结果是否存在明显的问题。

要判断残差是否服从正态分布,还要观察skew(偏度)和kurtosis(峰度)的值。有此表可以skew=-0.240,接近0;kurtosis=2.951,接近3,基本服从正态分布分布。具体原理可参考:excel统计分析——偏度、峰度_excel的峰度是减3后的值吗-CSDN博客

Durbin-Watson表示残差的自相关程度,如果它的值在2附近就说明没什么问题。在分析时间序列的数据时必须判断它是否在2附近。如果残差自相关,系数的检验结果便不可信,这个现象叫作伪回归。如果DurbinWatson统计量远大于2,就需要使用广义最小二乘法进一步讨论了。

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

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

相关文章

更简单地介绍 CUDA

这篇文章是对 CUDA 的超级简单介绍,CUDA 是 NVIDIA 流行的并行计算平台和编程模型。我之前在2013年写过一篇文章《CUDA简单介绍》,多年来一直很受欢迎。但 CUDA 编程变得更加容易,GPU 也变得更快,所以是时候进行更新(甚…

【Java程序设计】【C00290】基于Springboot的网上书城管理系统(有论文)

基于Springboot的网上书城管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上书城管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块:在系统首页可以查看首…

Atcoder ABC340 A-D题解

比赛链接:ABC340 话不多说&#xff0c;看题。 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int a,b,d;cin>>a>>b>>d;for(int ia;i<b;id)cout<<i<<endl;return 0; } Problem B: 还是签到题。一个v…

潇洒郎:2024 IDEA、Pycharm获取最新激活码获取方式

IDEA获取最新激活码 https://idea.javatiku.cn/ 手机打开&#xff0c;看到验证码&#xff0c;30分钟有效&#xff0c;输入验证码 获取到最新激活码

挑战杯 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据…

使用Python制作进度条有多少种方法?看这一篇文章就够了!

前言 偶然间刷到一个视频&#xff0c;说到&#xff1a;当程序正在运算时&#xff0c;会有一个较长时间的空白期&#xff0c;谁也不知道程序运行的进度如何&#xff0c;不如给他加个进度条。 于是我今个就搜寻一下&#xff0c;Python版的进度条都可以怎么写&#xff01; 送书…

展望2024生物发酵领域-振华仪表

参展企业介绍 杭州振华仪表有限公司(简称“振华仪表”)是集电磁流量计研发、生产、销售、服务于一体的国家高新技术企业、省“专精特新”企业&#xff0c;主导起草了《电磁流量计检定规程(JJG 1033—2007)》、《智能变送器性能评定方法》等4项国家标准。 振华仪表于1985年成功…

[已解决]npm淘宝镜像最新官方指引(2023.08.31)

最新的配置淘宝镜像的淘宝官方提供的方法 npm config set registry https://registry.npmmirror.com原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com &#xff0c;当点击 registry.npm.taobao.org 会默认跳转到 registry.npmmirror.com 如果你想将npm的下载…

小保司的理赔是否有保障?

《小保司的理赔是否有保障&#xff1f;》 预计6-7分钟读完 连续日更&#xff1a;第7天 作者&#xff1a;罗师兄 微信号&#xff1a;luoyun515 同一个人&#xff0c;同样的重疾险责任&#xff0c; 同样的保额&#xff0c;同样的缴费方式&#xff0c; 不同的保司保费可以相…

一文看懂大模型 Sora 技术推演

sora 一出&#xff0c;引起社会各界广泛关注。中美AI的差距进一步扩大&#xff0c;中美人才培养体系的差距等等言论&#xff0c;甚嚣尘上。 其实文生视频领域&#xff0c;华人学者和产业界的参与度还是非常高的。 那么 Sora 到底是谁做的&#xff0c;怎么做的&#xff0c;本篇…

2024年 最新python调用ChatGPT实战教程

2024年 最新python调用ChatGPT实战教程 文章目录 2024年 最新python调用ChatGPT实战教程一、前言二、具体分析1、简版程序2、多轮对话3、流式输出4、返回消耗的token 一、前言 这个之前经常用到&#xff0c;简单记录一下,注意目前chatgpt 更新了&#xff0c;这个是最新版的&am…

加载arcgis切片服务网络请求有大量404错误

需求&#xff1a; 前端访问arcgis切片服务时&#xff0c;在网络请求中出现大量404&#xff08;Not Found&#xff09;错误&#xff0c;切片时设置了感兴趣区域&#xff0c;在感兴趣范围内请求切片时能够正常返回切片。 问题分析&#xff1a; 设置感兴趣区域切片的目的是减少站…

Linux——简单的Shell程序

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…

LeetCode.2583. 二叉树中的第 K 大层和

题目 2583. 二叉树中的第 K 大层和 分析 这道题其实考察的是二叉树的层序遍历&#xff0c;下面我介绍一个二叉树的层序遍历模版&#xff1a; public List<List<Integer>> levelOrder(TreeNode root) {// 记录最终的结果List<List<Integer>> res n…

Python实战:xlsx文件的读写

Python实战&#xff1a;xlsx文件的读写 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &#…

从微软、英伟达、亚马逊到“木头姐”,大佬瞄准AI新风口:类人机器人

新近消息显示&#xff0c;一家开发类人机器人的初创公司新近融资云集硅谷大厂和风投基金&#xff0c;显示类人机器人正在成为科技巨头押注人工智能&#xff08;AI&#xff09;应用的新风口。 上月末就有媒体提到&#xff0c;上述初创Figure AI Inc.在磋商&#xff0c;寻求在微…

影视后期:剪辑逻辑故事的层次(三幕式故事结构)

写在前面 学习影视后期整理相关笔记博文内容涉及&#xff1a;三幕式理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上春树 流水账式短视频 流水账单线叙事要点&…

【JVM】MySQL驱动加载如何打破双亲委派机制

上文根据MySQL中Driver加载相关内容介绍了Java中SPI机制&#xff0c;本文详细介绍驱动的加载如何打破了双亲委派机制 Java双亲委派机制详细内容可以参考之前文章&#xff0c;在这里简单做个回顾 原理 首先我们要了解 Java 中的三层类加载器&#xff0c;分别为Bootstrap Class…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法&#xff1a; 1&#xff09;在普通方法中&#xff0c;this总是指向调用该方法的对象。在普通方法中&#xff0c;它是作为一种隐式参数一直就存在着&#xff08;这句话的意思&#xff0c;就是其实在普通方法中&#xff0c;编译器一直就…

林浩然与杨凌芸的Java泛型历险记:从类型安全到代码简洁,一场浪漫的编程革命

林浩然与杨凌芸的Java泛型历险记&#xff1a;从类型安全到代码简洁&#xff0c;一场浪漫的编程革命 Lin Haoran and Yang Lingyun’s Java Generics Adventure: A Romantic Programming Revolution from Type Safety to Code Simplicity 在那片充满逻辑与智慧的Java大陆上&…