SPSS Modelerで様々な組み合わせの散布図を自動出力する

# あらまし

※架空の出来事です。

**データサイエンスって、割と泥臭い。**

統計の力でスマートに課題解決するのがデータサイエンティスト。
近頃では[SPSS Modeler](https://www.ibm.com/jp-ja/products/spss-modeler)なんて実にスマートなソフトウェアもあって、いちいちRのコードとにらめっこしなくても超スマートに色んな統計分析をやってくれたりするわけですが、問題なのはそういう統計が終わった後、どういう分析を行ったのかを専門外の人に説明するときです。

「というわけだから説明のためにn(>100)通りの散布図の画像を作ってほしい」
『娑婆と冥土はほど遠し』
「作った画像は1ページずつPowerPointに貼りつける」
『我を冥土の父母と』

# 概要

環境：SPSS Modeler Subscription 1.0 (Windows x64)

説明のために[Wine Quality Datasets](http://www3.dsi.uminho.pt/pcortez/wine/)[^1]を利用します。

あらかじめ、このようなノードが作ってあるものと仮定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/e2d93b82-1da9-8435-9ac1-9140ca2351db.png)

「データ型」の中身はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/fbd66c85-52fc-d434-74e7-730f07e4d710.png)

「quality」を散布図にプロットする点の大きさに、「fixed acidity」か「volatile acidity」を散布図のx軸の値に、「free sulfur dioxide」か「total sulfur dioxide」を散布図のy軸の値にとって散布図を作ります。

![fixed acidity_free sulfur dioxide_quality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/5adbd6c6-8e34-755e-e17b-9a553ab1607b.png)
![fixed acidity_total sulfur dioxide_quality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/c0cc7775-dd3d-6f18-085f-e91a3b08c5a0.png)
![volatile acidity_free sulfur dioxide_quality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/c5e09b29-f917-94fc-de7b-bdbb803c3ad1.png)
![volatile acidity_total sulfur dioxide_quality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/98c83e2f-8372-e53b-0d97-d1b99f9aa809.png)

# そのまえに

あらゆる組み合わせの散布図を作りたいというだけなら、「グラフボード」ノードを作って「散布図の行列(SPLOM)」を選んで実行すれば作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/0af0bcd2-a896-c55e-1150-f1622e704d55.png)

ただ今回は後でPowerPointで張り付けるために、1枚ずつ別々の散布図を出力したいという事情がありました。

# 手法

何通りにもなる散布図を一つ一つ手作業で作るのは無理です。(今回の例では4通りだけですが)
SPSS ModelerではPythonで作業自動化のスクリプトを書けますからそれを利用します。

まずは「データ型」ノードと「散布図」ノードのIDを調べて…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/150b8b86-7486-086d-6c2e-4d5077f787d8.png)

[ファイル]->[ストリームのプロパティー(I)]->[実行]に次のようなコードを書きます。

```
diagram = modeler.script.diagram()

# 散布図画像の出力ディレクトリ(最後の/まで入力)
directory = "<出力ディレクトリのフルパス>"

# 画像の出力サイズ
width = 1024
height = 768

# ノードを取得
typenode = diagram.findByID("<データ型ノードのID>")    # データ型ノード
plotnode = diagram.findByID("<散布図ノードのID>")    # 散布図ノード

# データ型ノードのフィールドを全て取得
fields = typenode.getKeyedPropertyKeys("values")

# 散布図に使うフィールドを定義
x_fields = filter(lambda f: u"acidity" in f, fields) # 「acidity」が含まれるフィールドがX軸
y_fields = filter(lambda f: u"dioxide" in f, fields) # 「dioxide」が含まれるフィールドがY軸
size_fields = [u"quality"]   # 「quality」がプロットする点のサイズ

# 散布図の出力先をPNGファイルに設定
plotnode.setPropertyValue("output_mode", "File")
plotnode.setPropertyValue("output_format", "PNG")

# 画像の出力サイズを設定
plotnode.setPropertyValue("use_graph_size", True)
plotnode.setPropertyValue("graph_width", width)
plotnode.setPropertyValue("graph_height", height)

for x_field in x_fields:
    for y_field in y_fields:
        for size_field in size_fields:
            # 散布図の軸を設定
            plotnode.setPropertyValue("x_field", x_field)
            plotnode.setPropertyValue("y_field", y_field)
            plotnode.setPropertyValue("size_field", size_field)

            # 散布図画像の出力先を設定
            full_filename = directory + x_field + "_" + y_field + "_" + size_field + ".png"
            plotnode.setPropertyValue("full_filename", full_filename)

            # 散布図を出力
            plotnode.run(None)

```

あとは「適用」ボタンを押してから「このスクリプトを実行」ボタンを押せばOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/794ed6bc-63e2-3459-354d-23c88271dbbb.png)

出力ディレクトリに指定した場所に画像ファイルが自動的に出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/5156ada9-7e00-9611-74ea-749e5eccebc2.png)

# あとがき

この後、出力された画像を1枚ずつPowerPointに貼りつけるのには[指定したフォルダ内の画像ファイルを一括挿入するPowerPointマクロ](https://www.ka-net.org/blog/?p=8228)を利用しました。

# こぼれ話

そんな複雑な話でもないと思うのですが、だからなのかSPSS Modelerの自動化に関する情報がほとんど存在しなかったので記事にしてみました。

ちなみにこんなんですけど大学院1年生です。できるだけ楽して仕事することばっかり考えてる不良ですが良ければ誰か雇ってください。
fukuchan@fukuchan.mynetgear.com

[^1]: P. Cortez, A. Cerdeira, F. Almeida, T. Matos, and J. Reis, Decision Support Systems 47, 547 (1998).