前回の記事では、Microsoft Power BIでデータ処理をしていましたが、「Rコード」で処理ができるようにしました。
Microsoft Power BIでも「データ取得からグラフ作成まで」ほぼデータ処理を自動化できているのですが、「Rのコード」でもデータ処理の自動化が可能です。
グラフのビジュアルの細かな設定などの自由度も高いので、「Rコード」でデータの取得、処理ができるようにしてみました。
グラフの細かな部分の設定はしていませんが、以下が「Rコード」でのグラフ例です。
<付録:「Rコード」例>
以下の「Rコード」で工夫が必要だった点は、「季節平均値」の処理方法です。「冬」の場合、「12月、1月、2月」の3カ月平均ということになりますが、年をまたぐので行列形式で処理するためには、少し工夫が必要でした。
例えば、2019年1月、2月と2018年12月の3カ月の平均値を「2019年の冬の平均値」とするためには、「2019年の冬」用に一行下にシフトした12月のデータが必要になります。
そこで、「年」が行、「月」が列の形式のデータにおいて、季節の平均値用に「12月」の列を一行下方向にずらした「前年の12月」の列を追加しました。
つまり、「mutate_at(c("Pre_12月"),funs(lag),n=1)」の処理によって、2019年1月、2月のデータの行に2018年12月のデータ(「Pre_12月」のデータ)を下方向にシフトして配置して、行方向の計算で「冬」の3カ月平均値の列を作成できるようにしました。
この場合、最初の1891年の「冬」は前年の12月のデータが無いのでNAになります。
1月 2月 ・・・ その年の12月 前年の12月 冬
2017年
2018年
2019年 X Y Z (X+Y+Z)/3
「冬」の定義が「1月、2月、3月」だったら、このような余計なことをしなくて済むのにと思います。
「夏」の定義は、「6月、7月、8月」ですが、月別平均気温は「6月」よりも「9月」の方が高いので、「7月、8月、9月」といった「夏」の定義も間違いではないような気もします。そうすれば、年をまたぐ処理をしなくて済みます。
【追記】気象庁のページに「季節別」のデータがありました。月別データから季節の数字を算出する必要はありませんでした。
Excelのシートでの処理であれば、思いつくままにコピペなどでデータを加工してしまいますが、そのやり方では、処理を繰り返す際に間違ったり、処理の漏れがあったりして、結果が不安定になったりします。
「Rコード」や「パワークエリ」で処理を行うようにすれば、処理を繰り返す場合も同様の処理を確実に再現できます。しかも、データの取得からグラフ作成までのすべての処理はコードによって行われるので、一度コードを作成してしまえば、人手での処理が不要になります。作成したコードは、他の目的にも転用が可能なので、繰り返しではない処理でもコードによる処理の方が、「作業のストック」として後で役立つと思います。
「Rコード」や「パワークエリ」での処理の有用性を認識してからは、Excelのシートでの手作業での処理はなるべく避けるべきだと思うようになりました。
「Rコード」や「パワークエリ」は、まさに、データ分析における「RPA(ロボティック・プロセス・オートメーション)」のツールだと思います。
------------------------------------------------------------------
library(XML)
library(rvest)
library(tidyverse)
library(ggplot2)
url <- "http://www.data.jma.go.jp/cpdinfo/temp/list/mon_wld.html"
df_wtemp <- readHTMLTable(url,header = TRUE,stringsAsFactors = FALSE)
write.csv(df_wtemp,"worldtemp.csv",fileEncoding = "UTF8")
df_wtemp <- read_csv("worldtemp.csv",skip=1,col_names = c("ID","year", "M_01月","M_02月", "M_03月", "M_04月","M_05月", "M_06月", "M_07月","M_08月", "M_09月", "M_10月","M_11月", "M_12月"))
df_wtemp <- as.data.frame(df_wtemp)
df_wtemp$year_n <- str_replace_all(df_wtemp$year,"年","")
df_wtemp$year_n <- as.integer(df_wtemp$year_n)
df_wtemp[order(df_wtemp$year_n),]
df_wtemp$Pre_12月 <- df_wtemp$M_12月
df_wtemp <- df_wtemp %>% mutate_at(c("Pre_12月"),funs(lag),n=1)
df_wtemp <- df_wtemp %>% mutate(s1_Spring = rowMeans(select(.,"M_03月":"M_05月")))
df_wtemp <- df_wtemp %>% mutate(s2_Summer = rowMeans(select(.,"M_06月":"M_08月")))
df_wtemp <- df_wtemp %>% mutate(s3_Autumn = rowMeans(select(.,"M_09月":"M_11月")))
df_wtemp <- df_wtemp %>% mutate(s4_Winter = rowMeans(select(.,"Pre_12月","M_01月","M_02月")))
ggplot(df_wtemp,aes(x=year_n,y=M_08月)) + geom_line(color="red") + xlim(1980,2019) + labs(x="year",y="世界の月別平均気温偏差(℃)",title="8月")
ggplot(df_wtemp)+geom_line(aes(x=year_n,y=s1_Spring),color="red") + xlim(1980,2019) +labs(x="year",y="世界の月別平均気温偏差(℃)",title="Spring(3~5月)")
ggplot(df_wtemp)+geom_line(aes(x=year_n,y=s2_Summer),color="red") + xlim(1980,2019) +labs(x="year",y="世界の月別平均気温偏差(℃)",title="Summer(6~8月)")
ggplot(df_wtemp)+geom_line(aes(x=year_n,y=s3_Autumn),color="red") + xlim(1980,2019) +labs(x="year",y="世界の月別平均気温偏差(℃)",title="Autumn(9~11月)")
ggplot(df_wtemp)+geom_line(aes(x=year_n,y=s4_Winter),color="red") + xlim(1980,2019) +labs(x="year",y="世界の月別平均気温偏差(℃)",title="Winter(12~2月)")
df_wtemptidy <- df_wtemp %>% gather(key=month,tempr,3:14,-year_n)
df_wtemptidy <- as.data.frame(df_wtemptidy)
ggplot(df_wtemptidy)+geom_line(aes(x=year_n,y=tempr),color="red") + xlim(1980,2019) + facet_wrap(~month)+labs(x="year",y="世界の月別平均気温偏差(℃)")
df_wtemptidy8 <- df_wtemptidy %>% filter(month == "M_08月")
ggplot(df_wtemptidy8)+geom_line(aes(x=year_n,y=tempr),color="red") + xlim(1980,2019)+labs(x="year",y="世界の月別平均気温偏差(℃)",title="8月")
df_wtemptidy <- df_wtemp %>% gather(key=season,temprs,17:20,-year_n)
ggplot(df_wtemptidy)+geom_line(aes(x=year_n,y=temprs),color="red") + xlim(1980,2019) + facet_wrap(~season)+labs(x="year",y="世界の月別平均気温偏差(℃)",title="Seasons")
df_wtemptidys <- df_wtemptidy %>% filter(season == "s2_Summer")
ggplot(df_wtemptidys)+geom_line(aes(x=year_n,y=temprs),color="red") + xlim(1980,2019)+labs(x="year",y="世界の月別平均気温偏差(℃)",title="Summer(6~8月)")
----------------------------------------------------------------
---------------------------------------------------
0 件のコメント:
コメントを投稿