• このセクションで使う R パッケージ一覧
library(DT)
library(ggthemes)
library(jpndistrict) 
library(magrittr)
library(remotes)
library(rnaturalearth)
library(rmarkdown)
library(sf)
library(tidyverse)
  • 注意: jpndistrict パッケージ をインストールするときには、コンソールに次のコマンドを打ち込み、Enter key(もしくは Return key)を打つこと
install.packages("devtools")
devtools::install_github("uribo/jpndistrict")

1. 衆院選挙区の地図を描く

  • 2017年衆院選における静岡県(小選挙区)における立候補者の平均年齢を可視化する

1.1 衆院選選挙区マップデータを入手する

df_dist_map <- st_read("shp/senkyoku289polygon.shp",
                       options = "ENCODING=CP932", 
                       stringsAsFactors = FALSE) %>% 
  rename(district = kuname)
options:        ENCODING=CP932 
Reading layer `senkyoku289polygon' from data source 
  `/Users/asanomasahiko/Dropbox/statistics/class_materials/shp/senkyoku289polygon.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 290 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
CRS:           NA
  • 読み取った選挙区の地図データ (df_dist_map) の中身を確認
head(df_dist_map) %>% 
  rmarkdown::paged_table()

1.2 総選挙候補者年齢データの入手と加工

1.2.1 データの準備

・衆議院議員総選挙の得票データ hr96-21.csv をダウンロード
- ダウンロードした hr96-21.csv を Rプロジェクトフォルダ内に作った data フォルダに入れる
- データを読み込み df_hr と名前をつける

  • df_hr には 22 個の変数が入っている
変数名 詳細
year 選挙年 (1996-2017)
pref 都道府県名
ku 小選挙区名
kun 小選挙区
rank 当選順位
wl 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選
nocand 立候補者数
seito 候補者の所属政党
j_name 候補者の氏名(日本語)
name 候補者の氏名(ローマ字)
previous これまでの当選回数(当該総選挙結果は含まない)
gender 立候補者の性別: “male”, “female”
age 立候補者の年齢
exp 立候補者が使った選挙費用(総務省届け出)
status 候補者のステータス: 0 = 非現職、1 現職、2 = 元職
vote 得票数
voteshare 得票率 (%)
eligible 小選挙区の有権者数
turnout 小選挙区の投票率 (%)
seshu_dummy 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲)
jiban_seshu 地盤の受け継ぎ元の政治家の氏名と関係
nojiban_seshu 世襲元の政治家の氏名と関係
  • 必要な変数 (year, ku, kun, age) だけを抜き出す
df_age <- df_hr %>% 
  dplyr::select(year, ku, kun, age)
  • 抜き出したデータフレーム df_hr を確認
head(df_age) 
# A tibble: 6 × 4
   year ku      kun age  
  <dbl> <chr> <dbl> <chr>
1  1996 aichi     1 47   
2  1996 aichi     1 72   
3  1996 aichi     1 53   
4  1996 aichi     1 43   
5  1996 aichi     1 51   
6  1996 aichi     1 51   

1.2.2 データの加工(「選挙区」表記の統一)

  • 前のセッションで入手した「地図データ」df_dist_map と ここで入手した「候補者年齢データ」df_hr「選挙区」の値(表し方)が異なる
head(df_dist_map)
Simple feature collection with 6 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 126.7099 ymin: 25.8132 xmax: 142.2371 ymax: 35.63099
CRS:           NA
  kucode district ken ku                       geometry
