詳解Apache Spark

技術評論社から近々刊行される「詳解Apache Spark」をご恵贈いただきました.ありがとうございます!

詳解 Apache Spark

詳解 Apache Spark

Amazonの発送は4月29日からのようですが,都内のジュンク堂紀伊國屋書泉ブックタワーなどの大型書店では既に先行販売されているようです.是非手に取ってみてください.

総評

本書は,大規模並列分散基盤のApache Sparkについて,豊富な実践例を交えながら基本的なコンセプトや使用方法が解説された書籍です.この分野の第一線で実際に業務で使用している方々が,わかりやすく執筆されています.Sparkを使う必要があったりどんなものか知ってみたいと思ったりしているエンジニアの方,普段PythonやRなどでデータ解析を行っていてSparkを使ったデータ処理,解析について知ってみたい,使ってみたいという方にオススメです.

個人的に特に良かったと感じたポイントは,

  • 具体例が多いのでデータ解析に使用するイメージがわくこと
  • 分析者にとってもとっつき易い内容になっていること(基本的なコンセプトや機能とその応用例のバランスが大変良い)
  • DataFrameに1章割いて実践例とともに説明されていること
  • Spark1.6で導入された機能についても多く紹介されていること

です.

また,複数人で執筆しているにもかかわらず読者に要求する技術レベルや文体などにも統一感があります.編集,構成という観点でもしっかりした書籍であるという印象を受けました.

どの章も素晴らしい内容で読み応えがありますが,私のように探索的なデータ解析を行っている場合,Sparkとは何かから始めて一通りデータ解析で使えるようになりたいならば,第1章 → 第2章 → 第3章 → 第5章 → 第7章 → 第8章の順で一通り読み進めていき,残りの章は必要に応じて目を通すのも一つの手かなと思いました(あくまで個人的な所感).

SparkはScalaJavaPython,RのAPIが提供されていますが,本書はScalaを扱っています.本書で基本的な考え方や使用方法をおさえれば,他言語のAPIはリファレンスを片手に難なく入れると思います.

=== 4/25 追記 ===
著者の一人の方からサンプルコードのアドレスを教えていただきました.ありがとうございます!本書を読むときの強力な伴侶になると思います.

https://github.com/yu-iskw/gihyo-spark-book-example


=== 4/25 追記 その2 ===
和書のSpark本は,本書の他にもオライリーから2冊(「初めてのSpark」,「Sparkによる実践データ解析」),翔泳社から1冊(「Apache Spark入門」)出ています.
翔泳社の書籍は未読なのでコメントできません.
オライリーの2冊はどちらも大変な良書ですが,

  • 「初めてのSpark」は機能解説が大変わかりやすく充実しており翻訳も丁寧で重宝しますが,データ分析者が最初に読むには若干敷居が高いと感じる
  • 「Sparkによる実践データ解析」は,MLlibを用いた事例が豊富で大変勉強になりますが,事例がSparkのどのような基本機能に支えられているかを理解しようとすると,初心者にとっては若干手薄になる

と感じていました(私のSpark力が低いためかもしれませんが・・・).
その点,本書は基本機能の解説が丁寧で,またそれと関連付けて事例も豊富でバランスが大変良いです.
特にデータ解析寄りの業務に従事している方は本書でバランス良く勉強してから,上記の2冊に進むこともできるのではないかと個人的には思っています.

第1章 Sparkの基礎

本章では,Sparkの基礎としてその概要(MapReduceとの違い,実行環境,歴史),テクノロジースタック,利用者とそのメリットについて端的に説明されています.

7ページという分量ですが,読者がSparkを勉強すること(本書を読むこと)の動機付けが随所になされています.単にSparkの機能や歴史,スタックを説明しているのではなく,「Sparkを勉強することで誰(職種)にとってどんなメリットがあるか」という視点が強く意識されて書かれています.

例えば,普段PythonやRでデータ解析を行っていて,最近Sparkをよく耳にするようになったデータ解析者は1.2節「Sparkのテクノロジースタック」、1.3節「Sparkの利用者とそのメリット」を読むと,自分がどんなメリットを得られるかがよくわかると思います.また,データエンジニア,アプリケーションエンジニアにとっても,自分の業務にどう活かせるかがわかることでしょう.

第2章 Sparkの導入

本章では,実行環境の構築方法に始まり,ローカル環境でのインタラクティブシェルの実行例,Spark実行の背後で行われる処理の概要,スタンドアローンアプリケーションの実行例が扱われています.

個人的に特に良かったのが,インタラクティブシェルの2つの実行例で,RDDAPIの詳細な解説に立ち入ることなく処理の流れが図解されていることです.Sparkのキモの一つであるRDDがどういうフローで生成され,変換されるかについて,シンプルな例でイメージをつかむことができます.これは,以降の章を読み進めるうえでも重要だと思います.

第3章 RDD

本章では,Sparkの分散コレクションであるRDDの構造,操作(作成,変換,アクション,シャッフル,ペアRDDに対する集約,結合,永続化),そしてパーティションについて説明されています.

ここでも図が効果的に行われていてわかりやすいです.

これを機に,Sparkの開発者たちによる以下の論文を近々読もうかなと思います。

Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma,
Murphy McCauley, Michael J. Franklin, Scott Shenker, Ion Stoica
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf

第4章 クラスタ構築と運用

本章では,Sparkクラスタの構築方法について説明されています.ローカルモード,Spark Standaloneクラスタマネージャ,Hadoop YARN,Apache MesosApache Ambari,Amazon EC2Amazon Elastic MapReduceと,非常に多くのクラスタ構築方法,アプリケーションのデプロイ,リソース管理の方法が説明されています.

図がわかりやすいので,環境構築になじみがなくても読みやすい内容となっていると思います.

第5章 DataFrameとSpark SQL

本章では,SparkのDataFrame APIやSpark SQLを利用して,表形式のデータの集計や加工などの処理を行う方法について説明されています.DataFrameについてここまで懇切丁寧に説明されているのも本書の見どころの一つと言えるのではないでしょうか.

シェアバイクBAY AREA BikeShareの公開データをサンプルデータとして使用し,データフレームの処理を実践的に学んでいくことができます.
IOについても,JSON,Parquetフォーマットだけでなくデータ解析でありがちなCSVファイルをケースクラスを利用して読み込む方法,Apache Hiveとの連携,JDBCによるRDBMSやThrift JDBC/ODBCサーバとの連携方法等についてもしっかりと説明されています.

DataFrameのパフォーマンスチューニングとして,キャッシュ,実行計画の確認,パーティション数の調整についても取り上げられています.このあたりは非常に勉強になりました.

また,Spark1.6で試験的に追加されたDataset APIについても取り上げられていることも魅力の一つに感じました.Spark1.5まではクラスタ上で分散したデータはRDD,DataFrameという抽象化によって行われてきました.本書でも説明されているように,

  • RDDJVMオブジェクトに対してラムダ関数として処理を表現できるが,Catalystによる処理の最適化が行えない
  • DataFrameは構造化データを簡単に操作できるハイレベルAPIを提供しCatalystによる処理の最適化が行えるが,RDDに比べてUDFが使いづらく型安全ではない

というトレードオフがありました.こうした背景のもと,Dataset APIRDDとDataFrameのいいとこ取りをするために提案されました.本書では,Datasetの生成,DataFrameやRDDのDatasetへの変換について説明しています.今後,Dataset APIには様々な機能が追加されていくと思われますが,本書でコンセプトや基本的な使い方を習得しておくと得るものが大きいと思います.

本章の最後には,分析の実践例としてBAY AREA BikeShareのデータセットをクレンジング,集計し,Google Map上に可視化しています.集計結果はParquetフォーマットで保存し,SparkRで起動してR言語のggmapパッケージを利用して,シェアバイクがよく使われる区間を地図上に可視化します.その過程でデータや集計処理が正しいことの確認も行っており,日常のデータ分析でもよく行う作業に言及されていることも実践的で非常に好感が持てました.

第6章 Spark Streaming

本章では,ストリームデータをSparkで処理するコンポーネントであるSpark Stremingについて説明されています.

Spark StreamingへのAdvancedSourcesの入力はApache Kafka,Apache Flume,Amazon KinesisTwitter,ZeroMQ,MQTTと多くをサポートしますが,本書ではKafkaとTwitterが重点的に説明されています.
使用例として,アクセスログの集計,Twitterのツイートからの抽出・集計が取り上げられており,実践的で参考になりました.

ストリームデータ処理は従事している分野柄,今後データ収集,解析が浸透するにつれて重要度が増してくるはずなので実践していきたいと思います.

第7章 MLlib

本章では,Sparkで機械学習を用いたデータ解析を行うためMLlibについて説明されています.

7.1節「機械学習の基礎知識」では,機械学習の基礎知識として機械学習の利用プロセス,教師あり学習/教師なし学習,予測モデルの評価方法と指標,過学習や汎化性能,正則化,線形分離可能性などの機械学習の基本的な知識が説明されています.端的にまとまっていてわかりやすいので,7.2節以降でMLlibの個々のAPIを学習する際も必要に応じて参照すると良いでしょう.

