• 分析に必要なパッケージをロードする
library(interplot)
library(jtools)
library(margins)
library(msm)
library(patchwork)
library(stargazer)
library(tidyverse)

ダミー変数と交差項でわかること

変数の種類 変数名 詳細
応答変数 voteshare 候補者の得票率 (%)
説明変数 exppv 候補者が有権者一人当たりに使う使う選挙費用(円)
ダミー変数 ldp 自民党候補者か否か(ldp: 0 = 非自民党、1 = 自民党)

ダミー変数を説明変数に加えると、ダミー変数の値によって回帰直線が平行移動するような変化(つまり、自民党候補者であるか否かという要因は候補者の得票率に影響したのかということ)を捉えることができる(下の図の左側)

変数の種類 変数名 詳細
応答変数 voteshare 候補者の得票率 (%)
説明変数 exppv 候補者が有権者一人当たりに使う使う選挙費用(円)
調整変数(ダミー変数) ldp 自民党候補者か否か(0 = 非自民党、1 = 自民党)
交差項 exppv:ldp 選挙費用と自民党ダミーを掛け合わせた変数

交差項を説明変数に加えると、自民党候補者とそうでない候補者の間において、選挙費用が得票率に与える影響を捉えることができる(上の図の右側)

1. 交差項を使った回帰分析モデル

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

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

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

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

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

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

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

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

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

1.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 = ".")
読み取り方法 3
hr <- read_csv("data/hr96-24.csv",
               na = ".")  

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

  • hr96_17.csv は1996年に衆院選挙に小選挙区が導入されて以来実施された 10 回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017, 2021, 2024)の結果のデータ
  • hr に含まれる変数名を表示させる
names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "j_name"        "wl"            "rank"          "nocand"       
 [9] "seito"         "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • hr_2005 には 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 ...
 $ j_name       : chr [1:10773] "河村たかし" "今枝敬雄" "佐藤泰介" "岩中美保子" ...
 $ 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] "新進" "自民" "民主" "共産" ...
 $ 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(),
  ..   j_name = col_character(),
  ..   wl = col_double(),
  ..   rank = col_double(),
  ..   nocand = col_double(),
  ..   seito = 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_double(),
  ..   turnout = col_double(),
  ..   seshu_dummy = col_double(),
  ..   jiban_seshu = col_character(),
  ..   nojiban_seshu = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 
  • 数値は numeric 文字は character として認識されていることがわかる

  • データフレーム hr の変数名を確認/

names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "j_name"        "wl"            "rank"          "nocand"       
 [9] "seito"         "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • seito に含まれる値を確かめる
unique(hr$seito)
 [1] "新進"                   "自民"                   "民主"                  
 [4] "共産"                   "文化フォーラム"         "国民党"                
 [7] "無所"                   "自由連合"               "政事公団太平会"        
[10] "社民"                   "新社会"                 "日本新進"              
[13] "新党さきがけ"           "青年自由"               "さわやか神戸・市民の会"
[16] "民主改革連合"           "市民新党にいがた"       "沖縄社会大衆党"        
[19] "緑の党"                 "公明"                   "諸派"                  
[22] "保守"                   "無所属の会"             "自由"                  
[25] "改革クラブ"             "保守新"                 "新党尊命"              
[28] "ニューディールの会"     "世界経済共同体党"       "新党日本"              
[31] "国民新党"               "新党大地"               "幸福"                  
[34] "みんな"                 "改革"                   "日本未来"              
[37] "日本維新の会"           "当たり前"               "アイヌ民族党"          
[40] "政治団体代表"           "安楽死党"               "次世"                  
[43] "維新"                   "生活"                   "立憲"                  
[46] "希望"                   "緒派"                   "N党"                  
[49] "国民"                   "れい"                   "参政"                  

1.1.4 必要な変数の作成

  • 分析には自民党ダミーが必要なので、seito = "自民, それ以外の政党を 0 にしたダミー変数を作り hr_2005 と名前を付ける
  • 分析には候補者が有権者一人あたりに費やした選挙費用データが必要
  • しかし、この変数がないので exppv という名称で新たに変数を作り hr_2005 に上書きする
hr1 <- hr |> 
  mutate(exppv = exp / eligible) |> 
  mutate(ldp = ifelse(seito == "自民", 1, 0))
  • 分析に必要な変数だけに絞る
hr_2005 <- hr1 %>% 
  dplyr::filter(year == 2005) %>%    # 2005年のデータだけを選ぶ
  dplyr::select(year, voteshare, exppv, ldp, eligible, nocand) # 11の変数だけを選ぶ
  • hr_2005に含まれる変数を確認する
names(hr_2005)
[1] "year"      "voteshare" "exppv"     "ldp"       "eligible"  "nocand"   
  • ldpexppv が作られていることを確認
  • データの最初の 6 行を表示させる
head(hr_2005)
# A tibble: 6 × 6
   year voteshare exppv   ldp eligible nocand
  <dbl>     <dbl> <dbl> <dbl>    <dbl>  <dbl>
1  2005      50   17.0      0   360007      4
2  2005      39.1 40.0      1   360007      4
3  2005       7.4  6.05     0   360007      4
4  2005       3.6 13.1      0   360007      4
5  2005      52   30.2      0   366121      3
6  2005      39.1 14.4      1   366121      3

1.2 データの記述統計

