• ここで使っている R パッケージ一覧
library(ggthemes)
library(ggrepel)
library(httr)
library(jpndistrict)
library(sf)
library(tidyverse)

1. 東京23区の人口別地図を描く

  • 2015年度の東京都(23区)の人口のコロプレス地図を作成
  1. 東京都の「地図データ」と「人口データ」を取得する
  2. 2 つのデータをマージする
  3. マップを描く   
  • 地図を描くために必要な変数は次の 3 つ
  1. 地図データの変数
  2. 人口データの変数
  3. 区と市と町の名称
  • ここでは 2 つのセクション(地図データと人口データ)に分けて、データの入手方法とデータの加工方法、地図の描き方を解説する

1.1 東京23区の地図データを取得

  • ne_states()関数 では市区町村までマッピングすることはできまない
  • 徳島大学の瓜生真也先生が公開している {jpndistrict}パッケージ を使う
  • 地図を描くために {jpndistrict}パッケージが必要
  • しかし、{jpndistrict}パッケージは、CRAN からダウンロードできない

解決策:

  • github 経由で{jpndistrict}パッケージをインストールする
    → {remotes}パッケージをインストールする
    → 次のコードを Console に打ち込む(この作業は一度だけでよい)
install.packages("remotes")
remotes::install_github("uribo/jpndistrict")
  • 次に、インストールされた {jpndistrict} パッケージを読み込む
library(jpndistrict)

→ 東京都の地図データを抽出する
df_tokyo_map という名前を付ける

df_tokyo_map <- jpn_pref(admin_name = "東京都")
  • df_tokyo_map の型をチェックしてみる
class(df_tokyo_map)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"
  • 東京都の地図をプロットしてみる
df_tokyo_map |> 
  ggplot() +
  geom_sf() +
  theme_minimal()

- 東京都の区域は本州の「東京地方」と「島嶼部」から構成
- 「東京地方」の23特別区で構成される東京都区部(23区)だけを表示させる

df_tokyo_map <- jpn_pref(admin_name = "東京都") %>% 
  dplyr::filter(str_detect(city, "区")) # 23区だけを抜き取る設定
  • 東京都の地図をプロットしてみる
df_tokyo_map |> 
  ggplot() +
  geom_sf() +
  theme_minimal()

  • df_dtokyo_map の中身を確認し、東京都の pref_code を確認する
DT::datatable(df_tokyo_map)
  • 東京都の pref_code は 13

→ 東京都の地図データ + 23区のみ抜き取る

df_tokyo_map <- jpn_pref(13, district = TRUE) %>% 
  dplyr::filter(str_detect(city, "区")) # 23区だけを抜き取る設定
  • データの始めの部分を表示
head(df_tokyo_map, 23)
  • マップを描くために必要な変数 (city, geomety) だけに絞る
df_tokyo_map <- df_tokyo_map %>% 
  select(city, geometry)
  • 抜き取ったデータの始めの部分を表示
head(df_tokyo_map, 23)
  • これで必要なマップデータを入手できた   

  • df_tokyo_map の中身を確認し、東京都の pref_code を確認する

DT::datatable(df_tokyo_map)
  • 東京都の pref_code は 13

→ 東京都の地図データ + 23区のみ抜き取る

df_tokyo_sf <- jpn_pref(13, district = TRUE) %>% 
  dplyr::filter(str_detect(city, "区")) # 23区だけを抜き取る設定
  • 抜き取った東京23区の地図を表示    
df_tokyo_sf %>%
  ggplot() +
  geom_sf() +
  theme_minimal()

  • データの始めの部分を表示
head(df_tokyo_sf, 23)
  • マップを描くために必要な変数 (city, geomety) だけに絞る
df_tokyo_sf <- df_tokyo_sf %>% 
  select(city, geometry)
  • 抜き取ったデータの始めの部分を表示
head(df_tokyo_sf, 23)
  • これで必要なマップデータを入手できた   

1.2 東京23区の人口データを取得

  • 都道府県の人口データ取得方法は次の 2 つ
  1. 「政府統計の総合窓口(e-Stat)にアクセスして手動でデータをダウンロード
  2. 「政府統計の総合窓口(e-Stat)にアクセスして「アプリケーションID」を取得し自動でデータをダウンロード
  • 好みに応じてデータを取得する
  • ここではそれぞれの方法を解説する

