Excelでランダムフォレスト(Random Forest)したっていいじゃないか、にんげんだもの

この記事はマルチポストアドベントカレンダー記事なんだ、すまない諸君

この記事は

また、

そして、この記事はRとF#のアドベントカレンダーにマルチなポストの記事です、はい。全力でレベル下げる方向で頑張ります。

はじめに

やぁ、全世界のExcelリストのみんな!こんにちは!

君たちは来る日も来る日もExcelのセルをコピペしたり、セル数式を伸ばしたり、縮めたり、そしてまたやっぱり伸ばしたりするのに忙しい人生を送っている事と存じます。

でも最近はあれですね、やはりこうデータ分析だのマイニングだののブームの煽りを受けて、周囲の人間が「昔から俺、それ知ってるよ?」感を出しながら「なんとか分析をやれ!」だの「なんとか検定をやれ!」だのと、面倒臭い話を持って来ているだろう、この冬、以下がお過ごしですか?

さすがにその手の面倒な話は、いくらモニターの前で朝から晩までキーボードをひたすら叩いる君たちだって、セル数式だけではやらないと俺は強く信じているわけなんですけど、それ、Excelでやるにしてももっと簡単に出来るんです。

そう、それ、出来るんですよ、もっと簡単に出来るんですよ〜!

・・・・・・・・・・・・・そう・・・・・・・・・・・・・















































F#ならね!!

というわけで、この記事では

に記載されている記事(英語)をパク真似て似たような事、「Excelからランダムフォレストを使えるようにする」、特にランダムフォレストを使ったデータの予測値をExcel上に表示させてみようと、そういうお話です。また、自分へのメモも兼ねて内容も上記BLOGよりももうちょっと詳しめに書いておきます。ランダムフォレストの解説自体はググれば日本語でも情報がたくさん出てくるので割愛です。