library(stargazer)
  • stargazer()関数を使うと結果を見やすく表示できる
  • R-Markdown で表示する際、type = "html" を指定するときにはチャンクオプションで ```{r, results = "asis"} と指定する
  • データの記述統計を示す
stargazer(as.data.frame(hr_2005), 
          type = "html")
Statistic N Mean St. Dev. Min Max
year 989 2,005.000 0.000 2,005 2,005
voteshare 989 30.333 19.230 0.600 73.600
exppv 985 24.627 17.907 0.148 89.332
ldp 989 0.293 0.455 0 1
eligible 989 344,654.300 63,898.230 214,235 465,181
nocand 989 3.435 0.740 2 6

2. 二つのモデル (Model_1 & Model_2)

2.1 Model_1Model_2 の分析結果比較

交差項を含まないモデル

model_1 <- lm(voteshare ~ exppv + ldp,
              data = hr_2005)

交差項を含むモデル

model_2 <- lm(voteshare ~ exppv*ldp,
              data = hr_2005)
  • model_1model_2 の分析結果を並べて表示してみる
stargazer(model_1, model_2,
          type = "html")
Dependent variable:
voteshare
(1) (2)
exppv 0.565*** 0.791***
(0.024) (0.026)
ldp 15.852*** 40.163***
(0.961) (1.773)
exppv:ldp -0.746***
(0.048)
Constant 11.779*** 7.518***
(0.644) (0.637)
Observations 985 985
R2 0.618 0.695
Adjusted R2 0.617 0.694
Residual Std. Error 11.883 (df = 982) 10.631 (df = 981)
F Statistic 794.203*** (df = 2; 982) 743.450*** (df = 3; 981)
Note: p<0.1; p<0.05; p<0.01
  • 左側の (1) が model_1 の結果
  • 右側の (2) が model_2 の結果
交差項を「含まないモデル」(model_1) と「含むモデル」(model_2) の違いは重要

大事な点:

  • model_2(右側の結果)は調整変数が 0 の時(=非自民党候補者: ldp = 0) の結果

Model_2 の係数の解釈

選挙費用 (exppv) の係数 0.791 と \(p値 = 2e-16\) の意味
→ 非自民党候補者 (ldp = 0) が選挙費用を 1 円費やした時に 0.791% ポイント得票率が高まり、それは統計的に有意
  → 「自民党の候補者」 (ldp = 1) が選挙費用を費やした時の結果はわからない
  → 「自民党の候補者」(ldp = 1) が選挙費用を費やした時の結果も調べる必要がある
  → ここで知りたいのは「選挙費用が得票率に与える影響が、自民党候補者と非自民党候補者の間で異なるかどうか」
  → 交差項 (ldp:exppv) の係数を調べる

2.2 交差項 (ldp:exppv)   

  • 通常、交差項はldpのようなカテゴリカル変数とexppvのような連続変数を掛け合わせて作る

  • ここではldp:exppvという名称の交差項を作り、モデルに入れて回帰分析を行う

  • ダミー変数を含む重回帰分析の前提:
    → 2 つの回帰直線が平行(= 選挙費用が得票率に与える影響力は同一)

  • ここではこの制限を緩め、次の前提を置く
    モデルの前提:
    「自民党のある候補者とそうでない候補者の間で、選挙費用が得票率に与える影響は異なる」
    このモデルではldp:exppvという説明変数(= 交差項: interaction term)を追加する

  • ここでは次の重回帰式を推定する
    \[\mathrm{{voteshare}\ = \alpha_0 + \alpha_1 exppv + \alpha_2 ldp + \alpha_3 ldp:exppv + \varepsilon}\]

  • 上記の式は次の様に書き換えることが出来る

\[\mathrm{{voteshare}\ = \alpha_0 + (\alpha_1 + \alpha_3 ldp) exppv + \alpha_2 ldp + \varepsilon}\]

\(\alpha_0\) : 選挙費用が 0 (exppv = 0)の非自民党候補者 (ldp = 0) の得票率
\((\alpha_1 + \alpha_3 \textrm{ldp})\) : 得票率 (voteshare) に対する選挙費用 (exppv) の影響力

選挙費用が得票率に与える影響は、自民党候補者とそうでない候補者の間で異なるのか?

  • 交差項を含めたモデルを推定する場合、限界効果 (Marginal Effects) を考慮する必要がある

限界効果:説明変数が(特定の値において)応答変数に与える影響力の強さ

  • ここでは次の 3 つの変数を使って重回帰分析を行う
    応答変数 ・・・ voteshare(得票率:%)
    説明変数 ・・・ exppv(有権者一人あたりに費やした選挙費用:円)
    交差項 ・・・ ldp:exppv (ldp = 調整変数)

(モデル内でexppv*ldpと入力するとexppv:ldpという交差項名が自動的に付されexppv, ldpという2 つの変数も含まれる)

model_2 <- lm(voteshare ~ exppv*ldp,
              data = hr_2005)
  • 上で求めた Model_1Model_2 の結果を stargazer()を使って、見やすく表示できる
  • R-Markdown で表示する際、type = "html" を指定するときにはチャンクオプションで ```{r, results = "asis"} と指定する
stargazer(model_1, model_2, 
          type = "html")
Dependent variable:
voteshare
(1) (2)
exppv 0.565*** 0.791***
(0.024) (0.026)
ldp 15.852*** 40.163***
(0.961) (1.773)
exppv:ldp -0.746***
(0.048)
Constant 11.779*** 7.518***
(0.644) (0.637)
Observations 985 985
R2 0.618 0.695
Adjusted R2 0.617 0.694
Residual Std. Error 11.883 (df = 982) 10.631 (df = 981)
F Statistic 794.203*** (df = 2; 982) 743.450*** (df = 3; 981)
Note: p<0.1; p<0.05; p<0.01

   交差項 (ldp:exppv) の係数 -0.74623 と \(p値 = 2e-16\) の意味
