SPSS Modeler Flowで決定木をつくる


# はじめに
赤石です。
2021年5月21日に実施されたイベント [IBM Cloud Festa Online2021](https://ibmcloudfesta.github.io/online2021/) でWatson Studio上のサービスである**SPSS Modeler Flow**を使って、タイタニック・データセットを対象に決定木のモデルを作る話をしました。
当記事は、そこで見せた内容を、自分の環境で再現するための手順となります。

# SPSS Modeler Flowの特徴
最初に冒頭でご紹介したプレゼンのメッセージの抜粋をお伝えします。
決定木はPythonのOSSライブラリであるscikit-learnでも作ることができます。しかし、その場合と比較して、ここでご紹介するSPSS Modeler Flowは次の特徴があります。

* 完全にプログラミングレスにモデルを作れる
* 欠損値に対して特別な処理を行わず決定木モデルを作れる(精度は問わなければという前提は入ります)
* カテゴリ変数のダミー化の処理も不要
* データ項目名が日本語のままでツリーの判断ロジック表示ができる(scikit-learnでは視覚化ツールが日本語対応していないのでこれができない)

全体を通じて、プログラミングが苦手なユーザーに取ってとても便利な分析ツールであるということができます。




# 前提条件

## Watson Studio
IBM Cloudでライト・アカウントのユーザー登録がされていて、かつWatson Studioのプロジェクトまでが作成済みであること。
手順については、下記のリンクを参照してください。
[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)

## CSVファイル
デモで利用するタイタニック・データセットのCSVは、次のリンク先から事前にダウンロードしてください。
[タイタニック・データセット](https://raw.githubusercontent.com/makaishi2/sample-data/master/data/titanic_j.csv)

# 実習手順
それでは、早速実習を始めてみます。まず、下のようなプロジェクト管理の初期画面が表示されていることを確認してください。

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cd94e640-4395-eb34-3a9e-f6c878c0b6b2.png)


## CSVファイルアップロード


赤枠で示した「Newデータ資産」のリンクをクリックし、画面の指示に従ってCSVファイルをアップロードします。正しくできると下の画面のようになるはずです。

![スクリーンショット 2021-05-13 19.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/16cfa80c-78f1-d962-6b3c-3d148c099bb3.png)


これで最初のステップの「CSVファイルアップロード」は完了です。

## 新規フローの作成
次の上の画面で、右上の「プロジェクトに追加」をクリックします。

下の画面になったら、「 Modelerフロー」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6a42adb5-9cc0-faf2-41be-c21a02a5bbb9.png" width=50%>

次の画面になったら、「名前」の欄に「決定木分析（タイタニック）」などと入力し、画面右下の「作成」ボタンをクリックします。

![スクリーンショット 2021-05-13 19.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/179f5b8f-2a68-e211-8359-b7c0473315bd.png)

しばらく待って、次の画面がでてくれば、新規フローの作成に成功しています。
![スクリーンショット 2021-05-13 19.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/43041634-a9f7-dc99-dbce-d8d211bcd1b3.png)

## ノードの配置と結線
SPSS Modeler Flowは、有名なNode-REDと同じく、ビジュアルプログラミング環境です。「ノード」と呼ばれる部品を左側の「パレット」から中央の「キャンパス」にドラックアンドドロップして配置し、ノード間を結線することで、プログラムを組み立てていきます。
最初に今回のデモで使うノードをすべて配置することにします。
以下の部品を配置してみて下さい。

「インポート」「データ資産」
「出力」「データ検査」
「フィールド操作」「タイプ」
「フィールド操作」「パーティション」
「モデル作成」「C5.0」

それぞれの部品の配置は、その後の結線のことを考えて下の図のようにして下さい。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/472cfbc2-0470-fb01-59a0-a6ca7aa15095.png" width=70%>

更にノード間の結線を行います。慣れないと一番最初が難しいかもしれませんが、マウスポインタを結線したいノードの右側に移動すると、下のような矢印アイコンが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/83081f5f-5fb2-4763-7f42-275b7c092f94.png" width=40%>

そこで、結線先に向かってドラックアンドドロップすると、うまく結線ができます。下のような接続ができれば結線作業は完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c1e21c13-c66a-5397-2cf4-15b21cca5fa7.png" width=70%>

結線が終わったら、個別のノードの属性を設定していきます。

## データ資産ノードの設定
最初に設定するのは左上のデータ資産ノードです。このノードをダブルクリックして下さい。

![スクリーンショット 2021-05-13 19.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fa76cfd3-7304-379b-a732-b04379fc1e83.png)

すると、上の様な画面が出てくるので

①「Data Asset」をクリック
②2段階目の選択肢として「titanic_j.csv」が出てくるので、このファイルを選択
③最後に画面右下のOKを選択

とします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/be54120c-68c0-4024-5cde-2852f61c2b85.png" width=30%>


上の画面になったら「保存」をクリックして下さい。

下の図のようにノード名称が「titanic_j.csv」に変わっていたら、設定に成功しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/624d9a5c-c6ec-3356-a5c3-34edbedd3ad3.png" width=50%>

設定ができたら、プレビュー機能を使って、データの中身を確認してみます。
ノードでマウス右ボタンクリックで下のコンテキストメニューを表示し、「プレビュー」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a522dd71-79c9-8e71-2ae4-156a0db702e9.png" width=40%>


下のようなパネルが出てきたら、プレビューに成功しています。

![スクリーンショット 2021-05-13 19.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e164d208-6618-50d3-d1e3-85aec6a84531.png)

ポップアップパネル右上の閉じるアイコンで、ポップアップを閉じて下さい。

## 検査ノードでの確認
次に検査ノードを使ってデータの状態を確認してみましょう。
最初に検査ノードの真上にマウスポインタを移動して、右ボタンでコンテキストメニューを表示します。今度は、一番下の「実行」を選択して下さい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c7dbd09a-bd43-5d54-34f8-5a26bb8a07ce.png" width=40%>

下のような画面になったら、「Data Audit」の右側の目のアイコンをクリックして下さい。

![スクリーンショット 2021-05-13 19.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/53be175c-93e9-a3b9-3b94-68c89cb8f28c.png)

下のようなデータの散布図などの情報が表示されます。

![スクリーンショット 2021-05-13 19.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/98912296-2900-886f-2120-225c4bde026b.png)

画面をもっと下にスクロールすると、次の画面のように項目ごとの欠損値の状態などもわかるようになっています。

![スクリーンショット 2021-05-13 19.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/bb31f3fa-25f9-4ec0-c305-e46c89be4976.png)

上の表から「年齢」には177個の欠損値が、「乗船港コード」には、2個の欠損値があることが読み取れます。Python & scikit-learnで決定木を作る場合、前処理としての「**欠損値対応**」が必要なケースですが、SPSS Modeler Flowの場合、このまま**特別な対応をとらなくても決定木のモデル構築が可能**です。
確認が終わったら、画面左上の「フローに戻る」のリンクをクリックします。

## タイプノードの設定
次に、モデルを作る上で最も重要なタイプノードの設定をします。まず、タイプノードをダブルクリックして下さい。

下の画面が出てきたら、まず画面中程の「値の読み込み」をクリックして下さい。

![スクリーンショット 2021-05-13 20.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/648b960a-2fe9-001a-bbc4-db67ae35b467.png)

これにより、CSVのデータを全部読み取り、結果に応じて各項目の自動設定をします。
次に下の画面で「生存」「等室」「乗船港コード」のロールを「なし」に変更して下さい。今回利用するデータセットでは、上と同じことを意味する別の項目が存在するため、情報のダブりをなくす目的でこの設定をします。 参考までに、Pythonで同じ処理をする場合は、データフレームのdrop関数を使う形になります。

![スクリーンショット 2021-05-13 20.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d636af43-71fa-bba6-a02e-9fc7f451111e.png)

設定後は、下の画面のようになるはずです。

![スクリーンショット 2021-05-13 20.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0ecd0661-5e0c-fbc4-c21a-68df196f150f.png)

次にこのリストをスクロールダウンして、一番下の項目まで表示させます。
そして、下から2つめの「**生存可否**」の項目の**ロールを「入力」から「ターゲット」に変更**して下さい。この項目が**目的変数であることを教えるための設定**です。

![スクリーンショット 2021-05-13 20.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d9f66430-620a-dad7-f413-4faf67d3fba6.png)

この他、「**指標**」の値を手で修正することが必要な場合もあるのですが、今回はその必要はありませんでした。
Python & scikit-learnで決定木モデルを作る場合、**指標値が「フラグ型」「名義型」となっている項目に対してはモデル構築前に前処理が必要**です。しかし、SPSS Modeler Flowでは**「指標」の設定さえ適切にできていれば、後の処理はユーザーは意識しなくてOK**です。これもSPSS Modeler Flowの特徴の一つになります。
設定が正しくできたら、下の画面右下の「保存」ボタンをクリックします。

![スクリーンショット 2021-05-13 20.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/85d07b8c-f9e7-468e-c267-8b873daca584.png)

## パーティションノードの設定
次にパーティションノードの設定をします。パーティションノードをダブルクリックすると、下の画面が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5d71b7b3-4e3e-e477-c1b3-b381d9bf3807.png" width=40%>



ここで、
トレーニング：パーティション: 70
テスト・データ区分：30
シード: 123
を設定し、画面右下の「保存」ボタンをクリックします。

## モデルの構築
これで、モデル構築のためのすべての準備はできました。
下の画面で「実行」をクリックすると、学習が始まります。

![スクリーンショット 2021-05-13 20.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/35e68313-5662-ca0b-8503-6cf96e414205.png)

下の図のように新しくオレンジ色のノードができていれば、学習に成功しています。

![スクリーンショット 2021-05-13 20.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6151a246-e78e-1294-3bd1-bc77420f0f6d.png)

## 結果の確認

このノードにマウスポインタをあわせて、コンテキストメニューを表示させて下さい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c6bc0e9c-a1e1-7d82-7715-a81292d99c1c.png" width=40%> 


メニューから「モデルの表示」を選択します。

![スクリーンショット 2021-05-13 20.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/34ee5e61-526a-95d2-eea6-767b3636fbee.png)

上の画面が表示されるので、下から3つめの「ツリー図」をメニューから選択します。

![スクリーンショット 2021-05-13 20.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/67260a68-2ca7-3d9b-196a-bc7c2926926f.png)

上の様な図が出てくるので、「分類のラベルの表示」にチェックをつけた上で、ツリー図を拡大してみて下さい。

![スクリーンショット 2021-05-13 20.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/08abe55e-8149-3205-e749-41ff37421516.png)

上の図が、最終的な結果です。**生き残れたかどうかの一番重要な要素は「性別」**で次の要素は**「等室」（一等室の方が生き残る確率が高かった）や「成人男子」（男でも子供は優先して救出された）**など、当時の生々しい様子が、ツリーによる分析結果から読み取れます。

## 精度の分析
最後に今作ったモデルの精度分析をしてみましょう。

パレットから「出力」「精度分析」のノードをドラッグアンドドロップし、学習済みモデルと結線します。下の図の赤枠で囲まれた部分が、新たに追加されたところです。

![スクリーンショット 2021-05-13 20.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/819d0db8-03b4-682d-b5c0-565d429f7fc1.png)

次の「精度分析ノード」をダブルクリックします。下の画面が出て来るので、「一致行列」にチェックを入れて、右下の保存ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9e550bd0-f7ed-81e4-e26e-f6304c2225bf.png" width=50%>

「精度分析ノード」のコンテキストメニューを表示させ、実行ボタンをクリックします。

実行後の様子が、次の画面になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e8d3499b-b7c1-e49d-434f-071038a82738.png" width=50%>

赤枠で囲んだ部分が、検証データに対する混同行列です。

# まとめ
以上、とても簡単な操作で決定木のモデルが作れる、しかも判断ロジックの確認もお手軽にできることを確認しました。
タイタニックデータセットでは欠損値があり、今回は**欠損値を持った状態のままでモデルを作った**ことになります。
あるいは、scikit-learnでモデルを作る際に必須の手順である**カテゴリ変数のダミー変数化は、タイプノードで「名義型」が正しく設定されていれば、自動的に内部で対応**してくれています。
こうした点もscikit-learnではできない便利な点です。
全体を通じて、プログラミングが苦手なユーザーに取ってとても便利な分析ツールであるということができます。

# おまけ(作成済みフローの読み込み)
今回ご紹介した手順は、Pythonに比べるとはるかに簡単なものですが、もっと簡単に決定木の結果だけ確認したい方のために、構築済みのフローもGithubにアップしておきました。

[SPSS flow](https://github.com/makaishi2/sample-data/blob/master/spss/%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90%EF%BC%88%E3%82%BF%E3%82%A4%E3%82%BF%E3%83%8B%E3%83%83%E3%82%AF%EF%BC%89.str)

以下にこのフローをダウンロードして、より簡単にモデル構築をする手順を説明します。
「プロジェクトに追加」「Modeler フロー」の選択までは同じで、下の画面から

![スクリーンショット 2021-05-13 21.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7425aba0-990b-ffd0-de07-0091dd3acd79.png)

①「ファイルから」タブを選択
②画面左下のガイドに従い、フローファイルをアップロード
③画面右下の「作成」ボタンをクリック

読みが完了したら、画面上部の「実行」ボタンをクリックすると、モデルが構築され、モデルの表示も可能になります。

IBM Cloud Festa で使った発表資料は[こちら](https://speakerdeck.com/makaishi2/spss-modeler-flow-dechu-karuaiwotukuru)