...

[連載]フリーソフトによるデータ解析・マイニング

by user

on
Category: Documents
12

views

Report

Comments

Transcript

[連載]フリーソフトによるデータ解析・マイニング
[連載]フリーソフトによるデータ解析・マイニング 第88回
(独)農業・食品産業技術総合研究機構
農村工学研究所農村計画部主任研究員
合崎 英男(Aizaki Hideo)
■2000 年 3 月北海道大学大学院農学研究科博士後期課程修了。博
士(農学)。農林水産省農業研究センター研究員、農業工学研究所
研究員、同主任研究官を経て、06 年 4 月より現職。専門分野は農
業経済学(主に環境配慮や食品安全性に関する意思決定分析)。
1. はじめに
では、今号で使用する 10 のプロシージャを簡
RExcel シリーズ第 4 回では、Excel VBA で
単に紹介します。
R の関数(以下、R 関数)を利用する方法につ
「 R i n t e r f a c e . S t a r t R S e r v e r 」 と
いて紹介します。
「Rinterface.StopRServer」は、それぞれ R
Excel では、利用者がさまざまな機能を独自
サーバーを開始 / 終了させるために使用します。
のプログラムとして作成・活用できるように、
「Rinterface.RRun」は、R 関数で記述し
Excel VBA(以下、VBA)というマクロ言語を
た命令文を実行します。たとえば、「一様乱数
実装しています。RExcel の導入によって VBA
を 1 つ生成して変数 a に保存する」命令文を R
に新たなプロシージャ等が加わり、VBA 上で
上で実行するには、
R 関数が利用可能となります。
今号では、いくつかの計算例を紹介します
Rinterface.RRun ”a<-runif(1)”
が、VBA 自体の説明は最小限となっています。
と記述します。
VBA の利用経験によっては、若干わかりにく
Excel から R に数値・行列 / データフレーム
い部分があるかもしれません。VBA を解説し
を 渡 す た め に は、「Rinterface.PutArray」
た書籍等は多数刊行されていますので、必要に
と「Rinterface.PutDataframe」を利用し
応じて参照してください。
ます。前者は、Excel 上の指定したセル(範囲)
の値を R 上に変数として保存します。たとえ
2. プロシージャ
ば、セル A1 に入力されている数値を R 上に変
RExcel を導入することで、VBA に新たなプ
数 var1 として保存するには、
ロシージャが加わりますが、それらの先頭部分
Rinterface.PutArray ”var1”,
Range(”A1”)
には「Rinterface.」が付いています。ここ
48 ● ESTRELA 2010年11月(No.200)
とします。
紹介したワークシート関数 RApply と RCall に対
後者は、Excel 上の指定したセル範囲を R 上
応します)
。たとえば、前者を使ってセル A1 に
にデータフレームとして保存します。
たとえば、
入力された数値の 2 乗を計算し、その結果をセ
セル A1 から B10 の範囲の値( 1 行目は変数名、
ル A2 に返すときには、
それ以外はデータとする)を、R 上にデータフ
Rinterface.GetRApply
レーム mydf として保存するには、
Rinterface.PutDataframe ”mydf”,
Range(”A1:B10”)
”function(x)x*x”, Range(”A2”),
Range(”A1”)
とします。
「Rinterface.InsertCurrentRPlot」は、
とします。
R 関数で作成した図のコピーを、幅 / 高さ等を
一方、
R から Excel に数値・行列 / データフレー
指定して、Excel 上の任意のセルを左上端とし
ムを渡すためには、
「Rinterface.GetArray」
た領域に貼り付けます。
と「Rinterface.GetDataframe」を利用し
これらのプロシージャの詳細な書式や、その
ます。前者は、R 上の変数に保存されたデータ
ほかのプロシージャ等については、RExcel の
を Excel 上のセル(範囲)に返します。たとえ
ヘルプ(「RExcel」→「RExcel Help」)をご覧
ば、R 上の変数 var1 に保存されている値をセ
ください。
ル A2 に返すには、
Rinterface.GetArray ”var1”,
Range(”A2”)
3. 準備
Excel の起動後、ツールバーの「RExcel」→
「Start R」 を 選 択 し て R を 立 ち 上 げ ま す。 次
とします。
に、VBA のプログラムを作成するため、Visual
後者は、R 上のデータフレームを Excel 上の
Basic Editor( 以 下、VBE) を 立 ち 上 げ ま す。
セル範囲に返します。たとえば、R 上のデータ
Excel のツールバーから「ツール」→「マクロ」
フレーム mydf をセル A1 を左上端とするセル
→「Visual Basic Editor」を選択します。
範囲に返すときには、
VBE(図 1 )が立ち上がりましたら、RExcel
Rinterface.GetDataframe ”mydf”,
Range(”A1”)
図 1 Visual Basic Editor(VBE)
とします。
R 関数を使った命令文を R 上で実行し、そ
の 結 果 を 得 る た め の プ ロ シ ー ジ ャ と し て、
「Rinterface.GetRApply」と「Rinterface.
RunRCall」が あります。 前 者 は 実 行 結 果 を
Excel に返しますが、後者は返さないという違い
があります(それぞれ前回の 2010 年 10 月号で
2010年11月(No.200) ESTRELA ● 49
の機能を VBA で実行できるように設定します。
数 var2 に保存するよう指示しています。5 行
VBE のツールバーの「ツール」→「参照設定」
は変数 var2 に保存されている値をセル A2 に
を選択すると、参照可能なライブラリーの一覧
転送するよう指示しています。以上で R 関連
が表示されます。その中から「RExcelVBAlib」
のコード部分が終わりであることから、6 行で
を探して、選択されているか確認します。ライ
RServer を停止させています。
ブラリー名の前のボックス(□)にチェックマー
上記のプログラムを VBE に入力した上で、
ク(✓)が入っていれば、選択済みです。選択
Excel のシートに戻り、セル A1 に「3」を入力
されていない場合は、同ボックスをクリックして
して(図 3 )
、このマクロを実行します。マク
チェックマークを入れ、
[OK]ボタンを押します。
ロの実行は、Excel のツールバーの「ツール」
最後に、
VBE のツールバーから「挿入」→「標
→「マクロ」→「マクロ」から現れるウィンド
準モジュール」を選択し、プログラムを入力す
ウで、実行したい「マクロ名」を選択して、
[実行]
るコードウィンドウを開きます。
をクリックします。
「マクロ名」は、プログラ
ムの 1 行の「Sub」の後に設定した「Example1」
4. プログラム例
が該当します。実行した結果、3 2 の値である「9」
今回は、簡単なプログラム例を 5 つ紹介しま
がセル A2 に出力されます。
す。前回(2010 年 10 月号)のワークシート関
な お、 図 2 の 3 行 か ら 5 行 を、2 節 で
数を利用した例とほぼ同様な内容を、VBA で
「Rinterface.GetRApply」の例として示し
行うこととします。
た命令文で、置き換えることもできます。
⑴ 数値の計算
⑵ 複数の変数を使った計算
例 1 は、セル A1 に入力された数値の 2 乗し
例 2 では、2 つの変数の相関係数を求めます。
た値を、セル A2 に出力するプログラムです。
使用するデータは、セル A4 から B10 の範囲に
図 2 にプログラムを示します。1 行の「Sub」
入力されている変数 x と y とします(図 3)。
と 7 行 の「End Sub」 は、VBA の 命 令 文 で
図 2 の 9 行 か ら 14 行 が、 本 例 の プ ロ グ ラ
す。この 2 つの間に記述されたコードが、1 行
ム で す。9 行、10 行、13 行、14 行 は 例 1 と
の Sub の 後 に 記 述 さ れ て い る「Example1」
同 じ で す の で、 説 明 は 省 略 し ま す。11 行
という名称のマクロとして処理されます
か ら 12 行 で、 セ ル A4 か ら B10 の 範 囲 を
(
「Example1」の後の半角両括弧は、どのよう
変数名も含めてデータフレームとして扱
な名称のときでも付けます)
。
い( AsSimpleDF(Range(”A4:B10”)) )、
2 行から 6 行が、RExcel によって新たに導
R上 で 変 数xとyの 相 関 係 数 を 求 め
入されたプロシージャを使ったコード部分で
て ( ”f u n c t i o n ( m y d f ) w i t h ( m y d f ,
す。2 行で RServer を開始させています。3 行
cor(x,y))”)
、 そ の 結 果 を セ ル A12 に 返 す
はセル A1 に入力されている数値を変数 var1
(Range(”A12”))よう指示しています。
として R に保存するよう指示し、4 行は R で
上記のプログラムを「Example2」として、
変数 var1 の 2 乗を計算し、その計算結果を変
先ほどの「Example1」のプログラムの後に入
50 ● ESTRELA 2010年11月(No.200)
フリーソフトによるデータ解析・マイニング
図 2 Example1 〜 5 のプログラム
1行
2行
3行
4行
5行
6行
7行
8行
9行
10行
11行
12行
13行
14行
15行
16行
17行
18行
19行
20行
21行
22行
23行
24行
25行
26行
27行
28行
29行
30行
31行
32行
33行
34行
35行
36行
37行
38行
39行
40行
41行
Sub Example1()
Rinterface.StartRServer
Rinterface.PutArray "var1", Range("A1")
Rinterface.RRun "var2<-var1*var1"
Rinterface.GetArray "var2", Range("A2")
Rinterface.StopRServer
End Sub
Sub Example2()
Rinterface.StartRServer
Rinterface.GetRApply "function(mydf)with(mydf, cor(x,y))", _
Range("A12"), AsSimpleDF(Range("A4:B10"))
Rinterface.StopRServer
End Sub
Sub Example3()
Rinterface.StartRServer
Rinterface.PutArray "mat1", Range("A5:B10")
Rinterface.RRun "mat2<-t(mat1)"
Rinterface.GetArray "mat2", Range("A14")
Rinterface.StopRServer
End Sub
Sub Example4()
Rinterface.StartRServer
Rinterface.RunRCall "function(mydf)with(mydf, plot(x,y))", _
AsSimpleDF(Range("A4:B10"))
Rinterface.InsertCurrentRPlot Range("C17"), _
widthrescale:=0.3, heightrescale:=0.3, closergraph:=True
Rinterface.StopRServer
End Sub
Sub Example5()
Rinterface.StartRServer
Rinterface.PutDataframe "mydf", Range("A4:B10")
Rinterface.RRun "out<-summary(lm(y~x, data=mydf))"
Rinterface.GetArray "out$coef", Range("B30")
Rinterface.GetArray "t(colnames(out$coef))", Range("B29")
Rinterface.GetArray "rownames(out$coef)", Range("A30")
Rinterface.StopRServer
End Sub
力します。セル A4 から B10 のデータを変数名
VBA で定義されている記号で、その行に書か
も含めて入力した上で、例 1 と同様な手順で
れている命令文は、次の行にも続いていること
「Example2」マクロを実行すると、図 3 の 12
を表します。11 行と 12 行を 1 つの行で記述す
行に示す結果が得られます。
るときは、この「_」を削除した上で、12 行の
な お、 図 2 の 11 行 の 末 尾 に あ る「_」 は、
内容を 11 行の末尾から続けて記述します。
2010年11月(No.200) ESTRELA ● 51
⑶ 行列の計算
と し て 保 存 し、19 行 は 行 列 mat1 の 転 置 行
例 3 では、行列の計算を行います。図 3 の変
列(t(mat1))を行列 mat2 に保存し、20 行
数 x と y の数値部分のみに注目して 6 行 2 列
は行列 mat2 をセル A14 を左上端とする範囲
の行列とみなし、それを R に転送して転置し、
(Range(”A14”))に戻すよう指示しています。
転置行列を Excel に戻します。
このプログラムを「Example3」として、例
図 2 の 16 行から 22 行が、本例のプログラム
2 のプログラムの後に入力・実行すると、図 3
です。18 行はセル A5 から B10 の範囲のデー
の 14 行から 15 行に示す結果が得られます。
タ(Range(”A5:B10”))を R 上に行列 mat1
図 3 各 Example の実行結果
52 ● ESTRELA 2010年11月(No.200)
フリーソフトによるデータ解析・マイニング
⑷ 作図
に デ ー タ フ レ ー ム(”mydf”) と し て 転 送 す
例 4 では、変数 x と y の散布図を描きます。
るよう指示しています。36 行は、R 上で関数
図 2 の 24 行 か ら 31 行 が、 本 例 の プ
lm を 利 用 し て 回 帰 分 析 を 実 行 し(lm(y~x,
ロ グ ラ ム で す。26 行 か ら 27 行 は、 セ
data=mydf))、 そ の 結 果 の 要 約( 関 数
ル A4 か ら B10 の 範 囲 に あ る デ ー タ を
summary)を out に保存するよう指示してい
データフレームとしてRに取り込み
ます。そして、out に保存されている情報のう
( AsSimpleDF(Range(”A4:B10”)) )、関
ち、37 行では得られた推定値等(”out$coef”)
数 plot を 使 っ て 作 図(”function(mydf)
をセル B30(Range(”B30”))を左上端とする
with(mydf, plot(x,y))”)するよう指示し
範 囲 に、38 行 で は「Estimate」 な ど の 項 目
ています。この命令によって、新たなウィンド
名(”t(colnames(out$coef”) を セ ル B29
ウに変数 x と y の散布図が描かれます。28 行
(Range(”B29”))から右側のセル範囲に、39
から 29 行は、その散布図のコピーを Excel 上
行では変数名(”rownames(out$coef)”)を
のセル C17 を左上端とした範囲に、指定した
セル A30(Range(”A30”))から下の範囲に、
幅と高さ(ともに 0.3)で貼り付け、もとの散
それぞれ返すよう指示しています。
布 図 は 削 除(closergraph:=True) す る よ
上記のプログラムを Example5 として入力・
う指示しています。
実行した結果が、図 3 の 29 行から 31 行の部分
このプログラムを Example4 として入力・
になります。
実行した結果が、図 3 の 17 行から 27 行の範囲
にある図です。
5. おわりに
Excel のツールバーの「RExcel」→「Demo
⑸ 統計モデル分析
Worksheets」→「Writing macros」にはマクロ
最後の例は、変数 x と y を利用した回帰分析
を使った例が示されています。今号の例と同じ
です。
R 関数を使った作業を、異なるコードで実行し
図 2 の 33 行 か ら 41 行 が、 本 例 の プ ロ
ているケースもあります。また、今回は紹介で
グ ラ ム で す。35 行 は、 セ ル A4 か ら B10
きなかったプロシージャも利用されています。
の範囲にある変数 x と y のデータセット
関心のある方は、必要に応じて参照してくださ
(Range(”A4:B10”))を変数名も含めて R 上
い。
2010年11月(No.200) ESTRELA ● 53
Fly UP