• このセクションで使っている R packages
library(DT)
library(gapminder)
library(gghighlight)
library(ggrepel)
library(stargazer)
library(tidyverse)

1. R を使う時の「あるある」エラー

  • R を使って計量分析するために必要なのはデータの読み取り
  • しかし、いくつかの典型的なエラーが起こる
  • ここでは皆さんが直面するであろう「あるある」エラーの内容とその原因と対処法を提供する

1.1 パッケージがインストールできない

  • 原因はいくつか考えられる

原因 1: タイプミス

  • 例えば、次のような単純な「打ち間違い」:
間違い箇所
正しいコード install.packages("tidyverse")
誤ったコード install.package("tidyverse") packagepackages
誤ったコード install.packages(tidyverse) tidyverse"tidyverse"
誤ったコード install.packages ("tidyverse") ( 前の半角スペース
誤ったコード install.packages("tidiverse") tidiversetidyverse
対処法:
  • 正確に入力する

原因 2 : Console に入力していないため

  • Console ではなく Rmd ファイルのチャンクの中に入力してしまうことがよくある
対処法:
  • 正確に入力する
  • install.packages("パッケージ名")Console に入力する

原因 3: 「パッケージが CRAN に置かれていないため」

  • 例えば、jpndistrict というパッケージをコンソールでインストールする際に出てくるのがこのエラーメッセージ
対処法:
  • 正確に入力する
  • 次のコマンドを Console に打ち込んで Github からダウンロードする
install.packages("remotes")
remotes::install_github("uribo/jpndistrict")

原因 4: 「必要なパッケージがダウンロードできていないため」

  • 例えば、rnaturalearth というパッケージをインストールする際には、rnaturalearth を作動させるために必要な他のパッケージも同時にインストールしてみる
対処法:
  • 正確に入力する

  • インストールするコマンドに dependencies = TRUE を加える

install.packages("rnaturalearth", dependencies = TRUE)

1.2 csvファイルが読み取れない

  • 複数の原因が考えられる

原因 1: csv ファイル自体が「壊れている」場合

  • 読み取ろうとしている csv ファイルがきちんと開けるかどうか確認してみる
対処法:
  • 正確に入力する
  • csv ファイルの破損を修理する

原因 2: csv ファイルのエンコードが UTF-8 でない

対処法:
  • 正確に入力する
  • csv ファイルのエンコードを UTF-8 に指定して保存し直す

原因 3: csv ファイルが「Rプロジェクト」内に保存されていない

対処法:
  • 正確に入力する
  • csv ファイルを「Rプロジェクト」内に保存する

2. パッケージのインストールとロード

2.1 パッケージを使うための 2 ステップ

Step 1: install.packages("パッケージ名")
Step 2: library(パッケージ名) もしくは library("パッケージ名")

  • 例えば、DT というパッケージを使うためには、次の 2 ステップが必要
入力コード 入力するところ 入力後の処置
Step 1 install.package("DT") Console リターンキーを押す
Step 2 library(DT) Rmd ファイルのチャンクの中 knit する

2.2 パッケージをロードする 2 つの方法

  • 例えば、df1 という名前のデータフレームを使って DT というパッケージの datatable() という関数を使う場合
  • 次の 2 通りの方法が可能

★ 次の 2 行をチャンクに打ち込む

library(DT)
datatable(df1)

★ 次の 1 行をチャンクに打ち込む

DT::datatable(df1)
  • この補助教材ではどちらの方法も使っている

パッケージ間のコンフリクトの解説
・例えば、tidyverse というパッケージをインストールしロードすると次のように表示される

library(tidyverse)

メッセージの意味:

tidyverse パッケージをロードすると、同時に 8 つのパッケージがロードされる   ・tidyverse パッケージは filter()lag() という 2 つの関数とコンフリクト(=エラー)を起こす
filter()関数を使う際、エラーを避けるため次のようにコマンドを入力する必要がある
filter()dplyr::filter()

3. R プロジェクトを作る

  • RStudio を使ってデータ分析する上で重要なのは「R プロジェクトをつくること」

  • 「R プロジェクトをつくること」= 「R プロジェクトフォルダを作ること」

  • 「フォルダ」とは「ディレクトリ」のこと

  • 正しい「作業ディレクトリ (working directory)」の中で作業しないとエラーになる

  • この「作業ディレクトリ」= 「フォルダ」の中には分析に必要な複数の「ファイル」が入っている

  • RStudio は分析に必要な「ファイル」を、指定された「Rプロジェクトフォルダ」(= 作業中のディレクトリ)から引き出す
    → R プロジェクトをつくらないと「エラーを起こす確率が高くなる」

  • 自分がどの「フォルダ」の中で作業しているか(= どの「ディレクトリ」の中で作業しているか)を確かめる方法

  • 次のコマンドで確かめることができる

getwd()  # get working directry の略  
[1] "/Users/asanomasahiko/Dropbox/statistics/class_materials"
  • working directory にはデータ分析に必要なファイル(データや scriptなど) を保存するので、常に確認しておくこと

  • エラーが出た特に getwd() で自分が「どこで作業しているのか」をチェックする

  • もし、自分が作成した R プロジェクトフォルダの中にいない場合は、R プロジェクトフォルダの中にある「.Rproj」で終わるアイコンをダブルクリックする

  • RStudio では、分析テーマごとに新たなプロジェクトを作成するのがよい
    → いちいち getwd() でチェックしなくても、確実にデータを読み込んでくれる
    → エラーが少なくなる

  • File から New Project を選び、指示に従って作成すると、RProjectproject folder を自動的に working directory だと認識する

  • RStudio 右画面下部画面にある File をクリックすると、作成した RProject フォルダー内にあるファイルが表示される

4. データの準備 (hr96-21.csv)

  • データを可視化するために必要なのは「適切ななデータ」を準備すること
  • 「適切なデータ」とはデータを可視化する上で、エラーが出ず、問題なく必要なグラフを作成できるようなデータのこと
  • ここでは、データを可視化したり、計量分析したりするために必要なデータを準備する

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

  • Web 上に公開されているデータをパソコンにダウンロードする方法は 2 つある
(1) 予めダウンロード先を指定する方法
  • RProject フォルダ内に data という名称のフォルダを作成する
  • 下のコマンドを実行すると、csv ファイルがパソコンにダウンロードされ、data 内に自動的に保存される
download.file(url = "[hr96-21.csv](https://asanoucla.github.io/hr96-21.csv)",
              destfile = "data/hr96-21.csv")  

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

(2) ダウンロード先を指定しない方法
  • hr96-21.csv をクリックしてデータをパソコンにダウンロード  

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

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

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

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

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

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

4.4 総選挙データの読込と変数の修正・作成

  • 新たな変数の作成と修正
wlsmd の作成
  • wl = 1 は小選挙区当選者、wl = 2 は復活当選者、wl = 0 は落選者
table(hr$wl)

   0    1    2 
6001 2674  985 
  • wlsmd = 1 が小選挙区当選者, wlsmd = 0 が小選挙区の落選者と変更し、データフレーム名を df1 に変更
  • if_else() 関数を使う
df1 <- hr %>% 
  mutate(wlsmd = ifelse(wl == 1, 1, 0))
  • 変更を確認
table(df1$wlsmd)

   0    1 
6986 2674 
exppv (有権者一人あたり選挙費用)の作成
  • expeligible を使って、有権者一人あたりに使う選挙費用 (exppv) を作る
df1 <- mutate(df1, exppv = exp / eligible) # eligible は小選挙区ごとの有権者数
summary(df1$exppv)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
  0.0013   8.1762  18.7646  23.0907  33.3863 120.8519     2831 
  • exppv を作成する際にエラーが出た時の対処法
  • df1 <- mutate(df1, exppv = exp / eligible)実行する前に次の処理をする  
  • チャンクの中に打ち込んだ df1 <- mutate(df1, exppv = exp / eligible) は削除し、下の一連の作業が終わった後で打ち直すこと
  • チャンクの中に打ち込んだ df1 <- mutate(df1, exppv = exp / eligible) を残したまま下の一連の作業を実行すると、そのチャンクのところでエラーになってしまうから
Steps 実行するコマンド 作業の内容
1 str(df1$exp) 変数 exp のデータの型をチェック
2 num(文字型)なら Step 4 へ、それ以外の型なら Step 3 へ
3 df1$exp <- as.numeric(df1$exp) 変数 exp の型を数値型に変換
4 str(df1$eligible) 変数 eligible のデータの型をチェック
5 num(文字型)なら Step 7 へ、それ以外の型なら Step 6 へ
6 df1$eligible <- as.numeric(df1$eligible) 変数 eligible の型を数値型に変換
7 str(df1$eligible) 変数 eligible のデータの型をチェック
8 num (数値型)なら OK
9 str(df1$eligible) 変数 eligible のデータの型をチェック
10 num (数値型)なら OK

「数値型」のはずなのに「文字型」と認識される場合の対処法

  • R では時々 expeligible のデータの「型」が「数値型 (numeric)」ではなく「文字型」(charactor) として読み取られることがある
  • その場合はまず、次の作業を行う:
    (1) 変数の値に数値以外が入っていないか確かめる
    → 入っていれば数値に修正する
    (2) 変数の値が「全角」になっていないか確かめる
    → 全角の数字が入っていたら「半角」に修正する
  • 以上の作業を行っても「数値型 (numeric)」ではなく「文字型」(charactor) として読み取られる場合
    as.numeric()関数を使って、データの型を「数値型 (numeric)」に変換する必要がある
inc (現職ダミー)の作成
  • status = 0 は新人、status = 1 は現職、 status = 2 は元職
table(df1$status)

   0    1    2 
5517 3510  633 
  • これを次のように変更:
  • status = 0 がその他、status = 1 が現職
df1 <- hr %>% 
  mutate(inc = if_else(status == 1, 1, 0))
table(df1$inc)

   0    1 
6150 3510 
  • 修正後のデータフレーム (df1) を表示
names(df1)
 [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" "inc"          
ldp (自民党ダミー)の作成
table(df1$seito)

                                         N党           アイヌ民族党 
                     1                     27                      1 
さわやか神戸・市民の会     ニューディールの会                 みんな 
                     2                      1                     79 
                  れい       世界経済共同体党                   保守 
                    12                      2                     16 
                保守新                   公明                   共産 
                    11                     79                   2228 
                  国民                 国民党               国民新党 
                    21                     11                     21 
              安楽死党       市民新党にいがた                   希望 
                     1                      1                    199 
                  幸福               当たり前                   改革 
                   312                      1                      1 
            改革クラブ         政事公団太平会           政治団体代表 
                     4                      1                      2 
        文化フォーラム           新党さきがけ               新党大地 
                    10                     13                      8 
              新党尊命               新党日本                 新社会 
                     1                      9                     38 
                  新進               日本新進               日本未来 
                   235                      1                    111 
          日本維新の会                   次世                   民主 
                   198                     39                   1654 
          民主改革連合         沖縄社会大衆党                   無所 
                     2                      1                    641 
            無所属の会                   生活                   社民 
                     9                     13                    316 
                  立憲                   維新                 緑の党 
                   277                    171                      1 
                  緒派                   自民                   自由 
                    44                   2542                     61 
              自由連合                   諸派               青年自由 
                   212                     18                      1 
  • seito を使って自民党ダミー (ldp) を作る
  • ldp = 1 は自民党候補者、ldp = 0 は非自民党候補者
df1 <- hr %>% 
  mutate(ldp = if_else(seito == "自民", 1, 0))
table(df1$ldp)

   0    1 
7118 2542 
  • 修正後のデータフレーム (df1) を表示
names(df1)
 [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" "ldp"          
  • df1 には 23 個の変数が入っている
変数名 詳細
year 選挙年 (1996-2021)
pref 都道府県名
ku 小選挙区名
kun 小選挙区
wl 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選
rank 当選順位
nocand 立候補者数
seito 候補者の所属政党
j_name 候補者の氏名(日本語)
gender 立候補者の性別: “male”, “female”
name 候補者の氏名(ローマ字)
previous これまでの当選回数(当該総選挙結果は含まない)
age 立候補者の年齢
exp 立候補者が使った選挙費用(総務省届け出)
status 候補者のステータス: 0 = 非現職、1 現職、2 = 元職
vote 得票数
voteshare 得票率 (%)
eligible 小選挙区の有権者数
turnout 小選挙区の投票率 (%)
seshu_dummy 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲)
jiban_seshu 地盤の受け継ぎ元の政治家の氏名と関係
nojiban_seshu 世襲元の政治家の氏名と関係
wlsmd 選挙の当落: 1 = 当選(小選挙区)、0 = 落選(小選挙区)
exppv 有権者一人あたりに費やす選挙費用(円)
inc 現職ダミー: 1 現職、0 = 非現職
ldp 自民党ダミー: 1 自民党候補者、0 = それ以外

4.5 総選挙データの記述統計

  • 総選挙データ (df1) の変数の記述統計を表示させる
library(stargazer)
  • チャンクオプションで {r, results = "asis"} と指定する
stargazer(as.data.frame(df1), 
          type ="html",
          digits = 2)
Statistic N Mean St. Dev. Min Max
year 9,660 2,007.88 7.68 1,996 2,021
kun 9,660 5.75 5.07 1 25
wl 9,660 0.48 0.67 0 2
rank 9,660 2.65 20.39 1 2,003
nocand 9,660 3.89 1.09 2 9
previous 9,660 1.48 2.46 0 19
age 9,656 51.22 11.13 25 94
exp 6,829 7,551,393.00 5,482,684.00 535 27,462,362
status 9,660 0.49 0.62 0 2
vote 9,660 55,987.87 40,626.34 177 210,515
voteshare 9,660 27.67 19.34 0.10 95.30
eligible 8,785 330,268.30 80,058.87 115,013 495,212
turnout 7,849 62.09 6.53 44.71 83.80
seshu_dummy 8,875 0.12 0.33 0 1
ldp 9,660 0.26 0.44 0 1
  • df1 には 23 個の変数が入っている
  • しかし、ここには 15 個の変数の記述統計しか表示されていない

その理由:

  • 記述統計で表示されるのは変数の「型」 class が「数値型」( numeric, integer, double )の場合だけだから

  • 文字型データ (chr) や ファクター (factor) の場合は記述統計が表示されない

R で可視化する際、変数の class の違いはとても重要

str(df1)
tibble [9,660 × 23] (S3: tbl_df/tbl/data.frame)
 $ year         : num [1:9660] 1996 1996 1996 1996 1996 ...
 $ pref         : chr [1:9660] "愛知" "愛知" "愛知" "愛知" ...
 $ ku           : chr [1:9660] "aichi" "aichi" "aichi" "aichi" ...
 $ kun          : num [1:9660] 1 1 1 1 1 1 1 2 2 2 ...
 $ wl           : num [1:9660] 1 0 0 0 0 0 0 1 0 2 ...
 $ rank         : num [1:9660] 1 2 3 4 5 6 7 1 2 3 ...
 $ nocand       : num [1:9660] 7 7 7 7 7 7 7 8 8 8 ...
 $ seito        : chr [1:9660] "新進" "自民" "民主" "共産" ...
 $ j_name       : chr [1:9660] "河村たかし" "今枝敬雄" "佐藤泰介" "岩中美保子" ...
 $ gender       : chr [1:9660] "male" "male" "male" "female" ...
 $ name         : chr [1:9660] "KAWAMURA, TAKASHI" "IMAEDA, NORIO" "SATO, TAISUKE" "IWANAKA, MIHOKO" ...
 $ previous     : num [1:9660] 2 2 2 0 0 0 0 2 0 0 ...
 $ age          : num [1:9660] 47 72 53 43 51 51 45 51 71 30 ...
 $ exp          : num [1:9660] 9828097 9311555 9231284 2177203 NA ...
 $ status       : num [1:9660] 1 2 1 0 0 0 0 1 2 0 ...
 $ vote         : num [1:9660] 66876 42969 33503 22209 616 ...
 $ voteshare    : num [1:9660] 40 25.7 20.1 13.3 0.4 0.3 0.2 32.9 26.4 25.7 ...
 $ eligible     : num [1:9660] 346774 346774 346774 346774 346774 ...
 $ turnout      : num [1:9660] 49.2 49.2 49.2 49.2 49.2 49.2 49.2 51.8 51.8 51.8 ...
 $ seshu_dummy  : num [1:9660] 0 0 0 0 0 0 0 0 1 0 ...
 $ jiban_seshu  : chr [1:9660] NA NA NA NA ...
 $ nojiban_seshu: chr [1:9660] NA NA NA NA ...
 $ ldp          : num [1:9660] 0 1 0 0 0 0 0 0 1 0 ...
  • 数値は数値型 (numeric)、文字は文字型 (character) になっている
  • 文字型 (character) の値は「""」で囲まれいていることに注意
  • 欠損値は NA で表示されている
これで、計量分析に必要な衆院選のデータが揃った
参考文献
  • Tidy Animated Verbs
  • 宋財泫 (Jaehyun Song)・矢内勇生 (statuki statanai)「私たちのR: ベストプラクティスの探究」
  • 宋財泫「ミクロ政治データ分析実習(2022年度)」
  • 土井翔平(北海道大学公共政策大学院)「Rで計量政治学入門」
  • 矢内勇生(高知工科大学)授業一覧
  • 浅野正彦, 矢内勇生.『Rによる計量政治学』オーム社、2018年
  • 浅野正彦, 中村公亮.『初めてのRStudio』オーム社、2018年
  • Winston Chang, R Graphics Coo %>% kbook, O’Reilly Media, 2012.
  • Kieran Healy, DATA VISUALIZATION, Princeton, 2019
  • Kosuke Imai, Quantitative Social Science: An Introduction, Princeton University Press, 2017