1.2.1 e-Stat からダウンロード(手動)

  • 「市町村データ」 → 「データ表示」をクリック

  • 絞り込みの【表示データ】で「現在の市区町村」
  • 【地域区分】で「東京都」
  • 【絞り込み】で「特別区」
    → 「実行」をクリック

  • 「全て選択」→ 「確定」クリック

  • 【項目候補】から「A1101 総人口(人)」を選び → 「項目を選択」をクリック

  • 「確定」をクリック

  • 画面右上の「ダウンロード」をクリック

【ダウンロードの範囲】から「ページ上部の選択項目(調査年)」を選ぶ
【ファイル形式】から「csv形式」を選ぶ
【ヘッダの出力】から「出力しない」を選ぶ
【コードの出力】から「出力しない」を選ぶ
✅️データがない行を表示しない
✅️データがない列を表示しない
→ 「ダウンロード」をクリック

→ 「ダウンロード」をクリック
→ ダウンロードした csv ファイルを開く

  • 変数名の変更:
「調査年」 → year
「地域」 → city
「A1101_総人口【人】」 → population

  • 「/項目」の列は削除する
  • 「/項目」の列を選ぶ →「編集」→「削除」を選ぶ

  • city 内にある「東京都 」(東京都と半角スペース)を削除する
  • B にカーソルを当てて変数 city 列を選び「編集」→「検索」→「置換」
    → 「検索する文字列」に「東京都」という文字と「半角スペース」を入力
    → 「すべて置換」をクリック

  • 「通知 23件を置換しました」を確認 → OK をクリック

  • 次の画面で「閉じる」を選択する → 下のような画面が表示されれば OK

  • ファイルに tokyo_pop.csvと名前をつけて保存(例えばデスクトップに)
  • 注意:「ファイル形式」はCSV UTF-8(コンマ区切り)(.csv)を指定

  • これで東京23区の人口別マップを描くために必要な人口データは入手できた
  • 次のセクションでは「手動」でなく「自動」で人口データを入手する方法を紹介する

1.2.2 e-Stat からダウンロード(自動)

  • e-statAPI を利用して人口を取得する
  • API やアプリケーション ID の取得方法やデータのダウンロードに関してはこちらを参照
  • アプリケーションIDを入力する
id <- "取得したアプリケーションIDをここに貼り付ける"
  • 市町村別の人口データを取得する
get_estat <- GET(
  url = "http://api.e-stat.go.jp", path = "rest/2.1/app/getSimpleStatsData",
  query = list(
    appId = id,
    statsDataId = "0000020201",
    sectionHeaderFlg  = 2
    )
  )
  • 2015年の東京都のデータのみを選択し、データフレームにして前処理
df_tokyo_pop <- read_csv(content(get_estat, as = "text"), skip = 1) %>% 
  filter(str_detect(地域, "東京都"), 
         調査年 == "2015年度", cat01_code == "A1101") %>% 
  select(area = 地域, year = 調査年, population = value) %>% 
  separate(area, into = c("prefecture", "city"), sep = " ") %>% 
  mutate(
    year = as.integer(str_remove_all(year, "年度"))
    ) %>% 
  filter(city != "特別区部") %>%
  filter(str_detect(city, "区")) %>%
  select(year, prefecture, city, population)

rmarkdown::paged_table(df_tokyo_pop)
  • マップを描くために必要な変数 (city, population) だけに絞る
df_tokyo_pop <- df_tokyo_pop %>% 
  select(city, population)
  • これで東京23区の人口別マップを描くために必要な人口データは入手できた
  • 次に、 e-Stat から「手動」もしくは「自動」で入手した東京23区の「人口データ」と「1.1 東京23区の地図データを取得」で入手した「地図データ」をマージする

1.3 データのマージ(東京23区)

  • 上記の(1) もしくは (2) のプロセスを経て入手した東京都の人口データ (tokyo_pop.csvもしくは df_tokyo_pop) と「地図データ」(df_tokyo_sf)をマージする
  • ここでは上記の (1) のプロセスを経て入手した東京都の人口データ (tokyo_pop.csv) と「地図データ」(df_tokyo_sf)をマージする
  • Rプロジェクトフォルダを作成し、その中に data という名称のフォルダを作る
  • dataフォルダの中に tokyo_pop.csv ファイルを入れてデータを読み取り df_tokyo_pop と名前をつける
df_tokyo_pop <- read_csv("data/tokyo_pop.csv")
  • 読み取った東京都23区の人口データ (df_tokyo_pop) の表示
head(df_tokyo_pop)
  • 1.1 東京23区の地図データを取得」でダウンロードした東京都の地図データ (df_tokyo_sf) を表示させる
