第2章 データの管理と把握
第二章ではR言語の基本的な事項の説明を行っていますので、本ページでは補足的な事項のみまとめてあります。 R/RStudioの環境構築 、 Rの基本 はリンク先を参照してください。また、コードを書く際は コーディング・スタイル にも留意して分かりやすいコードを記述するクセをつけておくことが大切です。
なお、テキストで利用しているパッケージは“Mandatory”のパッケージのみですが、本ページでは“Optional”のパッケージも利用しています。
Package | Descriptions | |
---|---|---|
gmodels | Mandatory | Various R Programming Tools for Model Fitting |
modeest | Optional | Mode Estimation |
psych | Optional | Procedures for Psychological, Psychometric, and Personality Research |
skimr | Optional | Compact and Flexible Summaries of Data |
summarytools | Optional | Tools to Quickly and Neatly Summarize Data |
tidyverse | N/A | Easily Install and Load the ‘Tidyverse’ |
modeest
パッケージをインストールする場合は事前に Bioconductorリポジトリ からgenefilter
パッケージをインストールする必要があります。genefilter
パッケージをインストールするには CRANリポジトリ のBiocManager
パッケージまたは Bioconductorリポジトリ のBiocInstaller
パッケージが必要です。
Package | Descriptions | |
---|---|---|
BiocManager | R >= 3.5.0 | (via CRAN) Access the Bioconductor Project Package Repository |
BiocInstaller | R < 3.5.0 | Install/Update Bioconductor, CRAN, and github Packages |
genefilter | methods for filtering genes from high-throughput experiments |
2.1 Rのデータ構造
ベクトル
ベクトル変数はRのもっとも基本的な変数で、テキストにあるように欠損値(NA
)を表現することが可能です。欠損値(NA
)にも型があり関数によっては型を明示的に指定しないとエラーになる場合があることに留意しておいてください。
欠損値名 | 欠損値の型 | 備考 |
---|---|---|
NA_integer_ | 整数型(integer ) |
|
NA_real_ | 実数型(double ) |
numeric 型がdouble 型とは限らない |
NA_complex_ | 複素数型(complex ) |
|
NA_character_ | 文字型(character ) |
論理型(logical
)の場合はNA
をそのまま使ってください。
なお、ベクトル変数に複数の変数型を混在して代入してしまった場合には 強制型変換 が行われます。
因子
因子(型)変数は特殊な構造を持ったベクトル変数です。名義尺度に相当するのがfactor
型、順序尺度に相当するのがorder
型でカテゴリカル変数を扱うのに適しています。
また、因子型変数は因子情報の扱いが厄介ですので因子操作に特化したforcats
パッケージを用いることをおすゝめします。forcats
パッケージに関しては こちら をご覧ください。
リスト
リスト型変数はぱっと見厄介そうですが、自由度が高いことから様々な関数が返り値を格納するのに用いていますので、基本的な操作を憶えておく必要があります。
# サンプルコードをそのまま利用
subject_name <- c("John Doe", "Jane Doe", "Steve Graves")
temperature <- c(98.1, 98.6, 101.4)
flu_status <- c(FALSE, FALSE, TRUE)
gender <- factor(c("MALE", "FEMALE", "MALE"))
blood <- factor(c("O", "AB", "A"),
levels = c("A", "B", "AB", "O"))
symptoms <- factor(c("SEVERE", "MILD", "MODERATE"),
levels = c("MILD", "MODERATE", "SEVERE"),
ordered = TRUE)
subject1 <- list(fullname = subject_name, temperature = temperature,
flu_status = flu_status, gender = gender,
blood, symptoms = symptoms)
subject1
## $fullname
## [1] "John Doe" "Jane Doe" "Steve Graves"
##
## $temperature
## [1] 98.1 98.6 101.4
##
## $flu_status
## [1] FALSE FALSE TRUE
##
## $gender
## [1] MALE FEMALE MALE
## Levels: FEMALE MALE
##
## [[5]]
## [1] O AB A
## Levels: A B AB O
##
## $symptoms
## [1] SEVERE MILD MODERATE
## Levels: MILD < MODERATE < SEVERE
リスト型変数作成時に要素名(変数名)を指定しておくと$
演算子による参照が可能になります。
## [1] MALE FEMALE MALE
## Levels: FEMALE MALE
## NULL
属性のついた要素に対するアクセス
リスト型変数には属性が付与された要素が含まれる場合が多々あります。例えばt検定(t.test
関数)の返り値は以下のように様々な属性が付与されているのが分かります。
## List of 10
## $ statistic : Named num -3.77
## ..- attr(*, "names")= chr "t"
## $ parameter : Named num 18.3
## ..- attr(*, "names")= chr "df"
## $ p.value : num 0.00137
## $ conf.int : num [1:2] -11.28 -3.21
## ..- attr(*, "conf.level")= num 0.95
## $ estimate : Named num [1:2] 17.1 24.4
## ..- attr(*, "names")= chr [1:2] "mean in group 0" "mean in group 1"
## $ null.value : Named num 0
## ..- attr(*, "names")= chr "difference in means"
## $ stderr : num 1.92
## $ alternative: chr "two.sided"
## $ method : chr "Welch Two Sample t-test"
## $ data.name : chr "mpg by am"
## - attr(*, "class")= chr "htest"
この結果から信頼区間(conf.int
)要素の属性になっている信頼係数(conf.level
)を参照するに以下のようにattribute
関数を用いてください。
## $conf.level
## [1] 0.95
データフレーム
データフレーム(data.frame
)変数は最も使われる変数型です。データの処理を効率的にするにはtidy data形式を意識してください。
pt.data <- data.frame(fullname = subject_name, temperature, flu_status,
gender, blood, symptoms)
pt.data
第1章 で補足説明したように列(要素、変数)がフィーチャーで、行(個々の観測値)がインスタンスになります。また、リスト型と異なり要素名(変数名)を明示的に指定しなくても$
演算子でアクセスできます。
## [1] O AB A
## Levels: A B AB O
なお、データフレーム型を効率的に扱うにはdplyr
パッケージをはじめとしたtidyverse
パッケージ群を用いることをおすゝめします。dplyr
パッケージの基本については こちら を参照してください。
行列と配列
行列(マトリクス)を作成するにはmatrix
関数を配列(多次元の行列)を作成するにはarray
関数を用いますが、テキストでは
以降の章では、ときどき行列を使うが、配列は使わない。 - ブレット・ランツ. 『Rによる機械学習』 (Kindle の位置No.969-970). 翔泳社. Kindle 版.
とあり配列に関しては省略されています。配列(array
関数)に興味がある方は、書籍などで調べてください。
正方行列
正方行列(square matrix)は行数と列数が一致するnxnの行列(マトリクス)です。では、1, 2, 3, 4 の四つのデータを利用して典型的な2x2マトリクス(二次正方行列)を作成してみます。
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
matrix
関数はマトリクスにしたいベクトルデータに対して行数(nrow
)または列数(ncol
)を指定するだけです。このように行数(nrow
)を指定しても列数(ncol
)を指定しても同じ行列(1, 2, 3, 4)が作成されます。
では、行列(1, 3, 2, 4)を転置するにはどのようにしたらよいでしょうか?
方法1 - データを入れ替える
指定するベクトルデータの順番を変えることで転置された行列が作れます。ただし、この方法は間違いやすいのでおすゝめしません。
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
方法2 - byrow
オプションを使う
matrix
関数はデフォルトでは列方向へ展開していきます。行方向へ展開方法を変えるにはbyrow
オプションをTRUE
に設定します。
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
方法3 - 転置関数を使う
正方行列では案2でも事足りますが正方行列でないケースも考えると転置関数(t
)を利用するのがベストです。
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
非正方行列
1, 2, 3, 4, 5, 6 のデータを使って2x3または3x2の正方でない行列を作成するには正方行列の場合と同様に行数(nrow
)または列数(ncol
)を指定します。
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
行数(nrow
)と列数(ncol
)を同時に指定しても構いませんが、 nrow
\(\times\) ncol
が指定したデータのデータ長を越えないように注意してください。
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
指定したデータ長を越える行列数を指定するとワーニングは表示されますが、指定した行列数のマトリクスが作成されてしまいます。
## Warning in matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 4): data length [6]
## is not a sub-multiple or multiple of the number of columns [4]
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 1
## [2,] 2 4 6 2
2.2 Rによるデータの管理
Rのデータ構造の保存、ロード、削除
Rではセッション情報を.RData
ファイルに保持でき、また、再現可能性を重視した処理をしているので、データフレームの処理に長時間を取られるような場合やデータソースをネット上から取得してきたような場合を除いて個別にデータを保存しておく必要はないと考えます。
CSVファイルとの間のデータのやり取り
Base Rのread.csv
関数で上手く読み込めない場合にはreadr
パッケージのreadr::read_csv
関数を試してみてください。
2.3 データの研究と把握
データ構造の研究
読込んだデータフレームの概要を把握する基本ははstr
関数ですが、str
関数では欠損値(NA
)が分かりにくかったりします。そこで、サマライズ系の関数を用いることをおすゝめします。
skimr
パッケージは構造のみならず数値変数に対しては統計要約量も表示してくれます。R Markdownで利用するには以下のように一工夫必要です。
より洗練された出力を行ってくれるのがsummarytools
パッケージです。ただし、レンダリング処理に時間がかかるのが難点です。
summarytools::dfSummary(usedcars, plain.ascii = FALSE, style = "grid") %>%
summarytools::view(method = 'render', omit.headings = TRUE)
Error : Can’t find summarytools
No | Variable | Stats / Values | Freqs (% of Valid) | Valid | Missing | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | year [integer] | Mean (sd) : 2008.7 (2.2) min < med < max: 2000 < 2009 < 2012 IQR (CV) : 2 (0) | 13 distinct values | 150 (100%) | 0 (0%) | ||||||||||||||||||||||||||||||||||||
2 | model [character] | 1. SE 2. SEL 3. SES |
|
150 (100%) | 0 (0%) | ||||||||||||||||||||||||||||||||||||
3 | price [integer] | Mean (sd) : 12961.9 (3122.5) min < med < max: 3800 < 13591.5 < 21992 IQR (CV) : 3909.5 (0.2) | 117 distinct values | 150 (100%) | 0 (0%) | ||||||||||||||||||||||||||||||||||||
4 | mileage [integer] | Mean (sd) : 44260.6 (26982.1) min < med < max: 4867 < 36385 < 151479 IQR (CV) : 27924.2 (0.6) | 150 distinct values | 150 (100%) | 0 (0%) | ||||||||||||||||||||||||||||||||||||
5 | color [character] | 1. Black 2. Blue 3. Gold 4. Gray 5. Green 6. Red 7. Silver 8. White 9. Yellow |
|
150 (100%) | 0 (0%) | ||||||||||||||||||||||||||||||||||||
6 | transmission [character] | 1. AUTO 2. MANUAL |
|
150 (100%) | 0 (0%) |
Generated by summarytools 0.9.3 (R version 3.6.1)
2019-08-24
その他、欠損値を可視化したい場合は こちら を参照してください。
数値変数の研究
基本的な要約関数はsummary
関数以外にpsych
パッケージのpsych::describe
関数が分かりやすいです。その他、前述のサマライズ系の関数が構造と統計要約量を同時に出してくれるので便利です。
中心傾向の測度 - 平均値と中央値
散布度の測度 - 四分位数と五数要約
Rで計算できる四分位数(quantile
)と五数要約(fivenum
)は似て非なるものですので注意してください。詳しくは各関数のヘルプで確認してください。
## 0% 25% 50% 75% 100%
## 4867.00 27200.25 36385.00 55124.50 151479.00
## [1] 4867 27136 36385 55170 151479
数値変数の可視化 - 箱ひげ図
箱ひげ図には様々なバリエーションがあります。詳しくは こちら を参照してください。
数値変数の可視化 - ヒストグラム
ヒストグラムを描く際には階級が肝です。詳しくはこちら を参照してください。
数値データの把握 - 一様分布と正規分布
散布度の測度 - 分散と標準偏差
分散についてテキストでは以下の計算式(標本分散)の後に
\[\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2\]
Rで分散や標準偏差が必要なとき には、 var() 関数、 sd() 関数 が 使える。 - ブレット・ランツ. Rによる機械学習 (Kindle の位置No.1287-1288). 翔泳社. Kindle 版.
と記述されていますが、Rのvar
関数は不偏分散を求める関数ですので正しい計算式は以下のようになります。なお、標準偏差についても同様(\(sd = \sqrt{var}\))です。
\[\sigma^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \mu)^2\]
また、コラム中に
Rは標本分散(n - 1 で割る)を使っているからである。 - ブレット・ランツ. Rによる機械学習 (Kindle の位置No.1295). 翔泳社. Kindle 版.
とありますが、正しくは以下となります。
Rは不偏分散(n - 1 で割る)を使っているからである。
Base Rには標本分散を求める関数はありませんので、標本分散を求める場合には不偏分散を\(\frac{n-1}{n}\)倍することで求めてください。
## [1] 9684893
不偏分散はテキスト通りvar
関数だけで計算できます。
## [1] 9749892
カテゴリ変数の研究
中心傾向の測度 - 最瀕値
Base Rには最頻値を求める関数はありません。Base Rではtable
関数で求めるか、modeest
パッケージのmlv
関数を用いてください。
## [1] "2010"
## Registered S3 methods overwritten by 'rmutil':
## method from
## plot.residuals psych
## print.response httr
## [1] 2010
ただし、modeest
パッケージは Bioconductorリポジトリ にあるgenefilter
パッケージを必要としますので以下の手順でインストールしてください。
# R 3.5.0 or later
install.packages("BiocManager")
BiocManager::install("genefilter")
install.packages("modeest")
なお、BiocManager
パッケージが使えるのはR 3.5.0以降です。R 3.4.xで利用する場合には Bioconductor releases 3.6 から以下の手順でBionicInstaller
パッケージを入手しgenefilter
パッケージをインストールしてください。その他のバージョンの場合は こちら から当該バージョンを探してインストールしてください。
変数間の関係の研究
関係の可視化 - 散布図
散布図が複数組み合わさった散布図行例はデータの傾向を見る上で非常に便利です。
追加パッケージを用いることで様々な散布図行例を描くことができます。詳しくは こちら を参照してください。
関係の解析 - 2次元クロス表
「カテゴリ変数の研究」の項ではtable
関数やprpo.table
関数は1次元表の作成のみにしか使えない印象がありますが、table
関数やprpo.table
関数でも2次元クロス表を作成できます。
## transmission
## model AUTO MANUAL
## SE 63 15
## SEL 22 1
## SES 43 6
## transmission
## model AUTO MANUAL
## SE 0.42 0.10
## SEL 0.15 0.01
## SES 0.29 0.04
Excelのようなクロス集計表を作る場合には紹介されているgmodels::CrossTable
関数が便利です。
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 150
##
##
## | transmission
## model | AUTO | MANUAL | Row Total |
## -------------|-----------|-----------|-----------|
## SE | 63 | 15 | 78 |
## | 0.190 | 1.108 | |
## | 0.808 | 0.192 | 0.520 |
## | 0.492 | 0.682 | |
## | 0.420 | 0.100 | |
## -------------|-----------|-----------|-----------|
## SEL | 22 | 1 | 23 |
## | 0.287 | 1.670 | |
## | 0.957 | 0.043 | 0.153 |
## | 0.172 | 0.045 | |
## | 0.147 | 0.007 | |
## -------------|-----------|-----------|-----------|
## SES | 43 | 6 | 49 |
## | 0.034 | 0.196 | |
## | 0.878 | 0.122 | 0.327 |
## | 0.336 | 0.273 | |
## | 0.287 | 0.040 | |
## -------------|-----------|-----------|-----------|
## Column Total | 128 | 22 | 150 |
## | 0.853 | 0.147 | |
## -------------|-----------|-----------|-----------|
##
##
その他、集計表を作成するにはstats::ftable
関数やstats::xtab
関数などがあります。
2.4 まとめ
Rには数多のパッケージが出ており、Rでできないことはないと言えます。できないことはないと思ってググってみてください。答えを見つけられるでしょう。それでも答えを見つけられない場合には r-wakalang へ行けば、Rおじさんたちが必ず答えてくれます。