演習課題1

演習課題

(この課題はデータ処理演習という授業で用いました)
  • Our World in Data (https://ourworldindata.org/)からデータ(.csv)をDLし,グラフを作成せよ

    • 必要に応じて,表も作成せよ

    • 解析対象とする国は任意に選んで構わないが,少なくとも10か国のデータは使用すること

      • せっかくなので平均値や標準偏差も算出すること

    • データから読み取れる客観的事実についてまとめ,事実に基づいた簡単な考察・解釈をおこなうこと

    • 2種類以上のデータを組み合わせて考察してもよい(相関・回帰分析など)

    • グラフは,以下に紹介するものでなくても構わない

      • Moving bar graphのライブラリも検索すればすぐに出てくるので,使いたい人はどうぞ


  • このページでは,「Children Mortality」データセットを例に,折れ線グラフおよび地図プロット×アニメーションの作成方法のコードを紹介する

    • ぶっちゃけ,このコードをコピペするだけでクールなグラフを作りまくれる!

    • けれど,関数の使い方などは自分で自分で調べて理解すること

    • 色々カスタマイズしてオリジナルのグラフを作成すること

    • ちなみに,アニメーションはカッコいいけれど,データをじっくり把握することはできない。

      • 基本的には,対面でのプレゼン,レポート・論文の補足資料,あるいは自己満足のために使用する

  • 以下,各項目をクリックするとソースコードが表示される

折れ線プロット

手順

  1. データ読み込み

    • ファイルをただ読み込むだけ

    • Our World in Dataの各ページからcsvファイルをDLしてくる

    • データセットごとに使用している国名が違うかもしれないため,自身でプログラムを書き換える必要があるかもしれません

      • 例では「年」を時系列データとしているが,「日付」を時系列データとする場合にはプログラムを書き足す必要あり

  2. 折れ線グラフのプロット

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. 下準備

    • 【折れ線グラフの手順1・2を実行しておくこと】

  2. 地図プロット関数の定義

    • 単年度のデータをプロットする関数を先に作り,それをグルグル回す仕様にする

  3. 年ごとの繰り返しプロット関数の定義

    • 連続アニメーションするために作成

  4. アニメーションにする

    • 今回は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/