SPSS Modelerでインタラクティブ・ツリーをつくる

SPSS Modelerの決定木モデルのC&RT、CHAID、QUESTにはインタラクティブ・ツリー・ビルダーの機能があります（C5.0にはありません）。

決定木モデルはC&RTならジニ係数、CHAIDならカイ二乗値などの統計的な指標に基づいて、自動的にツリーを作成してくれます。しかしながら、以下のようなケースでは、ツリーを分割する変数や閾値を分析者がマニュアルに指定したいことがあります。

- カテゴリ毎に異なるロジックで分けたいので、最初の分岐は人が選んだカテゴリで分類したい。 例：装置毎に違うツリーを作りたい。カードのブランド毎に違うツリーを作りたい
- 装置運転の観点から調整がしやすい変数と調整が難しい変数がある。多少、精度がおちても調整のしやすい変数で分岐したい。例：振動は調整が難しいが、温度は調整可能
- 閾値が細かすぎると機械に設定ができない。例：最高温度：32.1のような細かい値は設定できないので30度で設定したい

この記事は[SPSS春のユーザーイベント2025]()の三井化学　松下様のご講演の[「三井化学の製造現場におけるSPSSを活用した課題解決事例」](https://speakerdeck.com/jpspss/20250604spsschun-04-1-san-jing-hua-xue-song-xia-yang-zi-liao)でご紹介いただいたインタラクティブ・ツリーの解説です

# インタラクティブ・ツリーをつくる

以下のようなデータを用意しました。
振動、温度、電力、油塗布、スイッチ、故障の列があります。


![{95D47883-B36F-43B4-BD8E-F5BAE0A7C956}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/774ade14-06b4-430c-9435-c9b15c1a88cc.png)


「データ型」ノードで「値を読み込み」、「故障」列のロールを「対象」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/252ae14a-a23c-4dfb-bd42-97ac64e0f1c1.png)


「作成オプション」タブで「インタラクティブセッションの起動」を選択し、『ツリーディレクティブを使用」にチェックを入れて「実行」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5f7e7467-4d0e-46cc-bda8-c3fcdbb0021e.png)


## ツリーを分割する変数を選ぶ
ルート・ノードのみが表示されますので、右クリックで「ユーザー設定の分割で枝葉を成長」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/44ec3b57-b93c-4358-8708-99737f52e951.png)

枝葉を分割する変数を選びます。デフォルトでそのアルゴリズムで一番統計的に有意な変数が、最も有効な閾値で選ばれています。
以下の例では「振動」が72.5で分岐することが選択されています。

![{21730C3C-0775-48D4-A9C0-229A564EB969}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fcac2c3e-0e87-41a2-9615-8ce970a5db7a.png)

故障を予測するのであれば、「振動」を選んでもいいかもしれませんが、故障が発生しないようにコントロールするのであれば、「振動」は意図的に起こしたり、抑え込んだりすることが難しい変数かもしれません。

そこでここでは、装置側でコントロール可能という想定で「温度」を選んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ac1f3697-9bd5-4f08-ac8e-7bcb27590baa.png)

そうすると以下のように、「温度」が259.5を閾値に枝葉が作られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/60c913de-7e4c-427e-ac37-ce67e5adfbaa.png)

## ツリーを分割する変数の閾値を編集する
しかし、259.5度は細かくて装置の「温度」として設定できないと想定します。
ルート・ノードで右クリックをして「枝を削除」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0cbec002-ce2b-4868-82f4-0ae7e94a4644.png)

ルート・ノードのみの状態に戻りますので、再度、右クリックで「ユーザー設定の分割で枝葉を成長」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/44ec3b57-b93c-4358-8708-99737f52e951.png)

予測値に「温度」を選び、分割を「ユーザー設定」を選び、「次の値以下」に「260」を設定してみます。259.5ではなく260を閾値に変更しています。そして、「成長」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/84900422-d7d9-4599-aecb-39315b5b56e0.png)

すると以下のように「温度」が260度の閾値でツリーを作る事ができました。
![{804CFA2A-E84D-4900-B54F-D9FFB682D401}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9ae18cbf-7a91-4405-ba5e-307492103f56.png)

さらに260度以下のノードを右クリックして、さらに枝葉を成長させてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d1a50bb4-0d33-41b7-9e0a-30e0afa5fe74.png)

予測値に「電力」を選び、分割を「ユーザー設定」を選び、「次の値以下」に「860」を設定してみます。863.5ではなく860を閾値に変更しています。そして、「成長」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a5e60a22-838b-4d94-8747-6735bd14bcbd.png)

「度数情報を表とグラフで表示」クリックしてみると、以下のようなツリーが出来上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b7af2751-5cd0-4db4-bdc0-68d5fddd160a.png)