head(df_tokyo_sf)
  • 共通の変数 (city) を手がかりに東京の地図データ (df_tokyo_sf) と東京の人口データ (df_tokyo_pop) をマージして、merge_tokyo というデータフレーム名をつける
merge_tokyo <- df_tokyo_sf %>% 
  left_join(df_tokyo_pop, by = "city") %>% 
  st_as_sf()
  • マージしたデータを確認する
merge_tokyo %>% 
  head() %>% 
  rmarkdown::paged_table()
  • 東京23区の人口別マップを描くために必要な変数だけを選ぶ
merge_tokyo <- merge_tokyo %>% 
  select(city, geometry, population)
  • マージしたデータを表示
merge_tokyo %>% 
  head() %>% 
  rmarkdown::paged_table()
  • これで東京23区の人口別マップを描くために必要な 3 つの変数がそろった
  1. 地図データの変数: geometry
  2. 人口データの変数: population
  3. 区と市と町の名称: city

1.4 東京23区の人口別マップ

  • 上で作成したデータ (merge_tokyo) を使って、人口の多い区を濃い緑色でマップ表示する
map_pop_tokyo <- merge_tokyo %>% 
  ggplot() +
  geom_sf(aes(fill = population)) +
  scale_fill_distiller(name = "人口",
                       palette = "Greens", direction = 1) +
  theme_map(base_family = "HiraginoSans-W3") +
  theme(legend.position = c(.1, -.1),
        legend.direction = "horizontal",
        legend.title = element_text(size = 15), 
        legend.text = element_text(size = 15),
        legend.key.size = unit(1, "cm"),
        legend.key.width = unit(3,"cm")) +
  coord_sf(datum = NA) 

map_pop_tokyo

・さらに23区名をマップ上に表示させる

map_pop_tokyo_text <- merge_tokyo %>% 
  mutate(
    text_x = map_dbl(geometry, ~st_centroid(.x)[[1]]),
    text_y = map_dbl(geometry, ~st_centroid(.x)[[2]])
  ) %>% 
  ggplot() +
  geom_sf(aes(fill = population)) +
  geom_label(aes(x = text_x, y = text_y, label = city), 
             size = 1.7, family = "HiraginoSans-W3") +
  scale_fill_distiller(name = "人口",
                       palette = "Greens", direction = 1) +
  theme_map(base_family = "HiraginoSans-W3") +
  theme(legend.position = c(.8, .05),
        legend.title = element_text(size = 10), 
        legend.text = element_text(size = 5),
        legend.key.size = unit(0.5, "cm"),
        legend.key.width = unit(1,"cm")) +
  coord_sf(datum = NA) 

map_pop_tokyo_text
東京23区人口別地図 (2015)

  • 作成したマップを fig に保存したければ、保存する前に予め Rプロジェクトフォルダに fig という名称のフォルダを作り、次のコマンドを入力する
ggsave("fig/map_pop_tokyo_text.png", map_pop_tokyo_text, width = 13, height = 13)

2. 宮城県の人口別地図を描く

  • 2015年度の宮城県の人口のコロプレス地図を作成
  1. 宮城県の「地図データ」と「人口データ」を取得する
  2. 2 つのデータをマージする
  3. マップを描く   
  • 地図を描くために必要な変数は次の 3 つ
  1. 地図データの変数
  2. 人口データの変数
  3. 区と市と町の名称
  • ここでは 2 つのセクション(地図データと人口データ)に分けて、データの入手方法とデータの加工方法、地図の描き方を解説する

2.1 宮城県の地図データを取得

  • 地図を描くために必要なデータ jpndistrict パッケージをロードする
pacman::p_load_gh("uribo/jpndistrict")

→ 都道府県別の地図データを抽出する → df_miyagi_map という名前を付ける

df_miyagi_map <- jpn_pref(admin_name = "宮城県")
head(df_miyagi_map)
  • df_miyagi_map の中身を確認する
DT::datatable(df_miyagi_map)
  • 抜き出した宮城県のマップを表示
df_miyagi_map %>%
  ggplot() +
  geom_sf() +
  theme_minimal()

  • 抜き出したマップデータの変数を確認する
