• このセクションで使っている packages
library(DT)
library(plyr)
library(reactable)
library(tidyverse)
  • グラフの設定 (Macユーザのみ)
  • ggplot を使ったグラフの中に日本語を表記させるためのコマンド
  • ggplot でグラフの背景を白に指定したい場合
theme_set(theme_bw(base_size = 10,
                        base_family = "HiraginoSans-W3"))
  • ggplot でグラフの背景をグレーに指定したい場合
theme_set(theme_gray(base_size = 10,
                     base_family = "HiraginoSans-W3")) 
  • グラフの中で日本語を表示させたい場合
theme_set(theme_bw(base_size = 10, base_family = "HiraginoSans-W3"))

1. データの準備 (hr96-24.csv)

1.1 データのダウンロード方法

予めダウンロード先を指定する方法

  • RProject フォルダ内に data という名称のフォルダを作成する
  • 下のコマンドを実行すると、csv ファイルがパソコンにダウンロードされ、data 内に自動的に保存される
download.file(url = "https://asanoucla.github.io/hr96-24.csv",
              destfile = "data/hr96-24.csv")

注意:一度ダウンロードを完了すれば、このコマンドを実行する必要はありません

ダウンロード先を指定しない方法

  • hr96-24.csv をクリックしてデータをパソコンにダウンロード  

  • RProject フォルダ内に data という名称のフォルダを作成する

  • ダウンロードした hr96-24.csv を手動でRProject フォルダ内にある data フォルダに入れる

1.2 選挙データの読み取り方法

  • 次のいずれかの方法で hr96-24.csv を読み取る
読み取り方法 1
  • na = "."というコマンドは「欠損値をドットで置き換える」という意味
  • 欠損値を空欄のまま残すと、本来「数値 (numeric)」型のデータが「」文字型 (character)」として認識されるなど、エラーの原因になるため、読み取る時点で事前に対処する
hr <- read_csv("data/hr96-24.csv",
               na = ".")  
読み取り方法 2
  • 読み取った値の日本語が文字化けする場合
  • locale()関数を使って日本語エンコーディング (cp932) を指定する
hr <- read_csv("data/hr96-24.csv",
               na = ".",
               locale = locale(encoding = "cp932"))
読み取り方法 3
hr <- read.csv("data/hr96-24.csv",
               na = ".")  

1.3 読み取った選挙データを確認

  • hr96_21.csv は1996年に衆院選挙に小選挙区が導入されて以来実施された 9 回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017, 2024, 2024)の結果のデータ
  • hr に含まれる変数名を表示させる