→ 「選挙費用が得票率に与える影響の差は -0.74623 %ポイントで、統計的に有意」

  • 候補者は自民党候補者 (ldp = 1) もいる
    → 調整変数である自民党ダミー (ldp)が 0 と 1 それぞれの値をとる場合に「選挙費用が得票率に与える影響力」を確認する必要あり

  • しかし、交差項を含む重回帰分析結果だけを示すのはあまり有益とはいえない

  • その理由 → 調整変数(この場合、ldp = 0) の結果しか示していないから
    → 調整変数の両方の値(ldp = 0ldp = 1)における限界効果を示す必要あり

  • データ解析において重要なこと:

  • 統計的有意性 (statistical significance) 限界効果を計算して図示する

  • 実質的有意性 (substantial significance)限界効果を計算して図示する

→ 交差項 (ldp:exppv) を構成する調整変数 (ここでは ldp) の値ごとの限界効果を調べる

2.3 「限界効果」を調べる理由

★ 交差項を含まない重回帰分析の場合:

  • 特定の説明変数 X の係数 b は、他の説明変数の値を一定に保ったときX が 1 単位増加すると、応答変数 Y の予測値が b 単位 だけ増えること示す

★交差項を含む重回帰分析の場合:

  • この考え方をそのまま使うことはできない
  • その理由 ・・・ 「他の変数の値を一定に保つ」ことができないから

解説:

  • ここで想定している model_1 に含まれる説明変数は次の 3 つ:
  1. 選挙費用 (X)
  2. 自民党ダミー (Z)
  3. 選挙費用:自民党ダミー (XZ)
  • 知りたいこと・・・ 選挙費用 (X) 1 単位(= 1 円)の増加が、得票率に与える影響
  • 他の変数(すなわち ZXZ の値)を一定に保ったまま、X の値だけを変えることは不可能
    その理由:X の値を変えると、XZ の値も変わってしまうから
  • それができるのは、Z = 0 (つまり候補者が非自民党候補者)のときだけ
  • 回帰分析(model_1)の結果として得られた選挙費用の係数 0.79142
  • これは非自民党候補者 (ldp = 0) の選挙費用が得票率に与える影響
    → 自民党候補者 (ldp = 1) の選挙費用が得票率に与える影響ではない
    → 調整変数である ldp には平均値 (0.5) という候補者は存在しない
    → 知りたいのは自民党候補者と非自民党候補者それぞれの選挙費用が得票に影響しているかどうか
    ldp = 0.5という実在しない候補者のデータを求めても意味がない
    ldp を中心化する意味はないので、中心化する必要はない

まとめ ・交差項を含む重回帰分析の場合「他の変数の値を一定に保つ」ことができないため、調整変数の値(カテゴリカル変数の場合は 0, 1)の限界効果をそれぞれチェックする必要がある

2.4 限界効果の可視化

2.4.1 散布図による限界効果の可視化

  • 非自民党候補者 (ldp = 0) と自民党候補者 (ldp = 1) を設定して影響力を可視化する

  • それぞれにおいて応答変数である得票率(voteshare)に、説明変数であ る有権者一人当たり選挙費用(exppv)が与える影響の大きさを可視化する

  • model_1 の結果から次の回帰関数の回帰式が得られる

\[\widehat{voteshare}\ = 7.52 + 0.79exppv + 40.2ldp -0.75exppv:ldp\]

\[= 7.52 + (0.79 - 0.75ldp)exppv + 40.21ldp\]

  • voteshare に対する exppv の影響力の総合値 \((α_1 + α_3ldp)\)は、

