サンプル分析

分析フローの実行

それではサンプル分析を始めましょう。まずはフローについて説明します。 フローは下図のように、図形(またはアイコン)とそれを繋ぐ矢印で構成されています。

図形やアイコンを「ノード」と呼び、ひとつひとつがデータの「処理」に対応します。 たとえば、一番左上の library と記されたノードをクリックしてみましょう。 フローの上に library(MASS) というRスクリプトが現れたはずです。 これは MASS という名前のライブラリを読み込んで、 さまざまな関数やデータを利用可能にする処理を示しています。

同様に次の data と記されたノードをクリックすると、 data(Boston) というスクリプトに対応していることがわかります。 これは Boston という名前のデータセットを読み込む処理を示しています。 このアイコンは、データやオブジェクトなどを読み込む処理を表します。

視線を左下に移すと、 data.entry と記されたノードがあります。 このノードはデータの内容を表形式で表示する処理に対応しています。

では、ここまでの一連の処理を実行してみましょう。 data.entry ノードを右クリックし、「実行」を選択します。

すると、フローの最初である library から始まり、 datadata.entry の順で処理を行います。 つまり、「ライブラリの読み込み」→「データの読み込み」→「データの表示」という一連の処理が実行されます。 実行すると以下のようなウィンドウが開き、データの中身を確認することができます。

データについて

このデータは論文 Harrison and Rubinfeld (1978) で使用されたもので、ボストン郊外の環境と住宅価格の関連を調べる目的で作成されたものです。 14番目の変数 medv が各地区の住宅価格の中央値(全体のちょうど真ん中にあたる価格)を表し、 その他の変数はさまざまな環境要因を表します。例えば tax は固定資産税の税率を、 chas は チャールズ河の流域であるかどうかを 0 / 1 で示します。 データについての詳細は上記の論文か、またはRのMASSパッケージのヘルプを参照してください。 Rでは library(MASS) を実行後、?Boston で確認することができます。

分析の目的

これからBostonデータの分析を始めますが、本来の分析目的は多数の要因が複雑に絡み合った難しい問題です。 そこで、ここではもう少しシンプルな目的を設定しましょう。 私たちの目的は環境要因の変数に基づいて住宅価格を予測することとします。 つまりBostonデータの medv 変数を、それ以外の変数に基づいて予測するための分析を行います。

注意

このチュートリアルにおけるサンプル分析は、R AnalyticFlowの操作方法の解説を優先して作成しています。 より実際のデータ分析に即した形になるよう配慮しておりますが、 統計理論的にあまり望ましくない方法で分析を行っている点もございます。 あらかじめご了承ください。

データの探索

まず手始めに、データセット中のそれぞれの変数が住宅価格 medv とどのように関連しているかを調べましょう。 この処理に対応するのは下図の plot ノードです。右クリック→実行を選択してください。

コンソールウィンドウでスクリプトが実行されますが、特に何も起こっていないように見えます。 ここでは medv 変数を他の全ての変数と比較するプロットを表示するため、 ユーザーがエンターキーを押すたびにプロットが切り替わるようになっています。 コンソールウィンドウを見ると、以下のようにエンター(Return)キーを押すように促されています。

注意

お使いの言語環境によっては文字化けが生じることがあります。 R AnalyticFlowライブラリパックを追加インストールすることで解決できます。

文字が表示されている下の領域を左クリックしてフォーカスを移し、エンターキーを押します。 エンターキーを押すごとに、グラフィックウィンドウの表示が切り替わります。 例えば、dis 変数(ボストン雇用センターからの距離)と 住宅価格 medv の散布図は以下のようになります。

いくつか散布図を眺めてみると、どうやら medv 変数は歪んだ分布をしており 数値の低いほうに値が集中する傾向があるようです。 そこで、 medv を対数変換した散布図を見てみることにしましょう。 先ほど実行した plot ノードをダブルクリックすると、ノードの編集を行うことができます。

「コード」を直接書き換えることもできますが、ここでは「関数オプション」の「値」で medv ~ . となっているところを log(medv) ~ . と書き換えてみましょう。 書き換えが終わったらエンターキーを押し、OKをクリックすると編集が完了します。

それでは書き換えたノードを実行してみましょう。

