정보
- 업무명 : 데이터 분석
- 작성자 : 박진만
- 작성일 : 2019-11-03
- 설 명 : 한반도 연 평균기온 자료처리 및 plotting
- 수정이력 :
내용
[특징]
- 각 지점별 연 평균기온 자료를 읽어서 한반도 전체 평균기온 및 각 지점별 연 평균기온 자료를 만든 후 이를 그리는 코드.
[기능]
- 연 평균 기온 자료 및 지점정보 자료 읽기.
- 지점정보와 지점명 매칭 후 한반도 평균기온 및 지점별 연 평균기온 구하기.
- 결과를 이용하여 통계량 산출 및 그래프 그리기.
[활용 자료]
- 기상개방포털의 연평균 기온 자료 및 지점자료
[자료 처리 방안 및 활용 분석 기법]
- 평균 수행 후 그림 그리기
[사용법]
- 입력자료를 디렉토리에 넣은 후 코드 수행
[사용 OS]
- Windows 10
[사용 언어]
- R
소스 코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### 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")) | |
} | |
결과

이외에도 다수 파일이 결과로 나옴.
참고문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
블로그에 대한 궁금하신 점을 문의하시면 자세히 답변드리겠습니다.
E. sangho.lee.1990@gmail.com & saimang0804@gmail.com
'프로그래밍 언어 > R' 카테고리의 다른 글
[R] NetCDF 형식인 NPP/CERES SSF 기상위성 자료를 이용하여 아스키 (ASCII) 형식으로 처리 (0) | 2019.12.28 |
---|---|
[R] 다수의 날짜정보를 컬럼으로 가진 DataFrame 에서의 컬럼 제어 방법 (0) | 2019.12.21 |
[R] 동아시아 대기질 이미지 영상을 통해 크롤링 및 애니메이션 구현 (0) | 2019.12.08 |
[R] ggplot2를 이용한 Log 스케일로 산점도 가시화 (0) | 2019.12.06 |
[R] 요리 사이트 (만개의 레시피) 크롤링 및 정보수집 소스코드 (0) | 2019.09.07 |