\[0.79 - 0.75ldp\]

  • exppvの係数 0.79 - 0.75ldp = 候補者が有権者一人当たり選挙費用(exppv)を 1 円費やすことで増える得票率(voteshare
    → 選挙費用が得票率に与える影響は、候補者が自民党候補者によって異なることがわかる

  • この回帰式に、非自民党候補者(ldp = 0)を代入すると、赤色の回帰式が得られる

\[\textrm{voteshare}= 7.52 + 0.791 \cdot \textrm{exppv} + \varepsilon\]

  • model_1の回帰式に、自民党候補者(ldp = 1)を代入すると、青色の回帰式が得られる

\[\textrm{voteshare}= 47.7 + 0.045 \cdot \textrm{exppv} + \varepsilon\]

  • この結果を図示すると、次のようになる

  • 点線は自民党候補者、実線は非自民党候補者の結果をそれぞれ示している
  • 点線(自民党候補者)よりも実線(非自民党候補者)の方が傾きが大きい
    → 選挙費用が得票率に与える影響力は、自民党候補者よりも非自民党候補者の方が大きい
  • 上で求めた 2 つの回帰式を散布図に描く
  • ggplot で日本語を表示させるため、マックユーザーは以下の行を入力
theme_bw(base_family = "HiraKakuProN-W3")
hr_2005 %>% 
  ggplot(aes(x = exppv, y = voteshare, color = as.factor(ldp))) +
  geom_point(pch = 16) +
  geom_abline(intercept = 7.52, slope = 0.791, color = "tomato") +
  geom_abline(intercept = 47.7, slope = 0.045, color = "blue") +
  ylim(0, 80) +
  labs(x = "選挙費用:円 (exppv)", 
       y = "得票率 (voteshare)",
         title = "有権者一人あたりに費やす選挙費用と得票率:2005年総選挙") + 
  annotate("label", 
           label = "得票率 = 7.52 + 0.791選挙費用\n(非自民党候補者)", 
           x = 65, y = 79,
           size = 3, 
           colour = "tomato", 
           family = "HiraginoSans-W3") +
  annotate("label",
           label = "得票率 = 47.7 + 0.045選挙費用\n(自民党候補者)", 
           x = 20, y = 79,
           size = 3, 
           colour = "blue", 
           family = "HiraginoSans-W3") +
  scale_color_discrete(name = "候補者の所属政党", labels = c("非自民党","自民党")) +
  theme_bw(base_family = "HiraKakuProN-W3")

  • どちらの散布図も右上がりの回帰直線
    → 有権者一人当たりの選挙費用が増えると、得票率が上がる傾向
  • 2 つの回帰直線の傾きの大きさが異なる
    選挙費用が得票率に与える影響の大きさは候補者が自民党所属か否かによって異なる
  • 自民党候補者が有権者一人あたり 1 円選挙費用を増やすと得票率が 0.045% ポイント増える
  • 非自民党候補者が有権者一人あたり 1 円選挙費用を増やすと得票率が 0.79% ポイント増える

2.4.2 msmパッケージによる限界効果の可視化

  • 交差項の効果は偶然得られたものではない(統計的に有意な)のか?
  • 2 本の回帰直線の傾きの違いは、統計的にも意味のある違いなのだろうか?
  • model_2 で得られた切片 (Intercept) と切片と 3 つの変数の偏回帰係数とを表示する
model_2$coef
(Intercept)       exppv         ldp   exppv:ldp 
  7.5182367   0.7914244  40.1634100  -0.7462253 
  • moderator 変数 (ldp) の 最小値 (0) と最大値 (1) それぞれの値における限界効果 (slope)を表示
  • 限界効果を計算するに必要な係数は 2 番目の exppvと 4 番目の exppv:ldp の 2 つ
at.ldp <- c(0, 1) # mini (0) - max (1) まで 1 間隔で区切る
slopes <- model_2$coef[2] + model_2$coef[4]*at.ldp 
                    # exppv の傾きの限界効果 (slopes) を計算する  
                    # [2] は2 つ目の係数、[4] は四つ目の係数という意味
slopes             # 結果を表示する  
[1] 0.79142440 0.04519911
  • delta method を使ってこれらの 2 つの限界効果 (= slopes) と標準誤差 (standard error)を推定
  • delta method コマンドを使うためにmsmパッケージをロードする
library(msm)
  • 候補者の所属政党ごとに得られた 2 つの限界効果 (sloples) とその標準誤差を計算し、図で表す
  • 95% 信頼区間 (upper, lower) を表示
estmean <- coef(model_2)
var <- vcov(model_2)

SEs <- rep(NA, length(at.ldp))

for (i in 1:length(at.ldp)){
    j <- at.ldp[i]
    SEs[i] <- deltamethod (~ (x2) + (x4)*j, estmean, var) # slopes の 標準誤差
}                                                      

upper <- slopes + 1.96*SEs
lower <- slopes - 1.96*SEs

cbind(at.ldp, slopes, upper, lower) 
     at.ldp     slopes     upper       lower
[1,]      0 0.79142440 0.8427628  0.74008605
[2,]      1 0.04519911 0.1230775 -0.03267927
  • アウトプットの解説

  • at.ldp は非自民党候補者が 0, 自民党候補者が 1 を表す

  • slopes は 2 種類の候補者それぞれの場合において、exppvvoteshare に及ぼす限界効果の大きさ(=傾き)

  • [1, ] と slopes に囲まれた値 (0.79142440)
    → 非自民党候補者の場合、説明変数 (exppv) が応答変数 (voteshare) に与える限界効果(回帰線の傾き)

  • [2, ] と slopes に囲まれた値(0.04519911)
    → 自民党候補者の場合、説明変数 (exppv) が応答変数 (voteshare) に与える限界効果(回帰線の傾き)

  • upperlower は95% 信頼区間

  • グラフを描くために上の行列をデータフレームに変換し msm_1 という名前を付ける

msm_2 <- cbind(at.ldp, slopes, upper, lower) %>% 
  as.data.frame()

msm_2
  at.ldp     slopes     upper       lower
1      0 0.79142440 0.8427628  0.74008605
2      1 0.04519911 0.1230775 -0.03267927
  • ldpx 軸、exppvvoteshare に与える影響力 (slopes) を y 軸にグラフを描く
msm_2 <- msm_2 %>% 
  ggplot(aes(at.ldp, slopes, ymin = lower, ymax = upper)) +
  geom_hline(yintercept = 0, linetype = 2, col = "red") +
  geom_pointrange(size = 1) +
  geom_errorbar(aes(x = at.ldp, ymin = lower, ymax = upper),
                width = 0.1) +
  labs(x = "候補者の所属政党", y = "選挙費用が得票率に与える影響 (限界効果 ME)") +
  scale_x_continuous(breaks = c(1,0),
                     labels = c("自民党", "非自民党")) +
  ggtitle("model 2の限界効果") +
  theme(axis.text.x  = element_text(size = 14),
        axis.text.y  = element_text(size = 14),
        axis.title.y = element_text(size = 14),
        plot.title   = element_text(size = 18)) +
  theme_bw(base_family = "HiraKakuProN-W3")

msm_2

分析結果の解釈 (1) 交差項 (ldp:exppv) が統計的に有意 (p 値: 2e-16)
「選挙費用が得票率に与える影響は、候補者が自民党候補か否かによって異なる」
(2) 非自民党議員の95%信頼区間が赤字の点線を踏んでない
= 選挙費用 (exppv)の係数が統計的に有意 (p 値: 2e-16)
非自民党議員 (ldp = 0) の限界効果 (ME) = 0.79
非自民党議員が選挙費用を 1 円使うと得票率が 0.79%ポイント増える
(3) 自民党議員の95%信頼区間が赤字の 0 ラインをクロスしている
自民党議員が選挙費用を 1 円使って増える得票率が 0 であることは否定できない(統計的に有意ではない)

2.4.3 interplotパッケージによる限界効果の可視化

  • interplot::interplot()を使って、上記をを確かめる
library("interplot")
interplot_2 <- interplot(m = model_2, 
                   var1 = "exppv", # 主要な説明変数
                   var2 = "ldp") + # 調整変数
  labs(x = "候補者の所属政党 (ldp)", 
       y = "選挙費用が得票率に与える影響(限界効果 ME)") +
  theme_bw(base_family = "HiraKakuProN-W3")

print(interplot_2)

  • 横軸は「候補者の所属政党」
  • 縦軸は「選挙費用が得票率に与える影響」(「得票率」ではない!」)

2.4.4 marginsパッケージによる限界効果の可視化

  • margins()関数を使って、非自民党候補者 (ldp = 0) と自民党候補者 (ldp = 1) それぞれの回帰式の傾き(限界効果: marginal effect)を計算できる
library(margins)
margins_2 <- summary(margins(model_2, 
                               at = list(ldp = 0:1))) %>% 
  dplyr::filter(factor == "exppv") %>% 
  as.data.frame()
margins_2
  factor ldp        AME         SE         z             p      lower     upper
1  exppv   0 0.79142440 0.02619306 30.215046 1.502754e-200  0.7400870 0.8427618
2  exppv   1 0.04519911 0.03973390  1.137545  2.553104e-01 -0.0326779 0.1230761
  • この結果を ggplot を使って可視化する/
#日本語を表示させるため、マックユーザーは以下の二行を入力  
ggplot(margins_2, aes(ldp, AME, ymin = lower, ymax = upper)) +
  geom_hline(yintercept = 0, linetype = 2, col = "red") +
  geom_pointrange(size = 1) +
  geom_errorbar(aes(x = ldp, ymin = lower, ymax = upper),
                width = 0.1) +
  labs(x = "候補者の所属政党", y = "選挙費用が得票率に与える影響 (限界効果 AME)") +
  scale_x_continuous(breaks = c(1,0),
                     labels = c("自民党", "非自民党")) +
  theme(axis.text.x  = element_text(size = 14),
        axis.text.y  = element_text(size = 14),
        axis.title.y = element_text(size = 14),
        plot.title   = element_text(size = 18)) +
  theme_bw(base_family = "HiraKakuProN-W3")

3. 3重交差項

3.1 3重交差項を使ってわかること

  • 前節では、「選挙費用が得票率に与える影響」が自民党とそれ以外の政党の候補の間で異なるかどうかみた
  • ここではさらに、選挙費用が得票率に与える影響は「新人とそれ以外」の候補者で異なるかどうかを調べたいとする
  • ここで使うのが 3 重交差項 (three-way interaction)

「Xの効果 3重交差項」の定義:

3重交差項とは 「 X の効果(= 傾き)が、A と B という 2 つの条件によって同時に変わる」ことを 1 つの係数で表す項

  • 2005年総選挙データだけを抜き出し、分析に必要な変数を作成する
    ・有権者一人あたりの選挙費用 (exppv)
    ・新人を表す変数 (challenger)
    ・自民党候補者を表すダミー変数 (ldp)
hr_2005 <- hr |> 
  filter(year == 2005) |> 
  mutate(exppv = exp/eligible) |> 
  mutate(challenger = if_else(status == 0, 1, 0)) |> 
  mutate(ldp = if_else(seito == "自民", 1, 0))
names(hr_2005)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "j_name"        "wl"            "rank"          "nocand"       
 [9] "seito"         "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu" "exppv"         "challenger"   
[25] "ldp"          
  • 3 重交差項 (exppv * ldp * challenger) を使った model_3 を実行してみる

モデル (model_3)

\[voteshare=β_0​+β_1​exppv + \beta_2ldp + \beta_3challenger + \beta_4exppv:ldp + \\ \beta_5exppv:challenger + \beta_6ldp:challenger + \beta_7exppv:ldp:challenger\]

model_3 <- lm(voteshare ~ exppv*ldp*challenger,
              data = hr_2005)
summary(model_3)

Call:
lm(formula = voteshare ~ exppv * ldp * challenger, data = hr_2005)

Residuals:
    Min      1Q  Median      3Q     Max 
-33.513  -3.614   0.190   4.029  32.710 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)           32.02457    1.16045  27.597  < 2e-16 ***
exppv                  0.20750    0.03448   6.019 2.48e-09 ***
ldp                   21.15108    1.97879  10.689  < 2e-16 ***
challenger           -28.77489    1.29501 -22.220  < 2e-16 ***
exppv:ldp             -0.22050    0.05042  -4.374 1.35e-05 ***
exppv:challenger       0.60654    0.04879  12.431  < 2e-16 ***
ldp:challenger        18.99111    2.99452   6.342 3.46e-10 ***
exppv:ldp:challenger  -0.64862    0.08533  -7.602 6.85e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 8.178 on 977 degrees of freedom
  (4 observations deleted due to missingness)
