新乡地区2011-2021近十年11月份天气数据分析:

新乡地区2011-2021近十年11月份天气数据分析:

		首先此部分采用R语言自带plot包及ggplot2包力求达到数据可视化效果,并对近十年新乡天气最高气温和最低气温进行可视化处理并加以回归分析,进一步进行未来10年的新乡11月天气最高气温最低气温进行预测可视化。
		本报告旨在进行本地11月天气可视化及预测,近年来天气问题变暖与小冰期等说法纷纭,为更好的展示未来天气趋向,做出此次报告,也是对未来天气气温变化作为参考数据。

新乡地区2011-2021近十年11月份天气数据分析:
流程显示

i. 导入数据:
list.files命令将input文件夹下所有文件名输入a,然后将天气数据文件夹下的数据全部导入并合并为一个数据集,先以第一个表格为基础,后面的表格导入并合进去,将新得到的数据集命名merge.data并保存。

 a = list.files("天气数据")                                                       #list.files命令将input文件夹下所有文件名输入ass
dir = paste("./天气数据/",a,sep="")#用paste命令构建路径变量dir
n = length(dir)                                                                 #读取dir长度,也就是文件夹下的文件个�?
merge.data = read.csv(file = dir[1],header=T,sep=",", encoding = "UTF-8")   #读入第一个文件内容(可以不用先读一个,但是为了简单,省去定义data.frame的时间,我选择先读入一个文件�?
for (i in 2:n){
  new.data = read.csv(file = dir[i], header=T, sep=",",encoding = "UTF-8")
  merge.data = rbind(merge.data,new.data)
}
write.csv(merge.data,file = "./天气数据/merge.csv",row.names=F)

ii. 清洗数据:
首先重置索引,然后再将日期格式由中文形式转换为xxxx-xx-xx,提取年份和日添加新列;再对温度列进行处理,先将温度符号去除便于绘图数据需要,再将最高温度与最低温度以“/”拆分,再分别添入high_temp与low_temp列;再将所需数据转为向量再转为数字,便于直接使用;此外,删除杂列,然后分为两个新数据集n_data1和n_data2,分别保存最高气温和最低气温以及其他必须的信息。

 rownames(merge.data)<- 1:nrow(merge.data)#重置索引
merge.data$日期<- as.Date(merge.data$日期,format="%Y年%m月%d日") #转成日期
library(lubridate)
merge.data$year<- format(merge.data$日期,"%Y")
merge.data$day<-format(merge.data$日期,"%d")#提取日为DAY
library (stringr)
merge.data$temp<-gsub('[℃]', '', merge.data$气温)#删去温度符号
merge.data$temp<-gsub('[/]','', merge.data$temp)#删去/
temp1<-str_split_fixed(merge.data$temp, ",",3)#拆分最高低温度


merge.data$high_temp<-temp1[,1]#分别对应入座
merge.data$low_temp<-temp1[,3]
merge.data$high_temp<-as.numeric(as.character(merge.data$high_temp))#转成向量,再转成数字
merge.data$low_temp<-as.numeric(as.character(merge.data$low_temp))

merge.data<- merge.data[,-7]#删除18,/,16这种列
n_data<-merge.data
n_data1<-merge.data[,c(2,5,6,7)]
n_data2<-merge.data[,c(2,5,6,8)]

iii. 近年气温分析:
这部分气温基础分析只采用了ggplot2绘图包及dplyr包,dplyr的group_by()函数用来将数据按照年份分组(group_by函数:按照某个变量分组),产生n1和n2两个分组数据集,再将数据集中温度转换数字;根据两个数据集绘制最高气温分析图,最低气温分析图。利用geom_line()调参输出折线图,gemo_point()加上点图,gemo_path()函数保证前后路径正确,使用平滑曲线gemo_smooth()函数,同时用于对于散点图趋势的拟合曲线绘制,再插入图例及对应颜色,设置各类标签加入标题,输出保存。

 library(ggplot2)
library(dplyr)
n1<-group_by(n_data1,year) 
n2<-group_by(n_data2,year) 
n1$high_temp <- as.numeric(as.character(n1$high_temp))
n2$low_temp <- as.numeric(as.character(n2$low_temp))
photo1 <- ggplot(data = n1,mapping = aes(x = day, y = high_temp,
                                     group=year ,fill=high_temp),colour=year ) +
      geom_point()+geom_path()+ 
      geom_smooth(method = "loess",formula = y ~ I(x))+
      geom_line(data = n1, mapping = aes(x = day, y = high_temp,colour=year),
                size=0.5)+ theme_bw()+
    labs(x="日期",fill="图例",y="温度/℃",title="近年新乡11月最高气温分析")+
  theme(plot.title = element_text(hjust = 0.5,vjust = 0))

photo2 <- ggplot(data = n2,mapping = aes(x = day, y = low_temp,
                                     group=year ,fill=low_temp),colour=year ) +
    geom_point()+geom_path()+ 
    geom_smooth(method = "loess",formula = y ~ I(x))+
    geom_line(data = n2, mapping = aes(x = day, y = low_temp,colour=year),
              size=0.5)+ theme_bw()+
    labs(x="日期",fill="图例",y="温度/℃",title="近年新乡11月最低气温分析")+
    theme(plot.title = element_text(hjust = 0.5,vjust = 0))

