お肉の検査員の統計解析日記

非エンジニアのお肉の検査員が日々の業務で発見した統計解析(主にRを使った)について情報発信します

お肉の検査員でもできるRを使った小地域や中学校区単位のコロプレスマップの書き方

こんにちは。
お肉の検査員です(4回目)。

今回は、コロプレスマップをRで書く方法について紹介させていただきます。
これは、2年前に実行したものを備忘録を兼ねてコードをアップするだけの記事になります(汗)。

 さて、私は普段都道府県ごとの比較をするために、コロプレスマップを書いています。コロプレスマップとは、区画別段彩図ともいいまして、統計地図の1つで,統計区ごとにそこの統計量を段階区分で色区分した指定色を塗った地図のことです。詳しくはコトバンクのサイトをご覧ください。
kotobank.jp

 都道府県レベルや市町レベルではMANDARAを使うと、私のような非エンジニアの人でもとても簡単に無料でコロプレスマップを書くことができます。

しかし、中学校単位や小地域(〇〇市〇〇町〇丁目のような)のコロプレスマップを書くのは簡単にはできませんでした。ただ書く方法として埼玉県の方が記載してくれています。
www.pref.saitama.lg.jp

が、なかなか理解できませんでした。。。私の理解力に問題がありますね。。。

 そこで、Rを使い小地域や中学校区単位のコロプレスマップを書く方法について紹介したいと思います。なぜ中学校区単位のコロプレスマップを書く必要があるか?と言いますと、私が普段関わっている健康づくりの仕事では市町の単位のみならず、市町の中の中学校区単位で高齢化率や喫煙率や運動実施率など生活習慣や脳卒中や心疾患のような罹患率を可視化することがあるためです。

 では早速その方法について書いていきますね。

 目次

1. 必要(中学校区単位か小地域単位か)なシェープファイルを取得する。

まず必要なシェープファイルを取得します。シェープファイルとは、図形情報と属性情報をもった地図データファイルが集まったファイルのことです。ある図形が地球上の「どの」位置にあり、「どんな」形状をしているのか、またその図形はどんな「属性」(性質・特徴・数値など)を持っているのか、という情報が記載されているファイルのことで、ダウンロードしてもそのまま(デフォの設定)では中を見ることができません。中学校区単位か小地域単位で取得するところが異なるので、それぞれ紹介します。

・ 中学校区単位のシェープファイル

中学校区単位のシェープファイルは、国土数値情報 ダウンロードサービスから取得します。
nlftp.mlit.go.jp
『2. 政策区域』の欄の『中学校区』をクリック(下のスクリーンショット参照)してください。

f:id:purerazz:20200211195928p:plain
中学校区単位のシェープファイル取得画面

 そうすると、各データの詳細のページに飛ぶので、一番下にある都道府県名の中で必要な都道府県名を選択して、ダウンロードしてください。そうすると、下のスクリーンショットのように、複数のファイルがダウンロードされてきます。

f:id:purerazz:20200211200030p:plain
中学校区単位のダウンロードされたフォルダ中身

 これは必要な都道府県によって異なるので、同様のファイル名のものがダウンロードされる訳ではないので注意してください。今回は、私の住んでいる滋賀県を選択しました。

 このファイル全てを、Rのフォルダに入れてください。一番簡単な方法は、Rstudioを立ち上げて、FileからNewprojectを押して、新しいプロジェクトを作ってそのフォルダの中に入れるのが一番早いと思います。このファイルの中の、『***.shp』となっているファイルがシェープファイルです。これで、中学校区単位のコロプレスマップを書くためのシェープファイルの準備は終わりです。小地域単位のシェープファイルが不要な方は、『2.Rに必要なパッケージをインストールする。』に飛んでください。

・ 小地域単位のシェープファイル

 小地域の場合は、中学校区単位のシェープファイルを取得した国土地理院のホームページではなく、e-Stat(政府統計の総合窓口)を使います。この中の、トップページから、『地図で見る統計(統計GIS)』を選択し、境界データダウンロードを押してください。今回は、小地域の2015年の国勢調査のデータを使います。
www.e-stat.go.jp
 この中の必要な都道府県名をクリックしてダウンロードしてください。
 ダウンロードすると、下のスクリーンショットのようなフォルダとファイルが出てくると思います。

