知识点:回归分析
本周是统计学学习小组-第二期的第十二周,我们这周的学习内容是【回归分析】,涉及到的二级知识点有两个,分别是:
-
1、一元线性回归:相关关系、最小二乘法、拟合优度检测、显著性检验、回归预测、残差分析
-
2、多元线性回归:多重共线性、变量选择与逐步回归
统计学(贾俊平第七版)第十一章、十二章
操作部分:汽车销售数据(看看汽车销量与什么因素有关?)
数据 https://pan.baidu.com/s/1VlTy4nfvgXdDzgimVguZMg
理论部分:
在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析按照涉及的变量的多少,分为一元回归和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。
在大数据分析中,回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。例如,司机的鲁莽驾驶与道路交通事故数量之间的关系,最好的研究方法就是回归。
1、根据因变量和自变量的个数来分类:一元回归分析和多元回归分析;
2、根据因变量和自变量的函数表达式来分类:线性回归分析和非线性回归分析。
一元线性回归:
例:考察一个人的收入水平(>)和其受教育程度(H)两个变量,它们之间不存在确定的函数关系。也就是说,受教育程度相同的人.他们的收入水平往往不同,同样,收入水平相同的人,受教育程度也可能不同。因为受教育程度尽管与一个人的收入多少有些关系,但它并不是影响收入的唯一因素.还有其他因素(如职业、工作年限等)的影响。因此,收入水平与受教育程度之间是一种相关关系。
相关系数:通过散点图可以判断两个变量之间有无相关关系,并对变量间的关系形态作岀大致的描述,但散点图不能准确反映变量之间的关系强度。因此,为准确度量两个变量之间的关系强度,需要计算相关系数。相关系数(correlation coefficient)是根据样本数据计算的度量两个变量之间线性关系强度的统计量。若相关系数是根据总体全部数据计算的,称为总体相关系数,记为P;若是根据样本数据计算的,则称为样本相关系数,记为丄样本相关系数的计算公式为:
(使用Excel中的CORREL或PEARSON函数都可以计算两组数据的相关系数。其语法为CORREL (Ar-rayl, Array2)o Amyl和Array2是两个变量的数据区域。)
一般情况下,总体相关系数p是未知的.通常将样本相关系数r作为p的近似估计值。但由于r是根据样本数据计算出来的,因此会受到抽样波动的影响。由于抽取的样本不同,r的取值也就不同,因此r是一个随机变量。能否根据样本相关系数说明总体的相关程度呢?这就需要考察样本相关系数的可靠性,也就是进行显著性检验。
例:
问:根据表11-2计算的相关系数.检验不良贷款与贷款余额之间的相关系数是否显著(a=0.05)。
解:
得出表11-3的各项相关系数的统计量:
回归方程:
最小二乘法:
一元线性回归的公式推导 这里有一个推导过程
例:
带入表达式可得出:
回归直线的拟合度:
拟合优度(Goodness of Fit)是指回归直线对观测值的拟合程度。度量拟合优度的统计量是可决系数(亦称确定系数)R²。R²最大值为1。R²的值越接近1,说明回归直线对观测值的拟合程度越好;反之,R²的值越小,说明回归直线对观测值的拟合程度越差。
引出公式:总平方和(SST) =回归平方和(SSR) +残差平方和(SSE)
估计标准误差:
1.线性关系的检验:
线性关系检验是检验自变量 X 和因变量 Y 之间的线性关系是否显著,或者说,它们之间能否用一个线性模型来表示。为检验两个变量之间的线性关系是否显著,需要构造用于检验的统计量。该统计量的构造是以回归平方和(SSR)和残差平方和(SSE)为基础的。将SSR除以其相应的自由度(SSR的自由度是自变量的个数k ,一元线性回归中自由度为1)
2.回归系数的检验:
回归系数的显著性检验是要检验自变量对因变量的影响是否显著。在一元线性回归模型中,如果回归系数
,则回归线是一条水平线,表明因变量 y 的取值不依赖于自变量 x ,即两个变量之间没有线性关系。
一元线性回归的预测实例:https://blog.csdn.net/qq_41799291/article/details/89640428
多元线性回归:
在许多实际问题中,影响因变量的因素往往有多个,这种一个因变量与多个自变量的回归问题就是多元回归,当因变量与各自变量之间为线性关系时,称为多元线性回归。多元线性回归分析的原理同一元线性回归基本相同,但计算上要复杂得多,需借助计算机来完成。
也就是有多个x值,来反映一个y值。
其一般的形式为:
例12数据集:链接:https://pan.baidu.com/s/1Mfo2mKXM-s7lN7g0OEYkfg 提取码:dcf
例12 Excel 处理后 :
多重判定系数:
与一元回归类似,对多元线性回归方程,需要用多重判定系数来评价其拟合程度。在一元回归中曾介绍过因变量离差平方和的分解方法,对多元回归中因变量离差平方和的分解也一样,同样有
python实例:https://blog.csdn.net/weixin_40014576/article/details/79918819
代码部分:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
import os
import seaborn as sns
os.chdir('F:/Desktop/统计学第二期/第十二,第十三周')
#通过read_csv来读取我们的目的数据集
adv_data = pd.read_csv("car.csv")
#得到我们所需要的数据集且查看其前几列以及数据形状
print('head:',adv_data.head(),'\nShape:',adv_data.shape)
print(adv_data.corr()) #相关性
# 通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
sns.pairplot(adv_data, x_vars=['国内生产总值当季值(亿元)x1','汽油价格(元/吨)x2','人民币贷款基准利率%x3','汽车总产量(万辆)x4'], y_vars='传统汽车销量', size=7, aspect=0.8,kind = 'reg')
sns.set(style="white", palette="muted", color_codes=True) #set( )设置主题,调色板更常用
plt.savefig("pairplot.jpg")
plt.show()
#数据分开
mydf = [['国内生产总值当季值(亿元)x1','汽油价格(元/吨)x2','人民币贷款基准利率%x3','汽车总产量(万辆)x4']]
X_train,X_test,Y_train,Y_test = train_test_split(adv_data[['国内生产总值当季值(亿元)x1','汽油价格(元/吨)x2','人民币贷款基准利率%x3','汽车总产量(万辆)x4']],adv_data.传统汽车销量,train_size=.80)
print("原始数据特征:",adv_data[['国内生产总值当季值(亿元)x1','汽油价格(元/吨)x2','人民币贷款基准利率%x3','汽车总产量(万辆)x4']].shape,
",训练数据特征:",X_train.shape,
",测试数据特征:",X_test.shape)
print("原始数据标签:",adv_data.传统汽车销量.shape,
",训练数据标签:",Y_train.shape,
",测试数据标签:",Y_test.shape)
#回归分析开始
model = LinearRegression()
model.fit(X_train,Y_train)
a = model.intercept_#截距
b = model.coef_#回归系数
print("最佳拟合线:截距",a,",回归系数:",b)
#最佳拟合线:截距 -15.370765781642774 ,回归系数: [-1.96695711e-04 1.26429884e-03 2.88586538e+00 1.02192695e+00]
#R方检测
#决定系数r平方
#对于评估模型的精确度
#y误差平方和 = Σ(y实际值 - y预测值)^2
#y的总波动 = Σ(y实际值 - y平均值)^2
#有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
#有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
#对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
#2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
score = model.score(X_test,Y_test)
print(score)
#对线性回归进行预测
Y_pred = model.predict(X_test)
print(Y_pred)
plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
#显示图像
plt.savefig("predict.jpg")
plt.show()