7.2節「MLlibでの機械学習」では,まずspark.mllibとspark.mlという2つのAPIセットの概要が説明されます.その後,spark.mlのPipelineが取り上げられます.機械学習アルゴリズムだけでなく,特徴抽出/変換/選択,交差検証(クロスバリデーション),評価指標,ハイパーパラメータの探索(グリッドサーチ)などについても取り上げられており実践的です.

PipelineやTransformerクラス,Estimatorクラスなどは,Python機械学習ライブラリscikit-learnを使用している方にはメソッド名なども含めてなじみ深い話だと思います.しかし,丁寧に説明してくれているので,そうでない方もスラスラと読み進めることができると思います.

学習済みのモデルの永続化については,Spark1.6.0からspark.mlに導入されたMLWritableトレイト,MLReadableトレイトについても説明があり,非常に勉強になりました.

7.3節「MLlibの利用例」では、スパムメッセージの検出,きのこの可食・有毒の識別,住宅価格の予測,映画のリコメンドの4例も取り上げられています.

第8章 GraphX

GraphXは,グラフ構造のデータの表現,並列処理を行うSparkのコンポーネントです.本章では,GraphXのデータ構造,グラフの操作,アルゴリズムとともに,独自のアルゴリズムを実装するPregel APIが説明されています.

また,利用例として,ECサイトにおけるユーザと商品の関係に基づいたレコメンデーションシステムが取り上げられています.ユーザと商品の関係をグラフで表現し,アソシエーションルールによる商品レコメンドを行っています.グラフのスケールフリー性を考慮したログデータの生成方法も実践的で,大変参考になりました.

Appendix YARN

この付録では,Sparkのクラスタマネージャの1つであるYARNの概要が説明されています.

JuliaOptで数理最適化 (Julia Advent Calendar)

これは,Julia Advent Calendar 20日目の記事です.この記事では,JuliaOptについて取り上げてみようと思います.

JuliaOptとは

JuliaOptとは,Juliaで数理最適化を実行するためのパッケージを集めたプロジェクトです*1
JuliaOpt: Optimization packages for the Julia language.
http://www.juliaopt.org/

JuliaOptは,Juliaの中でも最も精力的に開発が進められているプロジェクトの一つと言っても過言ではありません.
上記の公式ページは解説や関連する論文などが充実しています.
後ほど説明するモデリングツールであるJuMPやConvex.jlのサイトにもドキュメントが豊富です.
JuMP: https://jump.readthedocs.org/en/latest/
Convex.jl: http://convexjl.readthedocs.org/en/latest/

さらに,Jupyter Notebook形式で豊富な実行例が提供されています.
http://nbviewer.ipython.org/github/JuliaOpt/juliaopt-notebooks/tree/master/notebooks/

JuliaCon2015でもプレゼンテーションやワークショップが行われており,githubには各種の資料が,Youtubeには動画が上がっています.

スライド等の資料
https://github.com/JuliaOpt/JuliaCon-2015
JuliaOpt --Optimization packages in Julia

プレゼンテーション
"JuliaOpt Optimization related projects in Julia"

ワークショップ
"Solving optimization problems with JuliaOpt"

JuliaOptの概観

JuliaOptは複数のパッケージから構成されます.公式ページの中段付近にあるパッケージの関係図がわかりやすいのでご参照ください.
http://www.juliaopt.org/
これらのパッケージは,最適化問題を数式で定式化するモデリングツールと実際に最適化問題を解くソルバーに大別されます.
また,モデリングツールとソルバーをつなぐ抽象化のレイヤーにはMathProgBase.jlが配されています.

モデリングツール

モデリングツールは,最適化問題を数式で定式化します.JuMPとConvex.jlの2つが提供されています.

それぞれのモデリングツールが対応している問題,解法は下表のとおりです.
JuMPが線形計画法,混合整数線形計画法,2次錐計画法,混合整数2次錐計画法,半正定値計画法,非線形計画法,混合整数非線形計画法に対応しているのに対して,Convex.jlは非線形計画法,混合整数非線形計画法には対応していません.

線形計画法 混合整数線形計画法 2次錐計画法 混合整数2次錐計画法 半正定値計画法 (制約付き)非線形計画法 混合整数非線形計画法
JuMP
Convex.jl -- --
ソルバー

ソルバーは,Gurobi, CPLEX, Mosek等の商用ツール,SCS, ECOS等のフリーツールなど多くのものが対応しています.
詳しくは,JuliaOptの公式ページを参照してください.

JuMPの使用例

JuMPの使用例について,例題を通して見ていきましょう.以下の実行環境はOS X 10.10,Julia 0.4.2です.
まずは簡単な例として,JuMPのページにも例題として載っている以下の問題を解いてみます.
 \begin{eqnarray}\max \, \, &5x + 3y \\ s.t. 0 \leq &x \leq 2, \, 0 \leq &y \leq 30, x + 5y &\leq 3\end{eqnarray}

この問題は,JuMPを用いて次のように記述します.線形計画法を解くソルバーとして,ここではClp.jlをインストールしておきます.

julia> Pkg.add("JuMP")
julia> Pkg.add("Clp")
julia> using JuMP
julia> # モデルのインスタンスの生成
julia> m = Model()
Feasibility problem with:
 * 0 linear constraints
 * 0 variables
Solver set to Default
julia> # 変数の定義
julia> @defVar(m, 0 <= x <= 2)
x
julia> @defVar(m, 0 <= y <= 30)
y
julia> # 目的関数の設定
julia> @setObjective(m, Max, 5x + 3y)
5 x + 3 y
julia> # 制約条件の追加
julia> @addConstraint(m, x + 5y <= 3.0)
x + 5 y &#8804; 3
julia> # モデルの確認
julia> m
Maximization problem with:
 * 1 linear constraint
 * 2 variables
Solver set to Default
julia> # 最適化の実行
julia> status = solve(m)
INFO: Precompiling module Clp...
:Optimal
julia> println("Objective value: ", getObjectiveValue(m))
Objective value: 10.6
julia> println("x= ", getValue(x))
x= 2.0
julia> println("y= ", getValue(y))
y= 0.2

要点は以下のとおりです.

  • Model()でモデルのインスタンスを生成.
  • @defVarで変数を定義する.第一引数にはモデルのインスタンス,第二引数には変数の範囲を指定する.
  • @setObjectiveで目的関数を設定する.第一引数にはモデルのインスタンス,第二引数には目的関数の最大(Max) or 最小(Min),第三引数には目的関数の式を指定する.
  • @addConstraintで制約条件を追加する.第一引数にはモデルのインスタンス,第二引数には制約条件の式を指定する.
  • solve関数で最適化を実行する.
  • 最適化の実行後,目的関数の値はgetObjectiveValue関数,各変数の値はgetValue関数で取得する.

続いて,非線形最適化の例として,Rosenbeck関数  (1-x)^2 + 100(y - x^2)^2 を最小化する  x, y を求めてみましょう.非線形最適化を実行するIpopt.jlをインストールしておきます.

julia> Pkg.add("Ipopt")
julia> using JuMP
julia> m = Model()
Feasibility problem with:
 * 0 linear constraints
 * 0 variables
Solver set to Default
julia> @defVar(m, x, start = 0.0)
julia> @defVar(m, y, start = 0.0)
julia> @setNLObjective(m, Min, (1-x)^2 + 100(y-x^2)^2)
julia> solve(m)
julia> println("x = ", getValue(x), " y = ", getValue(y))
x = 0.9999999999999899 y = 0.9999999999999792

Convex.jlの使用例

Convex.jlの使用例として,次の問題を解いてみましょう.
 \begin{eqnarray} \min \, \, &\||Ax - b\||^2 \\ s.t. x_{i} &\geq 0 \, (i = 1, \, \dots, \, N) \end{eqnarray}
以下では, A は各成分が一様乱数からなる 4 5列の行列, b が4つの一様乱数からなるベクトルとして,Convex.jlを用いて最適なベクトル  x を求めています.

julia> Pkg.add("convex")
julia> Pkg.add("SCS")
julia> using Convex, SCS
julia> set_default_solver(SCSSolver(verbose=0))
SCS.SCSSolver(Any[(:verbose,0)])
julia> srand(71)
julia> m = 4;  n = 5
julia> # 行列Aとベクトルbの設定
julia> A = randn(m, n); b = randn(m, 1)
julia> # 最適化する変数 (ベクトルx)
julia> x = Variable(n)
julia> # 最適化問題の定式化
julia> problem = minimize(sumsquares(A * x - b), x >= 0)
julia> # 最適化の実行
julia> solve!(problem)
julia> # ベクトルxの推定値
julia> x
Variable of
size: (5, 1)
sign: Convex.NoSign()
vexity: Convex.AffineVexity()
value: 5x1 Array{Float64,2}:
 -2.8087e-6 
  0.26101   
  1.99817   
 -1.21593e-6
  0.135552
julia> # 目的関数の値
julia> problem.optval
1.166663382501328

