近7年上海天气数据抓取和分析(含代码)--分析部分

2017 年 10 月 25 日 数萃大数据 刘顺祥

前言

近7年上海天气数据抓取和分析(含代码)—爬虫部分一文中我们介绍了如何使用R语言对天气网进行爬虫,抓取上海近7年的天气数据,相信大家按部就班的操作文章代码时,应该觉得用R语言爬虫很简单了吧。今天,我们接着抓取的天气数据,使用R语言中的ggplot2包对其进行探索性分析。

开始探索

一、数据处理

探索之前,我们再来看一下抓取下来的数据结构。

# 加载第三方包
library(lubridate)
library(dplyr)
library(ggplot)
library(gridExtra) # 数据读取 tot_info <- read.csv('weather.csv') # 数据结构查询 str(tot_info)

由于爬虫后获得的数据都是字符串,所以将weather数据集读入到R内,所有变量都成了因子型变量,为了下面的进一步分析,我们需要将数据集中的变量进行类型的转换。

# 日期类型转换
tot_info$date <- as.Date(tot_info$date)
# 数值类型转换 tot_info$low <- as.numeric(as.character(tot_info$low)) tot_info$high <- as.numeric(as.character(tot_info$high)) # 按照日期,升序排序 tot_info <- tot_info[order(tot_info$date), ] # 数据结构查看 str(tot_info)

除此之外,我们还需要将日期数据进行拆分,拆分为年、月和日,同时将年月日转化为因子,除此还根据每天的最高温和最低温,计算温差。

# 拓展衍生变量
tot_info <- transform(tot_info, year = factor(year(date)), 
                      month = factor(month(date)), 
                      day = factor(day(date)),
                      diff = high - low)
head(tot_info)


二、数据探索

  • 上海近7年的最高或最低温度的趋势如何?

# 近7年最高气温
p1 <- ggplot(data = tot_info, aes(x = date, y = high)) + 
  geom_line(colour = 'steelblue') + # 绘制线图
  scale_x_date(date_breaks = '6 months', date_labels = '%y-%m') # 设置x轴刻度标签

# 近7年最低气温 p2 <- ggplot(data = tot_info, aes(x = date, y = low)) +  geom_line(colour = 'steelblue') +  scale_x_date(date_breaks = '6 months', date_labels = '%y-%m') # 两张图合并到一起 grid.arrange(p1, p2, ncol = 1, nrow = 2)

图形非常像我们以前学的y=sin(x)函数,非常具有规律性,反映了最高气温和最低气温存在周期波动性。既然气温在一年四季内存在明显的波动,那么温差会不会比较平稳呢?

  • 上海近7年温差是如何波动的?

# 近7年温差波动
p3 <- ggplot(data = tot_info, aes(x = date, y = diff)) + 
              geom_line(colour = 'steelblue') + 
              scale_x_date(date_breaks = '6 months', date_labels = '%y-%m') + 
              geom_hline(yintercept = 12.5, colour = 'red') # 水平参考线

p3

你会发现,每天的温差基本上还是比较平稳的,落在3~8度之间,当然也会存在一些气温异常的时候,温差能够达到10度以上。了解了整体近7年的温度趋势和温差波动情况,是不是可以纵向对比一下近3年各个月的温度情况。

  • 近3年各月最低气温对比

# 近三年各月最低气温趋势
p4 <- ggplot(data = tot_info[tot_info$year %in% 2015:2017,], 
            aes(x = day, y = low, group = year, colour = year)) + 
      geom_line(size = 1) + 
      scale_x_discrete(breaks = seq(1,31,5)) + # 设置x轴刻度标签
      facet_wrap('month') + # 分面绘图
      theme(legend.title = element_blank())
p4

对比发现,在近三年的5/6/8/9月份,最低气温趋势还是非常一致的,三条线几乎重合。而在7月份,2015年相对比较凉爽。再看其他月份,2016年的1月23号左右,气温骤降的特别厉害,还记得去年1月份上海的好多小区水管爆裂吗?而在2016年10月21日,气温居然降到了0度附近。。。。

同理,我们再贴上近3年最高气温趋势图和温差波动图的代码。

# 近三年最高气温趋势
p5 <- ggplot(data = tot_info[tot_info$year %in% 2015:2017,], 
            aes(x = day, y = high, group = year, colour = year)) + 
      geom_line(size = 1) + 
      scale_x_discrete(breaks = seq(1,31,5)) + 
      facet_wrap('month') + 
      theme(legend.title = element_blank())
p5

# 近三年温差趋势
p6 <- ggplot(data = tot_info[tot_info$year %in% 2015:2017,], 
            aes(x = day, y = diff, group = year, colour = year)) + 
      geom_line(size = 1) + 
      scale_x_discrete(breaks = seq(1,31,5)) + 
      facet_wrap('month') + 
      theme(legend.title = element_blank())

p6

通过上面的图形对比,我们可以发现关于气温的一些规律,以及少数的异常天气。如果我想在一张图上,完全展示每一天的最高或最低气温,可以借助于热力图来完成。

  • 热力图展示每天的最高气温分布

