2013年9月,国务院专门出台治理大气污染的条例,王安顺代表北京市与中央签订责任状,立下壮士断腕的决心。“也是生死状,因为中央领导说,2017年实现不了空气治理就‘提头来见’。既是玩笑话,也说明了这句话的分量很重。”

1月3日,北京市环保局发布了2016年北京市全年空气质量状况报告,“2016年我市空气质量达标天数198天,其中,一级优68天,二级良130天,达标天数较2015年增加12天;2016年共发生重污染39天,其中O3重污染1天,PM2.5重污染38天,较2015年减少7天。”

网友们看到这份报告纷纷调侃,“不过是今年多刮了几天风罢了”。空气质量的改善究竟是政府的功绩,还是“风”的垂怜呢?本文将基于天气和空气质量数据,用R语言一探究竟!

一、准备工作

library(RCurl)
#现成的数据找不到,需要用爬虫爬网页上的数据
library(XML)
#提取网页中的表格
library(dplyr)
#数据清理
library(ggplot2)
#画图
library(stringr)
#文本处理

二、数据收集

本文的空气质量数据来自http://www.tianqihoubao.com/aqi/beijing-201612.html
天气数据来自http://www.tianqihoubao.com/lishi/beijing/month/201612.html
时间跨度为2014-01-01至2016-12-31,总共应该是1096天,但2014年的空气质量数据有4天缺失,本文根据https://www.aqistudy.cn/historydata/daydata.php?city=%E5%8C%97%E4%BA%AC&month=201408
提供的数据予以补全(分别是2014-01-23、2014-03-24、2014-08-08、2014-08-22)。

空气质量数据和天气数据的爬虫代码:

#Air Quality
airdata <- matrix(data = NA, nrow = 1, ncol = 10)
airdata <- data.frame(airdata)
colnames(airdata) <- c("date", "airrank", "aqi", "aqirank", "pm2.5", "pm10","no2","so2", "co", "o3")months <- sprintf("%02d", 1:12)
years <- 2014:2016
for(i in years) {for(j in months) {print(paste(i, j, sep = ""))url_a="http://www.tianqihoubao.com/aqi/beijing-"url_b=".html"url_all=paste(url_a, i, j, url_b, sep = "")temp <- getURL(url_all, .encoding="GBK")temp2 <- iconv(temp,"gb2312","UTF-8") doc <- htmlParse(temp2, asText=T, encoding="UTF-8")tables <-readHTMLTable(doc)airdatatemp <- as.data.frame(tables)colnames(airdatatemp) <- c("date", "airrank", "aqi", "aqirank", "pm2.5", "pm10","no2","so2", "co", "o3")airdata <- rbind(airdata, airdatatemp)}
}airdata1 <- c("2014-01-23", "重度污染", "271", "182", "261","263","125", "118", "4.06", "10")
airdata2 <- c("2014-03-24", "重度污染", "270", "188", "220","249","93",  "53",  "1.99", "144")
airdata3 <- c("2014-08-08", "轻度污染", "107", "178", "64", "103","45",  "8",   "1.08", "220")
airdata4 <- c("2014-08-22", "良",       "80",  "98",  "51", "80", "58",  "3",   "0.80", "93")airdata <- rbind(airdata, airdata1, airdata2, airdata3, airdata4)#Wind
winddata <- matrix(data = NA, nrow = 1, ncol = 4)
winddata <- data.frame(winddata)
colnames(winddata) <- c("date", "weather", "temperature","wind")months <- sprintf("%02d", 1:12)
years <- 2014:2016
for(i in years) {for(j in months) {url_a="http://www.tianqihoubao.com/lishi/beijing/month/"url_b=".html"url_all=paste(url_a, i, j, url_b, sep = "")temp <- getURL(url_all, .encoding="GBK")temp2 <- iconv(temp,"gb2312","UTF-8") doc <- htmlParse(temp2, asText=T, encoding="UTF-8")tables <-readHTMLTable(doc)winddatatemp <- as.data.frame(tables)colnames(winddatatemp) <- c("date", "weather", "temperature","wind")winddata <- rbind(winddata, winddatatemp)}
}