要点は以下のとおりです.

  • 変数はVariableで指定する.引数にはサイズ(次元)を指定する.
  • 最適化問題の定式化は,minimize関数またはmaximize関数を用いて記述する.これらの関数の第一引数には目的関数,第二引数には制約条件を与える.
  • solve!関数を用いて最適化を実行する.

まとめ

  • JuliaOptはJuliaの数理最適化を実行するために必要なモデリング,ソルバーへのインタフェースを提供するパッケージをまとめたプロジェクト(組織).
  • JuliaOptを用いることにより,線形計画法,混合整数線形計画法,2次錐計画法,混合整数2次錐計画法,半正定値計画法,非線形計画法,混合整数非線形計画法などの最適化問題を解くことができる.
  • モデリングはJuMP, Convex.jlの2つが提供されており,各種のソルバーとのインタフェースにはMathProgBase.jlが使用されている.
  • 現在,精力的に開発が進められているプロジェクトであり,今後も動向をウォッチしていきたい.

*1:公式ページによると"organization"(組織).

新米探偵、データ分析に挑む(R Advent Calendar 2015)

これは,R Advent Calendar 2015の5日目の記事です.

今日は,Japan.Rとともに,立川は統計数理研究所では2015年度統計数理研究所共同研究集会「データ解析環境Rの整備と利用」が行なわれました.
この研究集会での発表の詳細については別途ご報告する可能性がありますが,徳島大学石田基広先生のオープンデータの収集や活用(可視化等)などのお話もお聞きしてきました.
そこで,本記事では先生が最近出版された「新米探偵、データ分析に挑む」の書評を書かせていただこうと思います.

書籍の概要

大学卒業後,探偵事務所に就職することになった「僕」こと田中俵太氏が商店街で起きる6つの事件に遭遇し,
統計学の基礎やR,RStudioの使用方法を身につけながら問題を解決していきます.
基本的な構成として,解決したい課題,明確化したい事項があり,そのために必要なデータ分析の手法やRの操作方法が現れてくるというストーリーになっています.
したがって,天下り的に知識が与えられて,一体どんなときにどう使うのだろうという心配を抱く可能性は非常に小さいです.

総評

おそらく統計もRも知識不要で,お気軽に読み進めることができます.

特にお勧めしたいのが,

  • 統計に興味があるけど何から始めたら良いかわからない
  • 東京大学出版会統計学入門などの統計のバイブルを手に取ったは良いが,イメージがわかなくて困っている
  • Rの初歩とされる本を手に取ったは良いが難しくて読み進められない or 出てくる関数などを何のために使うのかわからない

というような学生,社会人の方です.
統計やRの初歩レベルをクリアした方にも読み物として楽しめること請け合いです.

石田先生の読み物調の作品は,これまでにも「とある弁当屋の技師」シリーズがありました.

これらの作品と比べると,本書は

  • Rによる計算方法のウェイトが上がっている
  • モダンなRの機能を使っている(ggplot2, dplyr, RStudio等)

といったところに特色があるのかなと思います.
数々の名著を手がけられ,最新のRの動向にも目を配られている石田先生だからこそ生まれた名作と言えるでしょう.

また,Amazonの書評にもあるように,単にデータ分析を説明するだけでなく,顧客のニーズを明確化してデータや分析の要件の定義を行なっている箇所もあり,臨場感があります.
データ分析初心者の方に現場の雰囲気が伝わる書籍はなかなかないと思うので,その意味でも貴重です.

みせかけの回帰?

twitterを眺めていたら,このようなやり取りを見かけました.

この件については私も現在文献等を調査中ですが,@teramonagiさんが1ヶ月も前にブログ記事を書かれていますので,ご参照ください.

売上げを気温で回帰してみる

まとめ

従来の統計学の教科書は,初心者にはともすると無味乾燥でイメージが湧きにくいものが多かった気がしています.
私も大学の教養課程で「基礎統計」という授業を受講したものの,ほとんど興味が湧くことはありませんでした.
その当時,この本 (と現在のRの環境) があったら興味を持つことができただろうなと思いながらページをめくっていました.

データ分析に興味があるけどきっかけがつかめない,他書で挫折してしまったので易しい本から始めたい,理論だけでなくある程度手を動かせるようになりたい.そんな方々は,是非本書を手に取ってみてください.

データサイエンティスト養成読本機械学習入門編の振り返りと補足

9月10日,技術評論社より「データサイエンティスト養成読本 機械学習入門編」が発売され,おかげさまで約1ヶ月後には増刷が決定しました.
お読みいただいた方々に深くお礼申し上げます.

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

また,出版日の夜には,KDDIウェブコミュニケーションズ様で刊行記念イベントが行われました.

「データサイエンティスト養成読本 機械学習入門編」刊行記念イベント

私も著者の一人として参加させていただきました.
足元が優れない中ご参加いただいた方々,会場を提供いただいたKDDIウェブコミュニケーションズ様,
運営していただいた技術評論社様の方々にお礼を申し上げます.

以下では,出版後1ヶ月半を経てあらためて本書の見どころ,出版日当日の刊行記念イベントについて,主観的な感想を綴っていこうと思います.
また最後に,私が担当した第2部特集1「機械学習ソフトウェアの概観」に関する補足を行います.

あらためて本書のみどころを

本書は,企画構想時点から取りまとめを行われていた比戸さんによるブログ
機械学習の入門本を書きました(データサイエンティスト養成読本)
や以下のように既に多くの方々に書評を書いていただいており,大変感謝しております.

ヌケ,モレがあれば教えていただけると幸いです.

世間では人工知能機械学習,深層学習(ディープラーニング)などのキーワードが過熱気味の昨今,
本書は機械学習の入門としてデータサイエンティストを養成するという名の下に出版されました.
機械学習は素晴らしい,何でもできる,そんな謳い文句とともに機械学習の技術的な記事が並んでいるのだろうと思って手に取る方は,
冒頭の比戸さんの記事を読んで面食らうことでしょう.
機械学習のコンセプト,メリット,そして限界,人工知能/機械学習の歴史を踏まえて今注目される理由や実用化に向けたハードルなどが
非常に簡潔に書かれています.
最後のQ&Aでは,機械学習の等身大の姿が書かれており,
ともすれば人工知能機械学習により自動化が進み人間にとって代わるという現在の風潮に対して,非常に地に足のついた回答が提示されています.

個人的には,この記事は実際に機械学習を使用しようと思っている方だけでなく,
少しでも人工知能機械学習のキーワードを耳にしたことのある方は全員読んでいただきたいと思っています.
また,特に最後のQ&Aは業務の分析報告や提案活動の中で質問されそうな内容が並んでおり,
機械学習を使用しているデータ分析者の方にも少なからず得るものがあるのではないかと思います.
比戸さんがご自身のブログの中で"Demystifying Machine Learning"(機械学習の化けの皮を剥がす)として,
機械学習にまつわる2つの神話*1を打ち砕きたかったとおっしゃっていますが,その目的は十分に果たされ,
機械学習の良きも限界も理解した上で上手な付き合いを行なっていくための足がかりとなる名記事です.

比戸さんの記事を読んで腰を落ち着けた後は,馬場先生の記事で機械学習の中身を勉強すると良いと思います.
馬場先生の記事には数式が出てきますが,嬉しいのは数式の意味,あるいは意図を明確に書いていただいており,
図を多用して直感的な理解も促して下さっていることです.
たとえば,

  • 『「非雇用率が 0 のとき犯罪率は w_{0}」「非雇用率が 1 のときの犯罪率は w_{0} + w_{1}」であることを表現しています』
    といったように,数式の意味が書かれている.
  • 損失関数  l(w_{0}, w_{1}, x, y) = (y - (w_{0} + w_{1} x))^{2} について,
    『損失関数は、実際の犯罪率の値 y と犯罪率の予測値  w_{0}+w_{1}x の差が大きいほど値が大きくなるように設計されています。』
    と値の見方について書かれている.さらに,続けて具体例で
    「予測器  f(x)=0.1+0.5x の二乗誤差を示します。たとえば1番目の都市では、実際の犯罪率は0.04 であるのに対して予測器による予測値は0.15 であるため、二乗誤差は  (0.04-0.15)^{2}=0.0121

といった具合です.
数式だけでなく,文章や図も合わせて読むことにより理解を深めていくと良いと思います.