Multiple R-squared:  0.8199,    Adjusted R-squared:  0.8187 
F-statistic: 635.6 on 7 and 977 DF,  p-value: < 2.2e-16
  • model_1model_3 の分析結果を表示してみる
stargazer(model_1, model_3,
          type = "html")
Dependent variable:
voteshare
(1) (2)
exppv 0.565*** 0.208***
(0.024) (0.034)
ldp 15.852*** 21.151***
(0.961) (1.979)
challenger -28.775***
(1.295)
exppv:ldp -0.221***
(0.050)
exppv:challenger 0.607***
(0.049)
ldp:challenger 18.991***
(2.995)
exppv:ldp:challenger -0.649***
(0.085)
Constant 11.779*** 32.025***
(0.644) (1.160)
Observations 985 985
R2 0.618 0.820
Adjusted R2 0.617 0.819
Residual Std. Error 11.883 (df = 982) 8.178 (df = 977)
F Statistic 794.203*** (df = 2; 982) 635.597*** (df = 7; 977)
Note: p<0.1; p<0.05; p<0.01
  • model_3では、次の 4 つの交差項が作成されている
    exppv:ldp
    exppv:challenger
    ldp:challenger
    exppv:ldp:challenger

  • ここで得られた回帰式:

voteshare = 32.025 + 0.208exppv + 21.151ldp - 28.775challenger

