SPSS ModelerスクリプトでHTMLレポート出力（マツダ山口様のアイディア）

SPSS ModelerスクリプトでHTMLのレポートを出力するサンプルストリームをマツダ株式会社　山口　幸司様に作っていただき、SPSS春のユーザー会2021でご発表いただきました。

公開してシェアいただく許可をいただきましたのでこちらで紹介します。

また、山口様ご自身による当日の[ご講演資料のスクリプト解説部分](https://speakerdeck.com/jpspss/biwu-si-fen-xi-jie-guo-falsedatusiyubodowo-spss-plus-pythonsukuriputodesheng-cheng-sanpurusutorimujie-shuo-zi-liao)も公開していただきました。ビジュアルにまとめていただいていますので是非ご覧ください(2021/6/8)

■動作テスト環境
Modeler 18.2.1,18.2.2
Windows 10

■サンプルストリームとデータ
[サンプルストリーム](
https://github.com/hkwd/Yamaguchi-sama/raw/master/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0r3.str)
[サンプルデータ](https://github.com/hkwd/Yamaguchi-sama/raw/master/property_values_train.sav)

#1.動かし方
サンプルストリームの動かし方を説明します。
#1-1. 出力先のフォルダの用意
デフォルトは"C:\tepmp\SPSS_data\サンプル出力\”になっています。

#1-2. サンプルデータの確認
不動産の物件所情報のサンプルデータであるproperty_values_train.savの入力ノードをプレビューしてサンプルデータが参照できることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a2c5dee9-20db-06a6-3d55-83ce2ea982c1.png)


見つからない場合は以下を探してみてください。
＜インストールディレクトリ＞\DEMOS\japanese_ja\property_values_train.sav

一応以下にもアップロードしておきました。
[サンプルデータ](https://github.com/hkwd/Yamaguchi-sama/raw/master/property_values_train.sav)


#1-3. サンプルの実行
ツールメニューのストリームのプロパティから実行を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2e4d3e2b-c12d-89d1-9277-587cc10900cb.png)


出力先をデフォルトから変更する場合はmodeler scriptの3行目を変更してください。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9e55f54e-4139-b018-a10d-b1718bb9e8fe.png)

「このスクリプトを実行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1f2b75d3-75c9-ff75-d847-8b07ce25786a.png)

出力先に、以下のようにグラフのpngファイルやレポートのHTMLファイルが出力されます。
このサンプルストリームでは不動産の物件情報を建物の種類ごとに、4つのグラフをもった５つのレポートが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0687bed0-7558-09f2-e40b-bdd3ab44dc90.png)

レポートのHTMLファイルは、以下のようにグラフを一覧するレポートをブラウザで開くことができます。ここでは2-onder-1 kap_グラフリストというレポートを開いています。他の建物種類のレポートも同様のフォーマットでレポートが作られています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f0bb7d20-9d38-33ef-9f91-5758592a9b6f.png)



#2.サンプルストリームとスクリプト解説
サンプルストリームとスクリプトを解説していきます。

ストリームは大きくわけてグラフ出力のパートとHTMLファイル出力のパートに分かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/67dcb669-a82d-7107-70eb-4b22d99d8b9c.png)


modelerscriptも見ていきます。
まず、以下で建物種類選択の条件抽出ノードを書き換えていて、建物種類を絞り込んでいます。

```Python:L11
    stream.findByID("id8L4WF1NNZPK").setPropertyValue("condition",u"建物種類 = \"" + tatemono[x] + "\"")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/31e53d93-6a3e-40ee-b445-eada84a8849a.png)


次に以下で、グラフをファイルに出力しています。

```python:L18-24
            graphs[z].setPropertyValue("use_graph_size", True)
            graphs[z].setPropertyValue("graph_height", graphsizes[y][0])
            graphs[z].setPropertyValue("graph_width", graphsizes[y][1])
            graphs[z].setPropertyValue("output_mode", "File")
            graphs[z].setPropertyValue("output_format", "PNG")
            graphs[z].setPropertyValue("full_filename",foldname + "\\" + tatemono[x] + "_" + graphs[z].getPropertyValue("output_name") + ".png")
            graphs[z].run(None)