いくつかの変数では対数変換によってより線形に近い関係が見られるようですが、 更に他の変数にも変換を試みることにします。 一般的にはこのような探索的な分析を繰り返しているうちに、分析全体の流れを見失ってしまいがちです。 R AnalyticFlowでは以下のように分析フローの支流を設けることで、 探索的分析を全体の流れと分けて整理しながら分析を行うことができます。

ところで、対数変換を施した medv はどのような分布をしているのでしょうか。 新たにノードを追加してヒストグラムを作成しましょう。ここでは下図の attach ノードの次に新しいノードを作成することにします。 まず attach ノードを選択してください。

選択して色が変わったことを確認したら、コントロールキーを押しながらエンターキーを押します。 するとノードの編集ダイアログが表示されますので、「コード」に hist(log(medv)) と入力しましょう。 入力が終わったらエンターキーを押し、OKをクリックするかもう一度エンターキーを押します。

すると、新しく hist ノードが生成されます。 ノードをドラッグして見やすい位置に移動しておきましょう。 このノードを実行すると、左右対称よりやや偏った分布になっていることが確認できます。

Rエキスパートの方へ

すでにRの利用に習熟した方にとっては、分析を行うごとにノードを作成する方法を面倒だと感じるかも知れません。 そのような場合、コンソールウィンドウから直接Rコードを入力することが可能です。 このときエンターキーを押すと通常のRプロンプトと同様にコードが実行されますが、 コントロールキーを押しながらエンターキーを押すと入力したRコードに対応するノードが生成されます。 この方法は、トライアンドエラーを繰り返しながら分析を行うRエキスパートの方に最もお勧めする方法です。

データの加工

データの探索的分析を行った結果、いくつかの変数を対数変換することで うまく線形な関係を作り出せそうだということがわかりました。 この変換をまとめて行っているのが、以下の「変数変換」ノードです。

このノードは今まで見てきたものとは違い、複数行のRスクリプトに対応する「自由記述ノード」です。 自由記述ノードは基本的に四角形で表示され、まとまった動作を1ノードにまとめて記述する場合や ifwhile などの制御構文を記述する際に利用します。 これまで見てきたものは「一行ノード」と呼び、オブジェクトに付値するものは丸、 動作のみで付値を行わないものは三角、その他の特殊な動作は各種のアイコンで表示されます。

自由記述ノードの編集も、一行ノードと同様にノードをダブルクリックすることで行うことができます。 今回の例では、以下のようにRスクリプトが記述されています。 ここでは dislstat の2変数を対数変換し、dat オブジェクトに付値しています。

新しく自由記述ノードを作成する場合は、キャンバス(フローを記述する領域のこと)の何もない部分で 右クリックし、「自由記述ノードの作成」を選択します。作成されたノードにフローを接続するには、 接続元となるノードをクリックした状態で接続先のノードを中ボタンクリックします。 中ボタンがない場合は、Altキーを押しながらクリックすることで接続することができます。 一行ノードについても同様の方法で作成・接続することが可能です。

サンプリング

予測モデルの構築を始める前に、データを学習用と検証用に分割する作業を行います。 今回のデータ分析は予測が目的ですが、全てのデータを用いて予測モデルを作成してしまうと モデルによる予測精度を適切に測ることができません。 そのため、学習用データを用いてモデルを作成し、検証用データを用いて予測精度の測定を行います。

サンプリングは以下のノードで実行します。 このアイコンは「ランダム」な処理を行うことを示します。

このノードをダブルクリックすると、その中身は自由記述ノードであることがわかります。 先ほどの説明のとおり自由記述ノードは基本的に四角形で表しますが、 このように特殊な機能を持ったノードには適切な形状を指定することができます。 ノード形状の設定は編集ダイアログの「プロパティ」タグ内で行うことができます。

ノードのプロパティとして、コメントを入力することも可能です。 入力したコメントはノードのツールチップとして表示されます。 ノードにカーソルを近づけてしばらく静止すると、コメントが表示されます。

モデリング

それでは予測モデルの作成を行います。 このサンプルフローでは、以下のようにふたつのモデリングノードが配置されています。

上流にあるノードは、log(medv) を他のすべての変数から予測する線形回帰モデルを作成します。 支流にある summary ノードを実行してみましょう。 学習用データからモデルを推定し、推定結果のサマリを表示します。

