深入浅出数据分析CH11-合理误差

前言

本文是本人研读《深入浅出数据分析》一书后,使用不同工具对书中案例的分析,一是为了加强自己对案例的理解,二是希望能将各种主流工具学以致用,三是将个人的学习思考进行总结量化;

本文所使用的案例数据均从《深入浅出数据分析》的官网中下载,根据自己的学习需求对数据进行了一些处理,不代表官方,官方下载地址如下:examples / Head First Data Analysis · GitLab (oreilly.com)

背景

根据CH10一章,你创建了一个线性回归模型,这个模型根据人们要求的加薪幅度预测他们的士嘉积薪幅度,许多客户都在使用这个加薪算法,有些客户表示自己得到的比计算出的结果多了不少,有些客户表示自己得到的比计算出的结果少了不少,有些顾客表示自己得到的与计算出的结果分毫不差,但也有一些客户表示自己一分钱都没加,那些低于预测值的客户颇为疑惑,而那些一分钱没加的客户大为恼火,你该怎么解决不同客户的问题呢?

思考引导

1.回归方程预测的是人们平均得到的结果,并不是每个人都能和平均值一样。将新的客户结果数据添加到数据集中,再把这些新数据用散点表示出来,可以看到新加入的数据与原始数据的位置,我们发现新加入的数据点与原数据点不是完全重合的,他们有自己的位置所在。而那些没有得到加薪的客户所要求的加薪幅度都超出了我们模型的预测范围,也就是使用了外插法(用回归方程预测数据范围之外的数值),所以模型计算出来的结果对他们完全没有参考作用。外插法和内插法有所不同,内插法对数据范围内的点进行预测,这正是回归法的目的,内插法很准确,但人们随时都在使用外插法,不过,如果打算使用外插法,就需要制定附加假设条件,明确表示不考虑数据集外发生的情况。所以请为你原来的模型添加数据范围说明,说明如下:

"回归模型:received=0.7*requested+2.4。

*其中requested是要求加薪幅度,received是预测会得到的加薪幅度。

*此模型只在加薪要求requested介于0%到22%之间时有效。"

2.无论你的回归分析是否无可挑剔,都免不了要进行这样那样的预测,这些预测一般都不会完全和实际值一样,因此实际结果和预测结果之间的偏差叫机会误差,也称为残差,对残差的分析是优秀的统计模型的核心。指出误差对模型和客户都有好处,可以让客户更加理解你的预测。现在请再次为你的模型添加一条误差说明,说明如下:

"回归模型:received=0.7*requested+2.4。

*其中requested是要求加薪幅度,received是预测会得到的加薪幅度。

*此模型只在加薪要求requested介于0%到22%之间时有效。

*请注意,由于存在机会误差,你个人的结果可能会不同于预测结果。"

3.由于误差只能解释一部分偏差,不能解释所有数据点的偏差,因此误差几乎无法去除,我们应该在使用模型时增加误差说明,还应该关注误差是如何分布的,在上一章中我们得知残差标准差(均方根误差)为2.3,之后我们在回归线±2.3 的范围内画了一个区间(即误差区间)来表示误差的分布。如果数据点集中在误差区间内且数据点区间逼近误差区间,则说明在这段横坐标取值范围内,预测值接近实际值;如果数据点集中在误差区间内但数据点分布区间远小于误差区间,说明在这段横坐标取值范围内,误差区间偏大,应该缩小阴影区,即缩小误差;如果大部分数据点都分布在误差区间外,则说明在这段横坐标取值范围内,误差区间偏小,应该增大阴影区,即增大误差;三种区间如下图所示:

请想想用什么方法可以让每段误差区间都更加靠近数据点分布区间,即缩小预测值和实际值?

解决思路

可以将x轴分割成多个区域,分别用这些区域的数据建立不同的回归方程。

详细步骤

(1)将阴影区偏大和刚好的x取值区域划分为第一个区域(x1),将阴影偏大区的 x取值区域划分为第二个区域(x2),两个区域的分界点为10;

(2)分别用区域1,区域2的数据进行拟合,建立回归方程,得到两个回归方程fit1和fit2;

(3)分别计算两个回归方程fit1和fit2的残差,残差标准差,确定残差区间上下界(回归线±残差标准差 ),绘制残差区间;

工具选择

Excel

将数据拆分后分别建立散点图,添加趋势线,显示公式。

在x<=10范围内, y=0.94x+0.79,y是预测的实际加薪,x是要求加薪,实际加薪结果将会是预测加薪的±1.4%;

在10<x<=22范围内, y=0.3x+7.81,y是预测的实际加薪,x是要求加薪,实际加薪结果将会是预测加薪的±4.5%;此算法仅在10<x<=22时有效,超此范围则无效;

Tableau

拆分数据集,分别建立回归方程,本文也不做展示。

R

详细代码见附录。

回归方程fit1