三、数据清洗与整理

#根据日期合并两组数据
airdata$date <- as.Date(airdata$date)
winddata$date <- as.Date(winddata$date, "%Y年%m月%d日")mydata <- merge(airdata, winddata, by="date")
mydata <- na.omit(mydata)
mydata <- mydata[-which(duplicated(mydata$date, )),]airdata$date <- as.Date(airdata$date)
mydata[,3:10] <- as.numeric(unlist(mydata[,3:10]))#日期等数据整理
mydata$weekday <- weekdays(mydata$date, abbreviate = T)
mydata$weekday <- factor(mydata$weekday, levels = c("周一","周二","周三","周四","周五","周六","周日"))
mydata$month <- months(mydata$date, abbreviate = T)
mydata$month <- factor(x = mydata$month, levels = c("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"))
mydata$year <- format(mydata$date, "%Y")
mydata$airrank <- factor(x = mydata$airrank, levels =c("优","良","轻度污染","中度污染","重度污染","严重污染"))
mydata$wind.day.direction <- factor(x = mydata$wind.day.direction, levels = c("无持续风向","北风","南风","东风","东北风","西北风","西南风"))
mydata$wind.night.direction <- factor(x = mydata$wind.night.direction, levels = c("无持续风向","北风","南风","东风","东北风","西北风","西南风"))#气温数据整理
mydata$temp.max <- substr(mydata$temperature, start = 1, stop=str_locate(mydata$temperature, "/")[,1]-1)
mydata$temp.min <- substr(mydata$temperature, start = str_locate(mydata$temperature, "/")[,1]+1, stop = nchar(mydata$temperature))
mydata$temp.max <- as.numeric(substr(mydata$temp.max, start = 1, stop = nchar(mydata$temp.max)-43))
mydata$temp.min <- as.numeric(substr(mydata$temp.min, start = 43, stop =nchar(mydata$temp.min)-1))
mydata$temp.avg <- (mydata$temp.max + mydata$temp.min) / 2 #风速数据整理
mydata$wind.day <- substr(mydata$wind, start = 1, stop=str_locate(mydata$wind, "/")[,1]-1)
mydata$wind.night <- substr(mydata$wind, start =str_locate(mydata$wind, "/")[,1]+1, stop = nchar(mydata$wind))
mydata$wind.day[which(is.na(mydata$wind.day))] <- mydata$wind[which(is.na(mydata$wind.day))]
mydata$wind.night[which(is.na(mydata$wind.night))] <- mydata$wind[which(is.na(mydata$wind.night))]
mydata$wind.day.direction <- str_split_fixed(mydata$wind.day, pattern = " ", n = 2)[,1]
mydata$wind.night.direction <- str_split_fixed(mydata$wind.night, pattern = " ", n = 2)[,1]
mydata$wind.day.speed <- str_split_fixed(mydata$wind.day, pattern = " ", n = 2)[,2]
mydata$wind.day.speed <- str_split_fixed(mydata$wind.day.speed, pattern = "\r", n = 2)[,1]
mydata$wind.day.speed[which(mydata$wind.day.speed=="")] <- "≤3级"
mydata$wind.night.speed <- str_split_fixed(mydata$wind.night, pattern = " ", n = 2)[,2]
mydata$wind.night.speed <- str_split_fixed(mydata$wind.night.speed, pattern = "\r", n = 2)[,1]
mydata$wind.night.speed[which(mydata$wind.night.speed=="")] <- "≤3级"

四、绘图与分析

首先,我们根据所得到的AQI(空气质量指数)数据绘制了如下图所示的箱线图+小提琴图

ggplot(data = mydata, aes(x = year, y = aqi)) + geom_violin(fill="lightblue") +geom_boxplot(fill="lightgreen",  width=.2) +labs(x="",y="", title="北京AQI分布2014-2016") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold"))