# 分面的年月日热力图
p7 <- ggplot(data = tot_info, aes(x = day, y = month, fill = high)) + 
      geom_tile(colour = 'black') + 
      scale_x_discrete(breaks = seq(1,31,5)) + # 设置x轴刻度标签
      scale_y_discrete(breaks = seq(1,12,2)) + # 设置y轴刻度标签
      scale_fill_gradient(low = 'blue', high = 'yellow') + # 颜色配置
      facet_wrap('year') # 按年绘制分面图形
p7

一眼就可以发现中间段的亮黄色是气温比较高的月份,即6/7/8月份,再往两边扩展,逐渐进入冷紫色,气温开始下降,基本上就是年初和年末的两个季度了。

前面分析的内容全都是基于温度相关的时间序列图形,从抓取下来的数据集中,还包含了关于天气的字段,如晴、多云、小雨这样的信息。接下来我们就来看看近一年中,每个月上海的天气分布状况,从而有助于了解各个月的天气特征。

# 提取近一年的数据子集
weather1year <- subset(tot_info, date>='2016-09-01')

# 数据集的汇总
df <- group_by(weather1year, year, month, weather) %>% summarise(., freq = n())

# 拓展衍生变量
df <- transform(df, year_month = paste0(year,'-',month))

# 因子化处理,便于后面画图展现的顺序
df$year_month <- factor(df$year_month, levels = 
                          c('2016-9','2016-10','2016-11','2016-12', 
                           '2017-1','2017-2','2017-3','2017-4',
                           '2017-5','2017-6','2017-7','2017-8'),                        ordered = TRUE) # 绘图 p8 <- ggplot(data = df, aes(x = reorder(weather,-freq), y = freq)) +      geom_bar(stat = 'identity', fill = 'steelblue') +      coord_cartesian(ylim = c(0, 15)) + # 控制Y轴的范围      labs(x = NULL, y = '天数', title = '2016.9~2017.8上海天气状况') +      facet_wrap('year_month') + # 按年月作分面图形      geom_text(aes(label = freq),vjust = 0,                  size = 3, colour = 'black') + # 为每个条柱添加数值标签      theme(axis.text.x = element_text(angle = 60),            plot.title = element_text(hjust = 0.5, face = 'bold')) # 主题设置

p8

从图中可知,9月份和10月,分别近半个月都在滴滴答答的下雨,正是处于梅雨季节。11月,12月及次年的1月雨水相对会少一些,更多的是多云和阴天天气。在整个近一年中,4月份的晴天天气是最多的,其次是2月份。

好啦,今天就介绍这么多,感兴趣的朋友可以跟着文章中的代码,练一练ggplot2的绘图功能。关于绘图,后期也会陆陆续续的出一些相关文章,期待大家的讨论与学习。

推荐阅读

微课|ggplot2:饼图

趣事分享 | python与微信

基于R语言对《平凡的世界》人物进行挖掘

用R语言实现汉语转拼音及英语

Python微课:用Python验证你的策略吧!——Zipline回测

Python微课 | Seaborn——Python优雅绘图(上)

【统计思想之终】——莫愁前路无知己,天下谁人不识君。

跟我学R爬虫|HTML基础与R语言解析

易图秒懂の机器学习诞生 奠基篇

更多微课请关注【数萃大数据】公众号,点击学习园地—可视化

欢迎大家关注微信公众号:数萃大数据


课程公告

Python机器学习培训班【宁波站】

时间:2017年11月11日-12日

地点:武汉市湖北经济学院

更多详情,请扫描下面二维码

登录查看更多
0

相关内容

DATE:Design, Automation & Test in Europe。 Explanation:欧洲的设计、自动化和测试。 Publisher:IEEE/ACM。 SIT: http://dblp.uni-trier.de/db/conf/date/
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
盘一盘 Python 系列特别篇 PyEcharts TreeMap
平均机器
17+阅读 · 2019年6月13日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
LASSO回归与XGBoost:融合模型预测房价
论智
31+阅读 · 2018年8月8日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python爬虫股票评论,简单分析股民用户情绪
数据派THU
10+阅读 · 2017年12月12日
如何用Python做舆情时间序列可视化?
CocoaChina
11+阅读 · 2017年7月21日
Arxiv
8+阅读 · 2019年5月20日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
3D Face Modeling from Diverse Raw Scan Data
Arxiv
5+阅读 · 2019年2月13日
Arxiv
5+阅读 · 2018年12月18日
Efficient and Effective $L_0$ Feature Selection
Arxiv
5+阅读 · 2018年8月7日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
相关资讯
盘一盘 Python 系列特别篇 PyEcharts TreeMap
平均机器
17+阅读 · 2019年6月13日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
LASSO回归与XGBoost:融合模型预测房价
论智
31+阅读 · 2018年8月8日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python爬虫股票评论,简单分析股民用户情绪
数据派THU
10+阅读 · 2017年12月12日
如何用Python做舆情时间序列可视化?
CocoaChina
11+阅读 · 2017年7月21日
相关论文
Arxiv
8+阅读 · 2019年5月20日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
3D Face Modeling from Diverse Raw Scan Data
Arxiv
5+阅读 · 2019年2月13日
Arxiv
5+阅读 · 2018年12月18日
Efficient and Effective $L_0$ Feature Selection
Arxiv
5+阅读 · 2018年8月7日
Top
微信扫码咨询专知VIP会员