f:id:purerazz:20200211200236p:plain
小地域のダウンロードしたフォルダとファイル
 
 今回の画像は私の住んでいる滋賀県大津市のものを取ってきているので、他の地域を取ってきていると、違う名前のファイルになっていると思います。これらのファイルを中学校区単位のシェープファイルのところで説明したのと同様に、実行するRのフォルダにコピペで入れてください。シェープファイルの準備は以上です。

2. Rに必要なパッケージをインストールする。

 必要なパッケージは以下のとおりです。インストールされていないパッケージがある場合は、適宜インストールしてください。
 インストール方法は、Syunsuke Fukudaさんのホームページをご覧ください。すごく分かりやすいです。
syunsuke.github.io

~
library(ggmap)
library(tidyverse)
library(ggplot2)
library(sf)
~

 上記のコードがエラーも出ず実行できればインストール完了です。
 次の作業に進みましょう。

3. 取得したシェープファイルを読み込み、小地域名や学区名をとりだしcsvファイルに書き出す。

 取得したシェープファイルは、そのままでは開けないので、Rのsfパッケージを使います。今回は小地域名を例にやり方を紹介します。中学校区単位でも同様にシェープファイル名を指定すると出来ます。以下のコードを実行するとシェープファイルの中を見ることができます。

~
shpfile <- "h27ka25201.shp" #大津市の小地域のシェープファイル名
sh <- sf::st_read(shpfile)
~

このshをみるとシェープファイルの中が見えます。行数が多いので最初の6行だけ見てみましょう。

~
head(sh)
> head(sh)
Simple feature collection with 6 features and 35 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 135.8293 ymin: 35.17936 xmax: 135.8817 ymax: 35.28347
epsg (SRID):    NA
proj4string:    +proj=longlat +ellps=GRS80 +no_defs
   KEY_CODE PREF CITY S_AREA PREF_NAME CITY_NAME       S_NAME KIGO_E HCODE       AREA PERIMETER H27KAxx_ H27KAxx_ID KEN
1 252010010   25  201 001000    滋賀県    大津市   葛川坂下町   <NA>  8101 23771499.5 29735.988     2739       2738  25
2 252010020   25  201 002000    滋賀県    大津市 葛川木戸口町   <NA>  8101   706595.9  3404.912     2395       2394  25
3 252010030   25  201 003000    滋賀県    大津市   葛川中村町   <NA>  8101  1134147.6  4356.177      650        649  25
4 252010040   25  201 004000    滋賀県    大津市   葛川坊村町   <NA>  8101  1076856.1  4335.469     1074       1073  25
5 252010050   25  201 005000    滋賀県    大津市   葛川町居町   <NA>  8101   631492.7  3139.753     2307       2306  25
6 252010060   25  201 006000    滋賀県    大津市 葛川梅ノ木町   <NA>  8101   982738.1  4193.211     2762       2761  25
  KEN_NAME SITYO_NAME GST_NAME CSS_NAME KIHON1 DUMMY1 KIHON2  KEYCODE1 KEYCODE2 AREA_MAX_F KIGO_D N_KEN N_CITY KIGO_I
1   滋賀県       <NA>   大津市     <NA>   0010      -     00 201001000  2010010          M   <NA>  <NA>   <NA>   <NA>
2   滋賀県       <NA>   大津市     <NA>   0020      -     00 201002000  2010020          M   <NA>  <NA>   <NA>   <NA>
3   滋賀県       <NA>   大津市     <NA>   0030      -     00 201003000  2010030          M   <NA>  <NA>   <NA>   <NA>
4   滋賀県       <NA>   大津市     <NA>   0040      -     00 201004000  2010040          M   <NA>  <NA>   <NA>   <NA>
5   滋賀県       <NA>   大津市     <NA>   0050      -     00 201005000  2010050          M   <NA>  <NA>   <NA>   <NA>
6   滋賀県       <NA>   大津市     <NA>   0060      -     00 201006000  2010060          M   <NA>  <NA>   <NA>   <NA>
          MOJI KBSUM JINKO SETAI   X_CODE   Y_CODE  KCODE1                       geometry
