昨日(2021/4/25)参議院広島選挙区の再選挙がありましたね。この結果を地図に表して見たいので、久しぶりにjpndistrictパッケージを使用して白地図にお絵かきをしたいと思います。
地図の準備
まず、地図の準備から行います。作図はsfパッケージから行います。日本の地図情報のデータはjpdistrictパッケージを使いました。
jpn_pref()
で地図ファイルを読み込んでいます。34は広島県の都道府県コードです。
library(tidyverse)
library(patchwork)
library(sf)
library(jpndistrict)
#sfファイルの読み込み
sf_pref34 <- jpn_pref(34,district = TRUE) #district = TRUEで自治体の境界線が表示
glimpse(sf_pref34)
Rows: 30
Columns: 5
$ pref_code <chr> "34", "34", "34", "34", "34", "34", "34", "34", "34", "34", "34", "34", …
$ prefecture <chr> "広島県", "広島県", "広島県", "広島県", "広島県", "広島県", "広島県", "…
$ city_code <chr> "34101", "34102", "34103", "34104", "34105", "34106", "34107", "34108", …
$ city <chr> "中区", "東区", "南区", "西区", "安佐南区", "安佐北区", "安芸区", "佐伯…
$ geometry <GEOMETRY [°]> MULTIPOLYGON (((132.4333 34..., POLYGON ((132.4746 34.39977...,…
データの準備
次に選挙結果のデータを取り寄せます。残念ながら、選挙管理委員会の提供しているデータ形式はPDFのみだったため、pdftoolsパッケージを使用してpdfを読み込み、その後加工しました。詳しくはこちらの投稿を参考にさせていただきました。
Rでのデータインポートまとめ(csv, Excel, SPSS, Stata, html, pdf)
library(pdftools)
#PDF読み込み
text_pref34 <- pdf_text('https://www.pref.hiroshima.lg.jp/uploaded/attachment/434244.pdf')
#1p目を使用
text_pref34_1 <- text_pref34[[1]]
#データのtibble化
pref34_table_1 <- text_pref34_1 %>%
#\nで分割して行に分ける
str_split('\n') %>%
as_tibble(.name_repair = 'unique') %>%
slice(9:41) %>%
#空白で分割して列に分ける
separate(col = ...1, into = as.character(c(1:10)), sep = '\\s+') %>%
slice(-c(9,23,33))
#広島市のみ
pref34_table_1_1 <- pref34_table_1[1:8,]
pref34_table_1_1 <- pref34_table_1_1 %>% select(-`1`)
colnames(pref34_table_1_1) <- c("city","miyaguchi","sato","oyama","tamada","nishida","yamamoto","rate")
#広島市以外
pref34_table_1_2 <- pref34_table_1[-c(1:8),]
pref34_table_1_2 <- pref34_table_1_2 %>% select(-`10`)
colnames(pref34_table_1_2) <- c("city","miyaguchi","sato","oyama","tamada","nishida","yamamoto","rate")
#統合
pref34_table_2 <- rbind(pref34_table_1_1,pref34_table_1_2)
一応これで表形式になったため、次に表の中の変数を加工します。
各候補の得票をnumericに変換し、(宮内候補の得票 - 西田候補の得票) / 全候補の得票
という変数を作成しました。(おそらくmutate_at
などを使用すればよりシンプルにかけたはずです)
#各候補の得票をnumericに変換
pref34_table_2 <- pref34_table_2 %>% mutate(miyaguchi = str_replace_all(miyaguchi, pattern = ",", replacement = "") %>% as.numeric(.),
nishida = str_replace_all(nishida, pattern = ",", replacement = "") %>% as.numeric(.),
sato = str_replace_all(sato, pattern = ",", replacement = "") %>% as.numeric(.),
tamada = str_replace_all(tamada, pattern = ",", replacement = "") %>% as.numeric(.),
yamamoto = str_replace_all(yamamoto, pattern = ",", replacement = "") %>% as.numeric(.)) %>%
mutate(Miyaguchi_nishida = miyaguchi - nishida, #得票差変数作成
Margin_lead = Miyaguchi_nishida / (miyaguchi + nishida + oyama + sato + tamada + yamamoto) * 100) #宮内候補のリードポイントの変数作成
データの統合
2つのデータができたため、その2つを統合します。
まず、自治体名を使ってsfデータと選挙結果データを統合するため、sfデータのcity変数を選挙結果データのcity変数と合わせる作業をします。
(郡の方はできれば正規表現使った方すっきりしますね)
sf_pref34 <- sf_pref34 %>% mutate(city = str_replace_all(city, pattern = "広島市 ",""), #広島市〜区の「広島市」を削除
city = str_replace_all(city, pattern = "(安芸郡 |山県郡 |豊田郡 |世羅郡 |神石郡 )","")) #〜郡を削除
次に、2つのデータを統合します。
sf_hiroshima_21 <- full_join(sf_pref34,pref34_table_2, by = "city")
これで一応データは完成です。
##お絵かき
最後にggplotを使用してお絵かきをしました。
sf_hiroshima_21 %>%
ggplot() +
geom_sf(aes(fill = Margin_lead),color = NA) + #sfのプロット
scale_fill_gradient2("Margin of lead(pt) \n",low = "red",high = "blue",midpoint = 0) + #青が高い数字、赤が低い数字になるように塗り分け
labs(title = "2021年参院広島再選挙得票率差(pt)", subtitle = "青:野党系リード 赤:与党系リード") +
theme_bw(base_family = "HiraKakuProN-W3")
結果はこんな感じです。青いほど宮内氏のリード幅が大きく、赤いほど西田氏のリード幅が大きい傾向にあります。凡例の数値は(宮内候補の得票 - 西田候補の得票) / 全候補の得票 ×100
を票わしています。
今回の選挙では西南の自治体で与党系の候補(西田氏)が優勢だったのに対し、野党系の候補(宮内氏)は東部で優勢だったことがわかります。全体的に青系が多いことからも、広範な地域で宮内氏が票差を稼いだようです。
おしまい
今回は使用しませんでしたが、選挙区の境界線をこの図に追加しても面白いなと思いました。別のパッケージで対応可能だったはずなので、今度やって見たいです。
おまけ
今回作ったデータをもとに、別のグラフも作ってみました。円の大きさと円の横の数字は(宮内候補の得票 - 西田候補の得票)
を表しています。
#Margin_leadが0以上かどうかのダミー変数
pref34_table_2 <- pref34_table_2 %>% mutate(miyauchi_lead = if_else(Margin_lead > 0, "野党系リード","与党系リード" ))
pref34_table_2 %>%
ggplot(aes(y = reorder(city,Margin_lead), x = Margin_lead)) +
geom_point(aes(size = abs(Miyaguchi_nishida) , colour = miyauchi_lead)) +
#文字のラベル
geom_text(aes(label = Miyaguchi_nishida),
hjust = -0.25) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(title = "2021年参院広島再選挙得票率差(pt)",
subtitle = "円横の数字は得票数差(人)",
x = "得票率差(pt)", y = "" , size = "", color = "") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(text = element_text(size = 30))
福山市で野党系が1万票程度差を付けてる一方、与党系は呉市で最も差をつけることができたようです。