- 0.221exppv:ldp + 0.607exppv:challenger

+ 18.991ldp:challenger - 0.649exppv:ldp:challenger

  • 注目すべき変数は exppv(私達の関心は exppv の得票率への影響だから)
  • exppv の係数 0.208は、ldp = challenger = 0 の時の結果
  • 上の回帰式にldp = challenger = 0 を代入すると次の式が得られる

voteshare=32.025 + 0.208exppv

=>「自民党以外の新人候補者が1円使うと、得票率が 0.2%ポイント上がる」

  • 同様に、ldp = 1, challenger = 0 を代入すると次の式が得られる

voteshare=32.025 + 0.208exppv + 21.151 - 0.221exppv

= 53.176 -0.013exppv

=>「自民党の非新人候補者が1円使うと、得票率が 0.013%ポイント下がる」

  • 同様に、ldp = 0, challenger = 1ldp = 1, challenger = 1を計算して結果をまとめてみる
組み合わせ ldp challenger marginal effects of exppv
非自民+非新人 0 0 0.208
自民+非新人 1 0 -0.013 (0.208 - 0.221)
非自民+新人 0 1 0.815 (0.208 + 0.607)
自民+新人 1 1 -0.054(0.208 + 0.607 - 0.649 - 0.221)

=>「自民党以外の新人候補者が1円使うと、得票率が 0.815%ポイント上がる」
=> 最も選挙費用の限界効果が大きい

  • この結果を、統計的有意性と一緒に可視化してみる
library(marginaleffects)
library(dplyr)
library(ggplot2)

## --- ① 三重交差項の p 値を取り出して「2段表示」用に整形 ---
ct <- summary(model_3)$coefficients
p_triple <- ct["exppv:ldp:challenger", "Pr(>|t|)"]

p_triple_lab <- sprintf("p = %.2e", p_triple)

note_text <- paste0(
  "Three-way interaction\n",
  "(exppv:ldp:challenger)\n ",
  p_triple_lab
)

## --- ② 限界効果の推定 ---
me_exppv_3 <- slopes(
  model_3,                   # 可視化したいモデル
  variables = "exppv",        # 主要独立変数
  newdata = datagrid(
    ldp = c(0, 1),            # 調整変数1
    challenger = c(0, 1)      # 調整変数2
  )
) %>%
  mutate(
    ldp = factor(ldp, labels = c("非自民党候補者", "自民党候補者")),
    challenger = factor(challenger, labels = c("現職", "新人")),
    label = sprintf("%.2f", estimate)
  )

## --- ③ プロット ---
pl_model_3 <- ggplot(
  me_exppv_3,
  aes(
    x = ldp,
    y = estimate,
    ymin = conf.low,
    ymax = conf.high,
    color = challenger
  )
) +
  geom_pointrange(
    position = position_dodge(width = 0.7),
    size = 1.2
  ) +
  geom_text(
    aes(label = label),
    position = position_dodge(width = 0.7),
    hjust = 1.3,
    size = 5,
    show.legend = FALSE
  ) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(
    x = NULL,
    y = "選挙費用が得票率に与える影響(限界効果)",
    color = NULL
  ) +
  ## ★ 右上に2段でp値を表示
  annotate(
    "text",
    x = Inf, y = Inf,
    label = note_text,
    hjust = 1.05,
    vjust = 1.3,
    size = 4.6,
    color = "black",
    lineheight = 1.1
  ) +
  coord_cartesian(clip = "off") +
  theme_bw(base_family = "HiraKakuProN-W3") +
  theme(
    axis.title.y = element_text(size = 16),
    axis.text.x  = element_text(size = 16),
    axis.text.y  = element_text(size = 16),
    legend.text  = element_text(size = 16),
    legend.key.size = unit(1.5, "lines"),
    plot.margin = margin(5.5, 40, 5.5, 5.5)
  ) +
  guides(
    color = guide_legend(
      override.aes = list(size = 1.5)
    )
  ) +
  scale_color_manual(
    values = c(
      "現職" = "blue",
      "新人" = "red"
    )
  )

pl_model_3

3重交差項は「差の差」を表す

  • exppv:ldp:challenger の係数β (-0.649) が表していること
  • 「新人であるために選挙費用が得票率を増やす度合い(=限界効果, ME)が、自民党では0.649だけ小さい」ことを示す

βexppv:ldp:challenger

= [ME(ldp=1, challenger = 1) − ME(ldp = 1, challenger = 0)]

− ME(ldp = 0, challenger = 1) − ME(ldp = 0, challenger = 0)]

  • この式に、ここで得られた数値を代入してみる

βexppv:ldp:challenger

= [-0.06 - (-0.01)] - [0.81 - 0.21] = - 0.05 - 0.6 = -0.65

まとめ

選挙費用(exppv)は得票率を押し上げる (model_1)

・選挙費用を増やすほど得票率が上がる (1円 → 56.5%ポイント)

その効果は候補者属性によって異なる (model_3)

新人(challenger = 新人)のほうが、現職よりも選挙費用の限界効果が大きい
→ 新人は知名度が低いため、資金投入の「効き」が強い