実行すると、モデルの推定結果がコンソールウィンドウに表示されます。 係数に関する推定結果を以下に抜粋します。

いくつかの変数は有意ではないようです。 ここから変数間の因果関係を読み取ることは困難ですが、 少なくとも全ての変数を予測に用いることは避けたほうが良さそうです。

最適な予測を与える変数セットを探索するために、ここではステップワイズ法を用いることにします。 ステップワイズ法に対応するノードは二番目のモデリングノードですので、ここではその下にある summary ノードを実行します。

実行結果は以下のようになります。

いくつかの変数がモデルから除去され、モデルに採用された全ての変数が有意に推定されました。 本来は回帰診断など様々な角度からモデルの評価を行うべきですが、 ここでは省略してこのモデルを採用することにします。

予測

先ほど推定したモデルを用いて、検証用データに対して予測を行ってみましょう。 予測ノードの次に配置された plot ノードには、予測値と実績値の比較プロットが記述されています。

実行すると以下のようなプロットが得られます。

横軸が実績値、縦軸が予測値です。対数変換されているため見方には注意が必要ですが、 比較的よく予測されているように見えます。

念のためヒストグラムも作成してみましょう。plot ノードを選択した状態で コントロールキーを押しながらエンターキーを押し、「コード」に hist(mod$resid) と入力します。 エンターキーを押して確定させ、OKをクリックまたはもう一度エンターキーを押すとノードが生成されます。 右クリック→実行を選択するか、またはコントロールキーを押しながら R を押すと実行されます。

左右対称に近い誤差分布であることが確認できます。 全体的に誤差も小さく、当てはまりはそこそこ良いと考えてよさそうです。

結果の保存

最後に予測結果をデータファイルに書き出します。 今回はサンプル分析なので必ずしも必要な作業ではありませんが、 実際にデータ分析の結果を活用するシーンではしばしば必要となります。

データの書き出しは以下の write.table ノードで行います。

その前にある丸いノードは、予測結果をデータフレームに書き出しています。 このデータフレームの中身を print 関数などで確認することは良い復習になるでしょう。

注意

以前のマニュアルではdata.entry関数を利用するよう記述していましたが、動作しません (2008年1月現在、R-2.6.1。data.entry関数がnumericまたはcharacterしか扱うことができないため)。

データを書き出す際には、現在の作業ディレクトリの書き込み権限を持っていることを確認してください。 書き込み権限がない場合は作業ディレクトリを変更するか、データの出力先を別のフォルダに変更します。

作業ディレクトリは標準では .rflow ファイルのある場所となりますが、 必要に応じてメニューの「設定」→「作業ディレクトリの変更」から変更することができます。

データの出力先を変更する場合は、write.tableノードをダブルクリックして編集します。 変数リストの最初にあるfileの値が"prdata.csv"に設定されているので、これを変更しましょう。 値("prdata.csv")をダブルクリックして編集することもできますが、もっと簡便な方法が用意されています。 値を右クリックして「ファイルの選択」をクリックすると、ファイル選択ダイアログが表示されます。 ここから例えばデスクトップやマイドキュメントを選択し、好きなファイル名(日本語は避けたほうが無難です) を入力することで、簡単に出力先のファイルを変更することができます。

これで一連の分析は完了ですが、現在の分析を再開するときのために分析結果を保存しておきましょう。 メニューの「ファイル」→「名前をつけて保存」でフローを保存しておけば、フローを実行することで 前回の分析結果を復元することができます。

もうひとつの方法として、Rのワークスペース全体を保存することもできます。 これは save.image 関数を利用することで可能です。 ここでは画面左の「関数」タブをクリックし、関数ツリーからノードを生成してみましょう。 ツリーの「出力」をダブルクリックして開き、さらに「R」を開きます。 「Rワークスペース」と書かれたエントリをキャンバスにドラッグ&ドロップすると ノード編集ダイアログが現れます。ここでは何も入力せずにOKを選択し、新しいノードを生成します。

接続元のノードを選択した状態で save.image ノードを中クリック、 または Alt キーを押しながらクリックし、ノードをフローに接続します。

これを実行すると作業ディレクトリに .RData というファイルが作成されます。 このファイルを load 関数で読み込むことで、同じ状態から分析を再開することができます。