Chapter 6 データのハンドリング
6.1 データ
- Rはデータ分析(統計解析)を行うのが主な機能
- それ以外も色々できるが…
6.2 データの読み込み
- データはデータファイルから読み込む
- ファイルがある場所のpathを指定する。
- データファイルの形式はExcelや
.csv
,.dta
,.rds
など様々- 形式によって使う関数が異なる。
- 例えば
- Excelなら、
readxl
パッケージのread_excel
- csvなら、
readr
パッケージのread_csv
- いずれも
tidyverse
パッケージ群に含まれている
- Excelなら、
ここではエクセル形式について説明するが、その他のファイル形式については私達のRの第8章を参照してほしい
6.2.1 演習: データの読み込み
csvを読み込むにはread_excel()
関数を使う。この関数はreadxl
パッケージ含まれている。
readxl
パッケージをインストールする。r_renshu
フォルダにdata
フォルダを作成し、武蔵大学経済学部の学生数データをこちらからダウンロードして保存するか、以下のコードを実行する。
# data ディレクトリの作成
fs::dir_create("data")
# データのダウンロードと保存
download.file(url="https://keita43a.github.io/regression_tutorial/data/musashi_keizai_students_2023.xlsx",
destfile = "data/musashi_keizai_students_2023.xlsx")
Rスクリプトを作成し、
data_mgt.R
という名前をつけて保存する。Rスクリプトの冒頭でパッケージを読み込む
- Rスクリプトに以下のコードを書きこみ、データを読み込む。
Error: path does not exist:’
というエラーが出る場合は、ファイルの相対パスが間違っている可能性があるr_renshu
プロジェクトを開いていることを確認するgetwd()
で自分がr_renshuフォルダにいることを確認するmusashi_keizai_students_2023.xlsx
がきちんとdataフォルダに入っていることを確認する
6.2.2 日本語のデータを読み込む際の注意点
日本語のファイルを読み込む時に、問題になる可能性があるのがエンコーディングである。
エンコーディングとは、データを一定の規則に従って目的の情報に変換することで、とくに文字を扱う上で、それぞれの文字に番号を割り当てる符号化を行っている。
最近ではよりグローバルなUnicodeが使われており、tidyverseのパッケージもunicodeあるUTF-8をデフォルトとして使用する。しかし、日本語のファイルの中にはShift-JISというエンコーディングで作成されているファイルもある。
例えば、こちらのファイルをそのまま読み込んで見る。
## # A tibble: 6 × 6
## ...1 ProductID ProductName Price Category CreatedDate
## <dbl> <dbl> <chr> <dbl> <chr> <date>
## 1 1 1 YKDJw 1122 "\x83w\x83\x8b\x83X&\x83r\x83\x85\x8… 2005-08-30
## 2 2 2 ftKQ7 1877 "\x83w\x83\x8b\x83X&\x83r\x83\x85\x8… 2006-07-01
## 3 3 3 l8lqm 3754 "\x89\xc6\x8b\xef\x81E\x83C\x83\x93\… 2005-05-26
## 4 4 4 8ntvc 8242 "\x89\xd4\x81E\x83O\x83\x8a\x81[\x83… 2005-09-06
## 5 5 5 HhDBS 4461 "\x90H\x95i" 2010-12-28
## 6 6 6 PKIs3 4963 "\x8eG\x89\xdd\x81E\x93\xfa\x97p\x95… 2005-02-09
Category
という変数が文字化けしてしまっているのがわかる。
ファイルのエンコーディングを調べることができる。
readr
パッケージもに入っているguess_encoding
を使うと、Shift-JISである可能性が高いことがわかる。
## # A tibble: 3 × 2
## encoding confidence
## <chr> <dbl>
## 1 Shift_JIS 1
## 2 windows-1252 0.31
## 3 windows-1250 0.31
read_csv
のオプションを使って、encodingを指定する。Shift-JISはCP932というエンコーディングになっている。
## # A tibble: 6 × 6
## ...1 ProductID ProductName Price Category CreatedDate
## <dbl> <dbl> <chr> <dbl> <chr> <date>
## 1 1 1 YKDJw 1122 ヘルス&ビューティー 2005-08-30
## 2 2 2 ftKQ7 1877 ヘルス&ビューティー 2006-07-01
## 3 3 3 l8lqm 3754 家具・インテリア・家電 2005-05-26
## 4 4 4 8ntvc 8242 花・グリーン 2005-09-06
## 5 5 5 HhDBS 4461 食品 2010-12-28
## 6 6 6 PKIs3 4963 雑貨・日用品 2005-02-09
文字化けなく読み込めた。
6.3 tidy data (整然データ)
武蔵大学経済学部の学生数データを見てみよう。
学科 | 性別 | 4年 | 3年 | 2年 | 1年 |
---|---|---|---|---|---|
経済学科 | 男 | 140 | 121 | 139 | 133 |
経済学科 | 女 | 38 | 46 | 50 | 38 |
経営学科 | 男 | 117 | 111 | 121 | 129 |
経営学科 | 女 | 52 | 62 | 53 | 62 |
金融学科 | 男 | 108 | 107 | 90 | 93 |
金融学科 | 女 | 24 | 33 | 29 | 36 |
## エクセルからデータを読み込み
data_634 <- read_excel("data/musashi_keizai_students_2023.xlsx")
knitr::kable(data_634) ## kableは見やすい表を出力する関数
このデータは、人間の目に見やすい形式になっている。学科・性別と学年がクロス表形式になっているため、何年生の何学科の男女が何人いるか見やすい表になっている。このような形のデータは横型(wide型)と呼ばれる。
同じデータを、異なる形式で表示したものが以下である。
## 学科 性別 学年 学生数
## 1 経済学科 男 1年 133
## 2 経済学科 男 2年 139
## 3 経済学科 男 3年 121
## 4 経済学科 男 4年 140
## 5 経済学科 女 1年 38
## 6 経済学科 女 2年 50
## 7 経済学科 女 3年 46
## 8 経済学科 女 4年 38
## 9 経営学科 男 1年 129
## 10 経営学科 男 2年 121
## 11 経営学科 男 3年 111
## 12 経営学科 男 4年 117
## 13 経営学科 女 1年 62
## 14 経営学科 女 2年 53
## 15 経営学科 女 3年 62
## 16 経営学科 女 4年 52
## 17 金融学科 男 1年 93
## 18 金融学科 男 2年 90
## 19 金融学科 男 3年 107
## 20 金融学科 男 4年 108
## 21 金融学科 女 1年 36
## 22 金融学科 女 2年 29
## 23 金融学科 女 3年 33
## 24 金融学科 女 4年 24
このデータでは「人数」という一つの変数のみの列があり、その他の属性もすべて縦の項目で表されている。これは、コンピューターによって処理しやすい形式であり、ベクトルの処理が得意なRでは縦長の形式が扱いやすい。
この縦長形式のデータをtidy data(整然データ)と呼ぶ
tidy dataの定義
- 一つの列が一つの変数を表す
- 一つの行が一つの観測を表す
- 一つのテーブルが一つのデータセットだけを含む
Rの中でもtidy dataでないデータが好ましい場合もある。しかし、tidy dataを基本にしておけば、そこから加工することは容易である。
6.5 tidyでないデータとtidyデータの変換
学科 | 男 | 女 |
---|---|---|
経済学科 | 533 | 172 |
経営学科 | 478 | 229 |
金融学科 | 398 | 122 |
今から横型(wide型)のデータを縦長(long型)に変換する。上のようなデータを下のようなデータに変換したいとする。
学科 | 性別 | 人数 |
---|---|---|
経済学科 | 男 | 533 |
経済学科 | 女 | 172 |
経営学科 | 男 | 478 |
経営学科 | 女 | 229 |
金融学科 | 男 | 398 |
金融学科 | 女 | 122 |
6.5.1 long型データへの変換
tidyr
というパッケージのpivot_longer
という関数はtidyでないデータ(wide型)をtidyなデータ(long型)に変換する。
まずパイプ(|>
)でdata_634
というwide型のデータをpivot_longer()
関数に引き渡す。
pivot_longer()
関数には、まず以下の3つの引数が重要である。
cols
は、どの列(column)の変数を使うかを指定する
names_to
は、新たに生成されるカテゴリ用の列の名前を指定する
values_to
は、数値が入る列の名前を指定する
さらに複雑な操作をする場合は他にも引数を使うことがあるが、基本的な変換は上の三つできちんと指定されていればうまくいくはずだ。
6.5.2 データを見てみる
右上のEnvironmentペーンにdata_634_long
というオブジェクトが生成される。
クリックしてみると、エクセルのような画面が現れる
またView()
という関数をつかっても、同じようにデータを見ることができる。
6.5.3 データを一部だけみたい場合
また、データの最初だけみたいときは、head()
, また後ろだけ見たいときはtail()
関数を使う。
デフォルトでは、6行だけ表示されるが、行数は引数nで調整できる。
## # A tibble: 10 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 1年 133
## 2 経済学科 男 2年 139
## 3 経済学科 男 3年 121
## 4 経済学科 男 4年 140
## 5 経済学科 女 1年 38
## 6 経済学科 女 2年 50
## 7 経済学科 女 3年 46
## 8 経済学科 女 4年 38
## 9 経営学科 男 1年 129
## 10 経営学科 男 2年 121
6.6 データの「大きさ」
データの行数や列数を調べるときにはdim()
関数を使う。
## [1] 24 4
24行、4列だとわかる。 RStudioではdata.frameオブジェクトは右上ペーンにも表示されている。
6.8 変数の要約
含まれている変数の基本統計量を見たい場合はsummary()
関数を使う。
## 学科 性別 学年 学生数
## 経済学科:8 男:12 1年:6 Min. : 24.0
## 経営学科:8 女:12 2年:6 1st Qu.: 44.0
## 金融学科:8 3年:6 Median : 76.0
## 4年:6 Mean : 80.5
## 3rd Qu.:118.0
## Max. :140.0
- 定性的なデータ(カテゴリ変数)は、入っているカテゴリとその数
- もし
character
と表示されていたら、単なる文字列と認識されている
- もし
- 定量的なデータは以下のような統計量が計算される。
Min. | nth Qu. | Median | Mean | Max. |
---|---|---|---|---|
最小 | n分位 | 中央値 | 平均 | 最大 |
6.9 変数の取り出し
データから変数を一つ取り出すときは$マークを使う。
## [1] 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年
## [21] 1年 2年 3年 4年
## Levels: 1年 2年 3年 4年
6.11 データの操作
データを編集したいことはたくさん出てくる。
- 列の名前を変えたい
- データの特定の列だけ抽出したい
- データの特定の行だけ提出したい
- 例:男性だけのデータ
- データの順番を並び替えたい
- データの列を並び替えたい
- 新しい変数を作りたい
- データを集計したい
6.11.2 元のデータの見た目確認
## # A tibble: 24 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 1年 133
## 2 経済学科 男 2年 139
## 3 経済学科 男 3年 121
## 4 経済学科 男 4年 140
## 5 経済学科 女 1年 38
## 6 経済学科 女 2年 50
## 7 経済学科 女 3年 46
## 8 経済学科 女 4年 38
## 9 経営学科 男 1年 129
## 10 経営学科 男 2年 121
## # ℹ 14 more rows
6.11.3 列の名前を変えたい: rename()
列(変数)の名前を変更する
data_634_long_eng <- data_634_long |>
rename(department = 学科,
grade = 学年,
gender = 性別,
stu_num = 学生数)
print(data_634_long_eng)
## # A tibble: 24 × 4
## department gender grade stu_num
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 1年 133
## 2 経済学科 男 2年 139
## 3 経済学科 男 3年 121
## 4 経済学科 男 4年 140
## 5 経済学科 女 1年 38
## 6 経済学科 女 2年 50
## 7 経済学科 女 3年 46
## 8 経済学科 女 4年 38
## 9 経営学科 男 1年 129
## 10 経営学科 男 2年 121
## # ℹ 14 more rows
6.11.4 特定の列だけ抽出する: select()
データのうち、学科と性別という変数だけ抽出したいとする
## # A tibble: 24 × 2
## 学科 性別
## <fct> <fct>
## 1 経済学科 男
## 2 経済学科 男
## 3 経済学科 男
## 4 経済学科 男
## 5 経済学科 女
## 6 経済学科 女
## 7 経済学科 女
## 8 経済学科 女
## 9 経営学科 男
## 10 経営学科 男
## # ℹ 14 more rows
6.11.5 特定の行だけ抽出する: filter()
データのうち、女性のデータだけを抽出したいとする
## # A tibble: 12 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 女 1年 38
## 2 経済学科 女 2年 50
## 3 経済学科 女 3年 46
## 4 経済学科 女 4年 38
## 5 経営学科 女 1年 62
## 6 経営学科 女 2年 53
## 7 経営学科 女 3年 62
## 8 経営学科 女 4年 52
## 9 金融学科 女 1年 36
## 10 金融学科 女 2年 29
## 11 金融学科 女 3年 33
## 12 金融学科 女 4年 24
6.11.6 データの順番を並び替える: arrange()
データの順番を学年->性別の順番で並び替える
## # A tibble: 24 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 1年 133
## 2 経営学科 男 1年 129
## 3 金融学科 男 1年 93
## 4 経済学科 女 1年 38
## 5 経営学科 女 1年 62
## 6 金融学科 女 1年 36
## 7 経済学科 男 2年 139
## 8 経営学科 男 2年 121
## 9 金融学科 男 2年 90
## 10 経済学科 女 2年 50
## # ℹ 14 more rows
6.11.6.1 降順の並びにする
デフォルトは昇順だが、desc()で降順で並び変えることもできる
## # A tibble: 24 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 4年 140
## 2 経営学科 男 4年 117
## 3 金融学科 男 4年 108
## 4 経済学科 女 4年 38
## 5 経営学科 女 4年 52
## 6 金融学科 女 4年 24
## 7 経済学科 男 3年 121
## 8 経営学科 男 3年 111
## 9 金融学科 男 3年 107
## 10 経済学科 女 3年 46
## # ℹ 14 more rows
6.11.7 データの列を並び替える: relocate()
学年の列を性別の前に持ってくる
## # A tibble: 24 × 4
## 学科 学年 性別 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 1年 男 133
## 2 経済学科 2年 男 139
## 3 経済学科 3年 男 121
## 4 経済学科 4年 男 140
## 5 経済学科 1年 女 38
## 6 経済学科 2年 女 50
## 7 経済学科 3年 女 46
## 8 経済学科 4年 女 38
## 9 経営学科 1年 男 129
## 10 経営学科 2年 男 121
## # ℹ 14 more rows
6.11.7.1 列の後ろに持ってくる場合
学年の列を学科の後に持ってくる
## # A tibble: 24 × 4
## 学科 学年 性別 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 1年 男 133
## 2 経済学科 2年 男 139
## 3 経済学科 3年 男 121
## 4 経済学科 4年 男 140
## 5 経済学科 1年 女 38
## 6 経済学科 2年 女 50
## 7 経済学科 3年 女 46
## 8 経済学科 4年 女 38
## 9 経営学科 1年 男 129
## 10 経営学科 2年 男 121
## # ℹ 14 more rows
6.11.8 データの列を追加する: mutate()
新しく、学生数を100で割った数値を作るとする
## # A tibble: 24 × 5
## 学科 性別 学年 学生数 学生数100
## <fct> <fct> <fct> <dbl> <dbl>
## 1 経済学科 男 1年 133 1.33
## 2 経済学科 男 2年 139 1.39
## 3 経済学科 男 3年 121 1.21
## 4 経済学科 男 4年 140 1.4
## 5 経済学科 女 1年 38 0.38
## 6 経済学科 女 2年 50 0.5
## 7 経済学科 女 3年 46 0.46
## 8 経済学科 女 4年 38 0.38
## 9 経営学科 男 1年 129 1.29
## 10 経営学科 男 2年 121 1.21
## # ℹ 14 more rows
6.11.9 データの列を編集する: mutate()
存在する変数名にすると、新しく変数(列)を作らずに上書きする
## # A tibble: 24 × 4
## 学科 性別 学年 学生数
## <fct> <fct> <fct> <dbl>
## 1 経済学科 男 1年 1.33
## 2 経済学科 男 2年 1.39
## 3 経済学科 男 3年 1.21
## 4 経済学科 男 4年 1.4
## 5 経済学科 女 1年 0.38
## 6 経済学科 女 2年 0.5
## 7 経済学科 女 3年 0.46
## 8 経済学科 女 4年 0.38
## 9 経営学科 男 1年 1.29
## 10 経営学科 男 2年 1.21
## # ℹ 14 more rows
6.11.10 データを集計する
任意を列を集計したり統計量を計算する。
data_634_long_summarise <- data_634_long |>
summarise(学生数合計 = sum(学生数),
学生数平均 = mean(学生数))
print(data_634_long_summarise)
## # A tibble: 1 × 2
## 学生数合計 学生数平均
## <dbl> <dbl>
## 1 1932 80.5
6.12 練習問題: データ操作
武蔵大学経済学部の学生数データを使って、女性のみの合計学生数を学年別で計算せよ。結果を
data_634_long_female_grade
というオブジェクトに格納し、結果をコンソールに表示せよ。同じデータを使って、1,2年生のみ合計学生数を男女別・学年別で計算せよ。結果を
data_634_long_1_2_grade
というオブジェクトに格納し、結果をコンソールに表示せよ。
6.13 データの結合
2つのデータフレームを結合したい場合
- 縦に結合したい場合
- 横に結合したい場合
6.13.1 データの縦の結合
例えば人文学部のデータと結合したいとする。 人文学部のデータはこちらからダウンロードできる。
## エクセルからデータを読み込み
data_634_jinbun <- readxl::read_excel("docs/data/musashi_jinbun_students_2023.xlsx")
knitr::kable(data_634_jinbun) ## kableは見やすい表を出力する関数
学科 | 性別 | 4年 | 3年 | 2年 | 1年 |
---|---|---|---|---|---|
英語英米文化学科 | 男 | 53 | 73 | 65 | 51 |
英語英米文化学科 | 女 | 74 | 72 | 77 | 55 |
ヨーロッパ文化学科 | 男 | 43 | 47 | 37 | 68 |
ヨーロッパ文化学科 | 女 | 60 | 66 | 63 | 56 |
日本・東アジア文化学科 | 男 | 50 | 46 | 48 | 45 |
日本・東アジア文化学科 | 女 | 61 | 78 | 75 | 74 |
変数の順番などが同じことを確認した上で、bind_rows()
を使う
## # A tibble: 12 × 6
## 学科 性別 `4年` `3年` `2年` `1年`
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 経済学科 男 140 121 139 133
## 2 経済学科 女 38 46 50 38
## 3 経営学科 男 117 111 121 129
## 4 経営学科 女 52 62 53 62
## 5 金融学科 男 108 107 90 93
## 6 金融学科 女 24 33 29 36
## 7 英語英米文化学科 男 53 73 65 51
## 8 英語英米文化学科 女 74 72 77 55
## 9 ヨーロッパ文化学科 男 43 47 37 68
## 10 ヨーロッパ文化学科 女 60 66 63 56
## 11 日本・東アジア文化学科 男 50 46 48 45
## 12 日本・東アジア文化学科 女 61 78 75 74
6.13.2 データを横に統合
新しい変数を含んだデータを既存のデータに統合したい
## エクセルからデータを読み込み
data_634_keizai_teiin <- readxl::read_excel("docs/data/musashi_keizai_teiin_2023.xlsx")
knitr::kable(data_634_keizai_teiin) ## kableは見やすい表を出力する関数
学科 | 定員 |
---|---|
経済学科 | 580 |
経営学科 | 580 |
金融学科 | 440 |
6.13.3 データを横に統合:join()関数
ここではleft_join
を使う。学科という変数をキーとして、左側に存在するすべての行にデータを統合する。
## 学科の人数と学科の定員を統合する
data_634_long_keizai <- data_634_long |>
left_join(data_634_keizai_teiin, by=c("学科"="学科"))
print(data_634_long_keizai)
## # A tibble: 24 × 5
## 学科 性別 学年 学生数 定員
## <chr> <fct> <fct> <dbl> <dbl>
## 1 経済学科 男 1年 133 580
## 2 経済学科 男 2年 139 580
## 3 経済学科 男 3年 121 580
## 4 経済学科 男 4年 140 580
## 5 経済学科 女 1年 38 580
## 6 経済学科 女 2年 50 580
## 7 経済学科 女 3年 46 580
## 8 経済学科 女 4年 38 580
## 9 経営学科 男 1年 129 580
## 10 経営学科 男 2年 121 580
## # ℹ 14 more rows