この傾向は非自民党候補者だけに限定
・自民党以外の新人だと 1円→得票率が0.81%ポイント上がる
・自民党以外の非新人だと 1円→得票率が0.21%ポイント上がる

3.2 より現実的な分析: feols()

  • 3.1までの分析では、教育的観点から、得票率に影響を与える統制変数を含めていない

  • 実際の分析では、先行研究に基づいて、妥当な統制変数を含め、固定効果とクラスタ標準誤差を使った feols() を使うべき

  • kukun を使って district という名前の変数をつくる
    例)「宮城6区」: ku (miyagi)kun (6) => miyagi_6

hr_2005 <- hr_2005 %>% 
    mutate(
      district = str_c(ku, kun, sep = "_"))
  • 作成した変数 district をチェック
head(hr_2005$district)
[1] "aichi_1" "aichi_1" "aichi_1" "aichi_1" "aichi_2" "aichi_2"

1. district を固定効果に入れる(| district,)

  • 地盤、人口構成、都市度、保守性、選挙文化などは小選挙区ごとに異なる
  • このような「時間的にほぼ不変な要因」を完全に取り除く
    → 同じ選挙区で、選挙費用が多い候補と少ない候補を比べることができる
  • 全国に数百ある小選挙区の影響を考慮する必要がある

2. district でクラスタ化する (cluster = ~ district,)

  • 目的は、標準誤差を正しくすること
  • 同一選挙区内の誤差が独立でないことを許す
    → 同じ選挙区の候補はメディア環境・争点・投票率で共通ショックを受けると仮定
    → 標準誤差の過小評価を避けることができる

モデル (model_4)

\[voteshare=β_0​+β_1​exppv + \beta_2ldp + \beta_3challenger + \beta_4exppv:ldp + \\ \beta_5exppv:challenger + \beta_6ldp:challenger + \beta_7exppv:ldp:challenger + \\ \beta_8age + \beta_9nocand + \beta_{10}previous + \beta_{11}gender + \beta_{12}{seshudummy}\]

library(fixest)

model_4 <- feols(
  voteshare ~ exppv*ldp*challenger +
    age + nocand + previous + gender + seshu_dummy |
    
    district,            # district を固定効果に入れる 
  
  cluster = ~ district,  # district でクラスタ化する 
  
  se_type = "CR2",
  data = hr_2005)
summary(model_4)
OLS estimation, Dep. Var.: voteshare
Observations: 985
Fixed-effects: district: 300
Standard-errors: Clustered (district) 
                       Estimate Std. Error    t value   Pr(>|t|)    
exppv                  0.265061   0.049635   5.340182 1.8411e-07 ***
ldp                   20.091668   2.134417   9.413188  < 2.2e-16 ***
challenger           -25.754118   1.724555 -14.933777  < 2.2e-16 ***
age                   -0.258320   0.030890  -8.362643 2.3602e-15 ***
previous               1.484854   0.183451   8.093991 1.4685e-14 ***
gendermale            -0.211317   0.773384  -0.273237 7.8486e-01    
seshu_dummy            1.756830   0.938942   1.871075 6.2311e-02 .  
exppv:ldp             -0.306927   0.055079  -5.572494 5.6065e-08 ***
exppv:challenger       0.517560   0.062838   8.236402 5.5972e-15 ***
ldp:challenger        16.438915   3.394179   4.843267 2.0527e-06 ***
exppv:ldp:challenger  -0.457392   0.106251  -4.304816 2.2679e-05 ***
... 1 variable was removed because of collinearity (nocand)
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 5.86904     Adj. R2: 0.863518
                Within R2: 0.89668 
library(marginaleffects)
library(dplyr)
library(ggplot2)
library(broom)

## --- ① 三重交差項の p 値を取得(broom::tidyで安全に) ---
ct <- broom::tidy(model_4)

p_triple <- ct %>%
  filter(term == "exppv:ldp:challenger") %>%
  pull(p.value)

p_triple_lab <- sprintf("p = %.2e", p_triple)

note_text <- paste0(
  "Three-way interaction\n",
  "(exppv:ldp:challenger)\n",
  p_triple_lab
)

## --- ② 限界効果の推定 ---
me_exppv_4 <- slopes(
  model_4,
  variables = "exppv",
  newdata = datagrid(
    ldp = c(0, 1),
    challenger = c(0, 1)
  )
) %>%
  mutate(
    challenger = factor(challenger, labels = c("現職", "新人")),
    ldp = factor(ldp, labels = c("非自民党候補者", "自民党候補者")),
    label = sprintf("%.2f", estimate)
  )

## --- ③ プロット ---
pl_model_4 <- ggplot(
  me_exppv_4,
  aes(
    x = ldp,
    y = estimate,
    ymin = conf.low,
    ymax = conf.high,
    color = challenger
  )
) +
  geom_pointrange(
    position = position_dodge(width = 0.7),
    size = 1.2
  ) +
  geom_text(
    aes(label = label),
    position = position_dodge(width = 0.7),
    hjust = 1.3,
    size = 5,
    show.legend = FALSE
  ) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(
    x = NULL,
    y = "選挙費用が得票率に与える影響(限界効果)",
    color = NULL
  ) +
  ## ★ 右上に p 値(3行)を表示:少し下げたいなら vjust を増やす
  annotate(
    "text",
    x = Inf, y = Inf,
    label = note_text,
    hjust = 1.05,
    vjust = 1.8,   # ← 下げたいので 1.3→1.8(好みで調整)
    size = 4.6,
    color = "black",
    lineheight = 1.1
  ) +
  coord_cartesian(clip = "off") +
  theme_bw(base_family = "HiraKakuProN-W3") +
  theme(
    axis.title.y = element_text(size = 16),
    axis.text.x  = element_text(size = 16),
    axis.text.y  = element_text(size = 16),
    legend.text  = element_text(size = 16),
    legend.key.size = unit(1.5, "lines"),
    plot.margin = margin(5.5, 40, 5.5, 5.5)
  ) +
  guides(
    color = guide_legend(
      override.aes = list(size = 1.5)
    )
  ) +
  scale_color_manual(
    values = c(
      "現職" = "blue",
      "新人" = "red"
    )
  )

