[R] 한반도 연 평균기온 계산 및 Plotting

 정보

  • 업무명     :  데이터 분석
  • 작성자     : 박진만
  • 작성일     : 2019-11-03
  • 설   명      : 한반도 연 평균기온 자료처리 및 plotting
  • 수정이력 :

 

 내용

[특징]

  • 각 지점별 연 평균기온 자료를 읽어서 한반도 전체 평균기온 및 각 지점별 연 평균기온 자료를 만든 후 이를 그리는 코드.

[기능]

  • 연 평균 기온 자료 및 지점정보 자료 읽기.
  • 지점정보와 지점명 매칭 후 한반도 평균기온 및 지점별 연 평균기온 구하기.
  • 결과를 이용하여 통계량 산출 및 그래프 그리기.

 

[활용 자료]

  •  기상개방포털의 연평균 기온 자료 및 지점자료 

 

[자료 처리 방안 및 활용 분석 기법]

  •  평균 수행 후 그림 그리기

 

[사용법]

  • 입력자료를 디렉토리에 넣은 후 코드 수행

 

[사용 OS]

  • Windows 10

 

[사용 언어]

  • R
 

 소스 코드

### lib ###
library(dplyr)
library(tidybayes)
library(ggplot2)
library(lubridate)
### lib ###
options(digits=12)
########################################
Stats <- function(X, Y)
{
if (length(X) > 0) {
slope = coef(lm(Y~X))[2]
interp = coef(lm(Y~X))[1]
mean_X = mean(X, na.rm=T)
mean_Y = mean(Y, na.rm=T)
sd_x = sd(X, na.rm=T)
sd_y = sd(Y, na.rm=T)
number = length(X)
bias = mean(X-Y, na.rm=T)
rbias = (bias/mean(Y, na.rm=T))*100.0
# rbias = (bias/mean(X, na.rm=T))*100.0
rmse = sqrt(mean((X-Y)^2, na.rm=T))
rrmse = (rmse/mean(Y, na.rm=T))*100.0
# rrmse = (rmse/mean(X, na.rm=T))*100.0
r = cor(X, Y)
diff_mean = mean(X-Y, na.rm=T)
diff_sd = sd(X-Y, na.rm=T)
per_diff_mean = mean((X-Y)/Y, na.rm=T)*100.0
p_value = cor.test(X, Y)$p.value
return( c(slope, interp, mean_X, mean_Y, sd_x, sd_y, number, bias, rbias, rmse, rrmse, r, diff_mean, diff_sd, per_diff_mean, p_value) )
}
}
########################################
data <- read.csv("20191102204723.csv")
head(data)
colnames(data) <- c("locate","year","temp","rain")
locate_data <- read.csv("stnInfo_20191102204949.csv")
head(locate_data)
colnames(locate_data)[1:8] <- c("locate","st","en","name","v1","lat","lon","alt")
locate_data_L1 <- locate_data %>%
dplyr::select(locate:alt) %>%
dplyr::select(-v1) %>%
dplyr::filter(en == "")
data_L1 <- dplyr::left_join(data,locate_data_L1,by=c("locate"))
data_L2 <- data_L1 %>%
dplyr::group_by(locate,year,name) %>%
dplyr::summarise(temp = mean(temp),
rain = mean(rain))
# 한반도 평균기온 #
mean_korea_temp <- data_L2 %>%
dplyr::filter(!is.na(temp)) %>%
dplyr::group_by(year) %>%
dplyr::summarise(temp = mean(temp))
mean_korea_temp_fin <- mean(mean_korea_temp$temp)
st_name <- unique(data_L2$locate)
for (st in st_name) {
#st <- 90
data_L3 <- data_L2 %>%
dplyr::filter(locate == st) %>%
dplyr::filter(!is.na(temp))
X = data_L3$year
Y = data_L3$temp
if(min(X) >= 1970) {
next
}
stVal = Stats(X,Y)
xcord = min(X) + 20 * ((max(X) - min(X)) / max(X))
ycord = seq(max(Y) - 0.25 * ((max(Y) - min(Y)) / max(Y)), 0, -1.25 * ((max(Y) - min(Y)) / max(Y)))
ggplot() +
theme_bw() +
geom_line(aes(X, Y), colour="black", size=1.5) +
annotate("text", x=xcord, y=ycord[1], label=paste0("(Temp) = ", sprintf("%.2f",stVal[1])," x (Date) + ", sprintf("%.2f",stVal[2])), size=6, hjust=0, color="red", fontface="bold") +
annotate("text", x=xcord, y=ycord[2], label=paste0("R = ", sprintf("%.2f",stVal[12]), " (p < ", sprintf("%.3f",stVal[16]), ")"), size=6, hjust=0, color="red", fontface="bold") +
annotate("text", x=xcord, y=ycord[3], label=paste0("N = ", sprintf("%.0f",stVal[7]) ), size=6, hjust=0, color="black", fontface="bold") +
geom_abline(intercept=0, slope=1, linetype=1, color="black", size=1.0) +
stat_smooth(method="lm", color="red", se=F, aes(X, Y)) +
scale_x_continuous(minor_breaks = seq(min(data_L3$year), max(data_L3$year), by=5), breaks=seq(min(data_L3$year), max(data_L3$year), by=10), expand=c(0,0), limits=c(min(data_L3$year), max(data_L3$year))) +
#scale_y_continuous(minor_breaks = seq(8, 16, by=1), breaks=seq(8, 16, by=2), expand=c(0,0), limits=c(8, 16)) +
labs(title = paste(unique(data_L3$name),"mean ","Temp(C)")) +
labs(y = expression(paste(bold("yearly mean temp [C]")))) +
labs(x = expression(paste(bold("Date [Year]")))) +
labs(fill = NULL) +
theme(plot.title = element_text(hjust = 0.5)) +
theme(plot.title=element_text(face="bold", size=20, color="black")) +
theme(axis.title.x = element_text(face="bold", size=20, colour="black")) +
theme(axis.title.y = element_text(face="bold", size=20, colour="black", angle=90)) +
theme(axis.text.x = element_text(face="bold", size=20, colour="black")) +
theme(axis.text.y = element_text(face="bold", size=20, colour="black")) +
theme(legend.title=element_text(face="bold", size=12, colour="black")) +
theme(legend.position=c(0,1), legend.justification=c(0,0.9)) +
theme(legend.key=element_blank()) +
theme(legend.text=element_text(size=12, face="bold")) +
theme(legend.background=element_blank()) +
theme(text=element_text()) +
theme(plot.margin=unit(c(5,10,5,5),"mm")) +
ggsave(filename = paste0(st,".png"))
}
view raw korea_temp.R hosted with ❤ by GitHub

 결과

ko_mean.png
그림. 결과 예시

이외에도 다수 파일이 결과로 나옴.

 참고문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

블로그에 대한 궁금하신 점을 문의하시면 자세히 답변드리겠습니다.

E. ​sangho.lee.1990@gmail.com & ​saimang0804@gmail.com