とりあえずの全体像(R, F#, Excelの関係)

一応、下図のような感じでRとF#とExcelが関係しあい、全体を成しています。ExcelからExcel-DNAを経由してF#を経由してR Type Provider使ってRを呼ぶという感じです。「R#」ってなってるアイコンがR Type Providerのアイコンで、ちゃんとF#とRを繋いでいるように見えるこの不思議。そしてR Type Providerの裏にはR.NETという和製の.NET言語からRを操作するライブラリがあります。

F#のインストール

F#を使って「R⇔Excel」間をつなぐので、何はともあれF#を開発・コンパイルできる環境を入れておいた方がいいです。私はVisual Studioを使ってるので、今回もそれで。
Visual Studio IDE、コード エディター、Team Services、Mobile Centerのページを見ると、Visual Studio Express Editionの2013はないっぽい*1ので、とりあえずVisual Studio 2012のExpress Editionを入れましょう。
インストール方法自体は、下記BLOG

を参考にF#を「Visual Studio Express 2012 for Web」経由で突っ込んでおきましょう。

Rのインストール

Excelの裏側でRを呼ぶ必要があるので、Rをインストールします。最新版のR(windows用バイナリ)が

からダウンロードできるので、これを突っ込んでおきましょう。こちらはOK連打の基本デフォルトの設定でOKです。

F#のプロジェクトの作成

とりあえずExcelRandomForestという名前のライブラリプロジェクトを作成しておきます。

【ファイル】→【新しいプロジェクト】と選択して、

【テンプレート】→【Visual F#】→【F# Library】を選択し、
適当なファイル名前(ここではExcelRandomForest)を入力してOKを押下。

すると、プロジェクトが立ち上がります。

この段階まで来たらこれはこれとして、次にパッケージのインストール作業に入ります。

R・F#のパッケージのインストール

RとF#のインストールが無事完了しているなら、今度はR・F#共に拡張系のパッケージを入れる必要があるので、そちらにとりかかります。

randomForestパッケージのインストール

Excelからランダムフォレストを使いたいので、RのrandomForestパッケージを突っ込んでおきます。R.exe叩くなりして、Rを起動させて出てきたコンソールにinstall.packages("randomForest")と入力後、エンターキーでOKです。

> install.packages("randomForest")
trying URL 'http://cran.ism.ac.jp/bin/windows/contrib/3.0/randomForest_4.6-7.zip'
Content type 'application/zip' length 175401 bytes (171 Kb)
opened URL
downloaded 171 Kb

package ‘randomForest’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\teramonagi\AppData\Local\Temp\RtmpAT62b8\downloaded_packages
Nugetのインストール

今度はF#側の開発環境にパッケージを突っ込みます。Visual Studioのパッケージ管理システムであるNuGet Gallery | Homeを入れましょう。LINK先にある「Install NuGet」ボタンを押下すればインストールされます。

R Type Providerのインストール

次にF#からRを操作するための「R Type Provider」を突っ込みます。

簡単にR Type Providerについて説明すると「Rの型を動的にF#に提供する枠組み」で、Rの型に対しても、F#(Visual Studio)からコーディングする際にインテリセンスが効いちゃうという超優れものです。.NET系の言語とRを繋ぐならこれを使うのが一番いいってレベルの代物です。R Type Provider自体はBlueMountain Capital Managementというアメリカのヘッジファンドの方々がメインで開発しています。金融(クオンツ?)関係で有名な面子と言えば、かつて「クレディスイス = F#」という印象を我々に与えてくれたHoward Mansell氏もHead of Core Quantitative Strategiesとして参加されているようです。いつの間にかゴールドマソからこちらに移られていんですねぇ。

また「R Type Provider」のリリース記事が、BlueMountain Capital Managementの公式テックBLOGに
[=http://techblog.bluemountaincapital.com/2012/08/01/announcing-the-f-r-type-provider/]

として上がっているのですが、ここで1人の日本人に賛辞が送られているんですねぇ。該当箇所を抜粋すると

The RProvider is built on the RDotNet project, which handles all the gnarly interop with unmanaged data structures used by R.DLL. The Type Provider provides an easy-to-use layer on top of that to use R from F#. Many thanks go to the RDotNet author, Kosei.

そうまさにRのアドベントカレンダーであるR Advent Calendar 2013主催者、我らがゴミ箱氏こと@kos59125氏ですね!、彼の功績のおかげでこういう事が可能になっているわけです、ありがとうございます!すごい!グローバル人材!彼に会った人はちゃんとお礼を言って、更にフグでも奢ってあげましょう。


で、肝心のR Type Providerのインストールですが、Visual Studioの【ツール】→【ライブラリパッケージマネージャー】→【パッケージマネージャーコンソール】としてコンソールを起動して、そのコンソール上に「Install-Package RProvider」と入力後、エンター押下でOKです。

PM> Install-Package RProvider
依存関係 'R.NET (≥ 1.5.5)' の解決を試みています。
依存関係 'RDotNet.FSharp (≥ 0.1.2.1)' の解決を試みています。
'R.NET 1.5.5' が正常にインストールされました。
'RDotNet.FSharp 0.1.2.1' が正常にインストールされました。
'RProvider 1.0.5' が正常にインストールされました。
'R.NET 1.5.5' が Tutorial5 に正常に追加されました。
'RDotNet.FSharp 0.1.2.1' が Tutorial5 に正常に追加されました。
'RProvider 1.0.5' が Tutorial5 に正常に追加されました。
ExcelDNAのインストール

R Type Provider同様、Excelと.NET言語を橋渡ししてくれるExcel-DNAも同様にNuGet経由でブチ込んでおきます。
パッケージマネージャーコンソールに「Install-Package Excel-DNA」と入力後、エンターキーでOK。

PM> Install-Package Excel-DNA
'Excel-DNA 0.30.3' が正常にインストールされました。
'Excel-DNA 0.30.3' が Tutorial5 に正常に追加されました。
Starting Excel-DNA install script
	Set reference to ExcelDna.Integration to be CopyLocal=false
	Creating -AddIn.dna file
	Adding post-build commands
Completed Excel-DNA install script
R Type Providerを使ってF#からRのランダムフォレストを呼ぶ

これで準備が整ったので、F#でコーディングしていきます。
これはもうウオーッと実装を頑張るだけですね、はい。
ハマった所は

  • 【F#】open RDotNetもしておかないと、型の情報が足りなくてRのデータ型からF#(.NET)の型に戻すのに困る(open RProviderしたら自動で入るのかと思っていた)
  • 【F#】引数がジェネリックになってるとコンパイルは通るけどExcelから見えないからアウト
  • 【F#】stringは渡せるけど、stringの配列(string)はobjかobj経由じゃないとだめで、中で変換する必要がある
  • 【R】factor型を扱う際にはR側で型変換してからF#側に処理させるようにする

といった所です。

作成したDLLを使ってExcelからランダムフォレストしたっていいじゃない、にんげんだもの

最後に作成したDLLを起動してExcelから使ってみましょう。ここではRにデフォルトで入っている「あやめ」のデータirisサンプルにランダムフォレストを実行してみました。
サンプルのExcelシートでは「分類」・「回帰」の両方を適当にテストしています。緑色背景のセルをみると、ちゃんと予測値が出てきてるのがわかります。

また、関数の挿入経由で関数を表示させるとちゃんとコメントも入ってます。

ちなみにおまけで

の2つの関数もExcelから使えるようにしてみました。

まとめ

ここではExcelからランダムフォレストを(R経由で)使うために

  • R, F#をインストールする
  • R, F#の必要なパッケージをインストールする
  • F#のコードをちょっと書く
  • Excelでランダムフォレストのテストする

という流れを説明しました。ここで示した流れを使う事によって、RとExcelの連携がより簡単になるのではないでしょうか。というわけで、もっとF#使いましょう!(誰かR Type Providerの詳しい解説記事はよ!!)


よし、俺も年末年始はF#とR Type Providerをもっと弄ぼう…と思ったけど、
いっけねぇー、俺、今週末から年越し南国旅行だったわ、いっけねーーー!!!忘れてた、いっけねーー!!!


それでは、来年もよろしくお願いします!
では、次は

に各々バトンタッチです!そんじゃねーー!!!

サンプルExcel&F#のコード

作成したファイルはzipで固めて、Dropboxの公開フォルダに

としてアップしてます。ご使用の際には解凍後、
「ExcelRandomForest-AddIn-packed.xll」を実行してから「Sample_ExcelRandomForest.xlsm」を立ち上げてください。

またF#やらのもろもろのソースはgithubにUPしています。

興味があれば是非チャレンジを!というかR Type Provider/F#の細かい所を教えてください。

参考

R Type Providerの公式

R Type ProviderのGithub

Excel-DNAの公式

去年書いた記事。R Type Providerを知らなかった時代のお話。

「F# + Excel-DNA」の非常に参考になるコード

*1:2014年1月現在だと、以下から2013が落とせそう http://www.visualstudio.com/ja-jp/downloads