R packages
library(DT)
library(gapminder)
library(gghighlight)
library(ggrepel)
library(stargazer)
library(tidyverse)
間違い箇所 | ||
---|---|---|
正しいコード | install.packages("tidyverse") |
|
誤ったコード | install.package("tidyverse") |
package → packages |
誤ったコード | install.packages(tidyverse) |
tidyverse → "tidyverse" |
誤ったコード | install.packages ("tidyverse") |
( 前の半角スペース |
誤ったコード | install.packages("tidiverse") |
tidiverse → tidyverse |
Console
に入力していないためConsole
ではなく Rmd
ファイルのチャンクの中に入力してしまうことがよくあるinstall.packages("パッケージ名")
はConsole
に入力するCRAN
に置かれていないため」jpndistrict
というパッケージをコンソールでインストールする際に出てくるのがこのエラーメッセージConsole
に打ち込んで Github
からダウンロードするinstall.packages("remotes")
::install_github("uribo/jpndistrict") remotes
rnaturalearth
というパッケージをインストールする際には、rnaturalearth
を作動させるために必要な他のパッケージも同時にインストールしてみる正確に入力する
インストールするコマンドに dependencies = TRUE
を加える
install.packages("rnaturalearth", dependencies = TRUE)
csv
ファイルが読み取れないcsv
ファイル自体が「壊れている」場合csv
ファイルがきちんと開けるかどうか確認してみるcsv
ファイルの破損を修理するcsv
ファイルのエンコードが UTF-8
でないcsv
ファイルのエンコードを UTF-8
に指定して保存し直すcsv
ファイルが「Rプロジェクト」内に保存されていないcsv
ファイルを「Rプロジェクト」内に保存する・Step 1:
install.packages("パッケージ名")
・Step 2: library(パッケージ名)
もしくは
library("パッケージ名")
DT
というパッケージを使うためには、次の 2
ステップが必要入力コード | 入力するところ | 入力後の処置 | |
Step 1 | install.package("DT") |
Console |
リターンキーを押す |
Step 2 | library(DT) |
Rmd ファイルのチャンクの中 |
knit する |
df1
という名前のデータフレームを使って
DT
というパッケージの datatable()
という関数を使う場合★ 次の 2 行をチャンクに打ち込む
library(DT)
datatable(df1)
★ 次の 1 行をチャンクに打ち込む
::datatable(df1) DT
パッケージ間のコンフリクトの解説
・例えば、tidyverse
というパッケージをインストールしロードすると次のように表示される
library(tidyverse)
メッセージの意味:
・tidyverse
パッケージをロードすると、同時に 8
つのパッケージがロードされる ・tidyverse
パッケージは filter()
と lag()
という 2
つの関数とコンフリクト(=エラー)を起こす
→
filter()
関数を使う際、エラーを避けるため次のようにコマンドを入力する必要がある
filter()
→ dplyr::filter()
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
を選び、指示に従って作成すると、RProject
は
project folder
を自動的に working directory
だと認識する
RStudio
右画面下部画面にある File
をクリックすると、作成した RProject
フォルダー内にあるファイルが表示される
hr96-21.csv
)RProject
フォルダ内に data
という名称のフォルダを作成するcsv
ファイルがパソコンにダウンロードされ、data
内に自動的に保存されるdownload.file(url = "[hr96-21.csv](https://asanoucla.github.io/hr96-21.csv)",
destfile = "data/hr96-21.csv")
注意:一度ダウンロードを完了すれば、このコマンドを実行する必要はありません
hr96-21.csv をクリックしてデータをパソコンにダウンロード
RProject
フォルダ内に data
という名称のフォルダを作成する
ダウンロードした hr96-21.csv
を手動でRProject
フォルダ内にある data
フォルダに入れる
hr96-21.csv
を読み取るna = "."
というコマンドは「欠損値をドットで置き換える」という意味空欄
」は「.
」で置き換わるnumeric
)」型のデータが「」文字型
(character
)」として認識されるなど、エラーの原因になるため、読み取る時点で事前に対処する<- read_csv("data/hr96-21.csv",
hr na = ".")
locale()
関数を使って日本語エンコーディング
(cp932
) を指定する<- read_csv("data/hr96-21.csv",
hr na = ".",
locale = locale(encoding = "cp932"))
readrパッケージ
を使わないで読み取る<- read.csv("data/hr96-21.csv",
hr na = ".")
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
として認識されていることがわかるwl = 1
は小選挙区当選者、wl = 2
は復活当選者、wl = 0
は落選者table(hr$wl)
0 1 2
6001 2674 985
wlsmd = 1
が小選挙区当選者, wlsmd = 0
が小選挙区の落選者と変更し、データフレーム名を df1
に変更if_else()
関数を使う<- hr %>%
df1 mutate(wlsmd = ifelse(wl == 1, 1, 0))
table(df1$wlsmd)
0 1
6986 2674
exp
と eligible
を使って、有権者一人あたりに使う選挙費用 (exppv
)
を作る<- mutate(df1, exppv = exp / eligible) # eligible は小選挙区ごとの有権者数 df1
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
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 |
|
exp
や eligible
のデータの「型」が「数値型
(numeric
)」ではなく「文字型」(charactor
)
として読み取られることがあるnumeric
)」ではなく「文字型」(charactor
)
として読み取られる場合as.numeric()
関数を使って、データの型を「数値型
(numeric
)」に変換する必要があるstatus = 0
は新人、status = 1
は現職、
status = 2
は元職table(df1$status)
0 1 2
5517 3510 633
status = 0
がその他、status = 1
が現職<- hr %>%
df1 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"
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
は非自民党候補者<- hr %>%
df1 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 = それ以外 |
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 個の変数が入っているその理由:
記述統計で表示されるのは変数の「型」 class
が「数値型」( numeric
, integer
,
double
)の場合だけだから
文字型データ (chr
) や ファクター
(factor
) の場合は記述統計が表示されない
R で可視化する際、変数の class の違いはとても重要
「データの型」に関する詳細は 「私たちの R: 9.1 データ型」 を参考
str()
関数で、df1
に含まれる変数の
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
で表示されている