Hadley Wickham、Garrett Grolemund:R ではじめるデータサイエンス

作成日:2021-05-01
最終更新日:

概要

本書はプログラミング言語 R とそのパッケージを使ってデータサイエンスを解き明かしていく。 正誤表など、本書に関する Web ページは下記にある。
https://www.oreilly.co.jp/books/9784873118147/
原書は下記から参照可能だ。
https://r4ds.had.co.nz/index.html

感想

この本はわたしにとって難しい。以下、実環境とあるのは、R 4.0.5 Windows および RStudio 1.4.1106 に基づく。

各章には練習問題がある。解答は下記から参照できる:
https://sugiaki1989.gitbook.io/r-for-data-science-answers/

jitter

1章は ggplot2 によるデータ可視化の例を示している。そのなかで、poistion = "jitter" という指定が目を引いた。これは、散布図で各点の位置にランダムノイズを追加することを意味する。 ランダムノイズを追加する効果があるのは、同一の点に複数のサンプルがあるときだ。こうしておくと、 複数の標本が1つの点に重なってしまうのを避けることができ、大域的に見て密な領域がよくわかる。 これは覚えておこう。

なお、p.3 によれば tidyverse は6種類のライブラリがロードされるが、 私が試した版は8種類のライブラリがロードされる。追加されたのは stringr と forcats である。

RStudio

2章は R と RStduio の基本ワークフローについて説明されている。本書と実際の RStudio との違いは次の通り。

本書では入力プロンプトがないが、実際には入力プロンプトがある。他にも微妙な違いがある。

本書

1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.7
sin(pi / 2)
#> [1] 1

実環境

> 1 / 200 * 30
[1] 0.15
> (59 + 73 + 2) / 3
[1] 44.66667
> sin(pi / 2)
[1] 1

dplyr

3章は dplyrパッケージの解説だ。dplyr パッケージとは何か。データの操作に有用な関数があるパッケージ、 ということだ。dplyr が何を意味するのかわからない。まず、dplyr の読み方がわからない。 それでもひるまずに食いついていくしかない。

本章は nycflights13 というデータを使っているが、ライブラリの読み込みでエラーが出た。 下記の通り、インストールが必要となった。

> library(nycflights13)
 library(nycflights13) でエラー: 
   ‘nycflights13’ という名前のパッケージはありません
> install.packages("nycflights13")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/username/Documents/R/win-library/4.0’
(as ‘lib’ is unspecified)
 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/nycflights13_1.0.2.zip' を試しています 
Content type 'application/zip' length 4510226 bytes (4.3 MB)
downloaded 4.3 MB

package ‘nycflights13’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\username\AppData\Local\Temp\RtmpeGuYiy\downloaded_packages 

さて、p.39 をみて filter を使おうと思ったが、エラーが出た。

> filter(flights, month == 1, day == 1)
 match.arg(method) でエラー:  オブジェクト 'day' がありません 
> filter(flights, month == 1)
 filter(flights, month == 1) でエラー: 
   オブジェクト 'month' がありません 
> filter(flights)
 filter(flights) でエラー: 
   引数 "filter" がありませんし、省略時既定値もありません 

p.37 を見て、気づいた。library(tidyverse) を読み込むのを忘れていた。

> library(tidyverse)
-- Attaching packages ------------------------------------------- tidyverse 1.3.1 --
√ ggplot2 3.3.3     √ purrr   0.3.4
√ tibble  3.1.1     √ dplyr   1.0.5
√ tidyr   1.1.3     √ stringr 1.4.0
√ readr   1.4.0     √ forcats 0.5.1
-- Conflicts ---------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
> filter(flights, month == 1, day == 1)
(後略)

正しく動作した。

スクリプト

4章は、ワークフロー:スクリプトという表題である。こんなことが本文で言われている。 しかし、共有スクリプトには、install.packages() や setwd() を絶対に含めないことです。 他の人のコンピュータで設定を変えるのは反社会的行為です。 反社会的行為とは、怖い。

探索的データ解析

5章は探索的データ解析(Explanatory Data Analysis, EDA)について述べられている。 その中で、5.5.1 の練習問題 4. が気になった。

箱ひげ図での問題は、データセットがずっと小さかった時代に開発され、 あまりに多数の「外れ値」を表示する傾向があることだ。この問題を回避する1つの方式は要約値箱ひげ図である。 lvplot パッケージをインストールして、カットの価格分布を geom_lv() を使って表示しなさい。 何を学んだか。グラフをどう解釈するか。

原書の記述も併記する:

One problem with boxplots is that they were developed in an era of much smaller datasets and tend to display a prohibitively large number of “outlying values”. One approach to remedy this problem is the letter value plot. Install the lvplot package, and try using geom_lv() to display the distribution of price vs cut. What do you learn? How do you interpret the plots?

グラフを見ると、きりたんぽか、ニンジンのようだ。箱ひげ図とは違い、点の形でのデータ表示はほとんどない。ということは、 外れ値とはみなしていない、ということなのだろうか。日本語での解答は、 「geom_lv()は、箱ひげを改良した作図法で、よりも(ママ)多い分位数を使って作図します。」 となっている。これだけではわからないので、他のページも見てみた。

https://kenyu-life.com/2019/04/30/seaborn_plots/
これによれば、参照値(letter value)を利用して、詳細情報を末端にかけて表示する方法だと解説されている。 geom_lv() の lv は、Letter Value のことなのだろう。このページでリンクのある PDF を読んでみた。

論文はLetter-value plots: Boxplots for large data という表題がである。 では letter value とは何か。参照値という訳があるが、これだけでは何のことかわからない。 読み進めていって、Table 1 を見たとたん、疑問が氷解した。参照値とは、 順位統計量でいう、中央値(M)、四分位(F)、八分位(E)など、分位に対応する文字のことなのだ。 渡部洋らの「探索的データ解析」では、文字値という訳を当てている。

参照値に戻ると、この LV-plot とはこういうことらしい。

どこまで細かくしているかはよくわからないが、図を見ていると多分ここまでだろうと思われる。 要約値箱ひげ図という訳はなるほどと思うが、意味をとれば、多分位数箱ひげ図、ということだろうか。

プロジェクト

6章は RStudio を使ってプロジェクトを作っている。ここでいうプロジェクトとは、 ある目的のために作られた入力データや R スクリプト、分析結果、図などをまとめたものである。 さて、p.101 の例を真似してプロジェクトを作ろうとしたら、思わぬところで足をすくわれた。 以下はコンソールの例である。

> ggplot(diamonds, aes(carat, price)) + geom_hex()
  警告メッセージ: 
Computation failed in `stat_binhex()`:
   Package `hexbin` required for `stat_binhex`.
   Please install and try again. 
> install.packages("stat_binhex")
WARNING: Rtools is required to build R packages but is not currently installed. →
  Please download and install the appropriate version of Rtools before proceeding:
 
 https://cran.rstudio.com/bin/windows/Rtools/
 Installing package into ‘C:/Users/satosi/Documents/R/win-library/4.0’
 (as ‘lib’ is unspecified)
 Warning in install.packages :
   package ‘stat_binhex’ is not available for this version of R
 
A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages

https://github.com/hadley/r4ds/issues/607
を見ると、次のようにしてパッケージを追加するといいらしいのでやってみた。
install.pacakge("hexbin")

> install.packages("hexbin")
WARNING: Rtools is required to build R packages but is not currently installed. →
  Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/satosi/Documents/R/win-library/4.0’
(as ‘lib’ is unspecified)
 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/hexbin_1.28.2.zip' を試しています 
Content type 'application/zip' length 1475017 bytes (1.4 MB)
downloaded 1.4 MB

package ‘hexbin’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\username\AppData\Local\Temp\Rtmp6FJSak\downloaded_packages
> ggplot(diamonds, aes(carat, price)) + geom_hex()

うまくいった。

tibble

7章の表題は「tibble の tibble」。わからない単語を二重に並べられても困る。 tibble とはどういう意味だろうか。手元の英和辞典にはなかった。ランダムハウス英和大辞典(昔のもの) にもなかった。インターネットで見てみても、R の data.fram に代わるデータフレームという説明が大半である。 あるところには compliment(お世辞?)の意味で、good friend(いい友達?)という意味だというのがあった。 一応それで納得しておく。

readr

8章の表題は readr によるデータインポートである。readr という関数があるわけではなく、 readr はパッケージであって、そのなかの read_foo 関数の総称である。 本書では代表として read_csv() の使い方を説明している。

readr で読み込むデフォルトの問題点が2つ挙げられている。readr には、 この2つの問題を示す課題 csv ファイルが含まれていると本書 p.123 にある。 私の環境ではやはり異なっている。

本書

challenge <- read_csv(readr_example("challenge.csv"))
#> Parsed with column specification:
#> cols(
#>   x = col_integer(),
#>   y = col_character()
#> )
#> 警告: 1000 parsing failures.
#>  row col               expected actual
#> 1001   x no trailing characters .23837975086644292

実環境

> challenge <- read_csv(readr_example("challenge.csv"))
Parsed with column specification:
cols(
  x = col_double(),
  y = col_logical()
)
警告: 1000 parsing failures.
 row col           expected     actual                  flle
