まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

? R言語徹底解説(原著: Advanced R)を読んだ

?前置き

有難いことに去年は著者や関係の方から何冊かの本(じゃんけん大会での獲得を含む)をいただいておきながら、ついったー上でしか報告(宣伝?)できていなかったので今年はブログにも書くことにする(みなさまからの献本、お待ちしております)。

今回はいよいよ今週発売を迎える全Rユーザー待望の「R言語徹底解説(原著: Advanced R)」を関係者のご好意により頂いた。一通り読み終えたので感謝の気持ちも込めて、書籍の概要を紹介するとともに一読者としての感想や気になった箇所などをまとめてみる。(執筆お疲れさまでした、そして完成ならびに出版おめでとうございます。一Rユーザーとして、本書のような素晴らしい本に出会えて私は幸せです)

R言語徹底解説

?本書の概要

本書はRユーザーにはおなじみ*1{ggplot2}{dplyr}{devtools}などのパッケージの開発者であり、Rの統合開発環境を行うRStudioのChief Scientistを務めるHadley Wickhamが2014年に出版した"Advanced R"の翻訳書である。統計解析や機械学習などの用途で利用されるフリーのソフトウェア・アプリケーションであるR言語の利用者を対象にしたもので、この一冊でRの基礎やプログラミング言語としての側面、より先進的な技術の習得することを掲げた渾身の書となっている。

そんな素晴らしい書籍の翻訳を手がけたのは、石田基広・市川太祐・高柳慎一・福島真太朗(敬称略)の4名。それぞれがRに関する書籍を執筆・分筆している実績があり、読者は安心して読むことができるはずである。特に訳者の一人、石田さんは黄色い背表紙の本(Springer)を始め、Rに関する書籍を多数執筆・翻訳されており、日本のR界を牽引する人物の一人だ。それゆえ本書は国境を超えた神々の共演と言っても良いのではないだろうか。Rについて理解のある人物によって翻訳されることで、本書の内容は原著以上にR言語を理解するのに適した内容に仕上がっていることが期待される。

本書は序文を含めて4部で構成されており、ページ数は500を超える。その構成は次の通り。第1部: 基礎編、第2部: 関数型プログラミング、第3部: 言語オブジェクトに対する計算、第4部: パフォーマンス。目次を見てもらえばわかるが、実に広範囲の内容について取り扱っている。一方で、こうしたR言語の内部構造について詳細に述べた書籍は少なく、日本語のものでは間瀬(2007, 2014)の「Rプログラミングマニュアル」くらいしかない。

本書は著者Hadleyの10年以上にわたるR言語の理解に対する成果の集大成と言うべきもので、我々と同じR言語の一ユーザーであったHadleyが直面したであろうRに関する疑問や問題に挑戦することでRへの理解を深めていくという形式をとっている。そのため、本書を通して読者にRの挙動について思考を行わせる「エクササイズ」やHadley自身が過去に実行したという実験が随所に散りばめられている。章の頭では全体の構成についての説明があり、随所でRコードが実行されるという丁寧な構成になっている。

? 私について

Rやプログラミングについては初心者。自分で関数を書き始めたのはごくごく最近で、R以外の言語についてはほぼ知識が皆無。

過去に原著を読んでいるが、ほとんど内容を理解することができていないと思う(特に第1部以降)。

この書評では、そうした背景があることを理解していただきたい。

? 総評