可以很明显地看到,2014-2016年北京的空气质量整体上有所改善,AQI四分位线、平均值线均向下移动,总体的分布也逐渐向下偏。
参与空气质量评价的主要污染物为细颗粒物、可吸入颗粒物、二氧化硫、二氧化氮、臭氧、一氧化碳等。其中PM2.5最受关注,秋冬时节PM2.5爆表的新闻常见于报端,根据同样的方法我们构造了PM2.5的趋势图,结果与AQI类似。

ggplot(data = mydata, aes(x = year, y = pm2.5)) + geom_violin(fill="lightblue") +geom_boxplot(fill="lightgreen",  width=.2) +labs(x="",y="", title="北京PM2.5分布2014-2016") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold"))

那我们不禁要问了,近年来北京空气质量的改善,“风”——这一因素到底起了多大的作用呢?
首先我们考察不同风速情况下的PM2.5分布,看看大风是不是真的吹走了雾霾。
显然,空气污染(PM2.5>100)主要分布在风速小于等于3级的气象条件下,风力大于3级的日子空气污染较少。但如果从各风速看,白天和夜间呈现不同的特征,白天风速越大,PM2.5均值水平越低;夜间风速越大,PM2.5均值水平变化不太大(5-6级、6-7级均值水平较高,可能与样本太少有关)。这其中的道理,不太清楚。

ggplot(data = mydata, aes(x = wind.day.speed, y = pm2.5)) +geom_boxplot(fill="cornflowerblue", col=1, na.rm = T) +geom_point(position = "jitter", alpha=0.3, col="blue", na.rm = T) +labs(x="",y="", title="白天风速与PM2.5") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold"))ggplot(data = mydata, aes(x = wind.night.speed, y = pm2.5)) +geom_boxplot(fill="cornflowerblue", col=1, na.rm = T) +geom_point(position = "jitter", alpha=0.3, col="blue", na.rm = T) +labs(x="",y="", title="夜间风速与PM2.5") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold"))

进一步地我们对比下不同年份各空气质量等级天数与各风速天数。可以看到北京的空气质量整体向好,且趋势较为明显:空气质量为优的天数明显增加,轻度污染的天数有所增加;良、中度污染的天数大致不变;中度、严重污染的天数则有所减少。而反观214-2016年的整体风速情况,则无法看到的较为明显的趋势,相对来说,2014年的整体风速较小,而2015年和2016年则大致相当。

ggplot(data = mydata, aes(x = year, fill=airrank)) +geom_bar(col=1) +scale_fill_brewer(palette = "YlOrRd") +labs(x="",y="", title="空气质量2014-2016") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold")) ggplot(data = mydata, aes(x = year, fill=wind.day.speed)) +geom_bar(col=1, width = 0.4) +scale_fill_brewer() +labs(x="",y="", title="白天风速2014-2016") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold")) ggplot(data = mydata, aes(x = year, fill=wind.night.speed)) +geom_bar(col=1, width = 0.4) +scale_fill_brewer() +labs(x="",y="", title="夜间风速2014-2016") +theme(plot.title = element_text(hjust=0.5, size = 15, face = "bold"))

综上,从本文的分析来看,2014-2016年北京的空气质量确实是在逐渐改善,而且这其中“风”并没有扮演十分重要的角色…所以呢…

