大家好,我是云朵君!
本号「数据STUDIO」长期接受有偿投稿,公号菜单栏【云朵之家】-【投稿】可查看征稿文档!
本文来自我的朋友才哥投稿,公众号:可以叫我才哥 的号主,身为游戏运营的他自学python只为让工作更轻松,目前这个号已经累积了百篇原创,涵盖python基础、pandas数据分析、数据可视化以及python爬虫等,欢迎大家关注,和才哥一起学习。
本次我们实战案例用到的是啤酒销量和气温之间的关系数据,探索气温对啤酒销量的影响。在实际中影响啤酒销量的因素自然不止气温这么一个,但是本次实战仅考虑气温这一个变量。
回归分析只涉及到两个变量的,称一元回归分析。一元回归的主要任务是从两个相关变量中的一个变量去估计另一个变量,被估计的变量,称因变量,可设为Y;估计出的变量,称自变量,设为X。回归分析就是要找出一个数学模型Y=f(X),使得从X估计Y可以用一个函数式去计算。当Y=f(X)的形式是一个直线方程时,称为一元线性回归。这个方程一般可表示为Y=A+BX,根据最小平方法或其他方法,可以从样本数据确定常数项A与回归系数B的值。
这里我们要用到numpy
、pandas
和matplotlib
三剑客以及科学计算包scipy
、统计模型库statsmodels
和seaborn
。
# 引入工具库
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
加载数据
# 读取案例数据
beer = pd.read_csv("beer.csv")
beer.head()
案例数据
# 绘制联合分布图
sns.jointplot(x = "temperature", y = "beer",
data = beer,
color = 'black'
)
联合分布图
从图中可以看到,呈现一定的气温越高销量越高的情况。
我们建立一元回归模型,Y=A+BX
,其中X是气温,Y是销量,A和B为待确定的值,其中A为常量,B为回归系数。
如果B不为0,则可以认为啤酒销量与气温有关;如果B为正数,则气温越高啤酒销量越高;如果B为负数,则情况相反。
当A和B值确定后,我们就可以根据气温来预测销量了。
确定基础模型后,我们使用ols
函数建模,fit
函数进行拟合
# 建模与拟合
lm_model = smf.ols(formula = "beer ~ temperature",
data = beer).fit()
ols
就是最小二乘法英文缩写,全称为ordinary least squares
"beer ~ temperature"
代表模型的变量为temperature
,因变量为beer
fit
就是拟合过程,自动完成参数A和B的估计我们再通过summery
函数打印结果**(OLS模型的详细信息**)
# OLS模型的详细信息
lm_model.summary()
OLS模型的详细信息
在以上OLS
模型详细信息中,第二部分中的Intercept和temperature就是我们的A和B
coef
就是A和B具体的值,std err
是系数的标准误差,此后面依次是t
值、0假设时的p
值以及95%置信区间
的下置信界限和上置信界限。
p值越小,则可以认为气温的系数和0之间存在显著性差异,也就是气温和销量的关系比较明显。
而我们看到系数B
的值0.7654是大于0的,也就是气温越高,啤酒销量越多。
关于OLS
模型详细信息中其他信息的说明
Dep. Variable
:变量的名称Mode
l/Method
:模型是最小二乘法Date
:建模日期No. Observations
:样本容量Df Residuals
:样本容量减去参与估计的参数个数Df Mode
l:用到的因变量个数Covariance Type
:协方差类型,默认是nonrobust
R-squared/Adj. R-squared
:决定系数与修正决定系数F-statistic:/Prob (F-statistic)
:方差分析的结果Log-Likelihood
:最大对数似然AIC
:赤池信息量准则BIC
:贝叶斯信息量准则
这里的决定系数为0.504,它的含义是模型可以预测的差异在整体差异中所占的比例,怎么理解呢?
如果我们没有回归模型,那么平均值就是我们最好的估计,变异程度用样本方差表示,即(样本值-平均值)的平方和,将之称为总变异 如果有了回归模型后,那么我们对某一个特定自变量的结果可以通过回归模型来进行推断预测,这样(样本值-预测值)的平方和就是不能被解释的变异程度,(样本值-预测值)的平方和被称为剩余平方和。假设有一个完美的模型可以全部预测每个观测点的话,不能解释的变异就为0了。 决定系数就是用可以被解释的变异/总变异,决定系数越高,代表可以被解释的程度越高,回归模型的效果越好。
一元回归模型的参数都确定后,我们就可以进行预测了,直接用predict
函数即可。
# 一元回归模型预估值
beer['predict_beer'] = lm_model.predict()
beer.head()
如果要预测某个气温下的销售额,可以这样:
# 预测 气温 30的销售额
lm_model.predict(pd.DataFrame({"temperature":[30]}))
''' 输出
0 57.573043
dtype: float64
```
我们绘制实际值与预估值之间的组合图(前者散点、后者直线)。
# 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
x = beer.temperature
y1 = beer.beer
y2 = beer.predict_beer
plt.plot(x, y1, 'o', c='r', label='原始数据')
plt.plot(x, y2, label='一元回归模型')
plt.legend()
其实,sns.lmplot
就可以绘制回归曲线。
sns.lmplot(x = "temperature", y = "beer",
data = beer,
scatter_kws = {"color": "black"},
line_kws = {"color": "black"}
)
一元回归模型因为只涉及到一个自变量,所以是比较简单的模型案例,而我们在实际生活中遇到的更多的是多变量的回归模型,容我们后续介绍。本文完整数据获取:点赞和在看后,在本公众号后台回复:「210903」即可。