演習課題1
演習課題
(この課題はデータ処理演習という授業で用いました)Our World in Data (https://ourworldindata.org/)からデータ(.csv)をDLし,グラフを作成せよ
必要に応じて,表も作成せよ
解析対象とする国は任意に選んで構わないが,少なくとも10か国のデータは使用すること
せっかくなので平均値や標準偏差も算出すること
データから読み取れる客観的事実についてまとめ,事実に基づいた簡単な考察・解釈をおこなうこと
2種類以上のデータを組み合わせて考察してもよい(相関・回帰分析など)
グラフは,以下に紹介するものでなくても構わない
Moving bar graphのライブラリも検索すればすぐに出てくるので,使いたい人はどうぞ
このページでは,「Children Mortality」データセットを例に,折れ線グラフおよび地図プロット×アニメーションの作成方法のコードを紹介する
ぶっちゃけ,このコードをコピペするだけでクールなグラフを作りまくれる!
けれど,関数の使い方などは自分で自分で調べて理解すること
色々カスタマイズしてオリジナルのグラフを作成すること
ちなみに,アニメーションはカッコいいけれど,データをじっくり把握することはできない。
基本的には,対面でのプレゼン,レポート・論文の補足資料,あるいは自己満足のために使用する
以下,各項目をクリックするとソースコードが表示される
折れ線プロット
手順
データ読み込み
ファイルをただ読み込むだけ
Our World in Dataの各ページからcsvファイルをDLしてくる
データセットごとに使用している国名が違うかもしれないため,自身でプログラムを書き換える必要があるかもしれません
例では「年」を時系列データとしているが,「日付」を時系列データとする場合にはプログラムを書き足す必要あり
折れ線グラフのプロット
1. データ読み込み
# データ読み込み
# stringsAsFactors=FALSEをつければfactor型にならない
# Factor型だと色々と難しい
data <- read.csv("child-mortality-igme.csv", header=T, stringsAsFactors=FALSE)
以下はただのデータ確認
# データ中身の確認例
# Angolaだけを抜き出す
data[data[,1]=="Angola", ]
# Angolaの4列目だけを抜き出す
data[data[,1]=="Angola", 4]
# ちなみにこのデータの場合,列に名前がついているので
# ↑のとこれは同じ
data[data$Entity=="Angola", 4]
# ただし(%)は使えないみたいなので4列目(Children Mortality(%))は注意
2. 下準備
# 国リスト
# 使う国,使わない国はエクセルで確認する,あるいはcsvから予め削除しておいても良い
# データによっては,具体的な国地域名の他に,以下の区分も存在するので注意する
# 注意
以下の削除プロセスは,自身の興味に応じて変更すること
たとえば,金銭的に貧しい国と豊かな国の比較をしたい場合は,incomeの情報を使ったりするべきである
# Codeのついていない行を検索して削除する
# 検索してindexを得るには,grepかwhich関数を使う
# grepの場合:grep(0,nchar(data$Code))
delete_row <- which(nchar(data$Code)==0)
# 消す
data <-data[-delete_row,]
# ユニークな名前を取得し,カウントする
country_names <- unique(data$Entity)
n_country <- length(country_names)
3. 折れ線グラフのプロット
# 色に関するライブラリを読み込む
# おそらくデフォルトで入っているが,なかったらインストールすること(install.packagesを使う)
library(colorspace)
colors <- rainbow_hcl(250, c=80)
# グラフの下限・上限を決める
xlims <- min(data[,3])
xlims[2] <- max(data[,3])
ylims <- min(data[,4])
ylims[2] <- max(data[,4])
# プロットの準備
# 上書き解除しておく
par(new=F)
# 意味ない点をプロットし,ラベルを貼る
plot(0,0,xlim=xlims,ylim=ylims,ylab="Children Mortality (%)",xlab="Year")
# 上書きを指定
par(new=T)
# 全部プロットすると多いので,等間隔に50データを適当に抽出してプロット
# 実際には,適当ではなく,自身の興味のある国地域などをプロットすること [第14回課題]
# show_countyには,国番号が格納される。
# 任意の国を選びたい場合は, show_country <- c(x,x,x,x,x...) と任意の番号を入れる(xは実際は数値)
show_country <- seq(1,n_country, length=50)
# 折れ線プロットする
# for文で繰り返す
# for文が何か分からない人はR-tipsなどで調べる!
for (i in show_country){
# 各国におけるX軸(年)とY軸(死亡率)のデータを抜き出す
tmpY <- data[data$Entity==country_names[i],4]
tmpX <- data[data$Entity==country_names[i],3]
# plotのオプションについては以下のURLを参照
# http://cse.naro.affrc.go.jp/takezawa/r-tips/r/53.html
# https://www.kkaneko.jp/pro/r/rplot.html
# 折れ線をプロット
lines(tmpX,tmpY,xlim=xlims,ylim=ylims,col=colors[i],lwd=1)
}
# 凡例(legend)を追加
# 表示位置は左上,Fontsizeは0.6,3列表示,背景色なし,枠線なし
legend("topleft", legend=country_names[show_country],
col=colors[show_country], lty=1, cex = 0.6, ncol=3,
bg = "transparent", bty="n")
折れ線グラフの出力結果
地図プロット
手順
下準備
【折れ線グラフの手順1・2を実行しておくこと】
地図プロット関数の定義
単年度のデータをプロットする関数を先に作り,それをグルグル回す仕様にする
年ごとの繰り返しプロット関数の定義
連続アニメーションするために作成
アニメーションにする
今回はGIF出力します。オプションでmp4出力も可能
関数の定義について
項目2,項目3は関数の定義をしている
関数名 <-function{引数…} {関数の中身} で関数を定義する
関数を使う場合には,事前に定義している必要がある
そのため,
項目2・項目3を実行した段階では,何も起きません
項目2・項目3を実行してから,項目4を実行する,という形になる
関数はそのセッション内で一度定義すればいい(=パッケージのロードと同じ)ため,関数の中身を変更しない限り,項目2・3は一度しか実行しなくてよい
注意点
年データじゃない場合(日付データ)は,コードを変更する必要がありる
コードはコンソールに直接ではなく,スクリプトファイルに書いてから実行する方が間違えない
パッケージのインストールは,初回のみコメントアウト(#)を取って実行する
上手くいかない場合は,RStudioを再起動して,最初から実行する
エラーが出たら,そのエラーメッセージでググる!わからないところはググる!
時間はかかるかもしれないが,時間をかけたら誰でもできるので,焦らず慎重におこなうこと
時間は人によって異なるけれど,最終的にできるようになれば良い
1. 下準備
データの準備
【折れ線グラフの手順1・2を実行しておくこと】
# パッケージのロードとセッティング
2. 地図データプロット関数の定義
WorldNurie関数を定義
3. 繰り返しプロット関数の定義
アニメーション関数の引数とすることを考慮したため,繰り返しプロットを関数にしている
アニメーションを作らず動作確認だけをする場合には,以下のようにWorldNurie関数のみを実行する
WorldNurie(data,colors,y,worldmap2=worldmap,unit_str,title_str,crange)
連続アニメーションを作る前に,必ず単発出力をして動作を確かめよう
その際は,yを指定すること!
このとき,なぜか何にもプロットされない場合は以下を試す
# とりあえずプロットを消す(何もなくなるまでやる)
dev.off()
# これでプロットできなければ次も一緒に試す
dev.list()
# これでプロットできなければ次も一緒に試す
RStudioGD()
for文実行時(rept_WorldNurie)には,毎プロット出力されないので心配しないように
4. アニメーションGIFの作成
animetionについては下のURLを参考
https://www.slideshare.net/sleipnir002/animation10-11306609
地図アニメーションの出力結果
データがない地域は濃いグレーになっています
このあたりは各自工夫して見やすいように修正してください!
おまけ:mapsを使った地図plot関数作成
今回のやり方とは違うんだけど,自分で勉強して新たにコード書く時には下のURLのやり方を使うとすごい便利な気がします。
https://geocompr.robinlovelace.net/