第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パッケージに関しては こちら をご覧ください。

リスト

リスト型変数はぱっと見厄介そうですが、自由度が高いことから様々な関数が返り値を格納するのに用いていますので、基本的な操作を憶えておく必要があります。

## $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形式を意識してください。

第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パッケージです。ただし、レンダリング処理に時間がかかるのが難点です。

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
78(52.0%)
23(15.3%)
49(32.7%)
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
35(23.3%)
17(11.3%)
1(0.7%)
16(10.7%)
5(3.3%)
25(16.7%)
32(21.3%)
16(10.7%)
3(2.0%)
150 (100%) 0 (0%)
6 transmission [character] 1. AUTO 2. MANUAL
128(85.3%)
22(14.7%)
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パッケージを必要としますので以下の手順でインストールしてください。

 
なお、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おじさんたちが必ず答えてくれます。
 

Sampo Suzuki, CC BY-NC-SA 4.0

2019-08-24 (JST)