names(hr)
 [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"
  • df1 には 22 個の変数が入っている
変数名 詳細
year 選挙年 (1996-2024)
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 世襲元の政治家の氏名と関係
  • データの型をチェック
str(hr)
spc_tbl_ [10,773 × 22] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ year         : num [1:10773] 1996 1996 1996 1996 1996 ...
 $ pref         : chr [1:10773] "愛知" "愛知" "愛知" "愛知" ...
 $ ku           : chr [1:10773] "aichi" "aichi" "aichi" "aichi" ...
 $ kun          : num [1:10773] 1 1 1 1 1 1 1 2 2 2 ...
 $ wl           : num [1:10773] 1 0 0 0 0 0 0 1 0 2 ...
 $ rank         : num [1:10773] 1 2 3 4 5 6 7 1 2 3 ...
 $ nocand       : num [1:10773] 7 7 7 7 7 7 7 8 8 8 ...
 $ seito        : chr [1:10773] "新進" "自民" "民主" "共産" ...
 $ j_name       : chr [1:10773] "河村たかし" "今枝敬雄" "佐藤泰介" "岩中美保子" ...
 $ gender       : chr [1:10773] "male" "male" "male" "female" ...
 $ name         : chr [1:10773] "KAWAMURA, TAKASHI" "IMAEDA, NORIO" "SATO, TAISUKE" "IWANAKA, MIHOKO" ...
 $ previous     : num [1:10773] 2 2 2 0 0 0 0 2 0 0 ...
 $ age          : num [1:10773] 47 72 53 43 51 51 45 51 71 30 ...
 $ exp          : num [1:10773] 9828097 9311555 9231284 2177203 NA ...
 $ status       : num [1:10773] 1 2 1 0 0 0 0 1 2 0 ...
 $ vote         : num [1:10773] 66876 42969 33503 22209 616 ...
 $ voteshare    : num [1:10773] 40 25.7 20.1 13.3 0.4 0.3 0.2 32.9 26.4 25.7 ...
 $ eligible     : num [1:10773] 346774 346774 346774 346774 346774 ...
 $ turnout      : num [1:10773] 49.2 49.2 49.2 49.2 49.2 49.2 49.2 51.8 51.8 51.8 ...
 $ seshu_dummy  : num [1:10773] 0 0 0 0 0 0 0 0 1 0 ...
 $ jiban_seshu  : chr [1:10773] NA NA NA NA ...
 $ nojiban_seshu: chr [1:10773] NA NA NA NA ...
 - attr(*, "spec")=
  .. cols(
  ..   year = col_double(),
  ..   pref = col_character(),
  ..   ku = col_character(),
  ..   kun = col_double(),
  ..   wl = col_double(),
  ..   rank = col_double(),
  ..   nocand = col_double(),
  ..   seito = col_character(),
  ..   j_name = col_character(),
  ..   gender = col_character(),
  ..   name = col_character(),
  ..   previous = col_double(),
  ..   age = col_double(),
  ..   exp = col_double(),
  ..   status = col_double(),
  ..   vote = col_double(),
  ..   voteshare = col_double(),
  ..   eligible = col_number(),
  ..   turnout = col_double(),
  ..   seshu_dummy = col_double(),
  ..   jiban_seshu = col_character(),
  ..   nojiban_seshu = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 
  • 数値は numeric 文字は character として認識されていることがわかる

2. 投票率の分析

  • 1996年〜2024年総選挙の投票率の推移を棒グラフで表示させる

  • reactable:reactable()関数だと複数の条件での検索が可能

reactable::reactable(hr,
  filterable = TRUE,  # 検索可能に設定
  defaultPageSize = 10) # 表示行数の限界を指定  
  • 選挙年ごとの投票率(turnout) の平均 (mean.turnout) を計算する
  • 投票率は「選挙区単位」の数値なので、選挙年ごとに各小選挙区の平均を計算する
df1 <- hr |> 
  filter(rank == 1) |> 
  group_by(year) |> 
  summarise(mean.turnout = mean(turnout)) |> 
  round(digits = 1)
head(df1)
# A tibble: 6 × 2
   year mean.turnout
  <dbl>        <dbl>
1  1996         60.3
2  2000         63.1
3  2003         60.2
4  2005         67.8
5  2009         69.6
6  2012         59.4

str() 関数を使って欠測値を確認

str(df1)
tibble [10 × 2] (S3: tbl_df/tbl/data.frame)
 $ year        : num [1:10] 1996 2000 2003 2005 2009 ...
 $ mean.turnout: num [1:10] 60.3 63.1 60.2 67.8 69.6 59.4 52.7 53.9 56.1 53.9

・2014年と2017年総選挙における投票率が欠測 (NA) している
na.omit()関数を使って欠測のない観測だけを残す

df1 <- na.omit(df1)

・1996年から2024年総選挙における投票率の平均を計算する

mean(df1$mean.turnout)
[1] 59.7
df1 %>% 
  ggplot(aes(x = year, y = mean.turnout)) + 
  geom_point() +
  geom_line() +
  ggtitle("総選挙の投票率: 1996-2024") +
  geom_text(aes(y = mean.turnout + 0.5, label = mean.turnout), size = 3, vjust = 0) +
  geom_text(label = "平均投票率: 59.7%",
            x = 2007, y = 61, family = "HiraginoSans-W3", color = "tomato", size = 3) +
  geom_hline(yintercept = mean(df1$mean.turnout), # 投票率の平均に線を引く
             col = "tomato", 
             linetype = "dotted",
             size = 1) +
  labs(x = "総選挙年", y = "投票率(%)") 

3. 得票率の分析

3.1 自民党と民主党(立憲民主党)の得票率の推移

  • データフレーム hr を使って自民党と民主党候補者それぞれの得票率を選挙ごとに計算
  • ddply() 使うためのパケージをロードする
library(plyr)
vs_ldp_dpj <- hr %>% 
  filter(seito == "自民" | seito == "民主" | seito == "立憲") %>%  # 自民と民主だけを選ぶ  
  plyr::ddply(.(year, seito), summarize,  # 選挙年- 政党ごとに得票率の平均を計算
                mean.vs = mean(voteshare, na.rm = TRUE)) 
  • 計算した結果を表示
vs_ldp_dpj$mean.vs <- round(vs_ldp_dpj$mean.vs, 
                            digits = 1)        # 小数点 1 位まで表示  
head(vs_ldp_dpj)
  year seito mean.vs
1 1996  民主    22.1
2 1996  自民    40.9
3 2000  民主    33.6
4 2000  自民    46.2
5 2003  民主    40.5
6 2003  自民    48.1
  • 自民党と民主党(立憲民主党)の得票率を1996年から2024まで表示
f1 <- vs_ldp_dpj %>% 
  ggplot(aes(x = year, y = mean.vs, 
                         color = seito, linetype = seito, shape = seito)) +
  geom_point() +
  geom_line() +
  geom_text(aes(y = mean.vs + 0.5, label = mean.vs), size = 4, vjust = 0) +
  ggtitle("自民党、民主党(立憲民主党)候補者の平均得票率: 1996-2024年衆院選") +
  labs(x = "総選挙年", y = "得票率") +
  theme(legend.position = c(0.93, 0.2)) 
f1

・自民党と民主党(立憲民主党)それぞれの得票率の記述統計を示してみる

summary_by_party <- vs_ldp_dpj %>% 
  group_by(seito) %>% 
  summarise(mean_vs = mean(mean.vs),
            count = n())
summary_by_party
# A tibble: 3 × 3
  seito mean_vs count
  <chr>   <dbl> <int>
1 民主     35.3     7
2 立憲     38       3
3 自民     46.6    10
解釈 ・2009年総選挙を除き、民主党(立憲民主党)候補者より自民党候補者の方が平均得票率が高い
・自民党候補者の平均得票率は 46.6%、民主党候補者の得票率は 35.3%、立憲民主党の得票率は38%

・グラフを fig フォルダvs_ldp_dpj.png という名前を付けて保存(任意のサイズに指定できる)

ggsave(filename = "fig/vs_ldp_dpj.png", 
       width = 10, height = 7, units = "cm")

3.2 Exercise

  • 1996年から2024年衆議院における、公明党と共産党の小選挙区での選挙結果(候補者の得票率平均)の履歴を「それぞれ」折れ線グラフで表示しなさい

3.3 特定の候補者の得票率の可視化

3.3.1 高市早苗氏の得票率

  • データフレーム hr を使って高市早苗氏のこれまでの選挙結果の履歴を表示してみよう
  • データフレーム hr に含まれる変数を表示させる
names(hr)
 [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"
  • 分析に必要な変数を filter() 関数を使って取り出し、sanae と名前を付ける
sanae <- hr %>%
  filter(name == "TAKAICHI, SANAE") %>%
  select(year, pref, kun, seito, age, nocand, rank, previous, vote, voteshare)
  • DTパッケージの datatable 関数を使うと、インターアクティブなデータの記述統計を表示できる
DT::datatable(sanae)
  • 高市早苗氏の得票率の平均は
mean(sanae$voteshare) # voteshare の平均値
[1] 50.97667

高市早苗氏の得票率を1996年から2024年まで表示する

ggplot(sanae, aes(x = year, y = voteshare)) + 
  geom_point() +
  geom_line() +
  ggtitle("高市早苗氏の得票率: 1996-2024衆院選") +
  geom_hline(yintercept = mean(sanae$voteshare), # 安倍氏の得票率の平均に線を引く
             col = "tomato", 
             linetype = "dotted",
             size = 1) +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  geom_text(label = "平均得票率: 71.15%",
            x = 2014, y = 72, family = "HiraginoSans-W3", color = "tomato", size = 3) +
  labs(x = "総選挙年", y = "得票率(%)") 

3.3.2 石破茂氏の得票率

  • データフレーム hr を使って石破茂氏のこれまでの選挙結果の履歴を表示してみよう
  • まず、必要なデータセットを filter() 関数を使って取り出し、shigeru と名前を付ける
shigeru <- hr %>% 
  filter(name == "ISHIBA, SHIGERU") %>%
  select(year, pref, kun, seito, age, nocand, rank, previous, vote, voteshare)
  • DTパッケージの datatable 関数を使うと、インターアクティブなデータの記述統計を表示できる
DT::datatable(shigeru)
  • 石破茂氏の得票率の平均は
mean(shigeru$voteshare) # voteshare の平均値
[1] 72.205
  • 石破茂氏の得票率を1996年から2024まで表示する
ggplot(shigeru, aes(x = year, y = voteshare)) + 
  geom_point() +
  geom_line() +
  ggtitle("石破茂氏の得票率: 1996-2024衆院選") +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  geom_text(label = "平均得票率: 72.205%",
            x = 2014, y = 74, family = "HiraginoSans-W3", color = "blue", size = 3) +
  geom_hline(yintercept = mean(shigeru$voteshare), # 石破氏の得票率の平均に線を引く
             col = "blue", 
             linetype = "dotted",
             size = 1) +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  labs(x = "総選挙年", y = "得票率(%)") 

3.3.3 Exercise

  • 1996年から2024年衆議院における、小泉進次郎氏と河野太郎氏の選挙結果(得票率)の履歴をそれぞれ折れ線グラフで表示しなさい

3.3.4 高市早苗氏と石破茂氏の得票率

  • 高市早苗氏と石破茂氏の得票率を1996年から2024まで表示してみよう
  • まず、必要なデータセットを filter() 関数を使って取り出し、sanae_geru と名前を付ける
sanae_geru <- hr %>%
  filter(name == "ISHIBA, SHIGERU" | name == "TAKAICHI, SANAE") %>%
  select(year, pref, kun, seito, j_name, age, nocand, rank, previous, vote, voteshare)
  • DTパッケージの datatable 関数を使うと、インターアクティブなデータの記述統計を表示できる
DT::datatable(sanae_geru)
  • 高市早苗氏と石破茂氏の得票率を1996年から2024まで表示する
vs_sanae_geru <- ggplot(data = sanae_geru, aes(x = year, y = voteshare, colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("高市早苗氏と石破茂氏の得票率: 1996-2024衆院選") +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  theme(legend.position = c(0.85, 0.75)) +
  labs(x = "総選挙年", y = "得票率(%)") 

vs_sanae_geru

解釈 ・石破茂氏と高市早苗氏の選挙における得票率には21.2%ポイントの差がある

sanae_geru |> 
  group_by(j_name) |> 
  summarise(ave_vs = mean(voteshare))
# A tibble: 2 × 2
  j_name   ave_vs
  <chr>     <dbl>
1 石破茂     72.2
2 高市早苗   51.0

3.3.5 Exercise

1996年から2024年衆議院における、小泉進次郎氏と河野太郎氏の選挙結果(得票率)の履歴を折れ線グラフで「同時に」表示しなさい
その際、小泉氏、河野氏それぞれの得票率の平均を点線で示しなさい

3.3.6 得票率の高い候補者は誰?

dplyr::arrange(desc())
- 得票率の高い候補者順に並べる(=降順 (descending)
- 得票率の高い順にソートする → 得票率が欠損でないことが必要
- 表示する変数を指定 → 選挙年、選挙区名、政党名、年齢、氏名、票数、得票率

hr %>%
  filter(!is.na(voteshare)) %>%     # 欠損のある投票率を除外 
  arrange(desc(voteshare)) %>%      # 得票率を大きい順に並べる   
  select(year, pref, seito, age, j_name, wl, vote, voteshare) %>%
  print(n = 20)                        # 全て表示したければ n = inf と指定
# A tibble: 10,773 × 8
    year pref   seito    age j_name        wl   vote voteshare
   <dbl> <chr>  <chr>  <dbl> <chr>      <dbl>  <dbl>     <dbl>
 1  2009 栃木   みんな    57 渡辺喜美       1 142482      95.3
 2  2003 愛知   民主      38 古本伸一郎     1 181747      89.6
 3  2017 宮城   自民      57 小野寺五典     1 123871      85.7
 4  2024 鳥取   自民      67 石破茂         1 106670      85.2
 5  1996 富山   自民      42 住博司         1 126734      84.8
 6  2012 鳥取   自民      55 石破茂         1 124746      84.5
 7  2021 鳥取   自民      64 石破茂         1 105441      84.1
 8  2000 愛媛   自民      52 山本公一       1 142982      83.6
 9  2017 鳥取   自民      60 石破茂         1 106425      83.6
10  1996 栃木   自民      44 渡辺喜美       1  90082      83.4
11  2000 茨城   自民      44 梶山弘志       1 139817      83.4
12  2000 栃木   自民      48 渡辺喜美       1 112358      83.4
13  2014 神奈川 自民      33 小泉進次郎     1 168953      83.3
14  2021 宮城   自民      61 小野寺五典     1 119555      83.2
15  2012 鹿児島 自民      67 森山裕         1 107933      83.1
16  2003 佐賀   自民      56 今村雅弘       1 107522      82.4
17  2012 宮崎   自民      47 古川禎久       1 119174      81.8
18  2014 富山   自民      53 橘慶一郎       1 138991      81.2
19  2021 広島   自民      64 岸田文雄       1 133704      80.7
20  2021 宮崎   自民      56 古川禎久       1 111845      80.7
# ℹ 10,753 more rows
  • 渡辺喜美氏の得票率は 95.3%!!

渡辺喜美氏はずっと高い得票率なのか?

  • 渡辺喜美氏のこれまでの選挙結果の履歴を表示してみる
  • 分析に必要な変数を filter() 関数を使って取り出し yoshimi と名前を付ける
yoshimi <- hr %>% 
  filter(j_name == "渡辺喜美") %>% 
  select(year, pref, kun, seito, wl, nocand, age, previous, vote, voteshare)
  • DTパッケージの datatable 関数を使うと、インターアクティブなデータの記述統計を表示できる
DT::datatable(yoshimi)
  • 渡辺喜美氏の得票率の平均は
mean(yoshimi$voteshare) # voteshare の平均値
[1] 71.62857
  • 渡辺喜美氏の得票率を1996年から2024年まで可視化してみる
  • マックユーザーはグラフ中で日本語を表示できるよう次のコマンドも実行
theme_set(theme_classic(base_size = 10,
                        base_family = "HiraginoSans-W3"))
ggplot(yoshimi, aes(x = year, y = voteshare)) + 
  geom_point() +
  geom_line() +
  ggtitle("渡辺喜美氏の得票率: 1996-2014衆院選") +
  geom_hline(yintercept = mean(yoshimi$voteshare), # 渡辺氏の得票率の平均に線を引く
             col = "tomato", 
             linetype = "dotted",
             size = 1) +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  geom_text(label = "平均得票率: 71.6%",
            x = 2000, y = 73, family = "HiraginoSans-W3", color = "tomato", size = 3) +
  geom_text(aes(y = voteshare + 1, label = voteshare), size = 4, vjust = 0) +
  labs(x = "総選挙年", y = "得票率(%)") 

なぜ渡辺喜美氏は95%も得票したのか?

「第45回衆議院議員総選挙にはみんなの党公認で栃木3区から出馬し、5選 当初、自民党は栃木3区に元法務大臣の森山眞弓を擁立する方向で調整していたが、自民党栃木県連の反対により撤回し、公明党も候補者を擁立しない与党空白区となった 栃木3区は日本共産党も候補を擁立しない共産空白区となり、他に候補が立候補する気配を見せなかったため、戦後衆議院選挙初の無投票当選の可能性があったが、幸福実現党の斎藤克巳が立候補したため無投票当選とはならなかった 選挙結果は渡辺が14万2482票- 得票率95.3%で圧勝 渡辺の得票率は、小選挙区制導入後現在に至るまでの最高記録である (ウィキペディアの記事からの引用)

  • では、2009年総選挙における栃木3区の選挙情報を表示してみよう
yoshimi_2009 <- hr %>% 
  filter(year == 2009,
         pref == "栃木",
         kun == 3) %>% 
  select(year, pref, kun, seito, nocand, j_name, age, vote, voteshare)

yoshimi_2009
# A tibble: 2 × 9
   year pref    kun seito  nocand j_name     age   vote voteshare
  <dbl> <chr> <dbl> <chr>   <dbl> <chr>    <dbl>  <dbl>     <dbl>
1  2009 栃木      3 みんな      2 渡辺喜美    57 142482      95.3
2  2009 栃木      3 幸福        2 斎藤克巳    53   7024       4.7

2014年総選挙での渡辺喜美氏は?
「2014年に、後述の8億円借入問題が発生し、4月にみんなの党の代表の辞任を余儀なくされる これを契機にみんなの党は離党者が相次ぐなど、内部対立が激しくなり、第47回衆議院議員総選挙を前に解党に至る 渡辺本人は無所属で出馬するも、落選した 」(上記ウィキペディアの記事からの引用)

  • 2014年総選挙における栃木3区の選挙情報を表示してみる
yoshimi_2014 <- hr %>% 
  filter(year == 2014,
         pref == "栃木",
         kun == 3) %>% 
  select(year, pref, kun, seito, nocand, j_name, age, vote, voteshare)

yoshimi_2014
# A tibble: 3 × 9
   year pref    kun seito nocand j_name     age  vote voteshare
  <dbl> <chr> <dbl> <chr>  <dbl> <chr>    <dbl> <dbl>     <dbl>
1  2014 栃木      3 自民       3 簗和生      35 62814      48.7
2  2014 栃木      3 無所       3 渡辺喜美    62 51627      40.1
3  2014 栃木      3 共産       3 秋山幸子    63 14438      11.2

その後の渡辺喜美氏は?

「2017年10月の第48回衆議院議員総選挙が間近に迫った同年9月に小池百合子による希望の党の設立に影の存在として関わり、衆議院栃木3区へのくら替え出馬に意欲を示していたが、小池側の要請で出馬断念し、代わりに妹の渡辺美由紀を栃木3区から希望の党候補として擁立したが落選 その後、「当面は無所属議員として仕事をやらせてもらう」と述べ、希望の党に参加しない意向を明らかにした 11月1日の首班指名選挙では高市早苗に投票した 」(上記ウィキペディアの記事からの引用)

  • 2017年総選挙における栃木3区の選挙情報を表示してみる
yoshimi_2017 <- hr %>% 
  filter(year == 2017,
         pref == "栃木",
         kun == 3) %>% 
  select(year, pref, kun, seito, nocand, j_name, age, vote, voteshare)

yoshimi_2017
# A tibble: 4 × 9
   year pref    kun seito nocand j_name       age  vote voteshare
  <dbl> <chr> <dbl> <chr>  <dbl> <chr>      <dbl> <dbl>     <dbl>
1  2017 栃木      3 自民       4 簗和生        38 74371      57.8
2  2017 栃木      3 希望       4 渡辺美由紀    58 42820      33.3
3  2017 栃木      3 共産       4 槙昌三        74  9990       7.8
4  2017 栃木      3 緒派       4 石渡剛        48  1561       1.2

4. 選挙費用の分析

4.1 選挙費用(小選挙区別平均)

最も選挙費用を費やしている小選挙区は?

  • 衆院選挙データフレーム(hr)から2012年のデータだけを抜き出して hr2012 と名前をつける
hr2012 <- hr %>% 
  dplyr::filter(year == 2012) %>% 
  dplyr::select(exp, pref, ku, kun)
  • DTパッケージの datatable 関数を使うと、インターアクティブなデータの記述統計を表示できる
DT::datatable(hr2012)
  • 2012年衆議院選挙の小選挙区は全部で 300、立候補者は1,294人
  • 候補者一人一人が選挙で使った選挙費用 (exp) を総務省に報告

「小選挙区別」に候補者が使った選挙費用の平均を計算したい

  • 小選挙区ごとに候補者数 (nocand) が異なるため、エクセルでは計算が大変(^_^;)
変数一覧

変数一覧

  • Rだと簡単に計算できる
  • データフレーム hr2012 にある変数名を表示する
names(hr2012)
[1] "exp"  "pref" "ku"   "kun" 
  • exp のクラスをチェックする
str(hr2012$exp)
 num [1:1294] 15215857 3864350 11853832 1220570 7592182 ...
  • exp のクラスが numeric だと確認できた

exp の型が numeric 以外なら(例えば character なら)

csvファイルを開いて、exp に数値以外の文字などが入っていないかどうか確かめ、入っていたらそれらを数値に修正するか「.」(もしくは「NA」)と入力する

exp の値が全て数値だけなら、次の方法で numeric に変更する

hr2012$exp <- as.numeric(hr2012$exp)
  • exp の型が character から numeric に変更されたことを確認すること
str(hr2012$exp)
 num [1:1294] 15215857 3864350 11853832 1220570 7592182 ...
  • 衆議院の小選挙区は「愛知 1」のように「都道府県名 (pref)」と「小選挙区番号 (kun)」から構成
  • plyr::ddply() 関数を使って、小選挙区ごとに候補者の選挙費用 (exp) の平均値を計算し mean.exp.smd12 と変数名を付ける
  • データフレームの名前を df_12_ と指定
df_12 <- hr2012 %>% 
   group_by(ku, kun) %>% 
  summarize(mean.exp.smd12 = mean(exp, na.rm = TRUE), 
            .groups = "drop")
  • mean.exp.smmd12 の値の小数点第 1 位を切り上げて表示
df_12$mean.exp.smd12 <- round(df_12$mean.exp.smd12,
                              digits = 0)           
DT::datatable(df_12)
  • 小選挙区ごとに候補者の選挙費用の平均値 (mean.exp.smd12) の記述統計を表示
summary(df_12$mean.exp.smd12)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
 1555688  4737474  5611496  5860720  6811150 14068155 
  • 2012年衆院選で報告された候補者の選挙区ごとの選挙費用平均額 (mean.exp.12) をヒストグラムで描いてみる
hist(df_12$mean.exp.smd12)

4.2 選挙費用(総選挙別)

総選挙の選挙費用額は増えているのか?

  • 総選挙において候補者が総務省に届け出る選挙費用の、総選挙ごとの推移を可視化

exp: 立候補者が使う選挙費用額

df_exp <- plyr::ddply(hr, .(year), summarize,
        mean.exp = mean(exp, na.rm = TRUE)) %>% 
  round(digits = 0)
head(df_exp)
  year mean.exp
1 1996  9136316
2 2000  8388889
3 2003  7935408
4 2005  8142244
5 2009  6118181
6 2012  5769988
  • na.omit() 関数を使って非数値や欠測値以外の観測値だけを残す
df_exp <- na.omit(df_exp)
mean(df_exp$mean.exp)
[1] 7087435
ggplot(df_exp, aes(x = year, y = mean.exp)) + 
  geom_point() +
  geom_line() +
  ggtitle("立候補者が使う選挙費用平均額: 1996-2024") +
  geom_hline(yintercept = mean(df_exp$mean.exp), # 平均に線を引く
             col = "tomato", 
             linetype = "dotted",
             size = 1) +
  geom_text(label = "平均選挙費用: 約709万円",
            x = 2000, y = 7200000, family = "HiraginoSans-W3", color = "tomato", size = 3) +

  geom_text(aes(y = mean.exp + 200000, label = mean.exp), size = 3, vjust = 0) +
  labs(x = "総選挙年", y = "選挙費用額(円)") 

解釈 ・1995年から2012年の総選挙まで選挙費用額が減少
・2012年以降、選挙費用が徐々に増加

exppv: 一人あたりの有権者に費やす選挙費用額

  • 立候補者が有権者一人あたりに使う選挙費用 (exppv) を作る
hr <- hr %>% 
  mutate(exppv = exp/eligible) # eligible は小選挙区ごとの有権者数  
df_exppv <- plyr::ddply(hr, .(year), summarize,
        mean.exppv = mean(exppv, na.rm = TRUE)) %>% 
  round(digits = 0)
head(df_exppv)
  year mean.exppv
1 1996         29
2 2000         26
3 2003         24
4 2005         25
5 2009         18
6 2012         17

・2012年総選挙における mean.exppv が非数値 (NaN)

  • NaN (Not a Number): 計算不可能な式の結果(= 非数値)
  • NA (Not Available):本来データが存在しているが、何らかの理由でデータが存在していない(= 欠測値)
    na.omit() 関数を使って非数値や欠測値以外の観測値だけを残す
df_exppv <- na.omit(df_exppv)
mean(df_exppv$mean.exppv)
[1] 21.22222
ggplot(df_exppv, aes(x = year, y = mean.exppv)) + 
  geom_point() +
  geom_line() +
  ggtitle("有権者一人あたりの選挙費用平均額: 1996-2009") +
  geom_hline(yintercept = mean(df_exppv$mean.exppv), # 平均に線を引く
             col = "tomato", 
             linetype = "dotted",
             size = 1) +
  geom_text(label = "平均選挙費用: 21.2円",
            x = 1999, y = 22, family = "HiraginoSans-W3", color = "tomato", size = 3) +
  geom_text(aes(y = mean.exppv + 0.5, label = mean.exppv), size = 4, vjust = 0) +
  labs(x = "総選挙年", y = "有権者一人あたりの選挙費用額(円)") 
解釈 ・1995年から2017年の総選挙まで一人当たり選挙費用額が減少(2024年総選挙の選挙費用はまだ公開されない)
・2021年に一人当たり選挙費用が少し増加

4.3 選挙費用(候補者別)

誰が多額の選挙費用を使っているのか?
dplyr::arrange(desc())

  • 選挙費用の多い候補者順に並べる(=降順 (descending) )
  • 選挙費用の多い順にソートする → 選挙費用が欠損でないことが必要
  • 表示する変数を指定 → 選挙年、選挙区名、政党名、年齢、氏名、当落、選挙費用額
hr %>%
  filter(!is.na(exp)) %>%     # 欠損のある選挙費用を除外 
  arrange(desc(exp)) %>%      # 選挙費用額を大きい順に並べる   
  select(year, pref, seito, age, j_name, wl, exp) %>%
  print(n = 20)                        # 全て表示したければ n = inf と指定
# A tibble: 9,479 × 7
    year pref   seito      age j_name      wl      exp
   <dbl> <chr>  <chr>    <dbl> <chr>    <dbl>    <dbl>
 1  2012 福岡   民主        61 松本龍       0 27462362
 2  2021 大阪   れい        44 大石晃子     2 27443685
 3  2000 北海道 自民        50 岩倉博文     2 27179308
 4  1996 鹿児島 自由連合    58 徳田虎雄     0 26999782
 5  2000 鹿児島 自由連合    62 徳田虎雄     1 26973809
 6  2012 鹿児島 自民        41 徳田毅       1 26465523
 7  2000 長崎   自由        58 山田正彦     2 25690655
 8  1996 香川   新進        38 平井卓也     0 25608680
 9  1996 東京   自民        67 越智通雄     2 25596853
10  2000 香川   無所        42 平井卓也     1 25530255
11  2003 北海道 自民        56 北村直人     1 25529813
12  2003 長崎   民主        61 山田正彦     2 25482858
13  2003 福島   自民        66 佐藤剛男     1 25399111
14  2009 愛知   自民        78 海部俊樹     0 25354069
15  1996 東京   新進        37 古山和宏     0 25087603
16  2009 鹿児島 自民        38 徳田毅       1 25029285
17  2000 東京   自民        66 島村宜伸     0 24819076
18  2005 北海道 自民        62 金田英行     0 24649710
19  2000 北海道 自民        52 北村直人     1 24605343
20  1996 埼玉   新進        41 石田勝之     1 24464522
# ℹ 9,459 more rows

2012年総選挙で多額の選挙費用を使った候補者

hr %>%
  filter(!is.na(exp)) %>%     # 欠損のある選挙費用を除外 
  filter(year == 2012) %>% 
  arrange(desc(exp)) %>%      # 得票率を大きい順に並べる   
  select(year, pref, seito, age, j_name, wl, exp) %>%
  print(n = 20)                        # 全て表示したければ n = inf と指定
# A tibble: 1,280 × 7
    year pref   seito          age j_name      wl      exp
   <dbl> <chr>  <chr>        <dbl> <chr>    <dbl>    <dbl>
 1  2012 福岡   民主            61 松本龍       0 27462362
 2  2012 鹿児島 自民            41 徳田毅       1 26465523
 3  2012 熊本   自民            71 野田毅       1 23593097
 4  2012 鹿児島 自民            67 森山裕       1 20428510
 5  2012 千葉   日本未来        42 中後淳       0 19859907
 6  2012 岡山   自民            47 山下貴司     1 19366527
 7  2012 岐阜   自民            69 金子一義     1 19365846
 8  2012 愛知   自民            69 江崎鉄磨     1 18933861
 9  2012 奈良   民主            37 百武威       0 18680610
10  2012 栃木   自民            57 茂木敏充     1 18669798
11  2012 愛媛   自民            62 塩崎恭久     1 18228041
12  2012 鹿児島 民主            51 川内博史     0 18141072
13  2012 埼玉   自民            37 今野智博     2 17984123
14  2012 広島   自民            54 寺田稔       1 17888076
15  2012 福岡   自民            52 藤丸敏       1 17725028
16  2012 沖縄   国民新党        51 下地幹郎     0 17624616
17  2012 岐阜   自民            49 棚橋泰文     1 17572438
18  2012 山梨   日本維新の会    58 小沢鋭仁     2 17092273
19  2012 北海道 民主            70 小平忠正     0 17012898
20  2012 北海道 民主            53 仲野博子     0 16972595
# ℹ 1,260 more rows

2012年総選挙で少額の選挙費用で当選した候補者
dplyr::arrange()

  • 選挙費用の少ない候補者順に並べる(=昇順 (ascending) )
  • 選挙費用の少ない順にソートする → 選挙費用が欠損でないことが必要
  • 表示する変数を指定 → 選挙年、選挙区名、政党名、年齢、氏名、票数、得票率
hr %>%
  filter(!is.na(exp)) %>%     # 欠損のある選挙費用を除外 
  filter(year == 2012) %>% 
  filter(wl > 0) %>% 
  arrange(exp) %>%      # 選挙費用額を小さい順に並べる   
  select(year, pref, seito, age, j_name, wl, exp) %>%
  print(n = 20)                        # 全て表示したければ n = inf と指定
# A tibble: 421 × 7
    year pref   seito          age j_name        wl     exp
   <dbl> <chr>  <chr>        <dbl> <chr>      <dbl>   <dbl>
 1  2012 茨城   自民            68 額賀福志郎     1 1332443
 2  2012 福島   民主            48 玄葉光一郎     1 1351182
 3  2012 山形   自民            30 鈴木憲和       1 1423753
 4  2012 神奈川 自民            49 河野太郎       1 1500237
 5  2012 沖縄   共産            64 赤嶺政賢       2 2061222
 6  2012 埼玉   自民            41 牧原秀樹       2 2063977
 7  2012 東京   自民            51 伊藤達也       1 2577536
 8  2012 兵庫   みんな          38 井坂信彦       2 3237212
 9  2012 広島   日本維新の会    30 坂元大輔       2 3302348
10  2012 静岡   民主            41 細野豪志       1 3486965
11  2012 神奈川 みんな          48 浅尾慶一郎     1 3602077
12  2012 神奈川 自民            36 牧島かれん     1 3636093
13  2012 静岡   日本維新の会    63 鈴木望         2 3678605
14  2012 東京   自民            31 小倉将信       1 3701343
15  2012 兵庫   日本維新の会    46 三木圭恵       2 3772410
16  2012 広島   日本維新の会    49 中丸啓         2 3776897
17  2012 大阪   日本維新の会    28 丸山穂高       1 3807457
18  2012 大阪   日本維新の会    29 村上政俊       1 3823710
19  2012 千葉   自民            62 渡辺博道       1 3855657
20  2012 大阪   日本維新の会    43 木下智彦       1 3918767
# ℹ 401 more rows

4.4 選挙費用と得票率の関係

・2005年総選挙における「選挙費用」と「得票率」の散布図を描いてみる

hr %>% 
  select(seito, exp, voteshare, year) %>% 
  filter(year == 2005) %>% 
  ggplot(aes(x = exp, y = voteshare, col = seito)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = lm)

hr %>% 
  select(seito, exp, voteshare, year) %>% 
  filter(year == 2005) %>% 
  ggplot(aes(x = exp, y = voteshare, col = seito)) +
  geom_point(alpha = 0.5, size = 0.5) +
  geom_smooth(method = lm) +
  facet_wrap(~seito)

・2009年総選挙における「選挙費用」と「得票率」の散布図を描いてみる

hr %>% 
  select(seito, exp, voteshare, year) %>% 
  filter(year == 2009) %>% 
  ggplot(aes(x = exp, y = voteshare, col = seito)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = lm)

hr %>% 
  select(seito, exp, voteshare, year) %>% 
  filter(year == 2009) %>% 
  ggplot(aes(x = exp, y = voteshare, col = seito)) +
  geom_point(alpha = 0.5, size = 0.5) +
  geom_smooth(method = lm) +
  facet_wrap(~seito)

5. ケース数の分析

  • hr は1996年に衆院選挙に小選挙区が導入されて以来実施された 9 回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017, 2024)の結果のデータ
  • データを表示する際には次の二つの関数が便利

DT::datatable()・・・手軽にチェックできる
rectable::reactable()・・・複数の変数を同時に検索可能

reactable::reactable(hr,
  filterable = TRUE,  # 検索可能に設定
  defaultPageSize = 10) # 表示行数の限界を指定
  • 8 回の衆院選に出馬した立候補者数を「総選挙ごとに」知りたい場合
hr_elec <- hr %>% 
  group_by(year) %>% 
  summarize(frequence = n(), .groups = "drop")
DT::datatable(hr_elec)
  • 8 回の衆院選に出馬した立候補者数を「政党別に」知りたい場合
hr_party <- hr %>% 
  group_by(seito) %>% 
  summarize(frequence = n(), .groups = "drop")
DT::datatable(hr_party)
  • 8 回の衆院選への出馬回数を所属政党と立候補者別に知りたい場合
hr_cand <- hr %>% 
  group_by(seito, j_name) %>% 
  summarize(frequence = n(), .groups = "drop")
DT::datatable(hr_cand)
  • 8 回の衆院選での当選者(復活当選者を含む)を政党別に知りたい場合
hr_winner <- hr %>% 
  filter(wl > 0) %>% 
  group_by(seito) %>% 
  summarize(frequence = n(), .groups = "drop")
DT::datatable(hr_winner)

6. 惜敗率の計算方法(2024年総選挙)

  • 1996年から2024年総選挙結果から 2024年のデータだけを抜き出し「惜敗率」を計算してみる

  • 惜敗率を求める式は次のとおり

\[惜敗率 = \frac{自分の得票数}{当選者の得票数}\]

  • 当選者の惜敗率は 1
  • 当選者以外の惜敗率は 0 と 1 の間の値
hr_2024 <- hr %>% 
  filter(year == 2024)
  • hr が含む変数は次のとおり
names(hr_2024)
 [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" "exppv"        
  • 惜敗率を計算するために必要な変数は次のとおり
  1. ku
  2. kun
  3. vote
  4. rank
  • 惜敗率を計算するために必要な変数だけに絞る
hr_2024 <- hr_2024 %>% 
  select(ku, kun, rank, wl, seito, j_name, previous, gender, age, vote)
unique(hr_2024$ku)
 [1] "aichi"      "akita"      "aomori"     "chiba"      "ehime"     
 [6] "fukui"      "fukuoka"    "fukushima"  "gifu"       "gunma"     
[11] "hiroshima"  "hokkaido"   "hyogo"      "ibaraki"    "ishikawa"  
[16] "iwate"      "kagawa"     "kagoshima"  "kanagawa"   "kochi"     
[21] "kumamoto"   "kyoto"      "mie"        "miyagi"     "miyazaki"  
[26] "nagano"     "nagasaki"   "nara"       "niigata"    "oita"      
[31] "okayama"    "okinawa"    "osaka"      "saga"       "saitama"   
[36] "shiga"      "shimane"    "shizuoka"   "tochigi"    "tokushima" 
[41] "tokyo"      "tottori"    "toyama"     "wakayama"   "yamabnashi"
[46] "yamagata"   "yamaguchi" 
unique(hr_2024$kun)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30
  • kukun を使って district という名前の変数をつくる
  • 例)「宮城6区」: ku (miyagi) と kun (6) => miyagi_6
df_rank1 <- hr_2024 %>% 
    mutate(
      district = str_c(ku, kun, sep = "_")
      ) %>% 
    filter(rank == 1) %>% # ランク1位の候補者だけに絞る
    select(district, rank1_vote = vote)
df_sekihai <- hr_2024 %>% 
    mutate(
      district = str_c(ku, kun, sep = "_")
      ) %>% 
    left_join(df_rank1, by = "district") %>% 
    arrange(district, rank) %>% 
    mutate(
        sekihai = vote / rank1_vote
    )
df_sekihai <- df_sekihai %>% 
  select(district, rank, wl, seito, j_name, previous, gender, age, vote, sekihai)
DT::datatable(df_sekihai)

7. 選挙の強さ: Margin(1996-2024)

  • 惜敗率でわかるのは、小選挙で落選した「当選者以外」の選挙での強さ

\[惜敗率 = \frac{次点者の票数}{当選者の票数}\]

  • 惜敗率は 0 と 1 の間の値

  • 小選挙区当選者の惜敗率は全員 1
    → 小選挙区当選者間の強さの違いはわからない

  • 当選者を含めた選挙の強さ (Margin)を知りたい場合
    → ひと工夫必要

\[当選者のMargin = \frac{当選者の票数}{次点者の票数}\]

  • 当選者の Marginは 1 以上の値

  • 小選挙区の落選者の Margin は「惜敗率」を使う (0〜1)

  • 小選挙区の当選者の Margin は「当選者の Margin」を使う (1以上)
    小選挙区の当選者と落選者、両方の選挙の強さを比較できる

  • hr が含む変数は次のとおり

names(hr)
 [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" "exppv"        
  • Margin を計算するために必要な変数は次のとおり
  1. year
  2. ku
  3. kun
  4. vote
  5. rank
  • Margin を計算するために必要な変数だけに絞る
hr_margin <- hr %>% 
  select(year, ku, kun, rank, j_name, vote)
  • ku の中身を確認する
unique(hr_margin$ku)
 [1] "aichi"      "akita"      "aomori"     "chiba"      "ehime"     
 [6] "fukui"      "fukuoka"    "fukushima"  "gifu"       "gunma"     
[11] "hiroshima"  "hokkaido"   "hyogo"      "ibaraki"    "ishikawa"  
[16] "iwate"      "kagawa"     "kagoshima"  "kanagawa"   "kochi"     
[21] "kumamoto"   "kyoto"      "mie"        "miyagi"     "miyazaki"  
[26] "nagano"     "nagasaki"   "nara"       "niigata"    "oita"      
[31] "okayama"    "okinawa"    "osaka"      "saga"       "saitama"   
[36] "shiga"      "shimane"    "shizuoka"   "tochigi"    "tokushima" 
[41] "tokyo"      "tottori"    "toyama"     "wakayama"   "yamagata"  
[46] "yamaguchi"  "yamanashi"  "yamabnashi"
  • kun の中身を確認する
unique(hr_margin$kun)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30
calculate_margin <- function(data) {
  dat1 <- data %>% 
    arrange(rank) %>% 
    mutate(
      rank1_vote = if_else(rank == 1, vote, NA_real_),
      rank2_vote = if_else(rank == 2, vote, NA_real_)
    ) %>% 
    fill(rank1_vote, rank2_vote, .direction = "downup") %>% 
    mutate(
      divide_vote = if_else(rank == 1, rank2_vote, rank1_vote),
      margin = vote / divide_vote
    )
  return(dat1)
}
  • yearkukun を組み合わせて district という名前の変数をつくる
  • 例)year (1996) + ku (miyagi) + kun (6) => district (1996_miyagi_6)
hr_margin <- hr_margin %>% 
  mutate(
    district = str_c(year, ku, kun, sep = "_") # year を忘れずに  
  ) %>% 
  group_nest(district) %>% 
  mutate(
    margin_vote = map(data, calculate_margin)
  ) %>% 
  select(district, margin_vote) %>% 
  unnest(margin_vote)
reactable::reactable(hr_margin,
  filterable = TRUE,  # 検索可能に設定
  defaultPageSize = 10) # 表示行数の限界を指定
hr_margin <- hr_margin %>% 
  select(year, margin, j_name)
sanae_geru_margin <- hr_margin %>%
  filter(j_name == "石破茂" | j_name == "高市早苗") %>%
  select(year, margin, j_name)
ggplot(data = sanae_geru_margin, aes(x = year, y = margin, colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("高市早苗氏と石破茂氏の Margin : 1996-2024衆院選") +
  geom_text(
    aes(y = margin + 0.1, 
        label = round(margin, digits = 1), vjust = 0)
    ) +
  theme(legend.position = c(0.9, 0.1)) +
  labs(x = "総選挙年", y = "Margin") 

margin

hr_margin |> 
  filter(j_name == "石破茂" | j_name == "高市早苗") |> 
  group_by(j_name) |> 
  summarise(margin_ave = mean(margin))
# A tibble: 2 × 2
  j_name   margin_ave
  <chr>         <dbl>
1 石破茂         4.27
2 高市早苗       1.91
  • ここで「3.3.4 高市早苗氏と石破茂氏の得票率」で求めた高市氏と石破氏の「得票率」と比較してみよう

voteshare

hr |> 
  filter(j_name == "石破茂" | j_name == "高市早苗") |> 
  group_by(j_name) |> 
  summarise(vs_ave = mean(voteshare))
# A tibble: 2 × 2
  j_name   vs_ave
  <chr>     <dbl>
1 石破茂     72.2
2 高市早苗   51.0

解釈 次点者との差という観点 (margin) からみると、両者の差は2.36ポイント
得票率という観点からみると、両者の差は21.2%ポイント

8. 2021年自民党総裁選候補者の選挙成績

8.1 得票率

hr_vs <- hr %>% 
  select(year, voteshare, j_name) |> 
  filter(year < 2024)
ldp_pres_vs <- hr_vs %>%
  filter(j_name == "岸田文雄" | j_name == "高市早苗"| 
      j_name == "河野太郎"| j_name == "野田聖子") |> 
  mutate(j_name = factor(j_name, 
                         levels = c("岸田文雄",
                                    "河野太郎",
                                    "高市早苗",
                                    "野田聖子")))
ggplot(data = ldp_pres_vs, aes(x = year, y = voteshare, colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("2024自民党総裁選立候補者の得票率:1996-2024") +
  geom_text(
    aes(y = voteshare + 0.1, 
        label = round(voteshare, digits = 1), vjust = 0)
    ) +
  theme(legend.position = c(0.9, 0.2)) +
  labs(x = "総選挙年", y = "得票率(%)")

8.2 margin

hr_margin <- hr_margin %>% 
  filter(year < 2024) |> 
  select(year, margin, j_name)
ldp_pres_margin <- hr_margin %>%
  filter(j_name == "岸田文雄" | j_name == "高市早苗"|
      j_name == "河野太郎"| j_name == "野田聖子") |> 
  mutate(j_name = factor(j_name, 
                         levels = c("岸田文雄",
                                    "河野太郎",
                                    "高市早苗", 
                                    "野田聖子")))
ggplot(data = ldp_pres_margin, aes(x = year, y = margin, colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("2024自民党総裁選立候補者の選挙マージン:1996-2024") +
  geom_text(
    aes(y = margin + 0.1, 
        label = round(margin, digits = 1), vjust = 0)
    ) +
  theme(legend.position = c(0.2, 0.5)) +
  labs(x = "総選挙年", y = "Margin")

9. 2024年自民党総裁選候補者の選挙成績

9.1 得票率

hr_vs <- hr %>% 
  select(year, voteshare, j_name)
ldp_pres_vs <- hr_vs %>%
  filter(j_name == "石破茂" | j_name == "高市早苗"| j_name == "林芳正"|  
      j_name == "小林鷹之" |
      j_name == "茂木敏充"| j_name == "上川陽子"| j_name == "加藤勝信" | j_name == "小泉進次郎") |> 
  mutate(j_name = factor(j_name, 
                         levels = c("石破茂", 
                                    "小泉進次郎",
                                    "林芳正",
                                    "加藤勝信",
                                    "小林鷹之",
                                    "茂木敏充",
                                    "高市早苗",
                                    "上川陽子")))
ggplot(data = ldp_pres_vs, aes(x = year, y = voteshare, 
  colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("2024自民党総裁選立候補者の得票率:1996-2024") +
  geom_text(
    aes(y = voteshare + 0.1, 
        label = round(voteshare, digits = 1), vjust = 0)
    ) +
  theme(legend.position = c(0.94, 0.28)) +
  labs(x = "総選挙年", y = "得票率(%)")

9.2 margin

hr_margin <- hr_margin %>% 
  select(year, margin, j_name)
ldp_pres_margin <- hr_margin %>%
   filter(j_name == "石破茂" | j_name == "小泉進次郎"| j_name == "高市早苗"| j_name == "林芳正"| j_name == "小林鷹之" | j_name == "茂木敏充"| j_name == "上川陽子"| j_name == "加藤勝信" ) |> 
  
  mutate(j_name = factor(j_name, 
                         levels = c("石破茂", 
                                    "小泉進次郎",
                                    "茂木敏充", 
                                    "林芳正", 
                                    "加藤勝信",
                                    "高市早苗",
                                    "小林鷹之",
                                    "上川陽子")))
ggplot(data = ldp_pres_margin, aes(x = year, y = margin, colour = j_name, linetype = j_name, shape = j_name)) +
  geom_point() +
       geom_line() + 
  ggtitle("2024自民党総裁選立候補者の選挙マージン:1996-2024") +
  geom_text(
    aes(y = margin + 0.1, 
        label = round(margin, digits = 1), vjust = 0)
    ) +
  theme(legend.position = c(0.1, 0.75)) +
  labs(x = "総選挙年", y = "Margin")

参考文献