その後は興味に合わせて,いろいろな読み方ができると思います.たとえば,

  • ビジネスでどう使えば良いか知りたい,どう適用するかイメージを湧かせたい
    → 第1部特集3「ビジネスに導入する機械学習」,第2部特集3「推薦システム入門」(レコメンデーションの基本とともに,4章で筆者の実務経験を踏まえた見解が述べられています)
  • 実際に手を動かしながら,機械学習を体感したい
    → 第2部特集1「機械学習ソフトウェアの概観」,特集2「Pythonによる機械学習入門」,特集3「推薦システム入門」,特集4「Pythonで画像認識にチャレンジ」,特集5「Jubatusによる異常検知」
  • 最先端の話題について知りたい(深層学習,ディープラーニング
    → 第1部特集4「深層学習最前線」

といったように,様々な目的に合わせて記事を選んでいけるのも本書の特徴の一つかなと思っています.

第2部はPythonソースコードが多くなっていますが,
特集2でOSごとのインストール方法から説明していただいているので,Python初心者にも問題はないと思います.
この記事はscikit-learnだけでなく,NumPy, matplotlibについても丁寧に説明されており,
Rは使ったことがあるけどPythonはあまりないという方にも導入として非常に取っ付きやすいと思います.
また,個人的な感想ですが,第2部はまず特集2を読んでPythonで基本的なことができるようにしておいて,
Pythonを使って機械学習を実践したい場合は特集3, 4, 5を,
他のソフトウェアと比較してPythonがどのような位置付けとなっているかを知りたい場合は私が執筆した特集1を読む
という進め方も一つの手かもしれません.

第1部特集3と第2部特集1には,Rのソースコードが出てきます.
Rの初歩については解説が少ないので,本書の前作にあたる「データサイエンティスト養成読本」,
「データサイエンティスト養成読本 R活用編」を参照すれば良いかと思います.

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

以上,簡単ですが,機械学習って結局何?というところから,ビジネス応用,技術的な入門まで揃えられた本書が,
機械学習を正しく理解し,手を動かしながら使うイメージを持つための入門書として必携の一冊となることを願っています.

刊行記念イベント

刊行記念イベントでは,執筆者からLT(Lightning Talk)が行われた後に,Q&Aが行なわれました.
詳細については,技術評論社様のページにフォトレポートが上がっていますのでご参照ください.
「データサイエンティスト養成読本 機械学習入門編」刊行記念イベント フォトレポート

その後の懇親会と合わせて,様々な分野でデータ分析に関わる方々と情報・意見交換ができて非常に貴重な時間を過ごすことができました.

執筆担当箇所に関する補足

以下では,私が担当した第2部特集1「機械学習ソフトウェアの概観」について,執筆後に出てきた参考資料の紹介や補足を行います.
なお,出版社の許諾を得て掲載しています

代表的なソフトウェアに関する記事

本文とは少し違った観点で,Python, R, Julia等のデータ解析を実行するソフトウェアに関して綴られた以下の記事は,
ぜひ合わせてお読みいただければと考えています.

Python, Machine Learning, and Language Wars. A Highly Subjective Point of View(2015-08-24) by Sebastian Raschka

和訳版:Pythonや機械学習、そして言語の競争について – 極めて主観的な見地から

著者はミシガン州立大学で計算生物学を専攻する博士課程の学生で,
2015年9月に刊行された"Python Machine Learning"(Packt Publishing)を執筆されています.
冒頭で,著者は(1)アイデアをコードで書き出す時にかかった時間,(2)デバッギングにかかった時間,(3)実行にかかった時間の合計時間を想定し,
著者にとってはPythonがベストだったと説明しています.
MATLABやJuliaについても言及しており,Rについても誤解を解く記述もあります.
最後には,様々な言語を使用する読者からのコメントも複数掲載されており,参考になります.
著者はツールや言語は目的を達成するための手段というスタンスであり,私も同じ考えのため非常に共感を持ちます.

また,RとPythonの比較については特にKDnuggetsなどに多く記事が掲載されています.
たとえば,

などです.

レコメンデーションを実行するライブラリ/パッケージについて

第1章の「各ソフトウェアで実行可能なタスク」節で,
「Juliaでは,筆者の知る限りレコメンデーションを実行するライブラリは公式的には提供されていません」
と記載しました.
この点について,@chezouさんから,
「JuliaにはNMF.jlがあるのでレコメンデーションを実行できるのではないか」
というご指摘をいただきました.
ありがとうございます!

NMF(Non-negative Matrix Factorization, 非負値行列分解)は行列分解の手法で,レコメンデーションにおいてもよく用いられるようです.
詳細については,以下のブログ等をご参照ください.

このようにレコメンデーションで使用されるものの,第2部特集3で紹介されているナイーブベイズ分類器などと同様に,
必ずしもレコメンデーションに特化しているわけではない手法を実行するライブラリ/パッケージを紹介するかどうかは結構迷いましたが,
結局紹介しない方針を採りました.
一方で,確かに広義には含めた方が良い気がするので,ここで紹介しておきます.

またNMFは,RでもNMFパッケージが,Pythonでもscikit-learnのdecompositionモジュールに実装されています.

== 2015/11/4 追記 ==
kndt84さんに,PythonでNMFを用いてレコメンデーションを実装するには,scikit-learnのdecompositionモジュールのNMFクラスよりも,
nimfaを用いた方が良いのではないかというコメントをいただきました.
ありがとうございます!

kndt84さんのQiitaのページで,crabやpython-recsysとともにnimfaが紹介されています.
Pythonでのレコメンデーション実装についての備忘録

また,以下の記事も参考になります.
PythonのnimfaでNMFを試す
nimfaでNMF

nimfaは,"A Python Library for Nonnegative Matrix Factorization Techniques"とあるように,
まさに非負値行列分解のためのライブラリです.
公式ページの手法一覧表や上記のid: SAMさんのブログにあるように,
NMFの様々な手法が提供されています.
開発者はリュブリャナ大学の研究者や大学院生のようで,2012年にJMLRに論文を書かれています.

Marinka Zitnik and Blaz Zupan,
NIMFA : A Python Library for Nonnegative Matrix Factorization,
Journal of Machine Learning Research 13 (2012) 849-853.
http://www.jmlr.org/papers/volume13/zitnik12a/zitnik12a.pdf

この論文内では,nimfaは以下のメリット

  • モダンなNMFの手法,初期化方法,スコアリング指標を提供している.
  • nimfaは密行列も疎行列も扱える.
  • 部品ベースで実装され,階層的な設計が行われているため,既に実装した手法を組み込みやすい

があると主張されています.
また,関連して,PyMFNMFbioNMFといった行列分解のライブラリとの比較も行われています.

機会があれば,nimfaを使用してMovieLensデータセットなどでレコメンデーションを実行する例について,
別エントリで書ければと思います.

R/Python/Juliaによる統計量の算出・可視化

記事の2章では,R, Python, Julia, Spark MLlibを用いて予測モデルを構築する例を示しています.
刊行記念イベントでもお話ししたように,記事の主要な目的は機械学習のソフトウェアにはどのようなものがあり,
それぞれのメリットとデメリット,そしてどれを選択するのが良いかの指針を示すことにあると考えています.
ただ,これまでの業務経験から文章で話すだけではなく具体例を入れた方が初学者の方にはイメージがわきやすいとも考えており,
2章の例を入れました.

記事の中では特徴量の統計量を算出したり可視化する工程を省略していますが,機械学習アルゴリズムを適用する前に必ず行わなければならない作業です.
また,実際の分析では生のログデータから特徴量を構築する工程も非常に重要です.
ここでは,記事中でも用いたBank Marketingデータセットを対象に,
R, Python, Juliaでそれぞれ統計量の算出や可視化を実行する方法について説明します.

ここでは,以下の3つの処理

  1. データの読み込み(サンプル × 特徴量のテーブル形式のデータを想定)
  2. 1変数の分析:各特徴量(説明変数)の要約統計量の算出,分布の確認
  3. 2変数の関係性の分析:目的変数と各特徴量(説明変数)の相関の確認

について説明します.

1点目のデータの読み込みについては記事中でも説明しています.
2点目,3点目については,以下の表の内容を説明します.

R Python Julia
1変数の分析 要約統計量の算出 summary関数 pandas.DataFrame.describeメソッド describe関数(DataFrames.jl),DataFramesMeta.jl
分布のプロット ggplot2パッケージ pandas.DataFrame.plot, pandas.DataFrame.boxplot, pandas.DataFrame.hist PyPlot.jl,Gadfly.jl
層別集計 by関数 pandas.DataFrame.groupbyメソッド aggregate関数
2変数の関係性の分析 相関係数の算出 cor関数 pandas.DataFrame.corrメソッド cor関数
多変量連関図 pairs関数, ggpairs関数(GGallyパッケージ) 等 pandas.tools.plotting.scatter_matrix, seaborn.pairplot PyPlot.jlを用いた自作関数

なお,OS X 10.10で実行しており,使用したR, Python, Juliaのバージョンは以下のとおりです.

  • R 3.2.2
  • Python 2.7.9
  • Julia 0.3.10

本書執筆後にJuliaは0.4.0が出ましたが,ここでは書籍に合わせて0.3.10を使用しています.

データの読み込み

データの読み込みは記事中でも説明しています.

R

read.csv関数を用いてBank Marketingデータセットを読み込みます.

Python

Pandasのread_csv関数を用いてBank Marketingデータセットを読み込みます.

Julia

DataFrames.jlのreadtable関数を用いてBank Marketingデータセットを読み込みます.

要約統計量の算出

R

各列の要約統計量は,summary関数を用いて算出します.

Python

各列の要約統計量は,DataFrameクラスのdescribeメソッドにより算出できます.

上記を見ればわかるように,DataFrameクラスのdescribeメソッドはデフォルトでは数値の列しか統計量を算出しません.
ここで,DataFrameクラスのオブジェクトのdtypesを見て,各列のデータ型を確認してみましょう.

各列のデータ型は,ageやbalanceなどの数値の項目はint64,
jobやyなどのカテゴリ変数の項目はobjectとなっていることを確認できます.

以上の結果を受けて,describeメソッドのinclude引数に'object'をリストで指定します.
これは,データ型がobjectの項目のみを要約するという指定です.
その結果,カテゴリレコード数(count),ユニーク値の個数(unique),最も出現したカテゴリ値(top)とその頻度(freq)が
各項目に対して算出されることを確認できます.

Julia

DataFrames.jlのdescribe関数を用いて,データフレームの各列の要約統計量を算出します.

数値の項目に対しては,最小値(Min),第一四分位点(1st Qu.),中央値(Median),平均値(Mean),
第三四分位点(3rd Qu.),最大値(Max),欠損値の個数(NAs),欠損値の割合(NA%)が算出されていることを確認できます.
一方で,カテゴリ値の項目に対しては,データ数(Length),データ型(Type),欠損値の個数(NAs),
欠損値の割合(NA%),ユニーク値の個数(Unique)が算出されています.

各列のデータ型は,showcols関数を用いて確認できます.
1列目Col #に列番号,2列目Nameに列名,3列目Eltypeにデータ型,4列目Missingに欠損値の個数が表示されていることを確認できます.

なお,各列のデータ型は以下のようにeltypes関数を用いても確認できますが,
showcols関数を用いた方が列番号や列名などよりリッチな情報が出力されるので個人的には重宝しています.

層別集計

続いて,各説明変数と目的変数の関係を調べてみましょう.
目的変数yが'yes'であるか'no'であるかによって,各説明変数の統計量がどのように異なるかについて確認します.

R

by関数を用いて,目的変数のカテゴリごとに各列の要約統計量を算出します.
集計する対象は目的変数y以外であり,データ項目を選択するためにdplyrパッケージを使用しています.

目的変数のカテゴリ別に特徴量の分布などをプロットするには,ggplot2パッケージを使用すると便利です.

Python

Pythonで層別集計を実行するためには,DataFrameクラスのgroupbyメソッドにより層別に分割し,
その後,適用するメソッドを指定します.
次の例では,目的変数のカテゴリごとに分割し,describeメソッドにより各列の要約統計量を算出しています.

目的変数の値ごとに,数値の項目のヒストグラムをプロットするには,histメソッドを使用します.
layout引数には,図の行数,列数をタプルで与えています.

PythonでもRのggplot2と同様のグラフィクス機能を提供するggplotライブラリが提供されています.
ggplotライブラリは,pipによりインストールします.

$ pip install ggplot

次の例は,目的変数yのカテゴリごとに項目ageのヒストグラムをプロットしています.

Julia

Juliaでは,aggregate関数やby関数等を用いて,集計軸ごとに集計を実行できます.
次の例は,aggregate関数を用いて,quantile関数により数値の項目に対して分位点を算出しています.

出力結果は,

  • 負例は,1行目が最小値, ... , 5行目が最大値
  • 正例は,6行目が最小値, ... , 10行目が最大値

となっています.

カテゴリ値の項目に対しては,aggregate関数やby関数などを用いて,目的変数の値ごとにカテゴリ値を集計します.
以下では,aggregate関数を用いて,countmap関数により各カテゴリのレコード数を集計しています.

Juliaでは可視化のライブラリがいくつか提供されています.

などがあります.
これらの概要については,たとえば以下の資料などがまとまっています.
Graphics in Julia by Andee Kaplan
Introducing Julia/Plotting
また,Gadfly.jl/Immerse.jl, PyPlot.jl, UnicodePlots.jl, Qwt.jlの機能を統一したインタフェースで利用できる
Plots.jlというパッケージも提供されています.

ここではPyPlot.jlとGadfly.jlを用いて,目的変数yのカテゴリごとに特徴量の分布を可視化してみます.

PyPlot.jlは,Pythonのmatplotlib,特にpyplotとの連携に強いインタフェースです.
以下ではsubplot関数で2行1列の図を描くことを指定して,1行目に負例,2行目に正例のageの分布をプロットしています.

Gadfly.jlはRのggplot2パッケージと同様に,"Grammar of Graphics"の理念に基づいて開発されているパッケージです.
以下の例では,plot関数のx引数に描画する項目,ygroupに層別に用いる項目を指定しています.
Geom.subplot_gridの引数にGeom.histogramを与えることでヒストグラムを層別にプロットする指定を行っています.


2変数の関係性の分析

ここでは,2変数の関係性を分析するために,相関係数の算出と多変量連関図をプロットします.

R

相関係数は次のようにcor関数により算出します.

多変量連関図は,pairs関数を用いる方法がありますが,カテゴリ変数を適切に扱っているとは言い難いため,
ここではGGallyパッケージのggpairs関数を使用します.

Python

相関係数は次のようにDataFrameクラスのcorrメソッドにより計算します.

多変量連関図は,pandas.tool.plottingモジュールのscatter_matrix関数を用いてプロットします.

Pandas 0.17.0の時点では,多変量連関図は数値の項目のみに対してプロットされます.
RのGGallyパッケージのggpairs関数のように,カテゴリ変数の項目に対してもプロットされるようにするためには少し工夫が必要です.
この対処は少々紙面を要するため,別エントリで書ければと思います.

なお,多変量連関図については,seabornを用いた方が見栄えが良いかもしれません.
seabornはmatplotlibのラッパとなっており,洗練されたグラフィクスを多数提供します.

まずは,pipコマンドを用いてseabornインストールします.

$ pip install seaborn

seabornのpairplot関数を用いて多変量連関図をプロットします.
ここでは,目的変数である'y'をhue引数に指定することによって色を変えています.

Julia

相関係数は次のようにcor関数により計算します.
cor関数は,データフレームに対してそのままでは適用できないため,convert関数でDataArrayに変換しておきます.

多変量連関図は,ここでは以下のページで定義されているpairs関数を参考にして,自作の関数pairsを作成します.
https://gist.github.com/ahwillia/43c2cfb894f2bfec6760

DSML_my_pairs.jl

こうして定義したpairs関数を用いて多変量連関図をプロットします.

Juliaのデータフレームのハンドリングについては,以下の資料などが役立ちます.

また,以上では紹介できませんでしたが,Juliaで集計やデータ加工を実行するパッケージにDataFramesMeta.jlがあります.
このパッケージを使用すると,Rのdplyrパッケージと同様に,行の抽出,列の抽出,グループ化処理などの操作,
およびこれらの操作をパイプで連結することが可能になります.
2015年4月に行われた第3回JuliaTokyoの@weda654さんのスライドがわかりやすいです.


以上,少々長めになってしまいましたが,何かのご参考になれば幸いです.

*1:「数学も統計もわからないし、難しくて自分にはとても使えない、使いこなせない」という悲観的な神話と「よくわからないけど機械学習の専門家に今データで困っていることは全部解決できそうだ」という楽観的な神話

岩波データサイエンスVol.1(ご恵贈お礼)

岩波データサイエンス Vol.1 をご恵贈いただきました.ありがとうございます!

岩波データサイエンス Vol.1

岩波データサイエンス Vol.1

書籍の概要

本書は,「岩波データサイエンス」という6巻シリーズの1巻目です.主にマルコフ連鎖モンテカルロ法(MCMC)などを用いたベイズ統計モデリングについて扱っており,理論から実装,Stanなどの最先端のソフトウェアまで幅広い話題が揃えられています.著者陣は非常に豪華で,ベイズ統計モデリングの著名人で構成されています.ベイズ統計の基礎から最先端の動向まで,わかりやすく理解することができます.

そして,特筆すべきはサポートページの充実ぶり.特集記事だけでも以下のリンクのとおり,記事の補足,理解を促す動画,不採用の原稿,ライブラリのインストール方法などについても手厚くサポートされています.中には,p.4-5の巻頭言を補足するオリジナルビデオまであります.以下のリンク先で,左上の方にある「[特集] ベイズ推論とMCMCフリーソフト」をたどってみてください.

https://sites.google.com/site/iwanamidatascience/

また,なんと芥川賞受賞の円城塔さんの掌編小説まであります.サポートページにあるように,「雑誌のような本」という謳い文句にふさわしい内容に仕上がっています.

総評

以下では,特集「ベイズ推論とMCMCのソフト」に焦点を絞って書評を書かせていただきます.

特集の前半は,ベイズ統計の基本の速習にはじまり,階層ベイズ,時間・空間データのモデリングが扱われています.後半は,MCMCを実行するソフトウェアの使用方法や適用例について説明されています.重点的に説明されているソフトウェアは,Stan, PyMCです.また,前半の久保先生と伊東先生の記事にはBUGSのコードのJAGSによる実行例,WinBUGS/OpenBUGSの実行例が載っています.

本書を一通り読んで,概念,理論と実践のバランスが絶妙だと感じました.前半は過度に理論的な内容に偏ることなく,具体例とともにコードの説明もついており,後半も単なるツールの使用方法にとどまらず実例を挙げて説明しているので実践的という感想をもちました.p.5の特集の巻頭言に,「ツールの利用を前提として,ベイズ推論や階層ベイズモデリングを学ぶことを,もうひとつの目的にすることになった」とありますが,その目的は十分に達成できていると思われます.コラムも実践的な内容が多く,特集の最後には伊庭先生がベイズモデルの表現形式についてまとめてくださっているので,俯瞰的な視野で学習内容を整理できます.また.サポートページで補完する体制が整っており,まさに至れりつくせりです.データ解析に現在関わっている,そして将来志す人にとって必携の一冊です.構成についても,それぞれの記事が関連する箇所を参照し合っているので,内容の関係性を把握しやすいことも好印象でした.

対象としては,ベイズ統計,特に階層ベイズ,状態空間モデル,CARモデル等について専門書に進む前に知りたい,Stanなどの最新のベイズ統計モデリングのソフトウェアについて抑えておきたい,実行例を通して理解したいといったニーズがある読者に最適だと思います.

前提知識は,非ベイズ統計学,特に最小二乗法や信頼区間の考え方,一般化線形モデルは押さえておいた方が良さそうです.時系列解析あたりの基礎知識もあると,理解が向上するかと思います.数式も出てきますが,難解なものはなく大学教養程度の知識で問題ないでしょう.実装については,RかPythonで何かしらのデータ解析経験があった方が読みやすいかと思います.
ベイズ統計の知識については,伊庭先生の超速習コースが用意されているため,必須ではない気もします.とはいえ,事前分布,事後分布などが何を意味しているのか,またベイズ統計ではデータを観測した下でのモデルパラメータの確率分布を事後分布として推定するという世界観は,本文でも説明されているものの,あらかじめざっくりとした理解をしていないと少々厳しいかもしれません.たとえば,豊田先生の書籍の1~3章あたりに目を通しておくと良いかと思います*1

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門

また,以下の書籍の1~3章,8章あたりは本書の題材と関係する部分も多く,あらかじめざっと目を通しておいた方が良いかもしれません.

予測にいかす統計モデリングの基本―ベイズ統計入門から応用まで (KS理工学専門書)

予測にいかす統計モデリングの基本―ベイズ統計入門から応用まで (KS理工学専門書)

みどり本こと「データ解析のための統計モデリング入門」を読んでからの方が良いのか,読む前の方が良いかについては意見が分かれるかもしれません.個人的には,読んでいるに越したことがないが,読まなくても内容はある程度理解できるのではないかと思っています.

以下,各特集記事をオーバービューしていきます.

ベイズ超速習コース(伊庭幸人)

伊庭先生によるベイズ統計の導入的な記事.記事にもあるように,ベイズの定理を使って事後確率の計算にとどまる解説が多いのに対して,この記事では非ベイズでの統計解析,たとえば最小二乗法をベイズの枠組みで扱うとモノの見方をどう変えなければならないかが明確かつ簡潔に書かれています.そのため,個人的には,ベイズ統計モデリングだけでなく,機械学習を勉強しようと思ってベイズ的アプローチのバイブル「パターン認識機械学習」(通称,PRML)などを読もうとしている方々にも,本記事は目を通す価値があるように思われました.実装が気になる方は,p.65-70の松浦さんのStan,p.84-89の渡辺さんのPyMCの記事を合わせて読むのも一つの手かと思います.記事の最後に出てくる階層ベイズも「学校と生徒」のように身近な例で説明されているのでわかりやすいです.ただ,この記事ではそこまで詳しくは扱われていないので,次の久保先生の記事を読みましょう.

途中で出てくる普通の統計学での信頼区間の意味を確認するには,たとえば上記の豊田先生の「基礎からのベイズ統計学」p.54-55などを参照すると良いでしょう.

[コラム] 2ページで分かるMCMCの秘密 (伊庭幸人)

Q&A形式で,マルコフ連鎖モンテカルロ法(MCMC)のコンセプト・概要,よくある誤解,使用上の注意点がわかりやすくまとまっています.
Gibbs Sampler法やMetropolis Hasting法などの詳細については,サポートページにある伊庭先生の講義ビデオを観るか,同じく伊庭先生の「計算統計II」を読むと良いでしょう.

https://sites.google.com/site/iwanamidatascience/vol1/support_tokushu#TOC-2-MCMC-

階層ベイズ 最初の一歩(久保拓弥)

ご存知,「みどりぼん」の著者である久保先生による記事.階層ベイズモデルの入門ということで,「複数の県の複数の小学校で,異なる給食を1年間出したときに,生徒の身長の伸びに影響は出るか?」という題材で,対応のない一般化線形モデルでモデリングすることの問題の提起から始まります.その後,このモデルをベイズ化し,最後に対応関係をつけるように階層ベイズモデルを導入していきます.

本書では,巻頭言にもあるように階層ベイズの理解が一つの目的となっていますが,もしかすると伊庭先生の「ベイズ超速習コース」p.14-15の説明と,本記事の対応関係がわかりづらいかもしれません.しかし,その点についても手厚くフォローされているので心配は無用です.以下の,解説記事の2点目のQ&Aを読むとクリアになるでしょう.また,2回の反復測定の経時データを扱っており少々面食らうかもしれませんが,1点目のQ&Aに明確に説明されています.

「この解説を読む助けになるQ and Aを作成しました」
https://sites.google.com/site/iwanamidatascience/vol1/support_tokushu#TOC-JAGS-

この記事は,もう一度頭を整理して読み直そうと思います.

時系列・空間データのモデリング(伊東宏樹)

伊東先生による時系列データ,空間データのベイズモデリングの解説記事.時系列データや空間データでは,時点や空間の位置が近いのデータと相関をもつことが多く,そのようなデータをどのようにモデリングしていくかについて説明されています.

時系列データに対しては,状態空間モデルを扱います.状態空間モデルというと難しい印象を受けますが,最初はわかりやすいローカルレベルモデルから入ってくれているので,予備知識はそこまで必要ないのではないでしょうか.必要ならば,コマンダー,クープマンによる「状態空間時系列分析入門 」の冒頭2章分を読めば良いでしょう.

状態空間時系列分析入門

状態空間時系列分析入門

続いて,トレンドが変化するモデル,ノイズが正規分布に従わない場合,観測値が二項分布に従う場合へと拡張していきます.BUGSのコードも記載されており,わかりやすいです.

空間データは,Intrinsic CARモデルにより空間的に相関のあるデータをモデリングしていきます.RのCARBayesパッケージやWinBUGS/OpenBUGSのコードも載っています.

本文中で説明されているように,以上の状態空間モデルとIntrinsic CARモデルは同じ内容を別の形式で表現した関係にあります.これが,本書の特集の最後で伊庭先生が書かれている「時間・空間を含むベイズモデルのいろいろな表現形式」の「(1) 状態空間モデルによる表現」と「(2) 条件付き分布による表現」の関係の一例になっています.「(1) 状態空間モデルによる表現」と「(4) Full Conditionalによる表現」の関係の一例となっています.

2015/10/10 14:49追記:
伊庭先生から,(1) と (2) の関係よりも,(1) と (4) の関係の方が妥当であるというご指摘をいただきました.後ほど自分で理由を考えて追記します.

[コラム] MCMCソフトを使う前に ― 一般的な準備から統計モデリングまで (松浦健太郎

松浦さんによるMCMCのソフトウェアを使う前に行わなければならない事項,注意点がコンパクトにまとまった記事.

ベイズ統計モデリングに限らず,データ解析というと手法やツールに目が行きがちですが,その前に実験計画を立てて,対象とするデータの素性を理解しなければ何も始まりません.また,モデリングでも最初は簡単なモデルを作って,徐々に表現力と頑健性が高くなるように高度化していくプロセスが必要です.記事の最後には,久保先生と松浦さんのモデリングの手書きイラストが載っていて臨場感にあふれています.コラムという位置付けではありますが,個人的には,相当な場数をこなしてきたプロだからこそ書ける貴重な記事だと思いました.

Stan入門 ― 次世代のベイジアンモデリングツール (松浦健太郎

同じく松浦さんによるStanの使用方法の解説記事.まずは,伊庭先生の「ベイズ超速習コース」で扱われた最小二乗法をStanで実行し,ベイズ信頼区間ベイズ予測区間を求めていきます.次に,Stanの内部で対数事後確率(から事前分布の対数を引いたもの)がどのように表現されているかが説明され,increment_log_prob関数を紹介しています.

さらに,四半期ごとの予約販売数を対象として,季節変動のある時系列データを状態空間モデルで扱う方法,Stanの実装が紹介されています.これを読む前に,前記の「予測にいかす統計モデリングの基本」の8章や同様の話題を扱ったネット上のスライド,ブログなどで状態空間モデルにより季節調整を行っている例を眺めておいた方がわかりやすいかもしれません.個人的に重宝したのは,ベイズ決定まで書かれていることです.なお,ここでは販売数の実績が予測よりも上回った場合の損失コスト,実績が予測よりも下回った場合の廃棄コストの定式化がさらっと書かれていますが,筆者のモデリングセンスが垣間見えた気がします.

最後は,伊東先生の記事で扱われた2階階差のCARモデルを用いて,2次元のプレートを対象にどの処理が有効かの解析をしています.なお,処理は無作為割付の必要性も書かれていて,実験計画の重要性を改めて実感します.

[コラム] Pythonとは(高柳慎一)

高柳さんによる主にPythonの科学技術計算系のライブラリの紹介記事.本書では,これまではR+{Stan, JAGS, WinBUGS/OpenBUGS}が主体で説明されてきました.RユーザがPythonのライブラリを俯瞰する記事としてコンパクトにまとまっていて,重宝するのではないかと思います.

PythonMCMCライブラリPyMC(渡辺祥則)

渡辺さんによるPyMCライブラリの解説記事.松浦さんのStan入門と同様に,まずは最小二乗法を例にPyMCの使用方法の解説から入っていきます.続いて,みどり本10章の階層ベイズモデルの実行例,そして最後はStanが苦手とする離散変数のサンプリングの例が取り上げられています.最後の例により,Stanが苦手とする処理をPyMCでたやすく実現できることが実感できます.

PyMCは触れたことすらないので,これを機会に触ってみようと思います.

[コラム] MCMCソフトウェアの比較 (松浦健太郎

松浦さんによるMCMCソフトウェアを比較した記事.本書で扱われたStan,JAGS,PyMCに加えて4つのソフトウェア,そして自分で実装する場合について,複数観点で比較した表が掲載されています.重宝するのは,その下にどんな時にどのソフトウェアを使えば良いのかについて,筆者のお勧めが載っていることです.わずか1ページですが,良い意味で非常に情報量が多く重宝する記事です.

時間・空間を含むベイズモデルのいろいろな表現形式 (伊庭幸人)

伊庭先生によるベイズモデルの表現形式とそれらの関係性を解説した記事.表現形式を「状態空間モデルによる表現」,「条件付き分布による表現」,「マルコフ場モデルによる表現」,「Full Conditionalによる表現」の4つに分けて,それぞれの表現を本書でこれまでに扱われたモデルを例に説明されています.このように俯瞰的な視点で整理された記事は貴重だと思われます.また,特に良かったのが,これらの表現形式の説明に入る前に,モデリングとは何を行うことであるかが端的に説明されており,その後の表現形式の関係性を理解するのに視座が上がることです.ただ,私自身理解しきれていない部分もあり,またFull Conditionalによる表現で触れられているBrook's lemmaにも興味があるので,サポートページを利用したりして腰を落ち着けて勉強したいと思います.

[コラム] 赤池スクールとベイズ統計(伊庭幸人)

伊庭先生による80年代の統計数理研究所において行われたベイズ統計の研究に関するコラム.当時から盛んに研究が行われていたことがわかります.

おわりに

以上,丁寧な解説,実用的なソフトウェアの使用方法,モデリングの進め方や注意点の指南など,概念,理論と実践のバランスが絶妙で,至れり尽くせりの素晴らしい書籍でした.私も今後実務でベイズモデリングを実施予定です.これまでも少しずつは勉強してきた分野でしたが,このタイミングで本書が出版されることにより,基礎の復習と先端的な話題のキャッチアップができ,非常にありがたかったです.もう何周かしてみようと考えています.

最近出版されたデータ解析の書籍の中では,先月発売された「データサイエンティスト養成読本 機械学習入門編」とともに,データ解析を志す方々の良い指南書となることと思います.

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

一人でも多くの方の手に,この良書が渡ることを祈っています.

*1:豊田先生の書籍では4章以降がMCMCの説明であり,目を通しておくに越したことはありません.

ソースファイルからの関数定義の抽出

TL上で,Rのソースファイルから関数定義を抽出できないかが話題になっていたので,暫定案のご提示.
以下では,対処案を示すことを優先しているため,最小限の解説しかしていない.
ソースコードは,githubに上げたので適宜参照のこと.

source関数を読み解く

Rでソースファイルを読み込んでパースするsource関数は,リンク先の"source_orig.r"のように定義されている.
ここで注目すべきは,214-218行目である.
yyというのは,ソースコード内の式を評価したもので,値(value)とオブジェクトの内容を表示するかどうかを指定する論理値(visible)から構成される.
print.eval引数が真,かつ yy$visibleが真のとき,オブジェクトの内容が表示される仕様になっている.

if (print.eval && yy$visible) {
  if (isS4(yy$value)) 
    methods::show(yy$value)
  else print(yy$value)
}

しかし,Rの標準のsource関数の仕様だと,上記のyy$visibleが偽となり上記のコードが実行されないため,関数の本体も表示されることはない.

仕様を変更して関数を出力する

リンク先の"my_source.r" 217-220行目にあるように,上記の箇所を次のように書き換えればよい.
print.eval引数が真のとき,かつ,式であるeiオブジェクトを評価すると関数であるとき,関数の定義が出力されるようにする.

if (print.eval && is.function(eval(ei))) {
  print(ei[[1]])
  message("")
}

このように変更した関数名もmy.sourceとして,"my_source.r"というファイル名で保存しておく.

次のようなソースコードを用意して,これをmy.source関数で読み込もう.
test.r

hoge <- function()
{
}

huga <- function()
{
}

a <- 1
b <- 5
hoge()

問題なく動けば,hoge関数とhuga関数が表示されるはずである.

> source("my_source.r"); my.source("test.r", print.eval=TRUE)
hoge <- function() {
}

huga <- function() {
}

関数のカッコの位置などが変わってしまっているなど課題は多いが,ひとまず所望の動作が得られた.


== 追記 ==
@kos59125さんにもっと簡便な方法をご教示いただいた.
@kos59125さんのgistにあるように,parse関数でソースファイルをパースして式をリストにして,評価すると関数のものだけをフィルターするという発想.

> Filter(function(e) is.function(eval(e)), as.list(parse("test.r", keep.source=TRUE)))
[[1]]
hoge <- function() {
}

[[2]]
huga <- function() {
}

みんなのR (ご恵贈お礼)

みんなのR」をご恵贈いただきました.ありがとうございます!! (現在,写真が撮れないので後で追加予定・・・)

みんなのR -データ分析と統計解析の新しい教科書-

みんなのR -データ分析と統計解析の新しい教科書-

本書は"R for everyone"の翻訳書であり,Amazon.comのページを見ればわかるように原著は大変好評を得ています.翻訳者はみな日本のR界を代表する方々であり,Tokyo.Rなどの勉強会やブログ,パッケージ開発等で大変ご活躍されています.翻訳者の方々とは個人的な友人でもあり,ご本人たちのお顔を思い浮かべつつ楽しみながら一気に読ませていただきました*1

総評

まず最初に,この本は「中級者までなら,ぜひ手元に置いておきたい一冊」だと感じました.Rのインストールに始まり,基本的な文法規則,データ構造,可視化,統計手法,レポーティング,パッケージの作成方法まで,幅広いテーマを一冊で学ぶことができます.

また,深さについても,所々かなり詳しく書いてあり,縮小推定など他書ではなかなかお目にかかれない手法についても説明されています.データ分析で盲点となりがちなレポート作成についても1章割いてknitrパッケージの説明があるのも好感が持てます.これらは中級者も満足させる内容だと思いますし,他の箇所も事あるごとに短時間で復習するのに適しています.本書の内容を完全に理解して,必要なシーンで正しく使いこなせれば,立派なR中級者と定義しても良いのではないでしょうか*2

448ページという大ボリュームに圧倒されますが,平易な言葉とわかりやすいソースコード,図,表で説明されているため,スラスラ読めます.一度通しで流し読みして,必要な箇所を重点的に読むという読み方も十分可能です.

以上,Rの実行方法を交えた授業や勉強会のテキストとして最適な一冊ではないでしょうか.得られる価値や原著者や翻訳者の方々にかかった労力を考えると,とてもお買い得だと思います.良書を世に出していただいた翻訳者の方々に敬意を表しながら,太鼓判を押しておススメさせていただきたいと思います.

対象読者としては,「Rで学ぶデータ・プログラミング入門」などでRや統計の基礎の基礎を勉強した方で,より幅広く体系的に学びたいと思っている方に最適だと思います.

Rで学ぶデータ・プログラミング入門 ―RStudioを活用する―

Rで学ぶデータ・プログラミング入門 ―RStudioを活用する―

以下,本書を「Rの基礎」(1章-13章),「確率・統計」(14-22章),「レポーティング」(23章),「パッケージ作成」(24章)と勝手に分けて,個々の感想を述べていきたいと思います.

Rの基礎(1章-13章)

1章 Rを手に入れる
1.1 Rのダウンロード
1.2 Rのバージョン
1.3 32bitと64bit
1.4 インストール
1.5 Revolution R Community Edition
1.6 まとめ

2章 Rの環境
2.1 コマンドラインインターフェイス(CLI)
2.2 RStudio
2.3 Revolution Analytics RPE(R Productivity Environment)
2.4 まとめ

3章 Rパッケージ
3.1 インストールパッケージ
3.2 ロードパッケージ
3.3 パッケージの作成
3.4 まとめ

4章 Rの基本
4.1 基本的な数学
4.2 変数
4.3 データ型
4.4 ベクトル
4.5 関数(Function)の呼び出し
4.6 関数ドキュメント
4.7 欠損値
4.8 まとめ

5章 高度なデータ構造
5.1 データフレーム(data.frame)
5.2 リスト(List)
5.3 マトリックス(Matrix)
5.4 アレイ(Array)
5.5 まとめ

6章 Rへのデータ取り込み
6.1 CSVの読み込み
6.2 Excelの読み込み
6.3 データベースからの読み込み
6.4 他社統計ツールからの読み込み
6.5 Rバイナリファイル
6.6 Rに入っているデータ
6.7 Webサイトからの抽出
6.8 まとめ

7章 統計的なグラフィクス
7.1 基本グラフィクス
7.2 ggplot2
7.3 まとめ

8章 Rの関数を書く
8.1 ハロー、ワールド!
8.2 関数の引数
8.3 値の返却
8.4 do.call
8.5 まとめ

9章 制御文
9.1 ifとelse
9.2 Switch
9.3 ifelse
9.4 複合テスト
9.5 まとめ

10章 ループ:Rの方法ではない反復方法
10.1 forループ
10.2 whileループ
10.3 ループの制御
10.4 まとめ

11章 グループピング操作
11.1 Applyファミリー
11.2 aggregate
11.3 plyr
11.4 data.table
11.5 まとめ

12章 データ整形
12.1 cbindとrbind
12.2 Join
12.3 reshape2
12.4 まとめ

13章 文字列操作
13.1 paste
13.2 sprintf
13.3 テキストの抽出
13.4 正規表現
13.5 まとめ


RやRStudioのインストールに始まり,基本的なデータ構造,データの読み込み,グラフの作成,関数の記述,制御文やデータハンドリングについて説明されています.この本を教科書として,「R言語逆引きハンドブック」を辞書として手元に置いておくと学習効率が良さそうです.

改訂2版 R言語逆引きハンドブック

改訂2版 R言語逆引きハンドブック

7章でggplot2パッケージについて学んだら,インターネットで情報を集めてggplot2パッケージを用いた綺麗なグラフの書き方を学ぶと良いでしょう.書籍では「Rグラフィクス・クックブック」がオススメです.

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

8.4節で出てくるdo.call関数は,リストに対してある関数を適用するためのもので,意外と盲点かもしれません.今となってはdplyrパッケージのrbind_list関数などが台頭して古い書き方になってしまったかもしれませんが,かつては列数が同一の複数のデータフレームを持つリストに対して行方向に結合するときは do.call("rbind", x) としたものでした.

原著が執筆された時期には,Hadley Wickhamによるdplyrパッケージtidyrパッケージが公式にCRANで提供されていなかったため,本書では,それぞれplyrパッケージ(11.3節),reshape2パッケージ(12.3節)が紹介されています.この箇所についてモダンな書き方を知りたい方は,「データサイエンティスト養成読本 R活用編」の第3章で市川さんが書かれている記事を参照すると良いでしょう.

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

13章のstringrパッケージを用いた文字列操作については,詳しく書かれた書籍はなかなかないので重宝します.Rは文字列操作が苦手とされていますが,本章を読めばそのイメージはある程度払拭されるかもしれません.

Rのよりアドバンストな内容としては,「アート・オブ・R・プログラミング」などがあります.この本では,本書では扱っていないデバッグオブジェクト指向プログラミング,並列化などについても扱っています.

アート・オブ・Rプログラミング

アート・オブ・Rプログラミング

確率・統計 (14-22章)

14章 確率分布
14.1 正規分布
14.2 二項分布
14.3 ポアソン分布
14.4 その他の分布
14.5 まとめ

15章 基本統計
15.1 要約統計
15.2 相関と共分散
15.3 t検定
15.4 分散分析
15.5 まとめ

16章 線形モデル
16.1 単回帰
16.2 重回帰
16.3 まとめ

17章 一般化線形モデル
17.1 ロジスティック回帰
17.2 ポアソン回帰
17.3 その他の一般化線形モデル
17.4 生存時間分析
17.5 まとめ

18章 モデル評価
18.1 残差
18.2 モデル比較
18.3 クロスバリデーション
18.4 ブートストラップ
18.5 ステップワイズ変数選択法
18.6 まとめ

19章 正則化と縮小
19.1 Elastic Net
19.2 Bayesian shrinkage
19.3 まとめ

20章 非線形モデル
20.1 非線形最小二乗法
20.2 スプライン
20.3 一般化加法モデル
20.4 決定木
20.5 ランダムフォレスト
20.6 まとめ

21章 時系列と自己相関
21.1 自己回帰移動平均
21.2 VAR
21.3 GARCH
21.4 まとめ

22章 クラスタリング
22.1 K-means
22.2 PAM
22.3 階層型クラスタリング
22.4 まとめ


14章から22章まで続く確率・統計の解説も非常にわかりやすいものになっており,初学者の学習効率を確実に向上させると思います.以下では,いくつかトピックを取り上げます.

初学者を脱落させやすいと思われるt検定(15.3節),分散分析(15.4節)については,「何と何がどういう関係かを調べたい」というモチベーションが明確に書かれているため,非常にとっつきやすくなっています.

実務では,回帰モデルを構築する際に対数変換は頻繁に行います.本書では16.2節で2項目間の散布図を例示しながら,どのようなときに対数変換すべきかのヒントを与えてくれます.

「モデル評価」(18章),「正則化と縮小(シュリンケージ)」(19章),「非線形モデル」(20章)はややレベルが高いです.23章,24章とともに,中級者レベルの読者にも歯ごたえのある箇所ではないでしょうか.しかし,いずれも説明は的を得ていて,大変わかりやすいです.

「モデル評価」(18章)は,残差分析,モデル間の比較(係数比較,AIC, BIC),クロスバリデーション,ブートストラップ,ステップワイズについて扱われます.個々のテーマは他書をかき集めれば載っているものも多いですが,モデル評価という視点で解説した記事は貴重ではないかと思われます.

正則化と縮小(シュリンケージ)」(19章)は,日本語によるElastic netやBayes縮小の貴重な解説記事となっています.以下のスライドで予告されているベイズ縮小について知りたければ,すぐに本書を手に取るべきでしょう.

クラスタリング」(22章)でも,初学者が迷わないように,クラスタ数の決定方法について説明しています.

本書を読み終えた後は,尾崎さんや金先生,青木先生の書籍,はたまた共立出版のRで学ぶデータサイエンスシリーズに着手すると良いのではないかと思います.

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

パターン認識 (Rで学ぶデータサイエンス 5)

パターン認識 (Rで学ぶデータサイエンス 5)

レポーティング(23章)

23章 knitrパッケージによる再現性・レポートとスライドショー
23.1 Latexプログラムのインストール
23.2 Latex 入門
23.3 Latexを使ったknitr
23.4 マークダウンのヒント
23.5 knitrとマークダウンの利用
23.6 Pandoc
23.7 まとめ


個人的には,knitrパッケージによる再現性・レポートとスライドショーを取り上げてもらったのは非常に嬉しかったです.Rでデータ分析というと,どうしてもRの文法,統計手法に目が行きがちですが,実務では再現可能な形で「分析の足跡」を残すことは非常に重要です.データ分析者にとって「実験ノート」とも言えるこの足跡をどのような手段によって残すかが1つの課題となりますが,knitrパッケージを用いると容易く実現できます.

この章でknitrパッケージの基礎を学んだ後は,共立出版Useful Rシリーズの「ドキュメント・プレゼンテーション生成」を是非読んでください.

ドキュメント・プレゼンテーション生成 (シリーズ Useful R 9)

ドキュメント・プレゼンテーション生成 (シリーズ Useful R 9)

パッケージ作成(24章)

24章 Rパッケージの構築
24.1 フォルダ構成
24.2 パッケージファイル
24.3 パッケージドキュメンテーション
24.4 チェック、構築とインストール
24.5 CRANへの登録
24.6 C++コード
24.7 まとめ


パッケージの作成方法がコンパクトにまとまっていて重宝します.この後は,共立出版Useful Rシリーズ「Rのパッケージおよびツールの作成と利用」がオススメです.

Rのパッケージおよびツールの作成と応用 (シリーズ Useful R 10)

Rのパッケージおよびツールの作成と応用 (シリーズ Useful R 10)

おわりに

明日6月30日にいよいよ発売ですね.日本のRや統計に関わるコミュニティーの裾野を広げていくためにも,多くの方々の手にこの良書が渡ることを心から祈っています.

*1:他にやらなければならないことは大量にある状況にも関わらず,です!

*2:永遠の中級者から抜け出せない私が言うのも憚られますが,上級者にもきっと得るものがあると思います