## インタラクティブ・ツリーでつくったモデルのナゲット出力と定義の保存
これでモデルとして利用可能だと判断した場合は、ここでモデルを出力することができます。

「生成」メニューから「モデルの生成」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e5d1035c-e936-4ecb-a1b8-58d8a4944912.png)

ノードの生成先が「キャンパス」であることを確認して、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/14dff9d3-99c1-4d2b-849e-fdf47f047442.png)

また、「ファイル」の「ディレクティブ（式）の更新」を選び、このツリーの定義を保存し、「×」で閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/90df4796-b2dc-4a1d-a75a-e6fd7e76cc2b.png)

モデルナゲットがキャンパスにできていますので、「データ型」ノードに接続し、後続に「精度分析」ノードをつけて実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/783cdc08-a558-44a1-8ddd-f3b8c8edb691.png)

自動作成したモデルと同様に精度も確認ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6a2e2c72-e354-4d43-b2df-023a4defad3f.png)

モデルリンクを作っておきます。モデルナゲットをクリックして、「モデルリンクを定義」を選んで、「C&RT」のモデル作成ノードをクリックします。
![{36A842A8-F6DB-4C8A-AB09-B7B5369EFCEE}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0b4d8829-5631-4639-8ff0-aeded1e368ee.png)

以下のようにモデルリンクも作成されて、関係がわかりやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d28dcfe-209d-4b24-a1d1-38b90d1424bd.png)

# TIPS
### カテゴリ型の場合の編集
カテゴリ型を選ぶと以下のように、カテゴリをどちらに振り分けるかを選べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/de00d640-252c-42ec-8ac2-f6140b015d38.png)

### CHAIDの連続値の条件の編集
閾値をマニュアルで編集することはできません。
ただ複数の閾値を選択して、「グループ化」することはできます。
以下の「温度＞248 and 温度 <=250」と「温度＞250 and 温度 <=252」をグループ化してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c0bf3c5e-f649-4c5c-a3b8-dcf01744f84b.png)

「温度＞248 and 温度 <=252」というように条件が組み合わせられました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fac52be5-880d-4c6e-af8b-fc2f510f26fa.png)

「値のグループ化を解除します」をクリックすると、元に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6478b726-2c60-4c28-8be8-163b7ae077da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0a53c9fa-f669-4d27-b91e-2b81686640ee.png)

ただ、好きな閾値にはできないので、閾値を自由に設定したい場合はCAHIDではなくC&RTを使ってください。C&RTでは多分岐ができないのですが、以下のように複数回同じ変数を選んでツリーを深くしていくことで多分岐を表現することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a789748e-ce16-4945-b5af-a0b010897ce8.png)

### インタラクティブ・ツリーの保存
インタラクティブ・ツリーの情報は、「ファイル」の「ディレクティブ（式）の更新」の操作で、ツリーディレクティブに保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/90df4796-b2dc-4a1d-a75a-e6fd7e76cc2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/52e05657-ddc8-4dac-b91a-a722518f771a.png)

### 途中から自動で作成
例えば、ツリーの一部分をマニュアルで定義し、その後は元々のアルゴリズムを使ってツリーを成長させることも可能です。
以下の例では「スイッチ」のA、B、C、Dは「ユーザー設定の分割で枝葉を成長」で分割しています。

そして、枝を右クリックして、「ツリーを成長」、「ツリーの成長と剪定」、「ツリーを1レベル成長」などを選ぶことで、もともとのC&RTのアルゴリズムでA、B、C、Dで分割した後のツリーを作ってくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/21b25ab8-f900-42a2-8def-98372234edb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9acf5764-bfc8-4fe6-b8ca-e1f4bf2306f1.png)


# サンプル
サンプルは以下に置きました。

#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/refs/heads/master/250603InteractiveTree/250603InteractiveTress.str

#### 利用データ
https://github.com/hkwd/spsssample/raw/refs/heads/master/250603InteractiveTree/04%E9%81%8E%E5%8E%BB%E8%A3%85%E7%BD%AE%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E6%95%85%E9%9A%9C%E3%83%87%E3%83%BC%E3%82%BF2.csv

■テスト環境
Modeler 18.6
Windows 11



# 参考
##### インタラクティブ・ツリー・ビルダー - IBM Documentation 
https://www.ibm.com/docs/ja/spss-modeler/18.6.0?topic=trees-interactive-tree-builder

##### 【リレー連載】わたしの推しノード – 絶対エース「CHAIDノード」流行りの機械学習を圧倒する伝えやすさと使いやすさ 
https://community.ibm.com/community/user/blogs/yoichiro-nishimaki/2025/01/24/push06