```

対応するノードは以下です。ファイル名やフォーマットなどを設定して出力しています。４つすべてのグラフをループで処理し、ファイルに出力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9916a25f-6f5b-6950-1077-8305f2c76552.png)

出力したグラフファイル名をユーザーインプットノードに設定します。

```Python:L30-34
    unode = stream.findByID("id4MWVZK1EHSL")
    unode.setPropertyValue("names", [u"htmlソース"])
    unode.setKeyedPropertyValue("data", u"htmlソース", graphnames)
    unode.setKeyedPropertyValue("custom_storage", u"htmlソース", "String")
    unode.setPropertyValue("data_mode", "Ordered")
```

対応するノードは以下です。ファイル名が値としてセットされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b955752a-e880-8de1-50b9-9aef987330b8.png)

以下のようなデータがユーザー入力ノードにセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8f8c53ff-6dcf-49fc-1484-eac7cf1893a3.png)

以下のスクリプトによってフラットファイル・エクスポートノードでhtmlファイルを出力しています。

```Python:L36-37
    stream.findByID("id8HMV4MDF8WJ").setPropertyValue("full_filename",foldname + "\\" + tatemono[x] + "_" + u"グラフリスト.html")
    stream.findByID("id8HMV4MDF8WJ").run(None)
```

対応するノードは以下です。ファイル名がセットされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f15713f3-5a2f-0832-1962-d97e90ae1f08.png)

実行すると以下のようなHTMLがファイルに出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7837e09f-879f-fc20-43c9-028d17948a92.png)

#3.カスタマイズのポイント
このサンプルストリームとModeler Scriptは汎用的に作られていますので、少し書き換えることで好きなデータ、好きなグラフを使ったレポートを作ることができます。

カスタマイズのためにはまず、グラフを作りたいデータを選び、グラフを作ります。ポイントは、各グラフの出力のユーザー設定で「連番_グラフ名」を設定することです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/48a1f5bd-8fa7-71b9-1deb-9245b8ea7a65.png)

次に出力するカテゴリを絞り込むところを設定します。そして、HTMLのタイトルやレポート内に表示するカテゴリ名を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9ea3f581-2e60-4d7a-20ec-f60520e34582.png)

これはレポートの以下の部分に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5d0275a5-5f13-dca1-168a-1420f43f7c88.png)


次に改行コードの位置を指定します。グラフいくつ並べてから改行するかを指定できます。
以下は-4行目と2.5行目に改行を入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bc7c818c-ff22-a120-2720-d1cb6b359c9d.png)
最終出力の中に、改行の\<br\>のタグが埋め込まれているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ccb155cd-6587-6a0d-d0dc-0d5a52a54099.png)

スクリプトは以下を修正します。

```python:L06-L11
tatemono = ["2-onder-1 kap","Appartement","Hoekwoning","Tussenwoning","Vrijstaand"]
graphtypes = ["plot","histogram"]
graphsizes = [[600,700],[300,700]]
x = 0
while x < len(tatemono):
    stream.findByID("id8L4WF1NNZPK").setPropertyValue("condition",u"建物種類 = \"" + tatemono[x] + "\"")
```
graphtypes で出力対象のグラフ種類をリストします。
graphsizes で出力するグラフのサイズをリストで指定します。
tatemono は絞り込むカテゴリです。具体的には以下の列のカテゴリを対象としたグラフとレポートを作っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0cf924de-2c64-0b82-ce80-11a381aebb55.png)


#4. レポートの共有と自動出力
レポートを共有フォルダに出力するようにすれば、Modelerを持っていないユーザーとも結果をシェアすることができます。
また、マツダ様ではSPSS Collaboration and Deployment Services（通称CADS）を使って、週次でレポートを出力し、そのリンクをメールで関係者に送付することを自動化されています。これによって様々な関係者と分析結果を簡単に共有することを実現されています。

#5.最後に
Modelerの出力をパワーポイントに貼ってレポートを作っている方はたくさんいらっしゃると思います。しかし、HTMLで自動出力できるようにすることによって、作業時間を大幅削減することができます。
非常にユニークなアイディアでmodeler scriptを作成され、さらにそれを公開していただいたマツダ株式会社　山口　幸司様に改めて感謝いたします。