names(df_miyagi_map)
[1] "pref_code"  "prefecture" "city_code"  "city"       "geometry"  
  • 宮城県の人口別マップを描くために必要なのは次の 3 つのデータ
  1. 地図データの変数 (geometry)
  2. 人口データの変数 (pupulation)
  3. 区と市と町の名称 (city)
  • 変数 city の中には次の 3 種類の行政区が含まれていることがわかる
  1. 仙台市の区(例:仙台市 青葉区)
  2. 仙台市以外の市(例:塩竈市)
  3. 郡部の町(例:遠田郡 涌谷町)
  • このデータを次のように修正する必要がある
  • 仙台市内の「区」を仙台市以外の「市」や郡部の「町」と同レベルと見なし「仙台市」を除いた区名だけ表示させる(例:仙台市 泉区 → 泉区
    → 「仙台市」と「青葉区」の間に半角スペースが入っていることに注意
  • 郡部の「町」を仙台市以外の「市」や仙台市内の「区」と同レベルと見なし郡部の名称を除いて町名だけ表示させる(例:遠田郡 涌谷町 → 涌谷町
    「遠田郡」と「涌谷町」の間に半角スペースが入っていることに注意
  • 2 つの新たな変数 (shiku_cho) を作成する
  • 「仙台市 泉区」=> 「仙台市」は shi の中に、「泉区」は ku_cho の中に入れる
  • 「遠田郡 涌谷町」=> 「遠田郡」は shi の中に、「涌谷町」は ku_cho の中に入れる
df_miyagi_map <- jpn_pref(pref_code = 4) %>% 
  separate(city, 
           into = c("shi",     # city の中の前半部分を shi に入れる  
                    "ku_cho"), # city の中の後半部分を shi に入れる  
           sep = " ")          # 前半と後半に区切りはクオーテーション 
                               # クオーテーションの間に「半角のスペース」を入れる

df_miyagi_map
  • ここでさらに変数 city を新たに作り、その中に宮城県に関する次の 3 種類の行政区が全て含まれるようにしたい
  1. 仙台市内の「区」
  2. 仙台市以外の「市」
  3. 郡名を除いた「町」
  • if_else 関数を使う
    → 変数 ku_cho の値が NA なら city の中に変数 shi の値を入れる
    → それ以外の場合、 city の中に変数 ku_cho の値を入れると指定
df_miyagi_map <- df_miyagi_map %>% 
  mutate(       
    city = if_else(is.na(ku_cho), shi, ku_cho) 
    ) %>% 
  select(pref_code:city_code, city, geometry) # 残したい変数を指定  

# pref_code:city_code → pref_code から city までの変数を残す  
# city と geomerty も残す  
  • 変数を確認する
names(df_miyagi_map)
[1] "pref_code"  "prefecture" "city_code"  "city"       "geometry"  
  • 必要な変数だけに絞る
df_miyagi_map <- df_miyagi_map |> 
  select(city, geometry, )
DT::datatable(df_miyagi_map)
  • これで、宮城県の人口マップを描くために必要な「地図データ」が得られた

2.2 宮城県の人口データを取得

  • 都道府県の人口データ取得方法は次の 2 つ  
  1. 「政府統計の総合窓口(e-Stat)にアクセスして手動でデータをダウンロード
  2. 「政府統計の総合窓口(e-Stat)にアクセスして「アプリケーションID」を取得し自動でデータをダウンロード
  • どちらかの方法でデータを取得する

  • 1 の「手動」で人口データを入手する場合には「1.2.1 e-Stat からダウンロード(手動)」を参考にする

  • ここでは 2 の方法でデータをダウンロードしてみる

2.2.1 e-Stat からダウンロード(手動)

  • 1.2.1 e-Stat からダウンロード(手動)」を参考にして csvファイルを作成して下さい

2.2.2 e-Stat からダウンロード(自動)

  • e-statAPI を利用して人口を取得する
  • API やアプリケーション ID を使ったデータの取得に関してはこちらを参照
  • アプリケーションIDを入力する
id <- "取得したアプリケーションID"
  • 市町村別の人口データを取得する
get_estat <- GET(
  url = "http://api.e-stat.go.jp", path = "rest/2.1/app/getSimpleStatsData",
  query = list(
    appId = id,
    statsDataId = "0000020201",
    sectionHeaderFlg  = 2
    )
  )
  • 入手した市町村別の人口データデータフレームに変換し、次の条件で前処理する
  • csvファイルを読み取る際、一行目をスキップする (skip = 1)
  • 2015年の人口データ (調査年 == "2015年度")
  • 宮城県のデータ (filter(str_detect(地域, "宮城県"))
  • areaprefecturecity の二つの変数に分けて入れる
  • 加工したデータフレーム (df_miyagi_pop) を確認する
df_miyagi_pop <- read_csv(content(get_estat, as = "text"), skip = 1) %>% 
  filter(str_detect(地域, "宮城県"), 
         調査年 == "2015年度", 
         cat01_code == "A1101") %>% 
  select(area = 地域, 
         year = 調査年, 
         population = value) %>% 
  mutate(
    area = str_remove_all(area, " 仙台市")
    ) %>% 
  separate(area, into = c("prefecture", "city"), sep = " ") %>% 
  mutate(
    year = as.integer(str_remove_all(year, "年度"))
    ) %>% 
  filter(!is.na(city)) %>%                   # city の欠損値を除外する  
  select(year, prefecture, city, population) # 分析に必要な変数だけを残す
  • 前処理した宮城県の人口データ(df_miyagi_pop) の中身を確認
df_miyagi_pop

2.3 データのマージ(宮城県)

  • ここで作成した人口データ(df_miyagi_pop) と「2.1 宮城県の地図データを取得」で前処理した宮城県の地図データ (df_miyagi_map) を city という変数を手がかりにマージする
merge_miyagi <- left_join(df_miyagi_map,
                          df_miyagi_pop,
                          by = "city")
  • マージしたデータの変数を確認する
names(merge_miyagi)
[1] "city"       "geometry"   "year"       "prefecture" "population"
  • 地図を描くために必要なのは次の 3 つのデータ
  1. 地図データの変数 (geometry)
  2. 人口データの変数 (pupulation)
  3. 区と市と町の名称 (city)
  • df_miyagi_map からこれら 3 つの変数だけを抜き出す
merge_miyagi <- merge_miyagi %>% 
  select(geometry, population, city)
DT::datatable(merge_miyagi)
  • これで宮城県の人口別マップを描くために必要な 3 つの変数がそろった

2.4 宮城県の人口別マップ

  • 地図を描く準備が整ったので描いてみる
  • 変数 population の型をチェック
str(merge_miyagi$population)
 chr [1:39] "310183" "194825" "133498" "226855" "216798" "147214" "54187" ...
  • 数値 (numeric) であるべきはずの population の型が 文字型 (chr) と認識されている
    → 数値 (numeric) に変更する
merge_miyagi$population <- as.numeric(merge_miyagi$population)
  • scale_fill_gradient() を使い、人口が少ないほど白、多いほどグリーンに色分けしてみる
merge_miyagi %>%
  ggplot() +
  geom_sf(aes(fill = population)) +
  scale_fill_gradient(low = "white", high = "green") +
  labs(title = "宮城県内の人口別地図 (2015年)",
       fill = "人口") +
  theme_minimal(base_family = "HiraKakuProN-W3") +
  theme(legend.position = "bottom")

  • 区や市の名前を表示してみる
  • チャンクオプションに次のように入力する
  • {r map_pop_miyagi, fig.height=18, fig.width=15}
map_pop_miyagi <- merge_miyagi %>% 
  mutate(
    text_x = map_dbl(geometry, ~ st_centroid(.x)[[1]]),
    text_y = map_dbl(geometry, ~ st_centroid(.x)[[2]])
    ) %>% 
  
  ggplot() +
  geom_sf(aes(fill = population)) +
  geom_label_repel(aes(x = text_x,
                       y = text_y, 
                       label = city), 
                   size = 5, 
                   family = "HiraginoSans-W3",
                   min.segment.length = 0) +
  scale_fill_distiller(name = "人口",
                       palette = "Blues", 
                       direction = 1) +
  theme_map(base_family = "HiraginoSans-W3") +
  theme(legend.position = c(.65, .1),
        legend.title = element_text(size = 15), 
        legend.text = element_text(size = 15),
        legend.key.size = unit(1.5, "cm"),
        legend.key.width = unit(2,"cm")) +
  coord_sf(datum = NA) 

map_pop_miyagi

  • 作成したマップを fig に保存する
  • 作成したマップを fig に保存したければ、保存する前に予め Rプロジェクトフォルダに fig という名称のフォルダを作り、次のコマンドを入力する
ggsave("fig/map_pop_miyagi.png", map_pop_miyagi,
       width = 18, height = 15)

3. Exercise

Question 1: 「1. 東京23区の人口別地図を描く」や「2. 宮城県の人口別地図を描く」の手法を参考にして、あなたが興味ある都道府県を選び、人口規模別のマップを描きなさい

Question 2:得られた結果からどのようなことが言えるか説明しなさい

参考文献

参考:
拓殖大学政経学部浅野ゼミ生の中山郁弥さんが作成したサイト「2014年衆議院総選挙選挙区比較マップ」が役に立ちます