1001   y 1/0/T/F/TRUE/FALSE 2015-01-16 c:/Users/../challenge

しかし、結論は変わらず、x = col_double(), y = col_date() で正しく読み込める。

tidyr

9章は tidyr によるデータ整理である。最初に、トルストイによる『アンナ・カレーニナ』の、 あまりにも有名な冒頭の文章が引用されている。 そして、そのもじりが続いている。もじりを掲げよう。

整理データセットはどれも似通っているが、整理していないデータセットはそのあり方がそれぞれ異なっている。

整理データ(tidy data)の考え方はわかった。なお、他の訳書では「整然データ」という訳語もある。

整理データにはなりそうにないデータを扱うにはどうしたらいいのだろうか。 まずは探索的データ解析をしてみて、外れ値に相当しそうなところを NA (欠損値)で置き換えるなどすればいいのだろうか。 どうせ、そんな小細工は誰もみていないのだから。 欠損値については、 本書の p.141 以降で詳しく解説されている。

関係データ

10章は dplyr による関係データである。10.4 節では「ジョイン」という訳語が使われているが、 内部ジョインとか、外部ジョインということばには抵抗がある。 内部結合とか、外部結合ということばのほうがしっくりくるのだが、これは年齢のせいだろうか。

正規表現

11章は stringr による文字列と題して、正規表現を含む各種の文字列処理を扱っている。 p.173 で、ハワイ語による整列の例を見て驚いた。次の例がある。

x <- c("apple", "eggplant", "banana")

str_sort(x, locale = "en")  # English
#> [1] "apple"    "banana"   "eggplant"

str_sort(x, locale = "haw") # Hawaiian
#> [1] "apple"    "eggplant" "banana"

ハワイ語のアルファベットの順番を示した WEB サイトは見当たらなかった。 仕方がないのでアルファベット26文字を自分で入れてハワイ語でソートしてみたら、次の順番だった。

"aeioubcdfghjklmnpqrstvwxyz"

つまり、まずアルファベットを通常順に並べたあと、母音 aeiou をこの順に抜き取って先に並べる。 これがハワイ語のアルファベットの順というわけだ。なお、付け加えておくと、 ハワイ語で通常使われるアルファベットは、母音の aeiou のほか、子音は hklmnpw だけだ。ほかに日本語の促音のような ‘(オキナ)と母音を伸ばすことを表す ¯ (カハコー) が表記に使われる。

p.175 の練習問題の 1. の意味がわからない。

1. なぜ "\" が、"\", "\\", "\\\" が \ とマッチしないか説明しなさい。

日本語では X が Y とマッチするという。 だから、意味が通るようにするには助詞「が」と助詞「と」が対になる必要があるが、 ここではそうなっていない。原文を見てみよう。

Explain why each of these strings don’t match a \: "\", "\\", "\\\".

「\ は "\", "\\", "\\\" のどれともマッチしない。理由を説明せよ。」という意味だ。だから訳文は、 「なぜ \ が、"\", "\\", "\\\" のどれともマッチしないのか説明しなさい。」とすればいい。

p.175 の練習問題の 2. の意味がわからない。

2. 文字列「"'\」とはどうマッチするか。

原文にあたろう。

How would you match the sequence "'\?

ここでは「シーケンス」ということばを使っている。文字列でもなく、正規表現でもない。いやらしいなあ。 そうすれば、「"'\ という並びを文字列として表すにはどうするか。またこの文字列にマッチする正規表現は何か」 という意味だろう。解答例では次のようになっている。

str_view("\"'\\", "\"'\\\\", match = TRUE)
"'\  

p.186 では Harvard 英語コーパスから名詞を抽出する例を挙げている。近似として次の正規表現が示されている。

noun <- "(a|the) ([^ ]+)"

ちょっと物足りない。まず、冠詞としては an も必要だろう。それから、冠詞であるためには、 冠詞の前にも空白がないといけない。修正案は次の通り。

noun <- " (an?|the) ([^ ]+)"

因子とファクタ

12章は forcats でファクタという表題をもつ。ファクタとは本書の説明によればこうだ:
R においてファクタは、固定した既知集合の可能値をとるカテゴリ変数の処理に使われます。
わかりにくいが、「カテゴリ変数を表すデータ型で、取りうる値が既知の集合に限られる場合に使われる」 と考えればいいだろう。

それはともかく、ファクタは因子と訳してほしかった。

lubridate

13章は、lubridateによる日付と時刻、と題して lubridate による時間処理を述べている。 lubridate という単語は造語で、おそらく lubricate(なめらかにする)と date をかけているのだろう。