1   2809  兵庫9区  28  9 MULTIPOLYGON (((135.0025 34...
2   1303  東京3区  13  3 MULTIPOLYGON (((139.4133 34...
3   4010 福岡10区  40 10 MULTIPOLYGON (((131.0241 33...
4   4203  長崎3区  42  3 MULTIPOLYGON (((129.7689 33...
5   4703  沖縄3区  47  3 MULTIPOLYGON (((128.0207 27...
6   4701  沖縄1区  47  1 MULTIPOLYGON (((127.333 26....
変数名
年齢データ (df_age) ku, kun aichi, 1
マップデータ (df_dist_map) kuname 愛知1区

df_age → 漢字数字が分離(例えば「aichi」と「1」)
df_dist_map → 漢字数字が混合(例えば「愛知1区」)

→ どちらかに統一する必要がある
→ ここでは「年齢データ」の選挙区名を「愛知1区」のように変更
→ jpndistrict::jpnprefsを使って日本語の都道府県名を取得する

df_pref_name <- jpndistrict::jpnprefs %>% 
    mutate(
        prefecture_en = str_remove_all(prefecture_en, c("-ken" = "",  #-kenkenを削除
                                                        "-to" = "",   #-to を削除 
                                                        "-fu" = "")), #-fu を削除 
        prefecture_en = str_to_lower(prefecture_en), 
        prefecture = str_remove_all(prefecture, c("県" = "",  # 県を削除  
                                                  "都" = "",  # 都を削除 
                                                  "府" = "")) # 府を削除 
    ) %>% 
    select(prefecture, ku = prefecture_en) # 変数を 2 つに絞る  
head(df_pref_name) 
# A tibble: 6 × 2
  prefecture ku      
  <chr>      <chr>   
1 北海道     hokkaido
2 青森       aomori  
3 岩手       iwate   
4 宮城       miyagi  
5 秋田       akita   
6 山形       yamagata
  • df_agedf_pref_nameをマージ → 日本語の選挙区名を作成
  • 2017年のみをデータに絞る
  • df_hr17 と名前を付ける
df_hr17 <- df_hr %>% 
    left_join(df_pref_name, "ku") %>% 
    filter(year == 2017) %>% 
    mutate(
        district = str_c(prefecture, kun, "区")
    ) 
  • df_hr17 の変数を確認する
names(df_hr17)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu" "prefecture"    "district"     
  • 必要な変数 (district, age) だけに絞る
df_hr17 <- df_hr17 %>% 
  select(district, age)
head(df_hr17) 
# A tibble: 6 × 2
  district age  
  <chr>    <chr>
1 愛知1区  53   
2 愛知1区  42   
3 愛知1区  54   
4 愛知2区  51   
5 愛知2区  45   
6 愛知2区  31   
  • age の型が character <chr> なので、数値型 (numeric) に変更する
df_hr17$age <- as.numeric(df_hr17$age)
  • 2017年衆院選に出馬した候補者年齢の平均を選挙区毎に計算する
df_hr17_age <- df_hr17 %>% 
    group_by(district) %>% 
    summarise(age_mean = mean(age, na.rm = T))

1.2.3 「選挙区マップ」と「候補者年齢データ」をマージ

  • df_dist_mapdf_hr17_ageをマージする
  • マージする前にそれぞれのデータを確認する
head(df_hr17_age) 
# A tibble: 6 × 2
  district age_mean
  <chr>       <dbl>
1 三重1区      57.5
2 三重2区      68  
3 三重3区      51.2
4 三重4区      54.7
5 京1区        63  
6 京2区        47.7
head(df_dist_map) 
Simple feature collection with 6 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 126.7099 ymin: 25.8132 xmax: 142.2371 ymax: 35.63099
CRS:           NA
  kucode district ken ku                       geometry
1   2809  兵庫9区  28  9 MULTIPOLYGON (((135.0025 34...
2   1303  東京3区  13  3 MULTIPOLYGON (((139.4133 34...
3   4010 福岡10区  40 10 MULTIPOLYGON (((131.0241 33...
4   4203  長崎3区  42  3 MULTIPOLYGON (((129.7689 33...
5   4703  沖縄3区  47  3 MULTIPOLYGON (((128.0207 27...
6   4701  沖縄1区  47  1 MULTIPOLYGON (((127.333 26....
  • マージするデータフレーム (df_hr17_agedf_dist_map) を確認
head(df_hr17_age) 
# A tibble: 6 × 2
  district age_mean
  <chr>       <dbl>
1 三重1区      57.5
2 三重2区      68  
3 三重3区      51.2
4 三重4区      54.7
5 京1区        63  
6 京2区        47.7
head(df_dist_map)%>% 
  rmarkdown::paged_table()
  • 両方のデータフレームに共通する変数 (district) を手がかりにしてマージする
df_dist_map_age <- df_dist_map %>% 
    left_join(df_hr17_age, by = "district") %>% 
    st_as_sf()
  • マージしたデータを確認
DT::datatable(df_dist_map_age)

1.3 候補者の平均年齢の地図(静岡)

1.3.1 総選挙の選挙区マップ

  • 静岡県のマップを表示させる
  • チャンクオプションに {r map_dist_shizuoka_age, fig.height=10, fig.width=10} と指定
map_dist_shizuoka_age <- df_dist_map_age %>% 
    filter(str_detect(district, "静岡")) %>% 
    ggplot() +
    geom_sf(aes(fill = age_mean)) +
    scale_fill_distiller(name = "候補者の年齢の平均",
                         palette = "YlOrRd", 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_dist_shizuoka_age

  • 作成したマップを fig に保存する
  • 保存する前に予め Rプロジェクトフォルダに fig という名称のフォルダを作っておく
ggsave("fig/map_dist_shizuoka_age.png", map_dist_shizuoka_age,
       width = 10, height = 10)

1.3.2 マップに衆院選挙区名を表示させる

  • 地図に選挙区名を加えたい → map_dblで座標の重心を設定
map_dist_shizuoka_text <- df_dist_map_age %>% 
    filter(str_detect(district, "静岡")) %>% 
    mutate(
        text_x = map_dbl(geometry, ~st_centroid(.x)[[1]]),
        text_y = map_dbl(geometry, ~st_centroid(.x)[[2]]),
        district = str_remove_all(district, "静岡")
        ) %>% 
    ggplot() +
    geom_sf(aes(fill = age_mean)) +
    geom_label(aes(x = text_x, y = text_y, label = district), 
               size = 5, family = "HiraginoSans-W3") +
    scale_fill_distiller(name = "候補者の年齢の平均",
                         palette = "YlOrRd", 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_dist_shizuoka_text

  • 作成したマップを fig に保存する
ggsave("fig/map_dist_shizuoka_text.png", map_dist_shizuoka_text,
       width = 10, height = 10)

1.3.3 Exercise

Q1: 「1.3.2. マップに衆院選挙区名を表示させる」の手法を参考にして、あなたが興味ある都道府県をひとつ選び、2017年総選挙における「立候補者数 (nocand) 」規模別のマップを描きなさい

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

参考文献