使用R语言实现的城市空气质量分析模型

今天来点分享点干货吧,这个题是这学期数学建模的课题,不过鉴于本人数学比较渣而且时间精力有限,实现的思路比较传统和简单,用到了多元线性回归和主成分分析来求解模型,这也是统计学习方法里面比较常见的一种,正好在上个学期学习了R语言的使用,用来做统计分析十分方便。<!-- more -->

首先面临的问题是数据收集,经过多方查找,终于找到了PM2.5.in这个网站提供的开放数据接口,用python写爬虫爬到了一年来北京市的空气质量监测数据。又考虑到空气质量和工业、经济发展、天气等多方因素有关,但是在这其中容易收集到的就是天气数据,故在天气后报网站上手工复制到一年来的天气数据,以及动用各种搜索引擎耗尽十年功力找到13年全年和14年夏天几个月的湿度数据,从气候条件这一切入点做相关分析。原始数据格式如下:

相关矩阵表1

第一个要解决的问题就是空气质量与哪些污染物有密切的关系?(废话,肯定是PM2.5嘛。。)不过数据胜于雄辩,用r语言求解相关矩阵的方法(cor())求出空气质量指数AQI和其他污染物的相关矩阵以及图像如下:

图1

图2

Perfect,结果让我们很满意,AQI和PM2.5之间的相关程度最高,印证了我们最初的猜想((-,-)|||),之后我们的分析就可以围绕PM2.5展开鸟~

首先做一个不太有意义的分析,我们看到AQI是直接和污染物的浓度挂钩的,那么问题来了,能不能由这些污染物的浓度倒推出AQI的计算公式呢?我们知道求解因变量与多变量之间的最常用的的办法是多元线性回归,即通过最小化误差平方和的方法来实现y=b0 +b1x1 +b2x2 +e的参数最佳估计值。R语言里面有很方便的方法来实现这个方法(lm()),这里我们用混合回归模型来求解问题,初步结果如下,

QQ图片20150109194519

可以看到F值(F检验,也称失拟性检验,代表离散分析,F值越大表明回归模型越显著)1659,很大,修正后的R方(决定系数)为0.9515,表示拟合很好,美中不足的就是CO(0.986)和SO2的P值比较大,说明变量的显著性不是很高,而且我们看到上面各元素的相关矩阵发现各自变量之间也是有一定的相关关系,可能在其中存在多重共线性的问题,这里我们用R语言提供的逐步回归(step)方法来删除一些变量,可以用step函数进行变量筛选,step函数AIC作为评价指标来判断一个变量是否应该加入模型。

QQ图片20150109202108

我们看到删除了CO这一个变量,现在的分析结果是

QQ图片20150109202245

SO2的P值虽然还是较小,不过比之前要好一点,在模型中更显著了,F值和修正的r方也提高了一点点,说明这次的修正还是比较有效的。看一下近乎理想的残差分布图(plot())hia~hia~

QQ图片20150109202759

最后得出的结果是

AQI = 0.88758PM2.5+0.33105PM10-0.46667NO2-0.06736SO2+33.76268(没准气象局的人就是这么算滴~)

说好的PM2.5是影响AQI的主要因素,那末现在我们重点分析一下PM2.5和气象因素之间的关系。

首先看一下我搜集到的数据格式

QQ图片20150109204010

这样的数据显然是不能直接拿来用的!经过我的不懈努力以及各种Parser,得到了下面的东西

QQ图片20150109204445

其中降水量根据天气状况估算得出(悲哀地发现2013年和2014年的冬天都没有下雪啊有木有。。),考虑到前一天晚上的天气状况极有可能影响到第二天的污染情况(比如晚上刮风第二天空气会比较好~),故把前一天晚上的数据也加上了。

我们看到自变量还是比较多的,而且关键问题是天气因素之间是互相影响的,即使算出来了结果也会存在严重的多重共线性 。这时候主成分分析这个神奇的方法就派上用场啦(主成分分析(Principal Component Analysis,PCA), 将多个变量通过线性变换以选出较少个数重要变量的一种多元统计方法。又称主分量分析),R语言里面也提供了相应的方法(princmp)

经过对这些变量进行主成分分析,我们得出下面的表

QQ图片20150109210117

前九个因子的组成:

QQ图片20150109210428

我们看到前四个因子的方差累计贡献率已经达到了98%,故只取前四个元素进行分析。

根据上表其实可以发现第一二个因素主要和温度、湿度有关,第三个因素主要跟湿度有关,第四个因素主要跟降水有关,我们将因子重新命名如下

QQ图片20150109210714

凭常识来看冬天和夏天的气候条件和人文地理工业情况可能都不太一样,所以我们在这里把冬天的数据和夏天的数据分开来研究,冬天的多元线性回归分析结果如下

QQ图片20150109211101

该模型的R方 = 0.8295(高得出人意料啊有木有),假设几率 p-value=< 2.2e-16。说明在冬天 PM2.5 的值和气象环境有着明显的关系(其中跟湿度的关系很大)。

夏天的分析结果如下

QQ图片20150109211445

QQ图片20150109211513

该模型的R方=0.3076,假设几率 p-value=3.036e-05。该模型精确度不是很高,说明夏天空气中 PM2.5 浓度对气象环境的依赖不是很强。

冬天的数据是13年的,我们用2015年9号的数据来验证一下,今天的相对湿度大概是34左右,气温7到-5度,昨天湿度高一点,60左右,气温5度到-3度,得出PM2.5为30.18094,查了一下今天的空气质量是27,预测结果还是比较不错的

QQ图片20150109213633

还有一些后续的分析有时间再更吧~