在x<=10范围内, y1=0.94*x1+0.79,y1是预测的实际加薪,x1是要求加薪,实际加薪结果将会是预测加薪的±1.4%;

此算法仅在0<x<=10时有效,超此范围则无效;

其中,残差标准差:1.375,决定系数:0.5186;

回归方程fit2

在10<x<=22范围内, y2=0.3*x2+7.81,y2是预测的实际加薪,x2是要求加薪,实际加薪结果将会是预测加薪的±4.5%;

此算法仅在10<x<=22时有效,超此范围则无效;

其中,残差标准差:4.544,决定系数:0.02662;

图形分析

对比原来的一条回归线,发现分区域建立回归线后,各区域的阴影区都朝着我们想要的方向走,10以内的阴影区更贴近数据点分布了,10以外的阴影区也将更多数据点包含在内,增大了误差区间。

在误差上,第一区间的均方根误差(残差标准差)由原来的2.298缩小到了1.375,预测区间更加精确了;第二区间的均方根误差(残差标准差)由原来的2.298增大到了4.544,预测区间更加模糊了;

在决定系数上,第一区间的决定系数由原来的0.4431提升到了0.5186,模型得到了优化;第二区间的决定系数由原来的0.4431降低到了0.02662,模型似乎更差了;

第一区间的模型接收的x值更小但预测精度更准确,而第二区间的模型接收的x值更大,但是预测区间更加模糊,用户们可以根据自己的具体需求使用不同的模型。

后续提升

如何画出每个分段区间的误差区间

先计算出每个实际数据点与预测数据点之间存在的误差,把0-22划分为22个区间,使用公式计算每个区间内数据点的误差平方和,再计算均方根误差,确定边界为某区间在回归线附近±某区间均方根误差,画出阴影区。

如何确定分成多少段区间建立模型

全文总结

通过将样本进行分段,分别建立回归模型,减小了第一区域样本的实际值和预测值之间的误差,同时,增大了第二区域样本的实际值和预测值之间的误差。我们发现,新得出的误差不是都减小了,而是都更能解释区域内的数据误差了,这也告诉我们要正视误差的存在。

还有模型的精度是需要根据实际数据不断提升的,需要将新数据纳入到数据集中参与预测。

模型精度的评估是需要验证集测试集模型共同评估的,原书中没有将数据集划分为训练集测试集验证集,所以本文暂时不对模型精度进行过多分析。

关于误差及其衍生统计值的叫法也有很多,误差=残差,均方根误差=残差标准差,本文对两种叫法都有用到,希望读者看到时不要感到疑惑。

附录

R代码

#引入R高级绘图lattice

library(lattice)

#分割数据集为两个区域

x1=employee10$requested[employee10$negotiated=="TRUE"& employee10$requested <= 10]

y1=employee10$received[employee10$negotiated=="TRUE"& employee10$requested<=10]

fit1=lm(y1~ x1)#线性模型拟合

x2=employee10$requested[employee10$negotiated=="TRUE"& employee10$requested > 10]

y2=employee10$received[employee10$negotiated=="TRUE"& employee10$requested> 10]

fit2=lm(y2~ x2)#线性模型拟合

#计算第一区间的阴影区上线界限

rs1=resid(fit1)

sdrs1=sd(rs1)

y1p=predict(fit1) #回归线的y值

upper1=y1p+sdrs1 #上界

lower1=y1p-sdrs1 #下界

#计算第二区间的阴影区上线界限

rs2=resid(fit2)

sdrs2=sd(rs2)

y2p=predict(fit2) #回归线的y值

upper2=y2p+sdrs2

lower2=y2p-sdrs2

#绘图,polygon(c(x1,x2,x3,x4),c(y1,y2,y3,y4)),4个x坐标,4个y坐标,使用四个点确定一个区域,x和y是一 一对应关系

xyplot( y~ x,

panel=function(x,y){

panel.xyplot(x1,y1,pch=21, fill="white", col="black", cex=1.2)

panel.xyplot(x2,y2,pch=21, fill="white", col="blue", cex=1.2)

panel.lines(c(min(x1),max(x1)),c(min(y1p),max(y1p)),col="black",lty=1,lwd=1.1)

panel.lines(c(min(x2),max(x2)),c(min(y2p),max(y2p)),col="black",lty=1,lwd=1.1)

panel.polygon(c(min(x1),min(x1),max(x1),max(x1)),c(min(lower1),min(upper1),max(upper1),max(lower1)),col="gray",alpha=0.5)

panel.polygon(c(min(x2),min(x2),max(x2),max(x2)),c(min(lower2),min(upper2),max(upper2),max(lower2)),col="gray",alpha=0.5)},

xlab="要求加薪",ylab="实际加薪",main="加薪谈判结果", scale=list(tck=c(1,0))

)

#查看模型统计值

summary(fit1)

summary(fit2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值