magrittr

14章は「magrittr でパイプ」という話題だ。magirttr の名前については、 R 言語ではじめるプログラミングとデータ分析という本を前に読んでいて、 たまたま覚えていたのだった。

パイプは Unix や Linux を使ったことがある人にとってはおなじみの概念だ。

関数

15章は R 言語の関数についての説明だ。 コードの塊を3回以上コピー&ペーストするなら、関数を書くよう考えるべきという示唆は、 簡潔でいい。

ベクトル

16章はベクトルである。R 言語の特徴として基本数学演算がベクトルであることを述べている。 この p.264 で、本書ではこのように書かれている:

同じ長さのベクトルや、ベクトルと「スカラー」を足し合わすとどうなるかは直感的にわかりますが、

同じ長さのベクトルを足し合わせるのは直感的にわかるが、 ベクトルとスカラーを足し合わせるとどうなるかは、私には直感的にはわからない。 直感でなければ、このすぐあとで述べられるような「リサイクル」によってスカラーを同じスカラー値をとるベクトルのように伸ばして、 足し合わせるのだろう。しかし、私には直感としてベクトルとスカラーを足した結果が思い浮かばない。

purrr

17章はpurrr ライブラリの使い方である。前の章とこの章では purrr パッケージの関数を使うのだが、purrr パッケージとは何か。 r が 3 つならんでいて、怖い。purr はネコがのどをゴロゴロするときの声・音だというので、 これから来ているのだろう。意味付けとしては、R を関数型言語として扱いやすくするためのパッケージである。 なお、purrr パッケージを明示的に使うのではなく、purrr パッケージを含む tidyverse を使うことで、purrr パッケージを使えるようにしている。

modelr

いよいよ 18 章からモデルの話になる。p.329 では、 sin 関数の2周期弱にノイズを載せてサンプリングしたデータを多項式関数で近似する例があげ、 多項式関数の近似関数があてはめが悪くなる、といっているが、それも当然である。 本来周期的な関数を非周期的な関数である多項式関数であてはめようとすることがおかしい。 左から右にデータを見ていったときに、山があって、次に谷があって、次に山が来るのなら、 周期的関数をモデルに採用するのがいいと思う。

モデル構築

19章は「モデル構築」と正面から攻めている。ここでは、ggplot2 の dimonds データと、 nycflights13 の flights データを対象にモデルを構築している。 flights データの曜日効果は興味深い。

purrr と broom

第20章は purrr と broom による多数のモデル、という表題である。broom というパッケージは、 モデルを整理データにする汎用関数が用意されている。ところで、 broom にある glance を使ってみると、1項目指標が増えている。増えている項目は nobs だ。


> broom::glance(nz_mod)
# A tibble: 1 x 12
  r.squared adj.r.squared sigma statistic      p.value    df logLik   AIC   BIC deviance df.residual  nobs
      <dbl>         <dbl> <dbl>     <dbl>        <dbl> <dbl>  <dbl> <dbl> <dbl>    <dbl>       <int> <int>
1     0.954         0.949 0.804      205. 0.0000000541     1  -13.3  32.6  34.1     6.47          10    12

AIC については情報量統計学などを、 その他の指標については多変量解析ハンドブックなどを見るといいだろう。

コミュニケーション

第Ⅴ部はコミュニケーションである。ただ、図書館に返す前にここまでで、力尽きた。


誤植

本書に関する Web ページには多くの誤植情報がある。ところで、その誤植情報にも誤りがある。

                                                            
■P.318 1行目
【誤】モデルの質の校正に役立ちます。
【正】モデルの質の軟正に役立ちます。

【正】も誤っている。正しくは「モデルの質の較正に役立ちます。」だろう。いわゆるキャリブレーションだ。

■P.445 右欄上から9行目
【誤】
連続一スケール(continuous position scale)
【正】
連続位置スケール(continuous position scale)

この誤植は、編曲家の蔦谷 好位置(本名は蔦谷 恒一)を思い出す。付け加えておくと、 愛称は「ナイスポジション」である。

書誌情報

書 名R ではじめるデータサイエンス
著 者Hadley Wickham、Garrett Grolemund
訳 者黒川 利明
発行日2017 年 10 月 24 日(初版第1刷)
発行元オライリー・ジャパン
定 価円(本体)
サイズ
ISBN 978-4-87311-814-7
その他越谷市立図書館で借りて読む

まりんきょ学問所コンピュータの部屋統計活用術統計、時系列の本 > Hadley Wickham、Garrett Grolemund:R ではじめるデータサイエンス


MARUYAMA Satosi