ggsave("新乡最高气温分析.png", plot = photo1,scale = 3,dpi = 1000)
ggsave("新乡最低气温分析.png", plot = photo2,scale = 3,dpi = 1000)

iv. 未来气温预测:
采用R自带plot包先绘制近十年最高最低气温时序图,然后用时间序列来做温度走势的预测。因为R中周期性的时间序列数据需要每期数据项相同,但是这里2011年-2021年每年的数据项都不同,所以我把这个时间序列的周期定为30,按顺序取数据的话,最高温度和最低温度分别定为一个时间序列,并将其在同一个图上显示出来,画布关闭,输出保存。
这是周期性特别明显的数据,所以考虑使用HoltWinters指数平滑方法来做时间序列的分析预测,用这个方法分别对最高温时间序列数据和最低温时间序列数据分别做平滑得到平滑模型然后来做气温的预测。上面模型的平滑参数alpha、beta、gamma,分别是平滑指数、趋势指数、季节指数,参考http://blog.csdn.net/cl1143015961/article/details/42267613,值alpha越大说明对远期也就是以前年份的数据参考权重越大,另外gamma越大说明这个时间序列的季节性特点会越明显。接下来对这两个时间序列做预测。要用到forecast包,定义预测十年11月的气温,并以时序图形式展现,关闭画布,输出保存。

  n_data[,c(1:4)] <- as.numeric(unlist(n_data[,c(1:4)]))
dev.new()
png(file="新乡2011-2021最高最低气温时序图.png", bg="transparent",width=1800,height=900,res=72*3)

highestTS <-ts(n_data$high_temp[1:(30*10)],frequency=30,start=c(2011,11,1))
plot(highestTS,col="red",main="新乡2011-2021最高最低气温时序图")
lowestTS <-ts(n_data$low_temp[1:(30*10)],frequency=30,start=c(2011,11,1))
lines(lowestTS,col="blue")
legend("topright",cex=0.5,c("最高气温","最低气温"),col=c("red","blue"),lty=1,text.width=0.5)

dev.off()

library("forecast")
dev.new()
png(file="新乡未来最高最低气温预测时序图.png", bg="transparent",width=1800,height=900,res=72*3)

highestForecasts<- HoltWinters(highestTS)
lowestForecasts<- HoltWinters(lowestTS)

highestForecast2<- forecast(highestForecasts,h=150)
lowestForecast2<- forecast(lowestForecasts,h=150)
plot(highestForecast2$mean,ylim=c(-15,20),col="red",main="新乡未来最高最低气温预测时序图",xlab="时间",ylab="温度℃")
lines(lowestForecast2$mean,col="blue")
legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
dev.off()

# 3.简单测试预测准确性
Box.test(highestForecast2$residuals,lag=20,type="Ljung-Box")
Box.test(lowestForecast2$residuals,lag=20,type="Ljung-Box")
#X-squared = 43.889, df = 20, p-value = 0.001557可见最高气温预测较为准确
#data:  lowestForecast2$residuals
#X-squared = 72.078, df = 20, p-value = 8.309e-08可见最低气温预测有所差别

本人报告中未写关于预测准确性的测试,因为本人不懂p值怎么看,就没写,这里面有这部分功能测试,但是结论未知是否正确,请慎重判断。

新乡地区2011-2021近十年11月份天气数据分析:
a) 通过多年的11月天气数据以折线图辅以拟合曲线可视化直观看出新乡天气大形势的走势,当然明显最高气温较为有规律,最低气温变化过大,但也能对气温变化有所了解。
在这里插入图片描述在这里插入图片描述

b) 10年气温时序图及预测时序图:
由此图可简单看出气温变化走势,在此基础上进行未来十年11月气温预测。
在这里插入图片描述
在这里插入图片描述

报告总结
这次试验是我第一次接触R语言,刚开始遇到了很多困难,对于R语言一窍不通,后来经过老师的悉心指导,以及自己积极的去查找资料,对R语言有了进一步的了解。这次试验通过一部分对豆瓣电影top250榜单数据处理以及生成各类图形,另一部分对新乡天气的时序分析及预测分析及产生图表。在此过程中,了解到了豆瓣电影锻炼了自己的学习能力、动手操作能力,也让我对R语言产生了兴趣,发现R语言与python相似之处,以及方便之处。R语言编程中代码问题的解决、结果的成功运行以及这种对自身不断成长的认可,都带给我很强的满足感。突然发现,我已经不需要再有什么目标激励和物质奖励了,利用业余时间学习成长,能看到自己在一点点进步已经是最大的奖励了。希望以后有机会可以更加系统的掌握、了解R语言,并达到熟练的应用。
以下为完整代码

