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

昨日（2021/4/25）参議院[広島選挙区の再選挙](https://www.nhk.or.jp/senkyo2/hiroshima/17370/skh50038.html)がありましたね。この結果を地図に表して見たいので、久しぶりに**jpndistrict**パッケージを使用して白地図にお絵かきをしたいと思います。

## 地図の準備
まず、地図の準備から行います。作図は**sf**パッケージから行います。日本の地図情報のデータは[jpdistrictパッケージ](https://www.rdocumentation.org/packages/jpndistrict/versions/0.2.0)を使いました。
`jpn_pref（）`で地図ファイルを読み込んでいます。34は広島県の都道府県コードです。

```R
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）](https://qiita.com/Sickle-Sword/items/32d8c6e10ef477a64ff1)

```R
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`などを使用すればよりシンプルにかけたはずです）


```R
#各候補の得票を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変数と合わせる作業をします。
（郡の方はできれば正規表現使った方すっきりしますね）

```R
sf_pref34 <- sf_pref34 %>% mutate(city = str_replace_all(city, pattern = "広島市 ",""), #広島市〜区の「広島市」を削除
                     city = str_replace_all(city, pattern = "(安芸郡 |山県郡 |豊田郡 |世羅郡 |神石郡 )","")) #〜郡を削除

```

次に、2つのデータを統合します。

```R
sf_hiroshima_21 <- full_join(sf_pref34,pref34_table_2, by = "city")
```

これで一応データは完成です。

##お絵かき

最後にggplotを使用してお絵かきをしました。

```R
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861475/d4a821dd-3552-731d-8e79-be9d15551be6.png)


結果はこんな感じです。青いほど宮内氏のリード幅が大きく、赤いほど西田氏のリード幅が大きい傾向にあります。凡例の数値は`（宮内候補の得票 - 西田候補の得票） / 全候補の得票 ×100`を票わしています。
今回の選挙では西南の自治体で与党系の候補（西田氏）が優勢だったのに対し、野党系の候補（宮内氏）は東部で優勢だったことがわかります。全体的に青系が多いことからも、広範な地域で宮内氏が票差を稼いだようです。

## おしまい
今回は使用しませんでしたが、選挙区の境界線をこの図に追加しても面白いなと思いました。別のパッケージで対応可能だったはずなので、今度やって見たいです。

## おまけ
今回作ったデータをもとに、別のグラフも作ってみました。円の大きさと円の横の数字は`（宮内候補の得票 - 西田候補の得票）`を表しています。

```R

#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861475/88468251-934e-92b5-ea01-670a29d77b1e.png)


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