北京的雾霾是大风吹走的吗相关推荐

  1. 走出雾霾,中国工业只能向上,你还在拖后腿吗?

    我国中东部地区雾霾频发,已经到了驱霾只能靠风,两天无风就是霾的程度.雾霾直接影响到所有人的日常生活和身体健康,成为中国社会的焦点和痛点之一.雾霾的出现与我国工业化所处的发展阶段有关,与我国在全球产业分 ...

  2. 北京雾霾指数再度爆表!创业者们已经纷纷逃离北京

    自2015年北京步入冬季以来,雾霾红色预警已经亮过两次,而还有两次更严重的雾霾落在了红警之外. 环保局工作人员在调查雾霾污染时不小心迷路. 快递小哥也表示送货困难,10元一瓶的北京纯正雾霾销量剧增,并 ...

  3. 北京污染有救了 IBM用物联网找雾霾病因

    北京时间3月20日,国务院发展研究中心主办的的为期三天的"中国发展高层论坛2017"上,IBM公司董事长.总裁.首席执行官罗睿兰出席并发言,她表示此前IBM与北京环保局所推出的&q ...

  4. 雾霾经济:这10款产品,马云看了都想投资

    PMCAFF(www.pmcaff.com):互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台.定期出品深度产品观察,互联产品研究首选. 雾霾爆表,有的公司却凭借雾霾把生意做得风生水起,连马 ...

  5. 大数据破解污染图谱 北风与雾霾啥关系

    本文讲的是大数据破解污染图谱 北风与雾霾啥关系[IT168评论]南美洲的蝴蝶扇动下翅膀,太平洋都能起台风.但为何西伯利亚的强冷空气,却吹不动北京的雾霾?对于这个问题,中国的程序员希望用代码寻找气象与环 ...

  6. 雾霾塔设计师罗斯加德:智慧城市应该可持续

    早报专访雾霾塔设计师丹·罗斯加德 谈雾霾治理与智慧城市 位于北京798艺术园区的雾霾塔. 设计师丹·罗斯加德 今年9月27日,一座由荷兰设计师丹·罗斯加德设计的雾霾净化塔抵达北京,位置就在798艺术园 ...

  7. 谷歌地图的全球森林监察系统,揭秘中国雾霾的惊天秘密!

    来源:老牛时评 谷歌公司最近推出的全新交互式地图--"全球森林监察"它可以实时显示全球森林的覆盖情况. 该幅地图的数据来源有多个,其中包括了NASA的森林面积覆盖率的分析数据. 于 ...

  8. 阿里云工程师用机器学习破解雾霾成因

    原文链接;http://click.aliyun.com/m/13911/ 免费开通大数据服务:https://data.aliyun.com/m/experience 日前,一位署名为"傲 ...

  9. 美使馆9年pm2.5数据分析:雾霾到底是不是加重了?

    那天看到同学发的环保部的数据,于是想去验证下环保部数据的真伪,于是发现居然美大使馆提供了中国各大城市的PM 2.5数据,还是excel版本,作为一个曾经热血的新能源研究员来说,怎么能够抑制自己的数据控 ...

  10. 雾霾天我为何不逃离北京

    2019独角兽企业重金招聘Python工程师标准>>> 持续两周的雾霾,让北京的这个冬天又热闹起来,你可以看到朋友圈和公众号都在讨论雾霾的问题,我已经没法这种恐慌和愤怒了,逃离北京再 ...

最新文章

  1. CMake命令之set_property和get_property
  2. python快速排序解析_快速排序python实现总结
  3. Love = Accounting
  4. Tarjan算法_LCA
  5. deinstall 卸载grid_卸载Oracle 11g的Grid小计
  6. Eureka Client的使用
  7. windows下安装subversion
  8. [wikioi]奇怪的梦境
  9. 识别产品外观的合格软件_产品外观质量视觉检测系统.PDF
  10. thinkphp框架下的xml交互
  11. eclipse安装(中文)语言包插件
  12. 蓝桥杯题目练习(学做菜)
  13. JavaScript概述和HTML中嵌入JavaScript的三种方式
  14. mp4转gif在线转换,视频转换成gif动图怎么做?
  15. pdfmake生成pdf文件
  16. STM32芯片VDD、VDDA和VREF的关系
  17. JAVA读文件类之FileReader/InputStreamReader/BufferedReader
  18. android备份固件,安卓固件管家(Rom Manager Premium)
  19. DDR布局布线规则与过程
  20. 计算机基础知识(2)

热门文章

  1. java使用ffmpeg进行视频处理
  2. java程序开发的流程_Java程序开发流程(图文解说版)
  3. 量化指标公式源码_通达信低吸量化指标公式,通达信高抛低吸主图指标源码
  4. 赚外快—常见编程接单的网站集合(20余个)
  5. python编写水仙花数
  6. 分布式优化和去中心化优化概述
  7. java 汉字排序_Java中文排序
  8. 模板文件不存在,无法解析文档!的终极解决方案
  9. 尚学堂-张士兵-王勇JAVA视频教程下载
  10. (附源码)计算机毕业设计SSM基于java语言的在线电子书阅读系统