まずはじめに私の読了後の素直な感想を表現しておくと、「俺の持っているAdvanced R(原著)がこんなにわかりやすいわけがない」である。これには以下のような理由がある。

  • 過去に一度読んでいるはずの"Advanced R"の内容が比較的すんなりと理解できる!(丁寧な翻訳がされている
  • 本書の中で、他の章を参照せよ、といった記述が頻発する(良い意味での一気読みしにくい構成
  • 本書は一度読んだだけですべての内容が理解できるようなものではない(少なくとも私には)。しかし、読み返すたびに発見がある。読み返すほどにRの理解レベルがあがることが実感できる(訳者あとがきにおいても言及されている

?タイトルの通り、R言語について徹底的に解明してやろうという素晴らしい出来に仕上がっているので、店頭やインターネットで読みのではなく紙媒体の書籍として備えておくべき、理想の教科書(あるいは辞書)であると言える。

時にRが難しいと感じるのは、データの扱いや関数の挙動が理解できないという理由が多いのではないだろうかと思う。本書は多くのパッケージや関数を扱うわけではない。限られた・より洗礼された関数を使いこなすことで、既存の関数は効率性を高め、再現性のある処理を可能にし、より高速に実行できるものになる。そんなことをHadleyはこの本で述べたかったのではないかと邪推してみる...。

私はこの本がより多くのRユーザーの手元に届くことを願っている。この本が網羅する内容は、さまざまなレベルのユーザーであっても役に立つものであると確信している。Rの初心者はその内容について、理解できない点がたくさんあると思う。他のプログラミング言語にも共通して言えることであるが、Rは完璧な言語ではない。実行速度の遅さが頻繁に取り上げられるし、ちょっとした間違いですぐに関数が実行されなくなったり、以前と異なる挙動をとるようになってしまう。しかし一方で、ユーザーが求める挙動をすんなりと行ってくれる関数があることも知っている。またユーザーが自由自在に関数を定義したり関数をまとめたものをパッケージとして提供できたりする。つまり我々はRの利用者であり、開発者でもある。どちらの立場であれ、本書で扱われている内容はRを使う上で必要な教養となり、読むたびにRへの理解を深めることができるだろう

以下では各部の内容についてその概要を述べていく。副題に与えてある文言は私が勝手に与えたものである。

第1部: 基礎編: 「なんとなく」を「徹底」した理解に変える

第1部はRの基礎であり根幹をなす「データの構造」と「抽出」、「関数」、「オブジェクト指向」、「環境」という部分について述べられている。これらの言葉はRを使ったことがある者なら「なんとなく」イメージできるものだと思われる。そのため、Rについてすでに知識がある場合は退屈であると思われるかもしれない。しかしちょっと待ってほしい。第1部の各章のはじめには「クイズ」が設けられている。このクイズというのは、これに正答することができたらこの章は読み飛ばしても構わないよ、というHadleyからの挑戦とも言えるもので、はっきり言って私のような者では正解を得ることが難しい。「なんとなく」理解しているだけではこれらのクイズに答えることが難しいはずだ。だからこそこの章の内容をじっくり理解する必要があるといえよう。各章では章の内容について「徹底」して解説されている。章を読み終えるごとに、章の頭に戻って再度Hadleyと対話することが良いのではないだろうか(もちろんそれでもわからないものもある)。

Rを利用する上で、データの挙動はもちろん、関数や環境について理解しておくことは、自らの分析や処理内容を正常に動作させるために必須の事項であると言えよう。また、処理を実行した際に遭遇するエラーの仕組みやその対処方法についても触れられている。これらを理解しないままにすると最悪の場合、実行結果を誤って解釈してしまう恐れがある。加えて、Rを操作する上で基本的に理解しておくべき関数や演算子について整理したボキャブラリや、Rによるコードを書く際の注意を述べたコーディングスタイルについての章も設けられている。

余談であるが5章の「5.3.1 コメントについて」に少し補足をすると、RStudioを使用している場合は、shift + command + R(Macの場合)でセクションを区分するコメントの挿入が可能である。

第2部: 関数型プログラミング: 効率的な関数の実行のために

Rはユーザーが関数を定義して、柔軟な処理を実行できる環境を備えている。このことはRの強みの一つであるが、本書の言葉を借りれば「Rのユーザは、特にデータ分析の再現性を保証するためにも、質の高いコードを書くように心がけて欲しいのだが、そのためのスキルが十分に身についていない」。これはRを利用する糸口として統計や機械学習が背景にあることが挙げられており、R本体の開発を行うコアチームでさえも当てはまる事柄であるという。

Rは本質的に関数型のプログラミング言語である。関数型のプログラミング言語の特徴はデータ分析においても効率的な処理を行うために有効な手段となり得るなどが、多くのRユーザーはそれを理解していないのではないだろうか。この点についてHadleyは「汎関数」と「関数演算子」と呼ばれる機構を話題に取り上げ、より内部の挙動に近づいて「関数」というものを見直すのが第2章の内容である。クロージャ、メモ化という、プログラミング一般に用いられる機構がRでどのように働いているか、ということもこの章で知ることができる。

第3部: 言語オブジェクトに対する計算: Rの挙動をより理解する

第3部では、我々が普段利用している関数の背景にあるさまざまな機構についての理解を深めるためにメタプログラミングの概念とRの実装について学ぶことになる。具体的には「非標準評価」でsubset()関数で代表されるような関数の引数に与えた値がもつ値にアクセスできるという仕組み、lm()関数など、モデル式に用いられるような「表現式」がなぜy ~ xで良いのか、「ドメイン特化言語」と呼ばれる、RがR以外のシステムやプログラムの挙動を制御可能にし、連携させるための方法などが述べられている。我々が普段利用している多くの関数の背景にある仕組みを理解することで、メタプログラミングの利点と欠点についての知見を深めることが可能となるだろう

非標準評価は{dplyr}パッケージでも実装されている手法であり、 @dichikaさんと @kohsukeさんが取り組んだ記事があるのでここで紹介しておこう。本書と合わせて読むことで、非標準評価の利点について理解が深まるはずである。

第4部: パフォーマンス: Rに課せられた問題を解決するには

これまでと異なり最後の第4部では、いかにRの処理を効率的に実行するかということに焦点が当てられる。ここでいう効率的というのは、如何にしてメモリの消費を抑え、より短時間でプログラムを実行できるようにするかという問題である。HadleyはRの課題としてあげられる実行速度の遅さやメモリの使い方について向き合い、その解決策についていくつかの手法を提示する。また後半ではRとC++C言語との連携にページを割き、{Rcpp}パッケージの入門以上の内容について説明がなされる。そのため読者は、これまでの知識を元にして、スムーズにRの処理をC++へ実装することができるようになるのではないだろうか。

最後に、RとC++については日本語でも情報が増えてきているので、本書を読み終えた後に実践するのに適した資料をあげる。

R言語徹底解説

R言語徹底解説

? 参考・リンク

? ケチをつけてみる

一度読んだだけなので深くは言えないが、知らない横文字・小難しいプログラミング用語がとにかく多い。いくつかの言葉は間瀬 (2014)にも書かれているが、、それ以外の語句については、プログラミング知識の少ない私が読むには苦痛だった(本書と「Rプログラミングマニュアル」で使われているR用語に関して大きな乖離を感じる)。これに関連して、ページや余白の都合仕方がないのかもしれないが、訳者による脚注がもう少しあっても良かったのではないかと思う。これだけの豪華な訳者を揃えておきながらも、本書が単なる翻訳書のようになってしまっているのは残念な気がする。

誤植?

目に付いた(@dichikaさんや@yutannihilationさんが多分言及していない)ものをあげておく。

  • P.20 なぜリストをアトムに変換... 原著ではatomic vectorという語を用いており、本書でもアトミックベクトルで統一されているが、この部分だけ「アトム」となっている。
  • P.22 Rコードのコメント部分。levelに含まれない値を... levelsの方が良さそう
  • P.47 3.2.3 長さが4のベクトルにから5番目の要素... 「長さ4のベクトルから5番目の要素」か
  • P.48 3.2.4 決定係数の出力(R ^2)。P.221では正しく出力(R2)されている
  • P.109 plyrパッケージ... 「pryrパッケージ」か
  • P.146 8.3.2 束縛よって定義される... 「束縛によって定義される」か
  • P.204 10.4 パフォーマンス比較したいとする... 「パフォーマンスを比較したいとする」か
  • P.224 11.2.2 リストとして場合に... 「リストとした場合に」か
  • P.233 その関連関数ついて... 「その関連関数について」か
  • P.298 置換は表現式のすべて名前を... 「置換は表現式のすべての名前を」か
  • P.311 Rコード部分。identical(quote(name), as.name("名前"))の返り値がFALSEなのは当然では?原著ではidentical(quote(name), as.name("name"))でTRUEが返り値になっている
  • P.448 19.2 を使って初期され... 「を使って初期化され」か

f:id:u_ribo:20160210054607p:plain

*1:天使だったり、神だったり、ライバルだったりその姿は人や状況に応じていろいろ変わるという

広告を非表示にする