descriptive statistics
)
と推測統計学 (inferential statistics
)
の二つに分類できる統計学の種類 | 特徴 |
---|---|
記述統計学: | 統計量を使ってデータ傾向や性質をつかむ |
推測統計学: | 母集団の母数(母平均や母分散)を検定し推定する |
population
) から標本 (sample
)
を無作為に抽出し、その標本によって得られた標本平均や不偏分散などの統計量を使って、母集団の母数(母平均や母分散)を検定し推定する ・ここでは両統計学で共通して使う基礎知識である「記述統計学」を解説・演習する
descriptive statistics
)とは「ある変数が持つ情報を要約した数値」R関数 | 解説 | 英語表記 | |
---|---|---|---|
mean() |
平均値 | mean | |
median() |
中央値 | median | |
var() |
不偏分散(注1) | variance | |
sd() |
不偏標準偏差(注1) | standard deviation | |
IQR() |
四分位範囲(注2) | interquartile range | |
min() |
最小値 | minimum | |
max() |
最小値と最大値 | maximum | |
注1:
「不偏分散」と「不偏標準偏差」の詳細に関しては「10.推測統計学
」での解説を参照
注2: 四分位範囲とは、75パーセンタイルと25パーセンタイルの差のこと
TOEFL (iBT)
を受験したとするx
という変数名を付ける[1] 22 33 44 55 66 77 88 99 100
x
を代表する値(=代表値)として平均値、中央値、分散、標準偏差、四分位範囲、範囲を求めてみる[1] 66
x
を小さい順にソートしてみる[1] 22 33 44 55 66 77 88 99 100
分散 (variance
)
とは数値データのばらつき具合を表すための指標
分散は「平均値と個々のデータの差の2乗の平均」
平均値から離れた値をとるデータが多い → 分散が大きい
平均点付近の値をとるデータ多い → 分散が小さい
一般的に分散は次の式で求められる
\[分散 = \frac{\sum_{i=1}^N (個々のデータ -
平均)^2}{N}\]
分散 \(σ^2\)(シグマ)は次のように表記されることが多い
\[σ^2 = \frac{\sum_{i=1}^N (x_i -
\bar{x})^2}{N}\]
[1] 22 33 44 55 66 77 88 99 100
x
の平均値を求めて x_mean
と名前を付ける [1] 64.88889
x1
と名前を付ける [1] -42.888889 -31.888889 -20.888889 -9.888889 1.111111 12.111111 23.111111
[8] 34.111111 35.111111
[1]
の右隣にある数値 (-42.888889
)
は、データ x
の 1 番目の値 (22
) から平均値
(64.88889
) を引いた値[1] -42.88889
x1
)」x2
と名付ける [1] 1839.456790 1016.901235 436.345679 97.790123 1.234568 146.679012
[7] 534.123457 1163.567901 1232.790123
x2
の和を計算し sum_x2
と名付ける [1] 6468.889
N
) は 9 を代入するx
の分散 \(σ^2\)
は次のように計算できる\[σ^2 = \frac{\sum_{i=1}^N (x_i - \bar{x})^2}{N} = \frac{6468.889}{9} = 718.77\]
(718.77
) とは異なる値が出た→ その理由: var()
が計算するのは「分散 \(σ^2\)」 ではなく「不偏分散
\(U^2\)」だから
→ 詳細は 10. 推測統計学
を参照
\[標準偏差 = \sqrt{分散}\]
[1] 26.80989
( 26.8098
) とは異なる値が出た→ その理由: sqrt(var(x))
や sd(x)
が計算するのは「標準偏差 \(σ\)」
ではなく「不偏標準偏差 \(U\)」だから
→ 詳細は 10. 推測統計学
を参照
dplyr
を用いた記述統計量dplyr
パッケージを含む tidyverse
パッケージをロードデータの準備 (hr96-21.csv
)
・hr96-21.csv
をクリックしてデータをパソコンにダウンロード
RProject
フォルダ内に data
という名称のフォルダを作成するhr96-21.csv
を手動でRProject
フォルダ内にある data
フォルダに入れるna = "."
は「dot は欠損値と理解せよ」とのコマンドhr96_21.csv
は1996年に衆院選挙に小選挙区が導入されて以来実施された 9
回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017,
2021)の結果のデータ
読み取った選挙データを確認
dim()
関数を使うと hr
は9,660行、22列のデータであることが分かる
[1] 9660 22
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 | 世襲元の政治家の氏名と関係 |
dfSummary()
を使った記述統計の可視化summarytools パッケージ
を読み込むDimensions: 9660 x 22
Duplicates: 0
No | Variable | Stats / Values | Freqs (% of Valid) | Graph | Missing |
---|---|---|---|---|---|
1 | year [factor] |
1. 1996 2. 2000 3. 2003 4. 2005 5. 2009 6. 2012 7. 2014 8. 2017 9. 2021 |
1261 (13.1%) 1199 (12.4%) 1026 (10.6%) 989 (10.2%) 1139 (11.8%) 1294 (13.4%) 959 ( 9.9%) 936 ( 9.7%) 857 ( 8.9%) |
0 (0.0%) |
|
2 | pref [character] |
1. 東京 2. 大阪 3. 神奈川 4. 愛知 5. 埼玉 6. 千葉 7. 兵庫 8. 北海道 9. 福岡 10. 静岡 [ 37 others ] |
953 ( 9.9%) 635 ( 6.6%) 632 ( 6.5%) 521 ( 5.4%) 498 ( 5.2%) 444 ( 4.6%) 407 ( 4.2%) 369 ( 3.8%) 353 ( 3.7%) 264 ( 2.7%) 4584 (47.5%) |
0 (0.0%) |
|
3 | ku [character] |
1. tokyo 2. osaka 3. kanagawa 4. aichi 5. saitama 6. chiba 7. hyogo 8. hokkaido 9. fukuoka 10. shizuoka [ 38 others ] |
953 ( 9.9%) 635 ( 6.6%) 632 ( 6.5%) 521 ( 5.4%) 498 ( 5.2%) 444 ( 4.6%) 407 ( 4.2%) 369 ( 3.8%) 353 ( 3.7%) 264 ( 2.7%) 4584 (47.5%) |
0 (0.0%) |
|
4 | kun [factor] |
1. 1 2. 2 3. 3 4. 4 5. 5 6. 6 7. 7 8. 8 9. 9 10. 10 [ 15 others ] |
1626 (16.8%) 1456 (15.1%) 1337 (13.8%) 980 (10.1%) 730 ( 7.6%) 501 ( 5.2%) 418 ( 4.3%) 330 ( 3.4%) 308 ( 3.2%) 308 ( 3.2%) 1666 (17.2%) |
0 (0.0%) |
|
5 | wl [factor] |
1. 0 2. 1 3. 2 |
6001 (62.1%) 2674 (27.7%) 985 (10.2%) |
0 (0.0%) |
|
6 | rank [factor] |
1. 1 2. 2 3. 3 4. 4 5. 5 6. 6 7. 7 8. 8 9. 9 |
2673 (27.7%) 2673 (27.7%) 2459 (25.5%) 1256 (13.0%) 444 ( 4.6%) 122 ( 1.3%) 25 ( 0.3%) 6 ( 0.1%) 2 ( 0.0%) |
0 (0.0%) |
|
7 | nocand [numeric] |
Mean (sd) : 3.9 (1.1) min < med < max: 2 < 4 < 9 IQR (CV) : 1 (0.3) |
2 : 421 ( 4.4%) 3 : 3609 (37.4%) 4 : 3244 (33.6%) 5 : 1609 (16.7%) 6 : 582 ( 6.0%) 7 : 140 ( 1.4%) 8 : 37 ( 0.4%) 9 : 18 ( 0.2%) |
0 (0.0%) |
|
8 | seito [character] |
1. 自民 2. 共産 3. 民主 4. 無所 5. 社民 6. 幸福 7. 立憲 8. 新進 9. 自由連合 10. 希望 [ 41 others ] |
2542 (26.3%) 2228 (23.1%) 1654 (17.1%) 641 ( 6.6%) 316 ( 3.3%) 312 ( 3.2%) 277 ( 2.9%) 235 ( 2.4%) 212 ( 2.2%) 199 ( 2.1%) 1044 (10.8%) |
0 (0.0%) |
|
9 | j_name [character] |
1. 伊藤達也 2. 三原朝彦 3. 上川陽子 4. 下村博文 5. 中川正春 6. 中谷元 7. 二階俊博 8. 伴野豊 9. 佐藤勉 10. 前原誠司 [ 4610 others ] |
10 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9568 (99.1%) |
1 (0.0%) |
|
10 | gender [character] |
1. female 2. male |
1323 (13.7%) 8333 (86.3%) |
4 (0.0%) |
|
11 | name [character] |
1. KATO, KOICHI 2. ITO, TATSUYA 3. ABE, SHINZO 4. AISAWA, ICHIRO 5. AMARI, AKIRA 6. ASO, TARO 7. AZUMI, JUN 8. BANNO, YUTAKA 9. EDANO, YUKIO 10. ENDO, TOSHIAKI [ 4737 others ] |
11 ( 0.1%) 10 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9 ( 0.1%) 9567 (99.0%) |
0 (0.0%) |
|
12 | previous [numeric] |
Mean (sd) : 1.5 (2.5) min < med < max: 0 < 0 < 19 IQR (CV) : 2 (1.7) |
19 distinct values | 0 (0.0%) |
|
13 | age [numeric] |
Mean (sd) : 51.2 (11.1) min < med < max: 25 < 52 < 94 IQR (CV) : 16 (0.2) |
64 distinct values | 4 (0.0%) |
|
14 | exp [numeric] |
Mean (sd) : 7551392 (5482684) min < med < max: 535 < 6566110 < 27462362 IQR (CV) : 8240845 (0.7) |
6753 distinct values | 2831 (29.3%) |
|
15 | status [factor] |
1. 0 2. 1 3. 2 |
5517 (57.1%) 3510 (36.3%) 633 ( 6.6%) |
0 (0.0%) |
|
16 | vote [numeric] |
Mean (sd) : 55986 (40628.4) min < med < max: 177 < 50885.5 < 210515 IQR (CV) : 69290.2 (0.7) |
9278 distinct values | 0 (0.0%) |
|
17 | voteshare [numeric] |
Mean (sd) : 27.7 (19.3) min < med < max: 0.1 < 26.7 < 95.3 IQR (CV) : 34.3 (0.7) |
2151 distinct values | 0 (0.0%) |
|
18 | eligible [numeric] |
Mean (sd) : 330268.3 (80058.9) min < med < max: 115013 < 334376 < 495212 IQR (CV) : 121361 (0.2) |
2385 distinct values | 875 (9.1%) |
|
19 | turnout [numeric] |
Mean (sd) : 62.1 (6.5) min < med < max: 44.7 < 61.3 < 83.8 IQR (CV) : 10 (0.1) |
535 distinct values | 1811 (18.7%) |
|
20 | seshu_dummy [numeric] |
Min : 0 Mean : 0.1 Max : 1 |
0 : 7772 (87.6%) 1 : 1103 (12.4%) |
785 (8.1%) |
|
21 | jiban_seshu [character] |
1. 伯父=田村元(衆議院議員) 2. 叔父(養父)=古屋享(衆議院議員) 3. 父=三原朝雄(衆議院議員) 4. 父=塩谷一夫(衆議院議員) 5. 父=安倍晋太郎(衆議院議員) 6. 父=小沢佐重喜(衆議院議員) 7. 父=岸田文武(衆議院議員) 8. 父=村上信二郎(衆議院議員) 9. 父=松本十郎(衆議院議員) 10. 父=林大幹(衆議院議員) [ 190 others ] |
9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 9 ( 1.0%) 835 (90.3%) |
8735 (90.4%) |
|
22 | nojiban_seshu [character] |
1. 伯父=田中六助 2. 父=北側義一(衆議院) 3. 父=土屋義彦(参議院議長・埼玉県知事) 4. 父=平井卓志(参議院)、祖父=平井太郎(参議院議長 5. 父=石原慎太郎(衆議院議員) 6. 父=石破二朗(参議院議員) 7. 義父=佐藤栄佐久(参議院議員・福島県知事) 8. 叔父=柳田桃太郎 9. 父=中村喜四郎(先代)(参議院議員)、母=中村登美 10. 父=宮島滉(参院議員) [ 28 others ] |
8 ( 4.3%) 8 ( 4.3%) 8 ( 4.3%) 8 ( 4.3%) 8 ( 4.3%) 8 ( 4.3%) 8 ( 4.3%) 7 ( 3.8%) 7 ( 3.8%) 7 ( 3.8%) 107 (58.2%) |
9476 (98.1%) |
summarise()
summarise()
関数の使い方
summarise(記述統計の関数, 変数名1, 変数名2,...)
nocand
) の平均を計算したいとする# A tibble: 1 × 1
`mean(nocand)`
<dbl>
1 3.89
1996年から2021年総選挙において、小選挙区ごとの平均立候補者数は 3.89
選挙費用 (exp
) の平均を計算してみる
# A tibble: 1 × 1
`mean(exp)`
<dbl>
1 NA
→ その理由・・・exp
に欠損値があるため
→ na.rm = TRUE
(欠損値を取り除く指定)を加えてみる
# A tibble: 1 × 1
`mean(exp, na.rm = TRUE)`
<dbl>
1 7551393.
→ 計算できた !
summarise()
内には複数の変数名を指定できるhr
の exp
と age
と
voteshare
の平均値 (mean())
を計算してみる# A tibble: 1 × 3
`mean(exp, na.rm = TRUE)` `mean(age, na.rm = TRUE)` mean(voteshare, na.rm = …¹
<dbl> <dbl> <dbl>
1 7551393. 51.2 27.7
# ℹ abbreviated name: ¹`mean(voteshare, na.rm = TRUE)`
tibble
)形式で表示されるrename()
関数を使って変数名を読みやすく修正できるhr |>
summarise(Mean_exp = mean(exp, na.rm = TRUE),
Mean_age = mean(age, na.rm = TRUE),
Mean_voteshare = mean(voteshare, na.rm = TRUE))
# A tibble: 1 × 3
Mean_exp Mean_age Mean_voteshare
<dbl> <dbl> <dbl>
1 7551393. 51.2 27.7
group_by()
mean()
や
sd()
などの関数のみを使った方が効率的dplyr
パッケージが大変便利dplyr
を使わずに総選挙ごとの選挙費用
(exp
) の平均値を計算してみる1996
」である場合の選挙費用
(exp
)
の平均値を計算する場合は以下のように書く必要があるexp
に欠損値があるため
na.rm = TRUE
(欠損値を取り除く指定)を加えている[1] 9136316
mean(hr$exp[hr$year == 1996], na.rm = TRUE)
mean(hr$exp[hr$year == 2000], na.rm = TRUE)
mean(hr$exp[hr$year == 2003], na.rm = TRUE)
mean(hr$exp[hr$year == 2005], na.rm = TRUE)
mean(hr$exp[hr$year == 2009], na.rm = TRUE)
mean(hr$exp[hr$year == 2012], na.rm = TRUE)
mean(hr$exp[hr$year == 2014], na.rm = TRUE)
mean(hr$exp[hr$year == 2017], na.rm = TRUE)
mean(hr$exp[hr$year == 2019], na.rm = TRUE)
mean(hr$exp[hr$year == 2021], na.rm = TRUE)
dplyr
パッケージの group_by()
関数を使うと驚くほどコマンドが簡素化できる group_by()
関数の使い方
group_by(グループ化する変数名) |>
summarise(...)
hr
の year
ごとにデータをグループ化し、exp
の平均値を計算する場合summarise()
の前 に group_by(year)
を使ってパイプをつなぎyear
ごとに exp
の平均値を計算する# A tibble: 9 × 2
year Mean_exp
<fct> <dbl>
1 1996 9136316.
2 2000 8388889.
3 2003 7935408.
4 2005 8142244.
5 2009 6118181.
6 2012 5769988.
7 2014 7440127.
8 2017 9298783.
9 2021 NaN
group_by()
関数は 2
つ以上の変数でのグルーピングも可能hr
の year
と seito
でデータをグループ化し、exp
の平均値を計算してみる# A tibble: 113 × 3
# Groups: year [9]
year seito Mean_exp
<fct> <chr> <dbl>
1 1996 さわやか神戸・市民の会 NaN
2 1996 共産 3158354.
3 1996 国民党 NaN
4 1996 市民新党にいがた 3044160
5 1996 政事公団太平会 5540
6 1996 文化フォーラム NaN
7 1996 新党さきがけ 13030901
8 1996 新社会 4545681
9 1996 新進 12395369.
10 1996 日本新進 1898969
# ℹ 103 more rows
[1] "新進" "自民" "民主"
[4] "共産" "文化フォーラム" "国民党"
[7] "無所" "自由連合" "政事公団太平会"
[10] "新社会" "社民" "新党さきがけ"
[13] "沖縄社会大衆党" "市民新党にいがた" "緑の党"
[16] "さわやか神戸・市民の会" "民主改革連合" "青年自由"
[19] "日本新進" "公明" "諸派"
[22] "保守" "無所属の会" "自由"
[25] "改革クラブ" "保守新" "ニューディールの会"
[28] "新党尊命" "世界経済共同体党" "新党日本"
[31] "国民新党" "新党大地" "幸福"
[34] "みんな" "改革" "日本未来"
[37] "日本維新の会" "当たり前" "政治団体代表"
[40] "安楽死党" "アイヌ民族党" "次世"
[43] "維新" "生活" "立憲"
[46] "希望" "緒派" ""
[49] "N党" "国民" "れい"
# `ggplot` で文字バケしない設定(マックユーザーのみ)
theme_set(theme_classic(base_size = 10,
base_family = "HiraginoSans-W3"))
hr |>
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE)) |>
filter(seito == "自民" | seito == "民主")
# A tibble: 16 × 3
# Groups: year [9]
year seito Mean_exp
<fct> <chr> <dbl>
1 1996 民主 9961458.
2 1996 自民 14460093.
3 2000 民主 10207109.
4 2000 自民 14251423.
5 2003 民主 9772028.
6 2003 自民 12821990.
7 2005 民主 9574473.
8 2005 自民 12710075.
9 2009 民主 7802585.
10 2009 自民 11374974.
11 2012 民主 7728045.
12 2012 自民 9335490.
13 2014 民主 9757272
14 2014 自民 11450459.
15 2017 自民 12338476.
16 2021 自民 NaN
ggplot()
関数を使って自民党と民主党それぞれの候補者の選挙費用の平均値を可視化してみるhr %>%
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE)) |>
filter(seito == "自民" | seito == "民主") |>
ggplot(aes(x = year, # 共通するマッピング
y = Mean_exp, # 共通するマッピング
color = seito)) + # 共通するマッピング
geom_line(aes(group = seito),
size = 1) +
geom_point(aes(shape = seito),
size = 3) +
labs(x = "西暦",
y = "選挙費用(円)",
color = "政党",
shape = "政党") +
ggtitle("総選挙での選挙費用の推移(自民・民主)") +
scale_color_manual(values = c("民主" = "orangered",
"自民" = "limegreen")) +
theme_bw(base_family = "HiraKakuProN-W3")
hr |>
filter(seito == "自民" | seito == "民主") |>
group_by(seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE))
# A tibble: 2 × 2
seito Mean_exp
<chr> <dbl>
1 民主 9096866.
2 自民 12456211.
n()
n()
を加えるhr |>
filter(seito == "自民" | seito == "民主") |>
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE),
Cand_number = n())
# A tibble: 16 × 4
# Groups: year [9]
year seito Mean_exp Cand_number
<fct> <chr> <dbl> <int>
1 1996 民主 9961458. 143
2 1996 自民 14460093. 288
3 2000 民主 10207109. 242
4 2000 自民 14251423. 271
5 2003 民主 9772028. 267
6 2003 自民 12821990. 277
7 2005 民主 9574473. 289
8 2005 自民 12710075. 290
9 2009 民主 7802585. 271
10 2009 自民 11374974. 291
11 2012 民主 7728045. 264
12 2012 自民 9335490. 289
13 2014 民主 9757272 178
14 2014 自民 11450459. 283
15 2017 自民 12338476. 276
16 2021 自民 NaN 277
ggplot()
関数を使って自民党と民主党それぞれの立候補者数を総選挙ごとに可視化してみるgeom_tex()
関数を使って立候補者数を図に表示することも可能hr %>%
filter(seito == "自民" | seito == "民主") |>
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE),
Cand_number = n()) |>
ggplot(aes(x = year, # 共通するマッピング
y = Cand_number, # 共通するマッピング
color = seito)) + # 共通するマッピング
geom_line(aes(group = seito),
size = 1) +
geom_point(aes(shape = seito),
size = 3) +
labs(x = "西暦",
y = "立候補者数",
color = "政党",
shape = "政党") +
geom_text(aes(y = Cand_number + 3, label = Cand_number),
size = 4, vjust = 0) +
ggtitle("総選挙での立候補者数の推移(自民・民主)") +
scale_color_manual(values = c("民主" = "orangered",
"自民" = "limegreen")) +
theme_bw(base_family = "HiraKakuProN-W3")
# A tibble: 2 × 2
seito Cand_number
<chr> <int>
1 民主 1654
2 自民 2542
across()
across()
関数を利用することで、複数の変数に対して複数の記述統計量をより短いコードで計算することが可能 [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"
hr
の previous
から
exp
までお互い隣同士の 3
つの変数の平均値と標準偏差を計算する場合、次のコードを打ち込む必要があるhr |>
summarise(previous_Mean = mean(previous, na.rm = TRUE),
previous_SD = mean(previous, na.rm = TRUE),
age_Mean = mean(age, na.rm = TRUE),
age_SD = mean(age, na.rm = TRUE),
exp_Mean = mean(exp, na.rm = TRUE),
exp_SD = mean(exp, na.rm = TRUE))
# A tibble: 1 × 6
previous_Mean previous_SD age_Mean age_SD exp_Mean exp_SD
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1.48 1.48 51.2 51.2 7551393. 7551393.
across()
関数を使うと 4 行でよいhr |>
summarise(across(previous:exp,
.fns = list(Mean = ~mean(.x, na.rm = TRUE),
SD = ~mean(.x, na.rm = TRUE))))
# A tibble: 1 × 6
previous_Mean previous_SD age_Mean age_SD exp_Mean exp_SD
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1.48 1.48 51.2 51.2 7551393. 7551393.
mutate()
mutate()
関数の使い方
データフレーム名 |>
mutate(新しい変数名 = 計算式)
exp
) を有権者数 (eligible
)
で割り「有権者一人あたりに費やす選挙費用」(exppv
)
を作成するdplyr
を使わずにこの処理を行う場合、以下のようなコードとなる [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"
exppv
が追加されているdplyr::mutate()
を使うと次のようなコードになる# A tibble: 9,660 × 23
year pref ku kun wl rank nocand seito j_name gender name previous
<fct> <chr> <chr> <fct> <fct> <fct> <dbl> <chr> <chr> <chr> <chr> <dbl>
1 1996 愛知 aichi 1 1 1 7 新進 河村… male KAWA… 2
2 1996 愛知 aichi 1 0 2 7 自民 今枝… male IMAE… 2
3 1996 愛知 aichi 1 0 3 7 民主 佐藤… male SATO… 2
4 1996 愛知 aichi 1 0 4 7 共産 岩中… female IWAN… 0
5 1996 愛知 aichi 1 0 5 7 文化… 伊東… female ITO,… 0
6 1996 愛知 aichi 1 0 6 7 国民… 山田浩 male YAMA… 0
7 1996 愛知 aichi 1 0 7 7 無所 浅野… male ASAN… 0
8 1996 愛知 aichi 2 1 1 8 新進 青木… male AOKI… 2
9 1996 愛知 aichi 2 0 2 8 自民 田辺… male TANA… 0
10 1996 愛知 aichi 2 2 3 8 民主 古川… male FURU… 0
# ℹ 9,650 more rows
# ℹ 11 more variables: age <dbl>, exp <dbl>, status <fct>, vote <dbl>,
# voteshare <dbl>, eligible <dbl>, turnout <dbl>, seshu_dummy <dbl>,
# jiban_seshu <chr>, nojiban_seshu <chr>, exppv <dbl>
exppv
がないexppv
が最後の列なので、画面に収まらないからexppv
は問題なく追加されており、出力画面の下段に省略されている変数名に含まれている [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"
hr96-21.csv
)
を使って次の問題に答えなさいgroup_by()
関数と ggplot()
関数を使って総選挙 (1996-2021)
の立候補者の平均年齢をすべての政党ごとに計算し線グラフで可視化しなさいif_else()
re-coding
に使う関数if_else()
関数の使い方
if_else(条件式, TRUE の場合の戻り値, FALSE の場合の戻り値)
hr
の変数 status
の値は 0, 1, 2 の
3 つである変数名 | 詳細 |
---|---|
status | 候補者のステータス: 0 = 非現職、1 現職、2 = 元職 |
status
変数でデータをグルーピングし、vote
と exp
の平均値を計算してみるhr |>
group_by(status) |>
summarise(Mean_vote = mean(vote, na.rm = TRUE),
Mean_exp = mean(exp, na.rm = TRUE))
# A tibble: 3 × 3
status Mean_vote Mean_exp
<fct> <dbl> <dbl>
1 0 33252. 5110084.
2 1 89259. 11545342.
3 2 69632. 9335640.
status
を使って「現職ダミー」inc
を作りたいとしようinc
の値を「1 = 現職、0 = それ以外」に
re-coding
するhr <- hr |>
mutate(inc = if_else(status == 1, "現職", "非現職")) # status の値が 1 なら inc の値は 1、それ以外は 0 という意味
table()
関数と unique()
関数を使って、変数
inc
が正しく作成されたかどうかチェックする
現職 非現職
0 0 5517
1 3510 0
2 0 633
[1] "現職" "非現職"
re-coding
する場合、既存の変数(この場合だと
status
)を上書せず、新しい変数(この場合だと
inc
)として追加することが望ましい
inc
変数でデータをグルーピングし、vote
と exp
の平均値を計算してみる
hr |>
group_by(inc) |>
summarise(Mean_vote = mean(vote, na.rm = TRUE),
Mean_exp = mean(exp, na.rm = TRUE))
# A tibble: 2 × 3
inc Mean_vote Mean_exp
<chr> <dbl> <dbl>
1 現職 89259. 11545342.
2 非現職 36996. 5482955.
case_when()
re-coding
したいとき・・・if_else()
関数を使うre-coding
したいとき・・・case_when()
関数を使うcase_when
関数の使い方
データフレーム名 |>
mutate(新しい変数名 = case_when(条件1 ~ 新しい値,
条件2 ~ 新しい値,
......
TRUE ~ 新しい値)
TRUE ~ 新しい値
は「上記の条件全てが満たされない場合の値」を意味するhr
の 変数 status
の値 (1, 2, 0)
を日本語(現職・元職・新人)に変換し変数 status_j
として追加するhr %>%
mutate(status_j = case_when(status == "1" ~ "現職",
status == "2" ~ "元職",
TRUE ~ "新人")) %>% # 現職、元職以外は「新人」と指定
group_by(ステータス = status_j) %>%
summarise(平均得票数 = mean(vote, na.rm = TRUE),
候補者数 = n())
# A tibble: 3 × 3
ステータス 平均得票数 候補者数
<chr> <dbl> <int>
1 元職 69632. 633
2 新人 33252. 5517
3 現職 89259. 3510
%in%
hr
の変数 seito
は候補者の所属政党を示している変数名 | 詳細 |
---|---|
seito | 候補者の所属政党 |
hr
から
2021年総選挙のデータだけを抜き出して、seito
の値を確認してみる [1] "自民" "立憲" "N党" "国民" "維新" "共産" "れい" "無所" "社民" "諸派"
[11] "公明"
hr2021 %>%
mutate(party = case_when(seito == "自民" ~ "自民党",
seito == "公明" ~ "公明党",
seito == "立憲" ~ "立憲民主党",
seito == "維新" ~ "日本維新の会",
seito == "国民" ~ "国民民主党",
seito == "N党" ~ "NHK党",
seito == "れい" ~ "れいわ新撰組",
seito == "社民" ~ "社会民主党",
seito == "共産" ~ "共産党",
seito == "無所" ~ "無所属",
TRUE ~ "諸派")) %>%
group_by(政党 = party) %>%
summarise(得票総数 = sum(vote, na.rm = TRUE),
候補者数 = n(),
一人あたり得票平均数 = mean(vote, na.rm = TRUE))
# A tibble: 10 × 4
政党 得票総数 候補者数 一人あたり得票平均数
<chr> <dbl> <int> <dbl>
1 れいわ新撰組 248280 12 20690
2 公明党 872931 9 96992.
3 共産党 2640801 105 25150.
4 国民民主党 1245719 21 59320.
5 日本維新の会 4802793 94 51094.
6 無所属 2269166 80 28365.
7 社会民主党 313193 9 34799.
8 立憲民主党 17215620 214 80447.
9 自民党 27626157 277 99733.
10 諸派 222368 36 6177.
TRUE ~ ""
)
は条件の数だけ存在する必要はないseito
の値が”自民”か”公明”なら”政権与党”hr2021 %>%
mutate(party = case_when(seito == "自民" ~ "政権与党",
seito == "公明" ~ "政権与党",
TRUE ~ "野党")) %>%
group_by(与野党 = party) %>%
summarise(得票総数 = sum(vote, na.rm = TRUE),
候補者数 = n(),
一人あたり得票平均数 = mean(vote, na.rm = TRUE))
# A tibble: 2 × 4
与野党 得票総数 候補者数 一人あたり得票平均数
<chr> <dbl> <int> <dbl>
1 政権与党 28499088 286 99647.
2 野党 28957940 571 50714.
if_else()
関数を使うこともできる%in%
演算子が使えるhr2021
の変数 seito
が”自民”か”公明”のいずれかに該当するか確認する[1] TRUE FALSE FALSE FALSE TRUE FALSE
1番目が「TRUE」・・・この候補者は「自民」もしくは「公明」の候補者
2番目が「FALSE」・・・この候補者は「自民」「公明」以外の候補者
これを if_else()
関数の条件式として使える
hr2021 %>%
mutate(party = if_else(seito %in% c("自民", "公明"), "政権与党", "野党")) %>%
group_by(与野党 = party) %>%
summarise(得票総数 = sum(vote, na.rm = TRUE),
候補者数 = n(),
一人あたり得票平均数 = mean(vote, na.rm = TRUE))
# A tibble: 2 × 4
与野党 得票総数 候補者数 一人あたり得票平均数
<chr> <dbl> <int> <dbl>
1 政権与党 28499088 286 99647.
2 野党 28957940 571 50714.
recode()
関数if_else()
と case_when()
は書き方がやや複雑recode()
は使う条件式が ==
のみの場合、if_else()
や case_when()
と代替可能hr2021 %>%
mutate(party = recode(seito,
"自民" = "政権与党",
"公明" = "政権与党",
.default = "野党")) %>%
group_by(与野党 = party) %>%
summarise(得票総数 = sum(vote, na.rm = TRUE),
候補者数 = n(),
一人あたり得票平均数 = mean(vote, na.rm = TRUE))
# A tibble: 2 × 4
与野党 得票総数 候補者数 一人あたり得票平均数
<chr> <dbl> <int> <dbl>
1 政権与党 28499088 286 99647.
2 野党 28957940 571 50714.
.default = ""
:
いずれの条件にも該当しない場合の値を意味99
や
999
などで表示されることが多いdf1 <- tibble(id = 1:10,
age = c(19, 20, 22, 999, 35, 45, 50, 60, 70, 999),
college = c(1, 0, 0, 1, 1, 99, 1, 1, 99, 0))
df1
# A tibble: 10 × 3
id age college
<int> <dbl> <dbl>
1 1 19 1
2 2 20 0
3 3 22 0
4 4 999 1
5 5 35 1
6 6 45 99
7 7 50 1
8 8 60 1
9 9 70 99
10 10 999 0
変数 | 解説 |
---|---|
id: | ID番号 |
age: | 年齢、999 = 欠損値 |
college: | 1 = 大卒、0 = それ以外、99 = 欠損値 |
[1] 231.9
[1] 20.3
NA
でなく、99
や
999
の場合には注意が必要AGE
を作成し、age
が 39
以下なら 1
、それ以外は 0
にすage
が 999
なら NA
とするmutate()
内に case_when()
を使って指定するエラーメッセージ
Error in mutate()
: ! Problem while computing
AGE = case_when(age == 999 ~ NA, age <= 39 ~ 1, TRUE ~ 0)
.
Caused by error in names(message) <- `*vtmp*`
: ! ‘names’
attribute [1] must be the same length as the vector [0]
NA
の設定: age == 999 ~ NA
R
において欠損値は NA
のみtidyverse
の世界では、NA
は次の 2
種類あるnumeric
型の NA
charcter
型の NA
AGE
の値は全て数値だから、AGE
は numeric
型age == 999 ~ NA_real_
と設定# A tibble: 10 × 4
id age college AGE
<int> <dbl> <dbl> <dbl>
1 1 19 1 1
2 2 20 0 1
3 3 22 0 1
4 4 999 1 NA
5 5 35 1 1
6 6 45 99 0
7 7 50 1 0
8 8 60 1 0
9 9 70 99 0
10 10 999 0 NA
COLLEGE
を作成し、college
が
1
なら “大卒以上”、0
は
“大卒未満”、99
なら NA
と指定df1 %>%
mutate(AGE = case_when(age == 999 ~ NA_real_,
age <= 39 ~ 1,
TRUE ~ 0),
COLLEGE = case_when(college == 99 ~ NA,
college == 1 ~ "大卒以上",
TRUE ~ "大卒未満"))
エラーメッセージ
Error in mutate()
: ! Problem while computing
COLLEGE = case_when(edu) == 1 ~ "大卒以上, TRUE ~ "大卒未満")
.
Caused by error:
NA
の設定: college == 99 ~ NA
NA
は次の 2 種類あるnumeric
型の NA
charcter
型の NA
COLLEGE
の値は全て文字型だから、COLLEGE
は character
型college == 99 ~ NA_character_
と設定df1 %>%
mutate(AGE = case_when(age == 999 ~ NA_real_,
age <= 39 ~ 1,
TRUE ~ 0),
COLLEGE = case_when(college == 99 ~ NA_character_,
college == 1 ~ "大卒以上",
TRUE ~ "大卒未満"))
# A tibble: 10 × 5
id age college AGE COLLEGE
<int> <dbl> <dbl> <dbl> <chr>
1 1 19 1 1 大卒以上
2 2 20 0 1 大卒未満
3 3 22 0 1 大卒未満
4 4 999 1 NA 大卒以上
5 5 35 1 1 大卒以上
6 6 45 99 0 <NA>
7 7 50 1 0 大卒以上
8 8 60 1 0 大卒以上
9 9 70 99 0 <NA>
10 10 999 0 NA 大卒未満
欠損値 (NA
)
の指定方法まとめ
・numeric
型の NA
の場合:
変数 == 値 ~ NA_real_
・charcter
型の NA
:
変数 == 値 ~ NA_character_
hr96-21.csv
)
を使って次の問題に答えなさい group_by()
関数と ggplot()
関数を使って総選挙 (1996-2021)
の立候補者の平均年齢をすべての政党ごとに計算し線グラフで可視化しなさいwl
の値は 0, 1, 2 の 3 つである変数名 | 詳細 |
---|---|
wl | 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選 |
if_else()
関数を使って、小選挙区で当選した候補者を
1、小選挙区で落選した候補者を 0 とした小選挙区当選ダミー
(wlsmd
) を作成しなさいtable()
関数と unique()
関数を使って、変数
wlsmd
が正しく作成されたかどうかチェックしなさいfilter()
関数を使って2021年総選挙だけのデータを抜き出し、if_else()
関数を使って、自民党候補者を 1、それ以外の候補者を 0 とした自民党ダミー
(ldp
) を作成しなさいtable()
関数と unique()
関数を使って、変数
ldp
が正しく作成されたかどうかチェックしなさいfilter()
関数を使って2021年総選挙だけのデータを抜き出し、mutate()
関数、if_else()
関数、%in%
関数、group_by()
関数を使って、政権与党(自民党と公明党の合計)と野党候補者の平均年齢を比較して表示しなさいfilter()
関数を使って2021年総選挙だけのデータを抜き出し、mutate()
関数、if_else()
関数、%in%
関数、group_by()
関数を使って、政権与党(自民党と公明党の合計)と野党の当選者(比例復活当選者含む)の平均年齢を比較して表示しなさいfilter()
関数を使って2021年総選挙だけのデータを抜き出し、mutate()
関数、case_when()
関数と group_by()
関数を使って、自民党、公明党、立憲民主党、立憲民主党以外の野党の当選者(比例復活当選者含む)の平均年齢を比較して表示しなさい