`a = list.files("天气数据")                                                       #list.files命令将input文件夹下所有文件名输入ass
dir = paste("./天气数据/",a,sep="")#用paste命令构建路径变量dir
n = length(dir)                                                                 #读取dir长度,也就是文件夹下的文件个�?
merge.data = read.csv(file = dir[1],header=T,sep=",", encoding = "UTF-8")   #读入第一个文件内容(可以不用先读一个,但是为了简单,省去定义data.frame的时间,我选择先读入一个文件�?
for (i in 2:n){
  new.data = read.csv(file = dir[i], header=T, sep=",",encoding = "UTF-8")
  merge.data = rbind(merge.data,new.data)
}
write.csv(merge.data,file = "./天气数据/merge.csv",row.names=F)
rownames(merge.data)<- 1:nrow(merge.data)#重置索引
merge.data$日期<- as.Date(merge.data$日期,format="%Y年%m月%d日") #转成日期
library(lubridate)
merge.data$year<- format(merge.data$日期,"%Y")
merge.data$day<-format(merge.data$日期,"%d")#提取日为DAY
library (stringr)
merge.data$temp<-gsub('[℃]', '', merge.data$气温)#删去温度符号
merge.data$temp<-gsub('[/]','', merge.data$temp)#删去/
temp1<-str_split_fixed(merge.data$temp, ",",3)#拆分最高低温度


merge.data$high_temp<-temp1[,1]#分别对应入座
merge.data$low_temp<-temp1[,3]
merge.data$high_temp<-as.numeric(as.character(merge.data$high_temp))#转成向量,再转成数字
merge.data$low_temp<-as.numeric(as.character(merge.data$low_temp))

merge.data<- merge.data[,-7]#删除18,/,16这种列
n_data<-merge.data
n_data1<-merge.data[,c(2,5,6,7)]
n_data2<-merge.data[,c(2,5,6,8)]
#1.气温分析
library(ggplot2)
library(dplyr)
n1<-group_by(n_data1,year) 
n2<-group_by(n_data2,year) 
n1$high_temp <- as.numeric(as.character(n1$high_temp))
n2$low_temp <- as.numeric(as.character(n2$low_temp))
photo1 <- ggplot(data = n1,mapping = aes(x = day, y = high_temp,
                                     group=year ,fill=high_temp),colour=year ) +
      geom_point()+geom_path()+ 
      geom_smooth(method = "loess",formula = y ~ I(x))+
      geom_line(data = n1, mapping = aes(x = day, y = high_temp,colour=year),
                size=0.5)+ theme_bw()+
    labs(x="日期",fill="图例",y="温度/℃",title="近年新乡11月最高气温分析")+
  theme(plot.title = element_text(hjust = 0.5,vjust = 0))

photo2 <- ggplot(data = n2,mapping = aes(x = day, y = low_temp,
                                     group=year ,fill=low_temp),colour=year ) +
    geom_point()+geom_path()+ 
    geom_smooth(method = "loess",formula = y ~ I(x))+
    geom_line(data = n2, mapping = aes(x = day, y = low_temp,colour=year),
              size=0.5)+ theme_bw()+
    labs(x="日期",fill="图例",y="温度/℃",title="近年新乡11月最低气温分析")+
    theme(plot.title = element_text(hjust = 0.5,vjust = 0))

ggsave("新乡最高气温分析.png", plot = photo1,scale = 3,dpi = 1000)
ggsave("新乡最低气温分析.png", plot = photo2,scale = 3,dpi = 1000)
#2.预测尝试
n_data[,c(1:4)] <- as.numeric(unlist(n_data[,c(1:4)]))
dev.new()
png(file="新乡2011-2021最高最低气温时序图.png", bg="transparent",width=1800,height=900,res=72*3)

highestTS <-ts(n_data$high_temp[1:(30*10)],frequency=30,start=c(2011,11,1))
plot(highestTS,col="red",main="新乡2011-2021最高最低气温时序图")
lowestTS <-ts(n_data$low_temp[1:(30*10)],frequency=30,start=c(2011,11,1))
lines(lowestTS,col="blue")
legend("topright",cex=0.5,c("最高气温","最低气温"),col=c("red","blue"),lty=1,text.width=0.5)

dev.off()

library("forecast")
dev.new()
png(file="新乡未来最高最低气温预测时序图.png", bg="transparent",width=1800,height=900,res=72*3)

highestForecasts<- HoltWinters(highestTS)
lowestForecasts<- HoltWinters(lowestTS)

highestForecast2<- forecast(highestForecasts,h=150)
lowestForecast2<- forecast(lowestForecasts,h=150)
plot(highestForecast2$mean,ylim=c(-15,20),col="red",main="新乡未来最高最低气温预测时序图",xlab="时间",ylab="温度℃")
lines(lowestForecast2$mean,col="blue")
legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
dev.off()

# 3.简单测试预测准确性
Box.test(highestForecast2$residuals,lag=20,type="Ljung-Box")
Box.test(lowestForecast2$residuals,lag=20,type="Ljung-Box")
#X-squared = 43.889, df = 20, p-value = 0.001557可见最高气温预测较为准确
#data:  lowestForecast2$residuals
#X-squared = 72.078, df = 20, p-value = 8.309e-08可见最低气温预测有所差别


`
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长浪破风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值