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")
::install_github("uribo/jpndistrict") devtools
東京大学空間情報科学研究センター西沢明先生が作成した選挙区の地図データを使用する
「289小選挙区ポリゴン(詳細版)(shape形式)」をクリックしてダウンロードする
ファイルを解凍する
R プロジェクトフォルダの中に shape
という名前を付けたフォルダを作成し、その中に解凍したファイルを全て入れる
Shape
ファイルは sf::st_read
で読み込む
次のコマンドをチャンクに打ち込む
<- st_read("shp/senkyoku289polygon.shp",
df_dist_map 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) %>%
::paged_table() rmarkdown
・衆議院議員総選挙の得票データ 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_hr %>%
df_age ::select(year, ku, kun, age) dplyr
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
を使って日本語の都道府県名を取得する
<- jpndistrict::jpnprefs %>%
df_pref_name 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_hr %>%
df_hr17 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
) に変更する$age <- as.numeric(df_hr17$age) df_hr17
<- df_hr17 %>%
df_hr17_age 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)%>%
::paged_table() rmarkdown
district
)
を手がかりにしてマージする<- df_dist_map %>%
df_dist_map_age left_join(df_hr17_age, by = "district") %>%
st_as_sf()
::datatable(df_dist_map_age) DT
<- df_dist_map_age %>%
map_dist_shizuoka_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
に保存するfig
という名称のフォルダを作っておくggsave("fig/map_dist_shizuoka_age.png", map_dist_shizuoka_age,
width = 10, height = 10)
map_dbl
で座標の重心を設定<- df_dist_map_age %>%
map_dist_shizuoka_text 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)
Q1: 「1.3.2.
マップに衆院選挙区名を表示させる」の手法を参考にして、あなたが興味ある都道府県をひとつ選び、2017年総選挙における「立候補者数
(nocand
) 」規模別のマップを描きなさい
Q2: 得られた結果からどのようなことが言えるか説明しなさい
参考文献