この記事は、技術書献本大感謝 Advent Calendar 2016 18日目の記事です。
2016年も残すところあとわずかとなりましたが、今年のはじめに、翻訳者の皆様のご厚意によりいただきました「R言語徹底解説(原著: Advanced R)」について、(まだたった1回ですが)読み終えた印象をまとめさせていただきます。
発売開始直後の Twitter の TL を観ていた限りでは、多くの人が既に本書を手にされていると思います。
まだ購入されていない方、購入したもののこの500ページを超える大作を前に、中身をご覧になられていない方にとって、どのあたりを読むと、どういったことが習得できそうかを知るための参考になれば幸いです。
#1. はじめに
本書の特徴をご紹介する前に、この記事を私がどのような視点からまとめているかを知っていただくと、この記事の捉え方も変わってくると思いますので、簡単に私とRについて記させていただきます。
・ R歴: 2010年4月頃から現在までの約6年8ヶ月。
・ Rを使う場面/使い方: 仕事は、金融機関のリスク管理部門に対してコンサルティングを行っており、分析をする際は主にSASを使っています。ある種のPJTでは、マクロ経済指標やマーケットデータなどの比較的大きくないデータセットに対して、Rの既存パッケージや関数を用いて分析をします。また、研究・開発段階では、論文の中身について実装するときに、自作関数を作成し、Rで実装したりもします。
・ プログラミング言語に関する技術書とのふれあい状況: 一冊を通読をすることはほとんどなく、辞書的に参照することがある程度です。
→ つまり、まとめると「私はRの初心者です」。
#2. 基本情報
以下に、今回ご紹介する書籍の基本情報を共立出版のページから引用します。
目次は章立てのみですが、更に細かい節の構成については下記リンクをご参照ください。
http://www.kyoritsu-pub.co.jp/bookdetail/9784320123939
==
R言語徹底解説
Hadley Wickham 著・石田 基広・市川 太祐・高柳 慎一・福島 真太朗訳
ISBN 978-4-320-12393-9
判型 A5
ページ数 532ページ
発行年月 2016年02月
本体価格 5,400円
第1章 導入
第I部 基本編
第2章 データ構造
第3章 データ抽出
第4章 ボキャブラリ
第5章 コーディングスタイルガイド
第6章 関数
第7章 オブジェクト指向実践ガイド
第8章 環境
第9章 デバッギング,条件ハンドリング,防御的プログラミング
第II部 関数型プログラミング
第10章 関数型プログラミング
第11章 汎関数
第12章 関数演算子
第III部 言語オブジェクトに対する計算
第13章 非標準評価
第14章 表現式
第15章 ドメイン特化言語
第IV部 パフォーマンス
第16章 パフォーマンス
第17章 コードの最適化
第18章 メモリ
第19章 パッケージを用いたハイパフォーマンスな関数
第20章 RとC言語のインターフェイス
#3. 本書の特徴
読み終えてみて、本書を通して我々が習得できることには、大きく次の4つの特徴があると思います。
特に、2つ目は、全体を通して頻出する観点で、本書がもつ一番の特徴なのではないかなと考えています。
・ 意図したとおりに正確に計算/処理するために
・ コードの可読性と保守性を高めるために
・ データ抽出の際によく用いられる関数の背後にある仕組みとは
・ Rは遅いのか?Rとメモリの関係。Rで高速に処理したい場合の方法とは?C++も使っちゃう?
以下では、上記4項目のそれぞれについて、より詳細に、関連する部/章/節がどこであるか整理したいと思います。
● 意図したとおりに正確に計算/処理するために
金融機関では、たった一つの数値の誤りがインシデントとなり始末書を書かされたり、最悪の場合、行政処分で業務停止命令を受けてしまう、なんてことがあります。
プログラミング言語を利用して、データ解析あるいは数値計算をする際に、「意図したように正確に計算/処理する」というのは、最低限満たされなければならない要件ですよね。
ある程度 R を使われてきた方には、第I部 基本編に登場するRの基礎事項(データ構造、データ抽出、関数、環境、etc.)についてなんとなく理解しながらも、これまでは求めたい答えを短期間で得るために、コードを自己流で記述されてきたという人も多いと思います。
このパートでは、改めて R の基礎を復習し、加えて、期待していない結果を返すような危険を孕む注意すべき記法と、その理由について理解することができます。また第9章では、状況に応じたハンドリング技法や想定していない状況が発生した場合に問題を未然に防ぐための方法が記されています。
● コードの可読性と保守性を高めるために
PJTの過程ではお客様からデータをお預かりして分析し、最終的にはモデル/プロセスを納品するということがあります。仕様書のみの場合もあれば、コードをそのまま納品することもありますよね。受け取った相手方の担当者がコードを理解しやすいためにも、また、上述の正確性を高めるためにも、そのコードの意図が明確にわかるようなコーディングをする必要がありますよね。
何をしているコードかわかりやすくするために、「コメントを添える」ということもひとつですが、コード"それ自体"によって、「何を意図しているかを明確にする」ための方法が、第II部を読むことで習得できると思います。例えば、ループを書くのではなく、ある関数を使って書くとよい場合や(第10章、第11章)、反対に、コードは長くなってしまうが、「コードが何を実行しているか」を理解しやすい形に保つために、ループ文で書くべき場面にはどういったケースがあるか(11.6節)について知ることができます。
● データ抽出の際によく用いられる関数の背後にある仕組みとは
経験的に関数の挙動がどうであるか理解しており、日常的に使用しているが、「なんでこの関数、こういう風に書いて、こういう結果が返されるのだろう...」と感じていた関数ってありますよね???例えば、subset(df, a == 1) とか。この特殊性については、第13章 非標準評価のあたりに記述されていますので、この章を読むと「なるほど~」とようやく思えるときが来るかもかもしれません。(^^)b
● Rは遅いのか?Rとメモリの関係。Rで高速に処理したい場合の方法とは?C++も使っちゃう?
Rを使っている人なら「Rは遅い」というフレーズを一度は耳にしたことがあると思います。この言葉に関連することとして、第16章では、R言語が高速な処理の代わりに大切にしていることは何か、また、記述がよろしくないために処理が遅くなっている場合に、より高速に処理するためのヒントがまとめられています。例えば、データフレームからある列の値を抽出する書き方にはいくつもありますが、記法によって処理速度にな大きな違いが現れます。(16.4.1節)
また、処理を遅くしているボトルネックがどこにあるかを特定するための手順が、第17章にまとめられています。処理速度に関連して、第18章を通じて R がメモリを使用する際の特徴を知ることができます。
より効率的に処理するための方法として、Rcppパッケージを利用して、C++で記述したコードを R で実行する方法が第19章で紹介されています。C++と聞くと身構えてしまう方がいるかもしれませんが、「C++を始めよう」といった感じで、初歩的なところから始まっていますので、C++に馴染みのない方でも、読み進めることが出来るのではないかなと思います。
#4. おすすめしたい読者層
第1章を読んだのがだいぶ前ですっかり忘れていましたが、読み終えて私が考えるおすすめしたい読者層は Hadley 氏が1.1節に記した「本書が想定する読者層」と同様です。
・ Rについて中級程度の技能を有している人
・ 他のプログラミング言語に精通していて、R言語の学習はこれからという人
#5. 本書の難しいポイント
本書はどちらかと言えばエンジニアよりの(?)記述になっているのかもしれません。
Rユーザは他のプログラミング言語に比べて、エンジニアというよりも分析者に近い人が多いと思いますので、章立てをみると、取っ付きにくいと感じる方も多いでしょう。
でも、きっと大丈夫☆ 技術本に馴染みがなくても、本文と同じくらいの R のサンプルコードが記されていますので、文章から意味がわからなくても、コードを通じてその意味を捉えることが出来る思います。
#6. まとめ
「R言語徹底解説」をたった1回 読み終えた印象をまとめさせていただきました。
章立てをご覧になればお分かりいただけるように、とても情報量の多い書籍になっており、異なる職種やデータを扱う方からすると、また違った魅力的な側面があると思います。
最後になりましたが、このような素晴らしい一冊を読む機会を与えてくださった、翻訳者の石田先生、市川さん、高柳さん、福島さんに心より感謝申し上げます。これからも素敵な作品を楽しみにしています。