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")東京大学空間情報科学研究センター西沢明先生が作成した選挙区の地図データを使用する
「289小選挙区ポリゴン(詳細版)(shape形式)」をクリックしてダウンロードする
ファイルを解凍する
R プロジェクトフォルダの中に shape
という名前を付けたフォルダを作成し、その中に解凍したファイルを全て入れる
Shape ファイルは sf::st_read
で読み込む
次のコマンドをチャンクに打ち込む
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()・衆議院議員総選挙の得票データ 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
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_ageとdf_pref_nameをマージ → 日本語の選挙区名を作成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)df_hr17_age <- df_hr17 %>%
group_by(district) %>%
summarise(age_mean = mean(age, na.rm = T))df_dist_mapとdf_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_age と
df_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)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_agefig に保存するfig
という名称のフォルダを作っておくggsave("fig/map_dist_shizuoka_age.png", map_dist_shizuoka_age,
width = 10, height = 10)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_textfig に保存するggsave("fig/map_dist_shizuoka_text.png", map_dist_shizuoka_text,
width = 10, height = 10)Q1: 「1.3.2.
マップに衆院選挙区名を表示させる」の手法を参考にして、あなたが興味ある都道府県をひとつ選び、2017年総選挙における「立候補者数
(nocand) 」規模別のマップを描きなさい
Q2: 得られた結果からどのようなことが言えるか説明しなさい
参考文献