申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师。
不要杠,开心学习!
讲师介绍:梁老师 《细说Java》与《Java深入解析》图书作者。一线互联网资深数据分析专家,超过十年软件开发与培训经验。精通Python与Java开发,擅长网络爬虫,数据分析与可视化,机器学习,自然语言处理等技术。曾参与阿里云大学数据分析,机器学习,自然语言处理等课程开发与认证设计,担任阿里云学院导师。
进入正文:
接着上一篇的内容,我们继续学习数据分析师用到的统计学的内容。
本篇博客包括学习:
散点图矩阵、相关系数、单样本t检验、基模型、特征选择、分箱操作以及残差图。
让我们继续开始对AQI的分析与预测吧!
AQI分析与预测(下)

5.4 空气质量主要受哪些因素的影响?
对于空气质量,我们很可能会关注这个问题,例如,我们可能会产生如下的疑问:
- 人口密度大,是否会对空气质量造成负面影响?
- 绿化率高,是否会提高空气质量?
我们可以通过画图进行查看:
5.4.1 散点图矩阵
什么是散点图矩阵?
散点图矩阵图是可用于比较多个数据集以查找模式和关系。
散点图矩阵是将任意两个变量之间的关系都以散点图的形式(一个二维平面图)绘制出来。
这里我们只选取空气质量指数AQI、人口密度PopulationDensity和绿化覆盖率GreenCoverageRate来进行绘制。
通过seaborn的pairplot
来绘制散点图:
sns.pairplot(data[["AQI", "PopulationDensity", "GreenCoverageRate"]])
# sns.pairplot(data[["AQI", "PopulationDensity", "GreenCoverageRate"]], kind="reg")
图中对脚线发现不是散点图,因为横纵坐标的对脚线处是一个变量,一个变量的话就不会给我们绘制散点图了而是直方图。
通过散点图我们可以大致看出每两个变量之间的关系。但是从上面的图中我们还不是特别容易清晰的看出变量之间的关系,我们可以通过一种量化的方式来解决,那就是我们可以计算一下相关系数,相关系数就是衡量两个变量之间的相关性。
5.4.2 相关系数
5.4.2.1 协方差定义
协方差体现的是两个变量之间的分散性以及两个变量变化步调是否一致。容易得知,当协方差的两个变量相同时,协方差就是方差。
通俗的理解:
两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何?
5.4.2.2 相关系数定义
相关系数,可以用来体现两个连续变量之间的相关性,最为常用的为皮尔逊相关系数。 两个变量的相关系数定义为:
公式含义:就是用X、Y的协方差除以X的标准差和Y的标准差。
统计学中常用相关系数 r 来表示两变量之间的相关关系。
相关系数 r 的取值范围为[-1,1],我们可以根据相关系数的取值来衡量两个变量的相关性:
r为正时是正相关,反映当x增加(减少)时,y随之相应增加(减少);呈正相关的两个变量之间的相关系数一定为正值,这个正值越大说明正相关的程度越高。
r为负时是负相关,反映当x增加(减少)时,y 会相反的减少(增加);呈负相关的两个变量之间的相关系数一定为负数。
我们以空气质量(AQI)与降雨量(Precipitation)为例,计算二者的相关系数。
先计算一下二者的协方差和相关系数:
x = data["AQI"]
y = data["Precipitation"]
# 计算AQI与Precipitation的协方差。
a = (x - x.mean()) * (y - y.mean())
cov = np.sum(a) / (len(a) - 1)
print("协方差:", cov)
# 计算AQI与Precipitation的相关系数。
corr = cov / np.sqrt(x.var() * y.var())
print("相关系数:", corr)
结果:
协方差: -10278.683921772239
相关系数: -0.40159811621922753
我们有最简便的求协方差和相关系数的方法:
通过
Series.cov( )
方法来计算协方差;
通过Series.corr( )
方法来计算相关系数;
print("协方差:", x.cov(y))
print("相关系数:", x.corr(y))
结果:
协方差: -10407.167470794398
相关系数: -0.4043784360785916
不过,DataFrame对象提供了计算相关系数的方法,我们可以直接使用。
data.corr()
将data中所有变量两两一组求出他们的相关系数。
结果:
为了能够更清晰的呈现相关数值,我们可以使用热力图来展示相关系数。
plt.figure(figsize=(15, 10))
ax = sns.heatmap(data.corr(), cmap=plt.cm.RdYlGn, annot=True, fmt=".2f")
注意:
Matplotlib 3.1.1版本的bug,heatmap的首行与末行会显示不全。
可手动调整y轴的范围来进行修复。(老版本的Matplotlib不需要调整y轴范围。)
手动调整代码:
a, b = ax.get_ylim()
ax.set_ylim(a + 0.5, b - 0.5)
使用seaborn中的heatmap( )制作热力图。
cmap=plt.cm.RdYlGn
指定颜色,此处指定的是绿色到红色。
annot=True
显示数字。
fmt=".2f"
保留两位小数。
结果:
从图中可以看到,维度Latitude 对AQI 的相关性是最大的,为0.55。是正相关,也就意味着,随着维度的增大AQI也是增大的,越往北维度越大,AQI就越大,AQI越大意味着空气质量越差,所以南方空气要比北方空气要好。
5.4.3 结果统计
从结果可知,空气质量指数主要受降雨量(-0.40)与维度(0.55)影响。
- 降雨量越多,空气质量越好。
- 维度越低,空气质量越好。
此外,我们还能够发现其他一些明显的细节:
5.5 关于空气质量的验证
江湖传闻,全国所有城市的空气质量指数均值在71左右,请问,这个消息可靠吗?
城市平均空气质量指数,我们可以很容易的进行计算:
计算均值:
data["AQI"].mean()
结果:
75.3343653250774
该需求是要验证样本均值是否等于总体均值,根据场景,我们可以使用单样本 t 检验,置信度为95%。
r = stats.ttest_1samp(data["AQI"], 71)
print("t值:", r.statistic)
print("p值:", r.pvalue)
这里检验AQI空气质量的均值与71是否显著。
结果:
我们可以看到,P值大于0.05,故我们无法拒绝原假设,因此接受原假设。
什么是单样本 t 检验?
使用
ttest_1samp()