LoginSignup
2
1

More than 3 years have passed since last update.

jpndistrictパッケージで参院再選挙(広島県)の結果を図示する

Posted at

昨日(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")

Hiroshima21_1.png

結果はこんな感じです。青いほど宮内氏のリード幅が大きく、赤いほど西田氏のリード幅が大きい傾向にあります。凡例の数値は(宮内候補の得票 - 西田候補の得票) / 全候補の得票 ×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)) 

Hiroshima21_g2.png

福山市で野党系が1万票程度差を付けてる一方、与党系は呉市で最も差をつけることができたようです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1