1   葛川坂下町     3    38    19 135.8478 35.23138 0010-00 POLYGON ((135.8616 35.20851...
2 葛川木戸口町     1    17    10 135.8620 35.22521 0020-00 POLYGON ((135.8671 35.22892...
3   葛川中村町     1    31    15 135.8652 35.23569 0030-00 POLYGON ((135.8712 35.23956...
4   葛川坊村町     1    38    22 135.8693 35.24643 0040-00 POLYGON ((135.876 35.2517, ...
5   葛川町居町     1    24    10 135.8728 35.25609 0050-00 POLYGON ((135.8779 35.25713...
6 葛川梅ノ木町     1    37    18 135.8761 35.26503 0060-00 POLYGON ((135.8817 35.26856...
~

 このように、シェープファイルの中には、KEY_CODEや県名、市町名、小地域名、緯度経度の情報が入っています。このまま可視化しても必要な情報(例えば小地域ごとの高齢化率や喫煙率、運動率や疾病率など)は最初からは入っていないので、必要な情報が入ったファイルを用意する必要があります。
 しかし、連結するための小地域名について、半角や全角、数字も漢字などファイルにより様々な形式になっていると思うので、S_NAME(KEY_CODEでは私の場合エラーがでました。後述します。)の情報で連結するのが一番簡単と思います。そこで、現状のシェープファイルを一度csvで書き出して、そのファイル上でエクセルを使って必要な数値を入力すると間違いが少ないと思います。そのコードは以下のとおりです。
先ほどのシェープファイルの中をみたコードの続きとして実行してください。

~
### key code と S_NAMEを取り出す
keycode_sname = sh %>% dplyr::select(KEY_CODE, S_NAME) %>% as.data.frame() #シェープファイルの中から、KEY_CODEと小地域名が記載されているS_NAME列のみを取り出す。

keycode_moji = keycode_sname %>% select(-geometry) #このままではなぜかgeometry列もついてくるので、それを再度除去する。

write.csv(keycode_moji, "R020211_大津市小地域の元表.csv", row.names= FALSE) #行名を消してcsvファイルを書き出す。ファイル名は適宜変更して下さいね。
~

 このコードを実行すると、KEY_CODEと小地域名がかかれた(S_NAME列)だけのファイルが出来上がります。

4. 書き出したcsvファイルに、それぞれの小地域名や学区名ごとのデータ(例えば高齢化率や喫煙率など)をくっつける。

 この小地域名を参考にエクセル上でVLOOKUP関数などを駆使してコロプレスマップを書きたいデータを付け加えてください。今回はe-Statからとってきた小地域ごとの後期高齢者(75歳以上)率を見本にします。下のスクリーンショットのようなファイルを作ってください。私の場合は、このファイルを『大津市75歳以上人口割合.csv』という名前で保存しました。

 

f:id:purerazz:20200211200613p:plain
書き出されたファイル(見本)

5. くっつけたcsvファイルを再度Rに取り込んで、可視化する。

 ここまでくると作業としては90%以上完了しています。あとは、可視化するのみです。コードは以下のとおりです。

~
### 重ねたいデータを用意する
koukikourei = read.csv("大津市75歳以上人口割合.csv") #4.でつくったファイルを読み込む

mergeootu = dplyr::left_join(sh, koukikourei, by = " S_NAME ") # S_NAMEを手掛かりに2つのファイルを連結させる。KEY_CODEで連結させようとするとエラーが出るので断念しました。

ggplot(mergeootu, aes(fill = 後期高齢人口割合)) + geom_sf() #ファイルを可視化する
~

 すると、以下の図がでてきます。以上で完了です。

f:id:purerazz:20200211200724p:plain
大津市の小地域別の高齢化率のコロプレスマップ
 

 大津市の北の方が高齢化率が高いのが分かります。やはり可視化は重要ですね。

(参考)中学校区単位のコロプレスマップ

ちなみに、中学校区単位の場合は、以下のコードを実行してシェープファイルの中を見ます。その後の高齢化率や喫煙率のデータをくっつける作業は小地域と同様です。

~
#### 中学校区ごとの解析
shpfiles = "A32-13_25.shp" #滋賀県のデータ(見本)
sh_syo = sf::st_read(shpfiles, options = "ENCODING = CP932", stringsAsFactors = TRUE) #sfパッケージで読み込み

### 大津市のみをとりだす
head(sh_syo) #市町名が記載されている列名を調べる
sh_syo_ootsu = sh_syo %>% dplyr::filter(A32_002 == "大津市") #dplyrパッケージで大津市のみを取り出す
plot(sh_syo_ootsu) #中学校区単位を可視化する。
~

 次に、このファイルの『A32_003』列を小地域ごとと同様に取り出し、必要なデータをくっつけて可視化する、という流れで可視化することが出来ます。

 なにかの参考になれば幸いです。
 
 意見やコメントなどいただければ嬉しいです。