library(tidyverse)
・変数を手作りする方法を解説します
・変数をマージしてデータフレームの作り方を説明します
・複数のデータフレームをマージする方法を説明します
・様々な拡張子のデータを RStudio に取り込む方法を紹介します
・データ分析を行う前段階として、基礎的な専門用語の解説をします
テキストデータ、バイナリデータ、拡張子、パス、ファイル、フォルダ、Rプロジェクト、Rプロジェクトフォルダ、作業ディレクトリ、欠損値、変数の型、R付属データ、パイプ演算子、変数の型
(class
)、AND
演算子、OR
演算子、%in%
演算子、欠損値
tidyverse
) をロードするlibrary(haven)
library(readxl)
library(tidyverse)
data
というフォルダを作成hr96-21.csv
ファイルを
data
の中に入れる.csv
ファイルの読み取りには tidyverse
の中に含まれる read_csv()
関数を使う<- read_csv("data/hr96-21.csv",
hr na = ".") # 欠損値処理のコマンド
arrange()
hr
を使って当選者の中で
(wl > 0
) 獲得票数 (vote
)
の少ない候補者を表示してみる%>%
hr filter(wl > 0) %>%
arrange(vote) %>%
select(pref, kun, seito, j_name, wl, gender, rank, 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
# … with 3,649 more rows
!is.na()
NA
か否かを判定するには is.na()
関数を使う%>%
hr filter(is.na(exp)) %>%
select(year, j_name, exp)
# A tibble: 2,831 × 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
# … with 2,821 more rows
exp
に NA
が 2831 もあることがわかるN
がいくつか確認するdim(hr)
[1] 9660 22
exp
が 2831 も欠損であることがわかるexp
の欠損値を除外したいのだから、否定を表す
!
を使う%>%
hr filter(!is.na(exp)) %>%
select(year, j_name, exp)
# A tibble: 6,829 × 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
# … with 6,819 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
# … with 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
# … with 2,664 more rows
arrange(desc())
desc()
関数で囲む%>%
hr arrange(desc(vote)) %>%
select(year, pref, kun, seito, j_name, wl, gender, rank, vote)
# 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
# … with 9,650 more rows
DT::datatable()
関数を使うと便利<- hr %>%
hr2 filter(wl == 1) %>% # 小選挙区当選者だけを指定
arrange(desc(vote)) %>%
select(year, pref, kun, seito, j_name, wl, gender, rank, vote, voteshare)
::datatable(hr2) DT
bind_rows()
data.frame
を縦に結合する場合は、bind_rows()
を使うdata.frame
があるとする<- data.frame(id = 1:5,
df1 name = c("A", "B", "C", "D", "E"),
score = c(100, 90, 80, 70, 60))
<- data.frame(id = 6:8,
df2 name = c("F", "G", "H"),
score = c(50, 40, 30))
data.frame
を表示させてみる df1
id name score
1 1 A 100
2 2 B 90
3 3 C 80
4 4 D 70
5 5 E 60
df2
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
は一致しているbind_rows(df1, df2)
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 引数
を追加するbind_rows(list("1年" = df1,
"2年" = df2),
.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
)<- data.frame(univ = c("拓殖大学", "早稲田大学", "UCLA"),
df1 city = c("東京", "東京", "LA"),
pop = c(8600, 47000, 45000))
<- data.frame(univ = c("拓殖大学", "早稲田大学", "UCLA"),
df2 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
) と表示される
<- data.frame(univ = c("拓殖大学", "早稲田大学", "UCLA"),
x pop = c(8600, 47000, 45000))
<- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
y founder = c("桂太郎", "大隈重信", "日本国"))
left_join(x, y, by = "univ")
univ pop founder
1 拓殖大学 8600 桂太郎
2 早稲田大学 47000 大隈重信
3 UCLA 45000 <NA>
right_join()
関数のメカニズムright_join(x, y)
は y
を温存させる関数x
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるx
の UCLA と y
の東北大学はどうなるか?right_join(x, y)
を使うと、y
の東北大学が優先されて残されるpop
は欠損値
(NA
) と表示される
<- data.frame(pop = c(8600, 47000, 45000),
x univ = c("拓殖大学", "早稲田大学", "UCLA"))
<- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
y founder = c("桂太郎", "大隈重信", "日本国"))
right_join(x, y, by = "univ")
pop univ founder
1 8600 拓殖大学 桂太郎
2 47000 早稲田大学 大隈重信
3 NA 東北大学 日本国
inner_join()
関数のメカニズムx
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるinner_join(x, y)
は x
と y
両データに同時に存在する行のみが結合対象
<- data.frame(pop = c(8600, 47000, 45000),
x univ = c("拓殖大学", "早稲田大学", "UCLA"))
<- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
y founder = c("桂太郎", "大隈重信", "日本国"))
inner_join(x, y, by = "univ")
pop univ founder
1 8600 拓殖大学 桂太郎
2 47000 早稲田大学 大隈重信
full_join()
関数のメカニズムx
・・・拓殖大学, 早稲田大学, UCLA
が含まれるy
・・・拓殖大学, 早稲田大学, 東北大学
が含まれるfull_join(x, y)
は x
と y
全てを温存させるNA
) と表示される
<- data.frame(pop = c(8600, 47000, 45000),
x univ = c("拓殖大学", "早稲田大学", "UCLA"))
<- data.frame(univ = c("拓殖大学", "早稲田大学", "東北大学"),
y founder = c("桂太郎", "大隈重信", "日本国"))
full_join(x, y, by = "univ")
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
) だけ成績評価基準
・期末試験(60%)
・宿題 (40%)
R01_exam_score.csv, (N=100)
R01_hw.csv, (N=500)
データの準備
R01_exam_score.csv
tidyverse
パッケージを読み込むlibrary(tidyverse)
R01_exam_score.csv
をダウンロードする
期末試験のデータを読み込み df_exam
と名前を付ける
na = "."
を指定し、欠損値を「.」
で表示すると指定
<- read_csv("data/R01_exam_score.csv", na = ".") df_exam
df_exam
の中を確認してみる::datatable(df_exam) DT
df_exam
の記述統計を表示させるsummary(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
)
を確認
期末試験結果の分布をヒストグラムで表示してみる
theme_update(text = element_text(family = "HiraginoSans-W3"))
%>%
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") # 平均値に真ジェンタ色の縦線を引く
R01_hw.csv
R01_df_hw.csv
をダウンロードするna = "."
を指定し、欠損値を「.」
で表示すると指定<- read_csv("data/R01_hw.csv", na = ".") df_hw
df_hw
の中を確認してみる::datatable(df_hw) DT
N = 500
df_exam
は N = 100
, df_hw
は N = 500
成績を付けるために必要なのは 100人分の成績データ
→ 観測数を N = 100
に統一する必要がある
学生ごとに
(Student_1 〜 Student_100
まで)何回宿題を「提出」したかを計算し表示させる
→ group_by()
関数を使って df_hw
の
name
と hw
をグループ化し「提出」の合計を計算
→ 「提出」の合計値を submission
という変数に格納する
<- df_hw %>%
df_hw group_by(name, hw) %>%
summarise(submission = n())
::datatable(df_hw) DT
submission
には「提出」した回数ばかりでなく「未提出」の回数も表示されているfilter()
関数を使って、非表示にするhw
も不要なので select()
関数を使って非表示にする<- df_hw %>%
df_hw filter(hw == "提出") %>%
select(name, submission)
::datatable(df_hw) DT
%>%
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),
col = "yellow") # 平均値に黄色の縦線を引く
summary()
関数を使って、正確な記述統計を表示してみるsummary(df_hw$submission)
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(df_exam, df_hw, by = "name") df_left
::datatable(df_left) DT
left_join()
は x
を優先した 100
人全員が結合対象score
と
submission
) は作れたscore
は
100点満点換算の値だが、submission
は 5 点満点の値
→ submission
を 100点満点換算の値 (sub
)
に変換する必要がある<- df_left %>%
df_left mutate(sub = submission * 100/5) %>%
select(name, score, sub) # submission を非表示にする
::datatable(df_left) DT
成績評価基準
・期末試験(60%)
・宿題 (40%)
<- df_left %>%
df_left mutate(grade = score * 0.6 + sub * 0.4)
::datatable(df_left) DT
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)
::datatable(df_left) DT
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
%>%
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),
col = "yellow") # 平均値に黄色の縦線を引く
summary(df_left$grade)
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
がキー変数
<- full_join(df_exam, df_hw, by = "name") df_full
::datatable(df_full) DT
score
と
submission
) は作れたscore
は
100点満点換算の値だが、submission
は 5 点満点の値submission
を 100点満点換算の値 (sub
)
に変換する必要がある<- df_full %>%
df_full mutate(sub = submission * 100/5) %>%
select(name, score, sub) # submission を非表示にする
::datatable(df_full) DT
summary(df_full)
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%)
<- df_full %>%
df_full mutate(grade = score * 0.6 + sub * 0.4)
::datatable(df_full) DT
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)
::datatable(df_full) DT
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
%>%
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),
col = "yellow") # 平均値に黄色の縦線を引く
summary(df_full$grade)
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()
成績評価基準_1
・期末試験(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(df_exam, df_hw, by = "name") df_final
::datatable(df_final) DT
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 を非表示にする
::datatable(df_final) DT
成績評価基準
・期末試験(60%)
・宿題 (40%)
<- df_final %>%
df_final mutate(grade = score * 0.6 + sub * 0.4)
::datatable(df_final) DT
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)
::datatable(df_final) DT
これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
%>%
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),
col = "yellow") # 平均値に黄色の縦線を引く
summary(df_final$grade)
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 フォルダに入れる
・選挙データの読み取る
<- read_csv("data/mos_mc_paired.csv",
df_mosmc na = ".")
::datatable(df_mosmc) DT
wide format
)」なので、R 上では分析しにくい→ pivot_longer()
関数を使って「ロング形式
(long format
)」に変換する
pivot_longer()
関数
データ %>%
pivot_longer(cols = 変数が格納されている列,
names_to = "元の列名が入る変数名",
values_to = "変数の値が入る変数名")
<- df_mosmc %>%
df_long pivot_longer(cols = mos:mc,
names_to = "burger", # バーガー店名を入力
values_to = "score") # バーガーの評価点を入力
::datatable(df_long) DT
pivot_wider()
long
型データを wide
型データへ整形する際は pivot_wider()
を使うwide
型データが多いpivot_wider()
関数を使って「ロング形式
(wide format
)」に変換するpivot_wider()
関数
データ %>%
pivot_wider(cols = 変数が格納されている列,
names_from = "元の列名が入る変数名",
values_from = "変数の値が入る変数名")
<- df_long %>%
df_wide pivot_wider(names_from = "burger", # バーガー店名を入力
values_from = "score") # バーガーの評価点を入力
::datatable(df_wide) DT
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 累積検査数(人)総合 |
<- read_csv("data/COVID19_Worldwide.csv",
covid_df guess_max = 10000)
# 最初の10000行を読んでからデータ型を判断するよう設定
names(covid_df)
[1] "ID" "Country" "Date" "Confirmed_Day"
[5] "Confirmed_Total" "Death_Day" "Death_Total" "Test_Day"
[9] "Test_Total"
<- covid_df %>%
df1 select(Country, Date, Confirmed_Total, Death_Total)
変数名 | 詳細 |
---|---|
Country | 国名 |
Date | 年月日 |
Confirmed_Total | COVID-19 累積感染者数(人)総合 |
Death_Total | COVID-19 累積死亡者数(人)総合 |
DT
パッケージを使って表示する::datatable(df1) DT
df1
は tidy data
の 4
つの原則を満たす1. 1 つの「列」 | = 1 つの「変数」 |
2. 1 つの「行」 | = 1 つの「観測」 |
3. 1 つの「セル」 | = 1 つの「値」 |
4. 1 つの「表」 | = 1 つの「分析単位」 |
→ このデータは tidy data
(=long
型)
→ データを変換する必要はない
covid_df
の変数の記述統計を表示させるlibrary(stargazer)
{r, results = "asis"}
と指定するstargazer(as.data.frame(df1),
type ="html",
digits = 2)
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"
が
"/"
という「基準」によって分割されている<- df1 %>%
df1 separate(col = "Date",
into = c("Year", "Month", "Day"),
sep = "/")
<- df1 %>%
death_country group_by(Country, Year) %>%
summarise(Death = sum(Death_Total),
Infected = sum(Confirmed_Total))
::datatable(death_country) DT
death_country
の変数の記述統計を表示させる
チャンクオプションで {r, results = "asis"}
と指定する
stargazer(as.data.frame(death_country),
type ="html",
digits = 2)
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
の累積感染者数と累積死者数の散布図を描いてみる<- death_country %>%
plot_1 ggplot(aes(Infected, Death)) +
geom_point() +
stat_smooth(method = lm) +
::geom_text_repel(aes(label = Country),
ggrepelsize = 3,
family = "HiraKakuPro-W3") +
labs(x = "Covid19累積感染者数", y = "累積死者数")+
theme_bw(base_family = "HiraKakuProN-W3")
plot_1
<- death_country %>%
plot_2 filter(Country != "United States") %>%
ggplot(aes(Infected, Death)) +
geom_point() +
stat_smooth(method = lm) +
::geom_text_repel(aes(label = Country),
ggrepelsize = 3,
family = "HiraKakuPro-W3") +
labs(x = "Covid19累積感染者数", y = "累積死者数")+
theme_bw(base_family = "HiraKakuProN-W3")
plot_2
・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
軸に設定した散布図を描きなさい
・外れ値があれば、外れ値を除外した散布図を示しなさい