毎年何かが話題になるセンター試験ですが、今年は一部界隈で数1Aの箱ひげ図が話題になりました。
その内容は **「市区町村別の平均寿命を、都道府県別に47個の箱ひげ図」**にして並べるというもの。
この47個の箱ひげ図が「キモすぎる」と言われているそうです
ということで、このグラフっぽいグラフをRで描いてみます。
こんなグラフを作ります (わけあって平成12年度のデータになってしまいました)
なお、この記事は計算研究会アドベントカレンダー 21日目です
(アドベントカレンダーが遅れに遅れたので、翌年のセンター試験の内容を未来予知する時空超越をしてしまいました......)
1. データを探す
センター試験には「厚生労働省のWebページより作成」としかないので、ググってみます
ぱぱっと見つかったのは厚生労働省の生命表一覧のページ(https://www.mhlw.go.jp/toukei/saikin/hw/seimei/list54-57-02.html )です。
市区町村別の平均寿命が選べたので、最新の平成27年のデータを見てみます。
早速 平成27年市区町村別生命表の概況 よりダウンロードして、中のデータを開いてみると
なんとデータが12シートに渡ってわけてあるではありませんか!!
これはネ申エクセル案件です。
(流石に1マス1文字ではありませんが...)
これではRに読み込んでも、うまく処理はできないでしょう。
ここで私が天才であれば、いい感じに処理するプログラムなりマクロなりを組めたのかもしれませんが、私にそんな技術力はありません。
いろいろ調べてみた結果、平成12年度のエクセルデータには多少作業しやすそうな「参照元」シートがあることが分かりました。
ということで、半分手作業で、半分機械に頼って平成12年度のデータをcsvに整えます(15分)
これでようやくデータができたので、センターとは少し違いますが平成12年度のデータで箱ひげ図を作ってみます!
(タイトル詐欺になってごめんなさい... ><)
加工済のcsvデータをGitHubのページで公開しました。
厚生労働省の利用規約に従った上でご自由にお使い下さい
2. RStudioでデータを取り込む
2.1 作業ディレクトリの移動
Rの統合開発環境、RStudioで実際にデータを取り込んでみましょう。
まずは作業ディレクトリを移動します。
getwd()
で現在の作業ディレクトリが分かります。
どこかに新しいフォルダを作成して、その中に移動しましょう。
setwd("ディレクトリのパス")
で移動できます。
2.2 使用するパッケージのインストール
今回はggplot2などを利用します。
ggplot2を含むtidyverseというパッケージをRStudioに入れましょう。
install.packages("tidyverse")
これだけで一緒にggplot2を入れてくれます。
2.3. データをインポート
今回は私が用意したCenterData.csvを使います。
Environmentタブの「Import Dataset」をクリックし、「From text(readr)」を選びます。
「Browse...」からCenterData.csvを選びます。
データのプレビューが表示されたら、Importを押します。
これで取り込むことができました!
これ以降このデータはCenterData
という名前のデータフレームとして扱うことができます。
3. データを編集する
今回はそこまで編集する必要はありませんが、データの概観を確かめながら少しだけ編集を加えましょう。
3.1. データを表示する
CenterData
と単に打つとデータが表示されます。
また、
str(CenterData)
と打つとデータの情報についてが表示されます。
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 3361 obs. of 4 variables:
$ Prefecture: chr "北海道" "北海道" "北海道" "北海道" ...
$ City : chr "中央区" "北区" "東区" "白石区" ...
$ Male : num 78.5 78.5 78.3 77.6 78 78.6 78.3 79.4 78.8 78.5 ...
$ Female : num 86 85.1 85.2 84.6 85.4 85.9 85.5 86 86.7 85.4 ...
- attr(*, "spec")=
.. cols(
.. Prefecture = col_character(),
.. City = col_character(),
.. Male = col_double(),
.. Female = col_double()
.. )
今回はreadrのオプションで特に指定しなかったので、Prefectureの部分がchr(文字列)になっています。
実際はこれは47種類しかないfactor(因子)として扱いたいので変換しておきます。
3.2. 文字列からfactor(因子型)に変換
1列だけを変えたいので、as.factor()を使いました。
CenterData$Prefecture = as.factor(CenterData$Prefecture)
この状態でもう一度str(CenterData)
と打つと
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 3361 obs. of 4 variables:
$ Prefecture: Factor w/ 47 levels "愛知県","愛媛県",..: 46 46 46 46 46 46 46 46 46 46 ...
$ City : chr "中央区" "北区" "東区" "白石区" ...
$ Male : num 78.5 78.5 78.3 77.6 78 78.6 78.3 79.4 78.8 78.5 ...
$ Female : num 86 85.1 85.2 84.6 85.4 85.9 85.5 86 86.7 85.4 ...
- attr(*, "spec")=
.. cols(
.. Prefecture = col_character(),
.. City = col_character(),
.. Male = col_double(),
.. Female = col_double()
.. )
Prefectureのところが 47種類のfactorに変換されているのが分かります。
4. 箱ひげ図を作る
データの準備ができたので、早速作成に入っていきます。
愚直に箱ひげ図を作ってみる
ggplot2でまずは箱ひげ図を作ってみます。
ggplot(CenterData, aes(x = Prefecture, y = Male)) + geom_boxplot()
とりあえず箱ひげ図にはなりましたね!
ここからやりたいことは次の2つで
- 90度回転させて横向きにする
- なにかの値でソートして表示する
です
4.2. 90度回転させて横向きにする
横向きにするにはcoord_flip()
を最後に足します。
ggplot(CenterData, aes(x = Prefecture, y = Male)) + geom_boxplot() + coord_flip()
4.3. 代表値でソートして表示する。
これにはreorder()
というのを使ってみます。
今回は、それぞれの男性の平均寿命の平均値をもとにソートします。(おそらくセンター試験のグラフもそう)
ggplot(CenterData, aes (x = reorder(Prefecture,Male, FUN = mean), y = Male)) + geom_boxplot() + coord_flip()
並べ替えることができました、しかしセンターのグラフはこれの逆順なので、並べ替えを逆順にします。
ggplot(CenterData, aes (x = reorder(Prefecture,-Male, FUN = mean), y = Male)) + geom_boxplot() + coord_flip()
4.4. 箱ひげ図の体裁を整える
今は外れ値を点で表示していて、またひげの先端に横線もありません。
そこでこれらを追加します。
coef = Infで外れ値を消して、
coef = Inf , geom = "errorbar"で横線を追加します。
ggplot(CenterData, aes (x = reorder(Prefecture,-Male, FUN = mean), y = Male)) +
stat_boxplot(geom = "errorbar", coef = Inf, width = 0.6) +
stat_boxplot(coef = Inf) +
coord_flip()
5. 保存する
保存するにはggsaveを使います。
ggsave("ファイル名",width = 横, height = 縦)
例:
ggsave("Center.png",width = 5, height = 6)
まとめ
Rの勉強がてら、データを探す所から、データの編集、グラフの作成といろいろためになりました。
やっぱりタイムリーなデータを扱うのは楽しいですね
あまりに扱いにくい厚生労働省のデータを見つけたときは都市伝説を見たような気分になりましたが...
結局平成12年度の古いデータを使いましたが、流石に平均寿命というデータの特徴もあって大きくは変わりませんでした。
それはそうと、大阪の異常に平均寿命の短い市町村区はなんなんでしょう...
また、箱ひげ図(というか四分位数)の定義がいくつかあるのですが、高校の教育課程では何故か独自の定義を取っているらしく、ggplotで描かれた箱ひげ図とは少し異なっています。(分析結果には大差無い)
(参考:奥村晴彦「四分位数の定義」https://oku.edu.mie-u.ac.jp/~okumura/stat/quartile.html)
今回できなかったこと
- それぞれの県を順番にP1~P47として表記
- ラベルとか見た目をいい感じに調整する