{tidyverse}
をロードする── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
・変数を手作りする方法を解説します
・変数をマージしてデータフレームの作り方を説明します
・複数のデータフレームをマージする方法を説明します
・様々な拡張子のデータを RStudio に取り込む方法を紹介します
・データ分析を行う前段階として、基礎的な専門用語の解説をします
テキストデータ、バイナリデータ、拡張子、パス、ファイル、フォルダ、Rプロジェクト、Rプロジェクトフォルダ、作業ディレクトリ、欠損値、変数の型、R付属データ、パイプ演算子、変数の型
(class
)、AND
演算子、OR
演算子、%in%
演算子、欠損値
data
というフォルダを作成hr96-21.csv
ファイルを
data
の中に入れる.csv
ファイルの読み取りには {tidyverse}
の中に含まれる read_csv()
関数を使うarrange()
hr
を使って当選者の中で
(wl > 0
) 獲得票数 (vote
)
の少ない候補者を表示してみる# A tibble: 3,659 × 8
pref kun seito j_name wl gender rank vote
<chr> <dbl> <chr> <chr> <dbl> <chr> <dbl> <dbl>
1 東京 22 社民 保坂展人 2 male 5 13904
2 京都 3 日本維新の会 森夏枝 2 female 4 16511
3 埼玉 6 社民 深田肇 2 male 4 17909
4 埼玉 8 共産 塩川鉄也 2 male 4 18512
5 奈良 1 民主 家西悟 2 male 4 18994
6 沖縄 1 共産 赤嶺政賢 2 male 4 19528
7 高知 3 共産 春名真章 2 male 3 19549
8 京都 5 希望 井上一徳 2 male 4 19586
9 徳島 1 維新 吉田知代 2 female 3 20065
10 愛媛 2 維新 横山博幸 2 male 3 22677
# ℹ 3,649 more rows
!is.na()
NA
か否かを判定するには is.na()
関数を使う# A tibble: 1,016 × 3
year j_name exp
<dbl> <chr> <dbl>
1 1996 伊東マサコ NA
2 1996 山田浩 NA
3 1996 浅野光雪 NA
4 1996 石川和己 NA
5 1996 村松陽一 NA
6 1996 山崎義章 NA
7 1996 中野庸子 NA
8 1996 小川修 NA
9 1996 阿閉正雄 NA
10 1996 伊東敬芳 NA
# ℹ 1,006 more rows
exp
に NA
が 2831 もあることがわかるN
と変数の数を確認する[1] 9660 22
exp
が 2831 も欠損であることがわかるexp
の欠損値を除外したいのだから、否定を表す
!
を使う# A tibble: 8,644 × 3
year j_name exp
<dbl> <chr> <dbl>
1 1996 河村たかし 9828097
2 1996 今枝敬雄 9311555
3 1996 佐藤泰介 9231284
4 1996 岩中美保子 2177203
5 1996 青木宏之 12940178
6 1996 田辺広雄 16512426
7 1996 古川元久 11435567
8 1996 石山淳一 2128510
9 1996 藤原美智子 3270533
10 1996 吉田幸弘 11245219
# ℹ 8,634 more rows
exp
が欠損していない 6829 行を抽出できたarrange()
arrange()
関数を使うhr
から当選者 (wl > 0
)
の行のみを抽出しvote
)
が少ない当選者を上から順に表示してみるhr |>
filter(wl > 0) |>
arrange(vote) |>
select(year, pref, kun, seito, j_name, wl, gender, rank, vote)
# A tibble: 3,659 × 9
year pref kun seito j_name wl gender rank vote
<dbl> <chr> <dbl> <chr> <chr> <dbl> <chr> <dbl> <dbl>
1 1996 東京 22 社民 保坂展人 2 male 5 13904
2 2017 京都 3 日本維新の会 森夏枝 2 female 4 16511
3 1996 埼玉 6 社民 深田肇 2 male 4 17909
4 2003 埼玉 8 共産 塩川鉄也 2 male 4 18512
5 1996 奈良 1 民主 家西悟 2 male 4 18994
6 2003 沖縄 1 共産 赤嶺政賢 2 male 4 19528
7 1996 高知 3 共産 春名真章 2 male 3 19549
8 2017 京都 5 希望 井上一徳 2 male 4 19586
9 2021 徳島 1 維新 吉田知代 2 female 3 20065
10 2014 愛媛 2 維新 横山博幸 2 male 3 22677
# ℹ 3,649 more rows
wl == 1
と指定するhr |>
filter(wl == 1) |>
arrange(vote) |>
select(year, pref, kun, seito, j_name, wl, gender, rank, vote)
# A tibble: 2,674 × 9
year pref kun seito j_name wl gender rank vote
<dbl> <chr> <dbl> <chr> <chr> <dbl> <chr> <dbl> <dbl>
1 1996 高知 1 共産 山原健二郎 1 male 1 33523
2 2000 高知 1 自民 福井照 1 male 1 40765
3 2000 大阪 17 自民 岡下信子 1 female 1 41781
4 1996 京都 2 自民 奥田幹生 1 male 1 43060
5 2003 高知 1 自民 福井照 1 male 1 43232
6 2012 高知 1 自民 福井照 1 male 1 44027
7 2009 高知 1 自民 福井照 1 male 1 44068
8 1996 神奈川 4 自民 飯島忠義 1 male 1 46389
9 1996 徳島 1 民主 仙谷由人 1 male 1 47057
10 1996 福井 1 新進 笹木竜三 1 male 1 48214
# ℹ 2,664 more rows
arrange(desc())
desc()
関数で囲む# A tibble: 9,660 × 9
year pref kun seito j_name wl gender rank vote
<dbl> <chr> <dbl> <chr> <chr> <dbl> <chr> <dbl> <dbl>
1 2021 神奈川 15 自民 河野太郎 1 male 1 210515
2 2009 北海道 9 民主 鳩山由紀夫 1 male 1 201461
3 2009 静岡 6 民主 渡辺周 1 male 1 197688
4 2005 神奈川 11 自民 小泉純一郎 1 male 1 197037
5 2012 神奈川 15 自民 河野太郎 1 male 1 192604
6 2009 埼玉 6 民主 大島敦 1 male 1 186993
7 2005 神奈川 15 自民 河野太郎 1 male 1 186770
8 2009 北海道 3 民主 荒井聰 1 male 1 186081
9 2012 神奈川 11 自民 小泉進次郎 1 male 1 184360
10 2009 静岡 5 民主 細野豪志 1 male 1 184328
# ℹ 9,650 more rows
DT::datatable()
関数を使うと便利bind_rows()
data.frame
を縦に結合する場合は、bind_rows()
を使うdata.frame
があるとするdf1 <- data.frame(id = 1:5,
name = c("A", "B", "C", "D", "E"),
score = c(100, 90, 80, 70, 60))
df2 <- data.frame(id = 6:8,
name = c("F", "G", "H"),
score = c(50, 40, 30))
data.frame
を表示させてみる id name score
1 1 A 100
2 2 B 90
3 3 C 80
4 4 D 70
5 5 E 60
id name score
1 6 F 50
2 7 G 40
3 8 H 30
data.frame
は同じ変数名を共有しているbind_rows()
関数を使って、縦に積み重ねることが可能bind_rows()
・・・rows
(行を)
bind
(結びつける)data.frame
の変数名が一致する必要ありid
, name
, score
は一致している id name score
1 1 A 100
2 2 B 90
3 3 C 80
4 4 D 70
5 5 E 60
6 6 F 50
7 7 G 40
8 8 H 30
list()
関数df1
と df2
がそれぞれ 1 年ゼミと 2
年ゼミの学生データだとするbind_rows()
を使って縦に結合すると、学生の学年が分からないlist()
関数を使ってまとめ.id 引数
を追加する 学年 id name score
1 1年 1 A 100
2 1年 2 B 90
3 1年 3 C 80
4 1年 4 D 70
5 1年 5 E 60
6 2年 6 F 50
7 2年 7 G 40
8 2年 8 H 30
data.frame
に共通する変数(下の例では univ
)df1 <- data.frame(univ = c("拓殖大学", "早稲田大学", "UCLA"),
city = c("東京", "東京", "LA"),
pop = c(8600, 47000, 45000))
df2 <- data.frame(univ = c("拓殖大学", "早稲田大学", "UCLA"),
color = c("オレンジ", "えんじ", "黄色と青"))
left_join()
right_join()
inner_join()
full_join()
data.frame
のオブジェクト名を入力by = "キー変数名"
の引数を追加left_join()
関数のメカニズムleft_join(x, y)
は x
を温存させる関数x
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるx
の UCLA と y
の東北大学はどうなるか?left_join(x, y)
を使うと、x
の UCLA
が優先されて残されるfounder
は欠損値
(NA
) と表示される
right_join()
関数のメカニズムright_join(x, y)
は y
を温存させる関数x
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるx
の UCLA と y
の東北大学はどうなるか?right_join(x, y)
を使うと、y
の東北大学が優先されて残されるpop
は欠損値
(NA
) と表示される
inner_join()
関数のメカニズムx
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるinner_join(x, y)
は x
と y
両データに同時に存在する行のみが結合対象
x <- data.frame(pop = c(8600, 47000, 45000),
univ = c("拓殖大学", "早稲田大学", "UCLA"))
y <- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
founder = c("桂太郎", "大隈重信", "日本国"))
pop univ founder
1 8600 拓殖大学 桂太郎
2 47000 早稲田大学 大隈重信
full_join()
関数のメカニズムx
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるfull_join(x, y)
は x
と y
全てを温存させるNA
) と表示される
x <- data.frame(pop = c(8600, 47000, 45000),
univ = c("拓殖大学", "早稲田大学", "UCLA"))
y <- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
founder = c("桂太郎", "大隈重信", "日本国"))
pop univ founder
1 8600 拓殖大学 桂太郎
2 47000 早稲田大学 大隈重信
3 45000 UCLA <NA>
4 NA 東北大学 日本国
tidy data
構造tidy data
とはHadley Wickham
が提唱したデータ分析に適したデータ構造tidy data
はパソコンにとって読みやすいデータR
における多くの分析は整然データを基づいて行われるtidyr
パッケージ・・・整然ではないデータ(=雑然データ)を整然データへ変形tidy data
の 4 つの原則1. 1 つの「列」 | = 1 つの「変数」 |
2. 1 つの「行」 | = 1 つの「観測」 |
3. 1 つの「セル」 | = 1 つの「値」 |
4. 1 つの「表」 | = 1 つの「分析単位」 |
mos
と mc
という2
つの変数)に分かれていることmos
,
mc
)が入っているscore
)」と「バーガーの種類
(burger
)」を表す変数をそれぞれ作る必要があるscore
)だけburger
)だけmos
, mc
) が入っているscore
) だけburger
) だけave
) の作成ここでやりたいこと
・50人の生徒が履修している
・春学期にチェックテストを5回実施した
・生徒は全てのチェックテストを受験したとは限らない
・公平にチェックテストの点数を計算するにはどうすればいいのか
checktest.csv, (N=50)
データの準備
checktest.csv
{tidyverse}
パッケージを読み込むchecktest.csv
をダウンロードする
期末試験のデータを読み込み df_checktest
と名前を付ける
na = "."
を指定し、欠損値を「.」
で表示すると指定
df_checktest
の中を確認してみるdf_check
の記述統計を表示させる{r, results = "asis"}
と指定するStatistic | N | Mean | St. Dev. | Min | Max |
test_1 | 43 | 80.256 | 11.146 | 60 | 100 |
test_2 | 46 | 77.804 | 11.268 | 55 | 100 |
test_3 | 42 | 80.357 | 8.647 | 60 | 100 |
test_4 | 44 | 78.182 | 10.308 | 50 | 100 |
test_5 | 43 | 80.721 | 9.407 | 55 | 100 |
・それぞれのチェックテストには 4〜8
の欠損値 (NA
) がある
rowwise()
と na.rm = TRUE
を加える→ 欠損値を考慮した平均値を計算できる
df_check1 <- df_check1 |>
rowwise() |>
mutate(ave = mean(c(test_1, test_2, test_3, test_4, test_5),
na.rm = TRUE))
submission
)
の作成df_check
をロング型データ
df_check_long
に変換する・df_check_long
の
score
に欠損値がある生徒を除外する
・学生ごとに (Student_1 〜
Student_50まで)チェックテストの「受験回数」を計算し表示させる
→ group_by()
関数を使って df_check_long
の
name
に現れた生徒の名前の数を計算する
→ これがチェックテストの「受験回数」
→ 「受験回数」を submission
という変数に格納する
df_check2
+ df_check_nosub
=>
df_st_list
name
) を手がかりにマージするdf_st_list |>
ggplot(aes(submission, ave)) +
geom_point() +
labs(x = "チェックテストの受験回数", y = "チェックテストの平均点",
title = "チェックテストの受験回数と平均点の散布図") +
stat_smooth(method = lm) + # (method = lm, se = FALSE) → 95% 信頼区間が消える
geom_text(aes(y = ave + 0.2,
label = name),
size = 4,
vjust = 0)
成績評価基準
・期末試験(60%)
・宿題 (40%)
R01_exam_score.csv, (N=100)
R01_hw.csv, (N=500)
データの準備
R01_exam_score.csv
{tidyverse}
パッケージを読み込むR01_exam_score.csv
をダウンロードする
期末試験のデータを読み込み df_exam
と名前を付ける
na = "."
を指定し、欠損値を「.」
で表示すると指定
df_exam
の中を確認してみるdf_exam
の記述統計を表示させる name score
Length:100 Min. : 45.00
Class :character 1st Qu.: 68.00
Mode :character Median : 74.00
Mean : 75.23
3rd Qu.: 84.00
Max. :100.00
NA's :9
score
には 9 の欠損値 (NA
)
を確認
期末試験結果の分布をヒストグラムで表示してみる
df_exam |>
filter(!is.na(score)) |>
ggplot() +
geom_histogram(aes(x = score), color = "white",
binwidth = 10, boundary = 0) +
labs(x = "期末試験点数", y = "学生数") +
geom_vline(xintercept = mean(df_exam$score,
na.rm = TRUE), # score には欠損値が含まれるので、na.rm = TRUE を指定
col = "magenta", # 平均値に真ジェンタ色の縦線を引く
linetype = "dotted")
R01_hw.csv
R01_df_hw.csv
をダウンロードするna = "."
を指定し、欠損値を「.」
で表示すると指定df_hw
の中を確認してみるN = 500
df_exam
は N = 100
, df_hw
は N = 500
成績を付けるために必要なのは 100人分の成績データ
→ 観測数を N = 100
に統一する必要がある
学生ごとに
(Student_1 〜 Student_100
まで)何回宿題を「提出」したかを計算し表示させる
→ group_by()
関数を使って df_hw
の
name
と hw
をグループ化し「提出」の合計を計算
→ 「提出」の合計値を submission
という変数に格納する
submission
には「提出」した回数ばかりでなく「未提出」の回数も表示されているfilter()
関数を使って、非表示にするhw
も不要なので select()
関数を使って非表示にするdf_hw |>
filter(!is.na(submission)) |> # 欠損値処理
ggplot() +
geom_histogram(aes(x = submission), color = "white",
binwidth = 1, boundary = 0) +
labs(x = "宿題の提出回数", y = "学生数") +
geom_vline(xintercept = mean(df_hw$submission,
na.rm = T),
col = "yellow",
linetype = "dotted") # 平均値に黄色の縦線を引く
summary()
関数を使って、正確な記述統計を表示してみる Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 3.000 4.000 3.652 4.000 5.000
df_exam
と df_hw
)を得た left_join()
right_join()
inner_join()
full_join()
left_join()
成績評価基準_1
・期末試験(60%)
・宿題 (40%)
・期末試験を受けた人だけが採点対象
つまり「宿題を提出するしないに関わらず、期末試験を受験した人だけを採点する」
→ データフレームx
(ここでは df_exam
)
を温存させて結合する
→ left_join()
関数を使う
この場合、結合されるデータフレームは次のような構造になる
left_join()
は x
を温存する結合方法x
に含まれる Student_1
,
Student_2
, Student_3
だけが温存されるy
に含まれても x
には含まれない
Student_4
は除外されるname
がキー変数left_join()
は x
を優先した 100
人全員が結合対象score
と
submission
) は作れたscore
は
100点満点換算の値だが、submission
は 5 点満点の値
→ submission
を 100点満点換算の値 (sub
)
に変換する必要がある成績評価基準
・期末試験(60%)
・宿題 (40%)
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname
と grade
に絞るdf_left <- df_left |>
mutate(grade = score * 0.6 + sub * 0.4) |>
mutate(grade = round(grade, digits = 0)) |>
select(name, grade)
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_left |>
filter(!is.na(grade)) |>
ggplot() +
geom_histogram(aes(x = grade), color = "white",
binwidth = 10, boundary = 0) +
labs(x = "最終成績", y = "学生数") +
geom_vline(xintercept = mean(df_left$grade,
na.rm = T),
col = "yellow",
linetype = "dotted")# 平均値に黄色の縦線を引く
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
53.00 67.75 75.00 74.62 81.00 100.00 16
full_join()
成績評価基準_2
・期末試験(60%)
・宿題 (40%)
・宿題を 1
回も提出しなくても、期末試験で満点を取れば単位(=
60点)を認定する
つまり「宿題提出の有無や期末試験を受験したかどうかにかかわらず、全員を採点する」
→ 2 つのデータフレームに存在する全ての行が結合対象になる
→ full_join()
関数を使う
この場合、結合されるデータフレームは次のような構造になる
full_join()
は x
と y
両データに存在する全ての行が結合対象
x
には Student_3
があるが、y
には Student_3
がない時
→ Student_3
の score
の値は残る
y
には Student_4
があるが、x
には Student_4
がない時
→ Student_4
の submission
の値は残る
df_exam
と df_hw
は問題なく結合できる
Student_1
から Student_100
まで全員が結合できる
→ ここでは name
がキー変数
score
と
submission
) は作れたscore
は
100点満点換算の値だが、submission
は 5 点満点の値submission
を 100点満点換算の値 (sub
)
に変換する必要があるdf_full <- df_full |>
mutate(sub = submission * 100/5) |>
select(name, score, sub) # submission を非表示にする
name score sub
Length:100 Min. : 45.00 Min. : 20.00
Class :character 1st Qu.: 68.00 1st Qu.: 60.00
Mode :character Median : 74.00 Median : 80.00
Mean : 75.23 Mean : 73.04
3rd Qu.: 84.00 3rd Qu.: 80.00
Max. :100.00 Max. :100.00
NA's :9 NA's :8
NA's = 9
)NA's = 8
)成績評価基準
・期末試験(60%)
・宿題 (40%)
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname
と grade
に絞るdf_full <- df_full |>
mutate(grade = score * 0.6 + sub * 0.4) |>
mutate(grade = round(grade, digits = 0)) |>
select(name, score, sub,grade)
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_full |>
filter(!is.na(grade)) |>
ggplot() +
geom_histogram(aes(x = grade), color = "white",
binwidth = 10, boundary = 0) +
labs(x = "最終成績", y = "学生数") +
geom_vline(xintercept = mean(df_full$grade,
na.rm = T),
col = "yellow",
linetype = "dotted")# 平均値に黄色の縦線を引く
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
53.00 67.75 75.00 74.62 81.00 100.00 16
Student_8
は宿題は 1 度も提出しなかったが、期末で
97点を取得97 x 0.6 = 58点
なので単位認定はできないinner_join()
成績評価基準_3
・期末試験(60%)
・宿題 (40%)
・「宿題を 1
回も提出しない人」もしくは「期末試験を受験しない人」は採点されない
つまり「宿題を最低 1
回提出し、かつ期末試験を受験した人だけを採点する」
→ どちらのデータフレームにも存在する行のみが結合対象になる
→ inner_join()
関数を使う
この場合、結合されるデータフレームは次のような構造になる
inner_join()
は x
と y
両データに共通して存在する行が結合対象x
には Student_3
があるが、y
には Student_3
がない時Student_3
は残らないy
には Student_4
があるが、x
には Student_4
がない時Student_4
は残らないdf_exam
と df_hw
は問題なく結合できるStudent_1
から Student_100
まで全員が結合できるとは限らない→ ここでは name
がキー変数
inner_join()
は x
と y
両データに同時に共通して存在する 92 人だけが結合対象score
と
submission
) は作れたscore
は
100点満点換算の値だが、submission
は 5 点満点の値submission
を 100点満点換算の値 (sub
)
に変換する必要があるdf_final <- df_final |>
mutate(sub = submission * 100/5) |>
select(name, score, sub) # submission を非表示にする
成績評価基準_3
・期末試験(60%)
・宿題 (40%)
・「宿題を 1
回も提出しない人」もしくは「期末試験を受験しない人」は採点されない
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname
と grade
に絞るdf_final <- df_final |>
mutate(grade = score * 0.6 + sub * 0.4) |>
mutate(grade = round(grade, digits = 0)) |>
select(name, grade)
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_final |>
filter(!is.na(grade)) |>
ggplot() +
geom_histogram(aes(x = grade), color = "white",
binwidth = 10, boundary = 0) +
labs(x = "最終成績", y = "学生数") +
geom_vline(xintercept = mean(df_final$grade,
na.rm = T),
col = "yellow",
linetype = "dotted") # 平均値に黄色の縦線を引く
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
53.00 67.75 75.00 74.62 81.00 100.00 8
tidyr
パッケージを使ったデータの変換は次の 3
種類あるpivot_longer() |
Wide型(雑然) → Long型(整然) | |
pivot_wider() |
long型(整然) → wide型(雑然) | |
separate() |
セルの分割 | 例:「年月日」→「年」「月」「日」 |
pivot_longer()
データの準備
(mos_mc_paired.csv
) ・ mos_mc_paired.csv
をクリックしてデータをパソコンにダウンロード ・RProject
フォルダ内に data という名称のフォルダを作成する
・ダウンロードした mos_mc.csv
を手動でRProject
フォルダ内にある data フォルダに入れる
・選挙データの読み取る
wide format
)」なので、R 上では分析しにくい→ pivot_longer()
関数を使って「ロング形式
(long format
)」に変換する
pivot_longer()
関数
データ |>
pivot_longer(cols = 変数が格納されている列,
names_to = "元の列名が入る変数名",
values_to = "変数の値が入る変数名")
df_long <- df_mosmc |>
pivot_longer(cols = mos:mc,
names_to = "burger", # バーガー店名を入力
values_to = "score") # バーガーの評価点を入力
pivot_wider()
long
型データを wide
型データへ整形する際は pivot_wider()
を使うwide
型データが多いpivot_wider()
関数を使って「ロング形式
(wide format
)」に変換するpivot_wider()
関数
データ |>
pivot_wider(cols = 変数が格納されている列,
names_from = "元の列名が入る変数名",
values_from = "変数の値が入る変数名")
df_wide <- df_long |>
pivot_wider(names_from = "burger", # バーガー店名を入力
values_from = "score") # バーガーの評価点を入力
separate()
データの準備:
COVID19_Worldwide.csv
変数名 | 詳細 |
---|---|
ID | ID |
Country | 国名 |
Date | 年月日 |
Confirmed_Day | COVID-19 新規感染者数(人)/ 一日あたり |
Confirmed_Total | COVID-19 累積感染者数(人)総合 |
Death_Day | COVID-19 新規死亡者数(人) 一日あたり |
Death_Total | COVID-19 累積死亡者数(人)総合 |
Test_Day | COVID-19 新規検査数(人) 一日あたり |
Test_Total | COVID-19 累積検査数(人)総合 |
covid_df <- read_csv("data/COVID19_Worldwide.csv",
guess_max = 10000)
# 最初の10000行を読んでからデータ型を判断するよう設定
[1] "ID" "Country" "Date" "Confirmed_Day"
[5] "Confirmed_Total" "Death_Day" "Death_Total" "Test_Day"
[9] "Test_Total"
変数名 | 詳細 |
---|---|
Country | 国名 |
Date | 年月日 |
Confirmed_Total | COVID-19 累積感染者数(人)総合 |
Death_Total | COVID-19 累積死亡者数(人)総合 |
DT
パッケージを使って表示するdf1
は tidy data
の 4
つの原則を満たす1. 1 つの「列」 | = 1 つの「変数」 |
2. 1 つの「行」 | = 1 つの「観測」 |
3. 1 つの「セル」 | = 1 つの「値」 |
4. 1 つの「表」 | = 1 つの「分析単位」 |
→ このデータは tidy data
(=long
型)
→ データを変換する必要はない
covid_df
の変数の記述統計を表示させる{r, results = "asis"}
と指定するStatistic | N | Mean | St. Dev. | Min | Max |
Confirmed_Total | 31,806 | 18,250.14 | 115,471.60 | 0 | 3,184,582 |
Death_Total | 31,806 | 1,039.01 | 6,565.51 | 0 | 134,094 |
separate()
関数の使い方を解説するData
) は 2020/1/22
と表示されているYYYY年MM月DD日
」では不都合covid_df
の separate()
列を
Year
、Month
、Day
に分けてみるseparate()
関数の使い方
データ |>
separate(col = "分割する変数名",
into = c("分割後の変数名 1", "分割後の変数名 2", "分割後の変数名 3", ...),
sep = "分割する基準")
"2020/1/22"
の場合、"2020"
、"1"
、"22"
が
"/"
という「基準」によって分割されているdeath_country <- df1 |>
group_by(Country, Year) |>
summarise(Death = sum(Death_Total),
Infected = sum(Confirmed_Total))
death_country
の変数の記述統計を表示させる
チャンクオプションで {r, results = "asis"}
と指定する
Statistic | N | Mean | St. Dev. | Min | Max |
Death | 186 | 177,670.60 | 782,130.30 | 0 | 8,616,010 |
Infected | 186 | 3,120,774.00 | 13,105,502.00 | 731 | 160,231,690 |
Covid19
の累積感染者数と累積死者数の散布図を描いてみるplot_1 <- death_country |>
ggplot(aes(Infected, Death)) +
geom_point() +
stat_smooth(method = lm) +
ggrepel::geom_text_repel(aes(label = Country),
size = 3,
family = "HiraKakuPro-W3") +
labs(x = "Covid19累積感染者数", y = "累積死者数")+
theme_bw(base_family = "HiraKakuProN-W3")
plot_1
plot_2 <- death_country |>
filter(Country != "United States") |>
ggplot(aes(Infected, Death)) +
geom_point() +
stat_smooth(method = lm) +
ggrepel::geom_text_repel(aes(label = Country),
size = 3,
family = "HiraKakuPro-W3") +
labs(x = "Covid19累積感染者数", y = "累積死者数")+
theme_bw(base_family = "HiraKakuProN-W3")
plot_2
str_c()
データの準備: hr96-21.csv
hr
には 22 個の変数が入っている変数名 | 詳細 |
---|---|
year | 選挙年 (1996-2021) |
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 | 世襲元の政治家の氏名と関係 |
[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"
変数名 | 詳細 |
---|---|
year | 選挙年 (1996-2017) |
ku | 小選挙区名 |
kun | 小選挙区 |
j_name | 候補者の氏名(日本語) |
DT
パッケージを使って表示するstr_c()
関数の使い方を解説するku
) は
tokyo
、小選挙区 (kun
) は 1
のように表示されているtokyo_1
のように表示したいとするstr_c()
関数の使い方
データ |>
str_c(新たに作る変数名 = str_c(1番目の変数名, 2番目の変数名, sep = "間に入れる記号")
・Q8.1:
「2. 行のソート: arrange()」
を参考にして、次の問題にこたえなさい
分析には衆議院選挙データセット hr96-21.csv を使うこと
表示する変数は次の 6 つに限ること
Q1: 2021年総選挙の立候補者の中で、獲得した票数の多い順に並べ、トップ10人の候補者名を挙げなさい
Q2: 2021年総選挙の立候補者の中で、獲得した得票率の大きい順に並べ、トップ10人の候補者名を挙げなさい
・Q8.2:
「7.3 separate()」
を参考にして、次の問題にこたえなさい
データ COVID19_Worldwide.csv を使う
Q1 2020年
(1月22日〜7月10日)の国別「累積検査数」を x
軸、「累積感染者数」を y
軸に設定した散布図を描きなさい
Q2 2020年
(1月22日〜7月10日)の国別「累積検査数」を x
軸、「累積感染者数」を y
軸に設定した散布図を描きなさい
・外れ値があれば、外れ値を除外した散布図を示しなさい