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-26.csv)
・hr96-26.csv
をクリックしてデータをパソコンにダウンロード
RProject フォルダ内に data
という名称のフォルダを作成するhr96-26.csv
を手動でRProject フォルダ内にある data
フォルダに入れるna = "." は「dot は欠損値と理解せよ」とのコマンドhr96-26.csv
は1996年に衆院選挙に小選挙区が導入されて以来実施された 11
回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017, 2021,
2024, 2026)の結果のデータ
読み取った選挙データを確認
dim() 関数を使うと hr
は11,892行、22列のデータであることが分かる
[1] 11892 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: 11892 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 10. 2024 11. 2026 |
1261 (10.6%) 1199 (10.1%) 1026 ( 8.6%) 989 ( 8.3%) 1139 ( 9.6%) 1294 (10.9%) 959 ( 8.1%) 936 ( 7.9%) 857 ( 7.2%) 1113 ( 9.4%) 1119 ( 9.4%) |
0 (0.0%) |
|
| 2 | pref [character] |
1. 東京 2. 大阪 3. 神奈川 4. 愛知 5. 埼玉 6. 千葉 7. 兵庫 8. 福岡 9. 北海道 10. 静岡 [ 37 others ] |
1251 (10.5%) 796 ( 6.7%) 787 ( 6.6%) 650 ( 5.5%) 619 ( 5.2%) 556 ( 4.7%) 516 ( 4.3%) 447 ( 3.8%) 446 ( 3.8%) 319 ( 2.7%) 5505 (46.3%) |
0 (0.0%) |
|
| 3 | ku [character] |
1. tokyo 2. osaka 3. kanagawa 4. aichi 5. saitama 6. chiba 7. hyogo 8. fukuoka 9. hokkaido 10. shizuoka [ 37 others ] |
1251 (10.5%) 796 ( 6.7%) 787 ( 6.6%) 650 ( 5.5%) 619 ( 5.2%) 556 ( 4.7%) 516 ( 4.3%) 447 ( 3.8%) 446 ( 3.8%) 319 ( 2.7%) 5505 (46.3%) |
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 [ 20 others ] |
2028 (17.1%) 1790 (15.1%) 1623 (13.6%) 1161 ( 9.8%) 871 ( 7.3%) 608 ( 5.1%) 489 ( 4.1%) 409 ( 3.4%) 376 ( 3.2%) 377 ( 3.2%) 2160 (18.2%) |
0 (0.0%) |
|
| 5 | rank [factor] |
1. 1 2. 2 3. 3 4. 4 5. 5 6. 6 7. 7 8. 8 9. 9 |
3251 (27.3%) 3251 (27.3%) 2968 (25.0%) 1590 (13.4%) 615 ( 5.2%) 168 ( 1.4%) 38 ( 0.3%) 8 ( 0.1%) 3 ( 0.0%) |
0 (0.0%) |
|
| 6 | wl [factor] |
1. 0 2. 1 3. 2 |
7433 (62.5%) 3251 (27.3%) 1208 (10.2%) |
0 (0.0%) |
|
| 7 | nocand [numeric] |
Mean (sd) : 4 (1.1) min < med < max: 2 < 4 < 9 IQR (CV) : 2 (0.3) |
2 : 559 ( 4.7%) 3 : 4134 (34.8%) 4 : 3896 (32.8%) 5 : 2234 (18.8%) 6 : 782 ( 6.6%) 7 : 215 ( 1.8%) 8 : 45 ( 0.4%) 9 : 27 ( 0.2%) |
0 (0.0%) |
|
| 8 | seito [character] |
1. 自民 2. 共産 3. 民主 4. 無所 5. 立憲 6. 維新 7. 社民 8. 幸福 9. 参政 10. 新進 [ 45 others ] |
3093 (26.0%) 2599 (21.9%) 1654 (13.9%) 764 ( 6.4%) 484 ( 4.1%) 421 ( 3.5%) 334 ( 2.8%) 312 ( 2.6%) 267 ( 2.2%) 235 ( 2.0%) 1729 (14.5%) |
0 (0.0%) |
|
| 9 | j_name [character] |
1. 伊藤達也 2. 上川陽子 3. 下村博文 4. 中谷元 5. 伴野豊 6. 前原誠司 7. 原口一博 8. 古屋圭司 9. 古川元久 10. 古川禎久 [ 5469 others ] |
14 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11779 (99.0%) |
0 (0.0%) |
|
| 10 | name [character] |
1. ITO, TATSUYA 2. SAKAMOTO, HIROSHI 3. AISAWA, ICHIRO 4. ASO, TARO 5. EDANO, YUKIO 6. FUNADA, HAJIME 7. FURUKAWA, MOTOHISA 8. FURUKAWA, YOSHIHISA 9. FURUYA, KEIJI 10. GOTO, SHIGEYUKI [ 5986 others ] |
14 ( 0.1%) 12 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11 ( 0.1%) 11778 (99.0%) |
0 (0.0%) |
|
| 11 | previous [numeric] |
Mean (sd) : 1.5 (2.5) min < med < max: 0 < 0 < 19 IQR (CV) : 2 (1.7) |
20 distinct values | 0 (0.0%) |
|
| 12 | gender [character] |
1. female 2. male |
1840 (15.5%) 10052 (84.5%) |
0 (0.0%) |
|
| 13 | age [numeric] |
Mean (sd) : 51.6 (11.3) min < med < max: 25 < 52 < 94 IQR (CV) : 17 (0.2) |
65 distinct values | 4 (0.0%) |
|
| 14 | exp [numeric] |
Mean (sd) : 7125574 (5201119) min < med < max: 535 < 6172580 < 27462362 IQR (CV) : 7524977 (0.7) |
9386 distinct values | 2413 (20.3%) |
|
| 15 | status [factor] |
1. 0 2. 1 3. 2 |
6808 (57.2%) 4315 (36.3%) 769 ( 6.5%) |
0 (0.0%) |
|
| 16 | vote [numeric] |
Mean (sd) : 54787.5 (39815.6) min < med < max: 177 < 49037 < 210515 IQR (CV) : 67397 (0.7) |
11303 distinct values | 0 (0.0%) |
|
| 17 | voteshare [numeric] |
Mean (sd) : 27.3 (19.2) min < med < max: 0.1 < 25.9 < 95.3 IQR (CV) : 33.7 (0.7) |
2416 distinct values | 0 (0.0%) |
|
| 18 | eligible [numeric] |
Mean (sd) : 351536.3 (66499.1) min < med < max: 191241 < 356138 < 495212 IQR (CV) : 104828 (0.2) |
2937 distinct values | 1119 (9.4%) |
|
| 19 | turnout [numeric] |
Mean (sd) : 59.7 (7.1) min < med < max: 42.1 < 58.6 < 83.8 IQR (CV) : 10.5 (0.1) |
1028 distinct values | 1119 (9.4%) |
|
| 20 | seshu_dummy [numeric] |
Min : 0 Mean : 0.1 Max : 1 |
0 : 10820 (91.0%) 1 : 1072 ( 9.0%) |
0 (0.0%) |
|
| 21 | jiban_seshu [character] |
1. (Empty string) 2. 伯父=田村元(衆議院議員) 3. 叔父(養父)=古屋享(衆議院議員) 4. 父=三原朝雄(衆議院議員) 5. 父=小沢佐重喜(衆議院議員) 6. 父=岸田文武(衆議院議員) 7. 父=森美秀(衆議院議員) 8. 父=河野洋平(衆議院議員) 9. 父=渡海元三郎(衆議院議員) 10. 父=渡辺朗(衆議院議員) [ 195 others ] |
2083 (66.0%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 11 ( 0.3%) 973 (30.8%) |
8737 (73.5%) |
|
| 22 | nojiban_seshu [character] |
1. (Empty string) 2. 伯父=田中六助 3. 父=土屋義彦(参議院議長・埼玉県知事) 4. 父=平井卓志(参議院)、祖父=平井太郎(参議院議長 5. 父=石破二朗(参議院議員) 6. 義父=佐藤栄佐久(参議院議員・福島県知事) 7. 義父=吹田_(衆院議員) 8. 父=北側義一(衆議院) 9. 父=石原慎太郎(衆議院議員) 10. 叔父=柳田桃太郎 [ 30 others ] |
2130 (89.7%) 11 ( 0.5%) 11 ( 0.5%) 11 ( 0.5%) 11 ( 0.5%) 11 ( 0.5%) 10 ( 0.4%) 9 ( 0.4%) 9 ( 0.4%) 8 ( 0.3%) 153 ( 6.4%) |
9518 (80.0%) |
summarise()summarise()関数の使い方
summarise(記述統計の関数, 変数名1, 変数名2,...)
nocand) の平均を計算したいとする# A tibble: 1 × 1
`mean(nocand)`
<dbl>
1 3.96
1996年から2026年総選挙において、小選挙区ごとの平均立候補者数は 3.96
選挙費用 (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 7125574.
→ 計算できた !
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 7125574. 51.6 27.3
# ℹ 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 7125574. 51.6 27.3
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: 11 × 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 5844662.
8 2017 6016640.
9 2021 6434585.
10 2024 NaN
11 2026 NaN
group_by() 関数は 2
つ以上の変数でのグルーピングも可能hr の year と seito
でデータをグループ化し、exp の平均値を計算してみる# A tibble: 136 × 3
# Groups: year [11]
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
# ℹ 126 more rows
[1] "無所" "国民党" "文化フォーラム"
[4] "共産" "民主" "自民"
[7] "新進" "自由連合" "政事公団太平会"
[10] "社民" "新社会" "日本新進"
[13] "新党さきがけ" "青年自由" "さわやか神戸・市民の会"
[16] "民主改革連合" "市民新党にいがた" "沖縄社会大衆党"
[19] "緑の党" "諸派" "公明"
[22] "保守" "無所属の会" "自由"
[25] "改革クラブ" "保守新" "新党尊命"
[28] "ニューディールの会" "世界経済共同体党" "新党日本"
[31] "国民新党" "新党大地" "幸福"
[34] "みんな" "改革" "日本未来"
[37] "日本維新の会" "当たり前" "アイヌ民族党"
[40] "政治団体代表" "安楽死党" "次世"
[43] "維新" "生活" "希望"
[46] "立憲" "緒派" "N党"
[49] "国民" "れい" "参政"
[52] "中道" "減ゆ" "れいわ"
[55] "みらい"
[1] "社民" "次世" "諸派" "共産" "民主" "自民" "維新" "無所" "生活" "公明"
[1] "希望" "立憲" "自民" "共産" "社民"
[6] "無所" "日本維新の会" "緒派" "公明"
# `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 == "民主" | seito == "立憲" ) # A tibble: 21 × 3
# Groups: year [11]
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 more rows
ggplot()
関数を使って自民党と民主党それぞれの候補者の選挙費用の平均値を可視化してみるhr %>%
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE)) |>
filter(seito == "自民" | 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",
"立憲" = "purple",
"自民" = "limegreen")) +
theme_bw(base_family = "HiraKakuProN-W3") hr |>
filter (seito == "自民" | seito == "民主" |seito == "立憲") |>
group_by(seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE))# A tibble: 3 × 2
seito Mean_exp
<chr> <dbl>
1 民主 8888738.
2 立憲 6493454.
3 自民 11544302.
n()n()を加えるhr |>
filter(seito == "自民" | seito == "民主" |seito == "立憲") |>
group_by(year, seito) |>
summarise(Mean_exp = mean(exp, na.rm = TRUE),
Cand_number = n())# A tibble: 21 × 4
# Groups: year [11]
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 more rows
ggplot()
関数を使って自民党と民主党それぞれの立候補者数を総選挙ごとに可視化してみるgeom_tex()関数を使って立候補者数を図に表示することも可能hr %>%
filter(seito == "自民" | 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",
"立民" = "purple",
"自民" = "limegreen")) +
theme_bw(base_family = "HiraKakuProN-W3") hr |>
filter(seito == "自民" | seito == "民主" | seito == "立憲") |>
group_by(seito) |>
summarize(Cand_number = n())# A tibble: 3 × 2
seito Cand_number
<chr> <int>
1 民主 1654
2 立憲 484
3 自民 3093
across()across()
関数を利用することで、複数の変数に対して複数の記述統計量をより短いコードで計算することが可能 [1] "year" "pref" "ku" "kun"
[5] "rank" "wl" "nocand" "seito"
[9] "j_name" "name" "previous" "gender"
[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.52 1.52 51.6 51.6 7125574. 7125574.
across() 関数を使うと 4 行でよいhr |>
summarise(across(previous:exp,
.fns = list(Mean = ~mean(.x, na.rm = TRUE),
SD = ~mean(.x, na.rm = TRUE))))# A tibble: 1 × 8
previous_Mean previous_SD gender_Mean gender_SD age_Mean age_SD exp_Mean
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1.52 1.52 NA NA 51.6 51.6 7125574.
# ℹ 1 more variable: exp_SD <dbl>
mutate()mutate()関数の使い方
データフレーム名 |>
mutate(新しい変数名 = 計算式)
exp) を有権者数 (eligible)
で割り「有権者一人あたりに費やす選挙費用」(exppv)
を作成するdplyr
を使わずにこの処理を行う場合、以下のようなコードとなる [1] "year" "pref" "ku" "kun"
[5] "rank" "wl" "nocand" "seito"
[9] "j_name" "name" "previous" "gender"
[13] "age" "exp" "status" "vote"
[17] "voteshare" "eligible" "turnout" "seshu_dummy"
[21] "jiban_seshu" "nojiban_seshu" "exppv"
exppv が追加されているdplyr::mutate() を使うと次のようなコードになる# A tibble: 11,892 × 23
year pref ku kun rank wl nocand seito j_name name previous gender
<fct> <chr> <chr> <fct> <fct> <fct> <dbl> <chr> <chr> <chr> <dbl> <chr>
1 1996 愛知 aichi 1 7 0 7 無所 浅野光雪…… ASAN… 0 male
2 1996 愛知 aichi 1 6 0 7 国民党…… 山田浩 YAMA… 0 male
3 1996 愛知 aichi 1 5 0 7 文化フォ… 伊東マサコ… ITO,… 0 female
4 1996 愛知 aichi 1 4 0 7 共産 岩中美保子… IWAN… 0 female
5 1996 愛知 aichi 1 3 0 7 民主 佐藤泰介…… SATO… 1 male
6 1996 愛知 aichi 1 2 0 7 自民 今枝敬雄…… IMAE… 3 male
7 1996 愛知 aichi 1 1 1 7 新進 河村たかし… KAWA… 1 male
8 1996 愛知 aichi 2 8 0 8 国民党…… 山崎義章…… YAMA… 0 male
9 1996 愛知 aichi 2 7 0 8 無所 村松陽一…… MURA… 0 male
10 1996 愛知 aichi 2 6 0 8 文化フォ… 石川和己…… ISHI… 0 male
# ℹ 11,882 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] "rank" "wl" "nocand" "seito"
[9] "j_name" "name" "previous" "gender"
[13] "age" "exp" "status" "vote"
[17] "voteshare" "eligible" "turnout" "seshu_dummy"
[21] "jiban_seshu" "nojiban_seshu" "exppv"
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 32304. 4714481.
2 1 87914. 10650551.
3 2 67961. 8095759.
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 6808
1 4315 0
2 0 769
[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 現職 87914. 10650551.
2 非現職 35923. 5068651.
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 元職 67961. 769
2 新人 32304. 6808
3 現職 87914. 4315
%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] FALSE FALSE TRUE TRUE FALSE TRUE
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()
を使って指定するdf1 %>%
mutate(AGE = case_when(age == 999 ~ NA, # age が 999 なら NA
age <= 39 ~ 1, # age が 39 以下なら 1、それ以外は 0
TRUE ~ 0))エラーメッセージ
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 ~ NAR において欠損値は NA のみtidyverse の世界では、NA は次の 2
種類あるnumeric 型の NAcharcter 型の NAAGE
の値は全て数値だから、AGE は numeric 型age == 999 ~ NA_real_ と設定df1 %>%
mutate(AGE = case_when(age == 999 ~ NA_real_, # age が 999 なら NA
age <= 39 ~ 1, # age が 39 以下なら 1、それ以外は 0
TRUE ~ 0))# 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, # 99 なら NA
college == 1 ~ "大卒以上", # college が 1 なら “大卒以上”、0 は “大卒未満”
TRUE ~ "大卒未満"))エラーメッセージ
Error in mutate(): ! Problem while computing
COLLEGE = case_when(edu) == 1 ~ "大卒以上, TRUE ~ "大卒未満").
Caused by error:
NA の設定: college == 99 ~ NANA は次の 2 種類あるnumeric 型の NAcharcter 型の NACOLLEGE
の値は全て文字型だから、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_, # 99 なら NA
college == 1 ~ "大卒以上", # college が 1 なら “大卒以上”、0 は “大卒未満”
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-26.csv)
を使って次の問題に答えなさいgroup_by() 関数と ggplot()
関数を使って総選挙 (1996-2024)
の立候補者の平均年齢をすべての政党ごとに計算し線グラフで可視化しなさいgroup_by() 関数と ggplot()
関数を使って総選挙 (1996-2024)
の立候補者の平均年齢をすべての政党ごとに計算し線グラフで可視化しなさいwl の値は 0, 1, 2 の 3 つである| 変数名 | 詳細 |
|---|---|
| wl | 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選 |
if_else() 関数を使って、小選挙区で当選した候補者を
1、小選挙区で落選した候補者を 0 とした小選挙区当選ダミー
(wlsmd) を作成しなさいtable() 関数と unique() 関数を使って、変数
wlsmd が正しく作成されたかどうかチェックしなさいfilter()
関数を使って2024年総選挙だけのデータを抜き出し、if_else()
関数を使って、自民党候補者を 1、それ以外の候補者を 0 とした自民党ダミー
(ldp) を作成しなさいtable() 関数と unique() 関数を使って、変数
ldp が正しく作成されたかどうかチェックしなさいfilter()
関数を使って2024年総選挙だけのデータを抜き出し、mutate()
関数、if_else() 関数、%in%
関数、group_by()
関数を使って、政権与党(自民党と公明党の合計)と野党候補者の平均年齢を比較して表示しなさいfilter()
関数を使って2024年総選挙だけのデータを抜き出し、mutate()
関数、if_else() 関数、%in%
関数、group_by()
関数を使って、政権与党(自民党と公明党の合計)と野党の当選者(比例復活当選者含む)の平均年齢を比較して表示しなさいfilter()
関数を使って2024年総選挙だけのデータを抜き出し、mutate()
関数、case_when() 関数と group_by()
関数を使って、自民党、公明党、立憲民主党、立憲民主党以外の野党の当選者(比例復活当選者含む)の平均年齢を比較して表示しなさい