pl_model_4

  • 統制変数を含まず、選挙区の事情を考慮しない下の分析結果 (model_3) の結果と比較
  • 0.81 (model_3) => 0.78 (model_4)
  • 0.21 (model_3) => 0.27 (model_4)
  • -0.01 (model_3) => -0.04 (model_4)
  • -0.06 (model_3) => 0.02 (model_4)
    → model_4 の方がより信頼できる分析

3. Excercise

3.1

  • 「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者で異なるかどうか」を調べたい

  • ここで使うデータは1996年から2024年に実施された総選挙結果

  • データはここからダウンロード

  • このデータセットには次の 23 個の変数が入っている

変数名 詳細
1. year 選挙年 (1996-2024)
2. pref 都道府県名
3. ku 小選挙区名
4. kun 小選挙区
5. rank 当選順位
6. nocand 立候補者数
7. seito 候補者の所属政党
8. j_name 候補者の氏名(日本語)
9. name 候補者の氏名(ローマ字)
10. previous 当選回数
11. gender 立候補者の性別: “male”, “female”
12. age 立候補者の年齢
13. wl 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選
14. wlsmd 選挙の当落: 1 = 当選(小選挙区)、0 = 落選(小選挙区)
15. exp 立候補者が使った選挙費用(総務省届け出)
16. status 候補者のステータス: 0 = 非現職、1 現職、2 = 元職
17. vote 得票数
18. voteshare 得票率 (%)
19. eligible 小選挙区の有権者数
20. turnout 小選挙区の投票率 (%)
21. seshu_dummy 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲)
22. jiban_seshu 地盤の受け継ぎ元の政治家の氏名と関係
23. nojiban_seshu 世襲元の政治家の氏名と関係
  • ここから 2009年のデータと次の 6 つの変数を抜き出して分析しなさい
変数名 詳細
voteshare 得票率 (%)
exppv 有権者一人当たりに候補者が費やした選挙費用 (yen)
dpj 民主党ダミー(民主党候補者 = 1、それ以外の候補者 = 0)
previous 候補者の当選回数
age 候補者の年齢
nocand 立候補者数

注意1:dpj という変数はデータセット内には含まれていないので、seito もしくは party 変数を使って各自作成すること
注意2:exppv という変数はデータセット内には含まれていないので、expeligible 2 つの変数を使って各自作成すること

Q1: 上記3 つの変数に関する記述統計を表示させなさい
Q2: 選挙費用と得票率の散布図を表示し、簡単にコメントしなさい
Q3: 衆議院選挙において「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者で異なるかどうか」に関するあなたの仮説を述べなさい。
また、そう考える理由を簡単に述べなさい
Q4: 「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者で異なる」と言えるか? msm パッケージを使って、民主党候補者とそれ以外の候補者それぞれに関して、選挙費用が得票率に与える限界効果を可視化し、その結果をわかりやく説明しなさい

3.2

  • 「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者において、現職と新人の間で異なるかどうか」を調べたい

  • ここで使うデータは1996年から2024年に実施された総選挙結果

  • データはここからダウンロード

  • このデータセットには次の 23 個の変数が入っている

  • ここから 2009年のデータと次の 6 つの変数を抜き出して分析しなさい

変数名 詳細
voteshare 得票率 (%)
exppv 有権者一人当たりに候補者が費やした選挙費用 (yen)
dpj 民主党ダミー(民主党候補者 = 1、それ以外の候補者 = 0)
previous 候補者の当選回数
age 候補者の年齢
nocand 立候補者数
gender 立候補者の性別: “male”, “female”
seshu_duymmy 1 = 世襲、0 = 非世襲
challenger 1 = 新人、0 = それ以外

注意1:dpj という変数はデータセット内には含まれていないので、seito もしくは party 変数を使って各自作成すること
注意2:exppv という変数はデータセット内には含まれていないので、expeligible 2 つの変数を使って各自作成すること
注意3:challenger という変数はデータセット内には含まれていないので、statusを使って各自作成すること

Q1: 小選挙区を表す district を作成し、データフレームに追加しなさい
Q2: 衆議院選挙において「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者において、現職と新人の間で異なるかどうか」に関するあなたの仮説を述べなさい。また、そう考える理由を簡単に述べなさい
Q3: 「選挙費用が得票率に与える影響は、民主党候補者とそれ以外の候補者、現職と新人の間で異なる」と言えるか?
feols() を使って、district を固定効果に入れ、クラスタ化した結果を可視化してその結果をわかりやく説明しなさい

参考文献
  • 宋財泫 (Jaehyun Song)・矢内勇生 (Yuki Yanai)「私たちのR: ベストプラクティスの探究」
  • 土井翔平(北海道大学公共政策大学院)「Rで計量政治学入門」
  • 矢内勇生(高知工科大学)授業一覧
  • 浅野正彦, 矢内勇生.『Rによる計量政治学』オーム社、2018年
  • 浅野正彦, 中村公亮.『初めてのRStudio』オーム社、2018年
  • Winston Chang, R Graphics Cookbook, O’Reilly Media, 2012.
  • Kieran Healy, DATA VISUALIZATION, Princeton, 2019
  • Kosuke Imai, Quantitative Social Science: An Introduction, Princeton University Press, 2017