SPSS Modelerの拡張ノードでPythonを利用する ①セットアップと可視化

#0. はじめに
SPSS Modelerでは一般的に分析で利用される各種機能が提供されていますが、RやPythonの機能も使いたいケースがあると思います。
SPSS Modelerの拡張ノードを利用することで、SPSS ModelerからRやPythonを実行することができます。

今回はPython連携を試します。
R連携を試す場合は、@kawada2017さんの [SPSS Modelerの拡張ノードでRを利用する](https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a
) で紹介されています。

SPSS Modeler 拡張ノードで Python 利用時に注意が必要な点として、入出力データを Spark DataFrame 形式で取り扱う点があげられます。
もちろん、処理の中で Spark DataFrame を pandas Dataframe 等に変換することで、pandasのメソッドを利用したデータ加工や、matplot/seabornといったライブラリによる可視化も可能です。

■テスト環境
SPSS Modeler 18.2.2
Windows 10
Python 3.7.7

#1. Python 3.7.x の導入

SPSS Modeler 18.2.2には、製品に同梱のPython 3.7.7が存在しますが、別途、ユーザーが独自にインストールしたPython環境を利用することも可能です。

追加でライブラリを導入することも想定し、今回は独自のPythonインストール済み環境を利用します。
この記事の作成時点では、Modeler18.2.2でPython 3.7.x がサポートされています。
最新のサポート状況は、マニュアルをご確認ください。

Python for Spark を使用したスクリプト
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_r_nodes_ddita/clementine/r_pyspark_api.html


**1. Python 3.7.x インストーラーのダウンロード**

以下のリンク先より、3.7.x のインストーラーをダウンロードします。
https://www.python.org/downloads/


**2. Python 3.7.x インストーラーの実行**

インストーラーを管理者として起動し、Customization Installを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/c8ae0211-425f-42f1-6903-d843a68a2de1.png)

Optional Featureはデフォルトのまま変更せず、次へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ca1bd64c-9ce7-609f-96c6-9ba1caa331e4.png)

Install for all users をチェックし、Installを押下します。
この時、install location も控えておきます。例では、C:\Program Files\Python37 です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/491b411d-25eb-320c-5f94-6593640bb750.png)

Pythonのインストールが完了したら、Pythonのバージョンを確認します。
Powershellを起動し、下記コマンドを実行します。

```powershell
cd <python_install_location>
python -v
```
```:実行例
PS C:\Users\Administrator> cd "C:\Program Files\Python37"
PS C:\Program Files\Python37> python -V
Python 3.7.7
```
**3. Python 追加ライブラリの導入**
任意のPythonライブラリを導入します。
例では、numpy, pandasと、可視化用にmatplotlib, seabornを導入しています。

```powershell
python -m pip install <ライブラリ名>
```
```:実行例
PS C:\Program Files\Python37> python -m pip install numpy, pandas, matplotlib, seaborn
Collecting numpy
  Downloading https://files.pythonhosted.org/packages/5f/a5/24db9dd5c4a8b6c8e495289f17c28e55601769798b0e2e5a5aeb2abd247b/numpy-1.19.4-cp37-cp37m-win_amd64.whl (12.9MB)
(略)
Successfully installed ~ (略)
```

#2. SPSS Modeler用に 独自の Python インストール済み環境を指定

メモ帳などで options.cfg を開きます。options.cfg のデフォルトのパスは下記です。
C:\Program Files\IBM\SPSS\Modeler\18.2.2\config\options.cfg

eas_pyspark_python_path に python.exe のパスを指定し、上書き保存します。

```:options.cfg
# Set to the full path to the python executable (including the executable name) to enable use of PySpark.
eas_pyspark_python_path, "C:<python_install_location>\\python.exe"
```
```:記載例
# Set to the full path to the python executable (including the executable name) to enable use of PySpark.
eas_pyspark_python_path, "C:\\Program Files\\Python37\\python.exe"
```

サービスより SPSS Modeler 18.2.2 を再起動し、変更を反映します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/b73f4e5a-03fb-152f-ee1f-5a19905d9c4b.png)


# 3. SPSS Modelerでの動作確認

動作確認用のデータセットとして、irisのデータセットをダウンロードします。
https://github.com/mwaskom/seaborn-data/blob/master/iris.csv

SPSS Modeler を起動し、可変長ノードを追加、iris.csvを読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/0282b17e-5d3a-c2e2-8632-542afaac2244.png)

出力タブから拡張の出力ノードを選び接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/5d3c35ff-6479-a745-52d8-f08176685ad2.png)

拡張の出力ノードのプロパティを開き、Python for Spark のシンタックスへ以下のコードを記載し、実行します。
ライブラリseabornを利用し、ペアプロット図（散布図行列）を出力する内容です。
シンタックスの詳細は後述します。
実行完了までに、数分かかる場合があります。

```python:シンタックス
import spss.pyspark.runtime

ascontext = spss.pyspark.runtime.getContext()

import numpy
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

indf = ascontext.getSparkInputData()
sns.pairplot(indf.toPandas(), hue='species')
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ec4ad2f3-d176-d067-d609-b714eeb7daf6.png)

実行が完了すると、以下のようにPythonのウィンドウでペアプロット図（散布図行列）が表示されます。
各変数間の関係をまとめて確認することができます。
Rの場合、拡張出力ノード内のグラフ出力タブにグラフ出力されるのですが、現状Pythonは対応していないようで、Pythonのウィンドウで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/bb077cbf-bbf6-1ff5-c2ac-f43c866fc40d.png)

＜ご参考＞ Rの拡張出力ノードでグラフ出力した例
@kawada2017さんの [SPSS Modelerの拡張ノードでRを利用する](https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a)より引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/972ee3ff-4020-6986-6c78-d89dc4ceb957.png)

ちなみに、Pythonのウィンドウでグラフを表示している間、下記のように常にストリームが実行中となっています。
ストリーム処理を完了させるために、Pythonのウィンドウを閉じる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/26c15c4f-d670-e32c-61a2-e1173e483a65.png)

Pythonでも、Rのように拡張出力ノード内グラフ出力タブへのグラフ出力がサポートされると良いと思いましたので、新機能のアイデアとして投稿してみました。
ご賛同いただける方がいっらやしましたら、下記URLより、Voteをクリックして投票いただけますと幸いです。
機能の開発が確約されるものではありませんが、投票数が多いと検討対象となります。

Extension Output Node for Python with Graph Output tab like R
https://ibm-data-and-ai.ideas.aha.io/ideas/MDLR-I-329


# (補足) Python for Spark のシンタックスについて

拡張の出力ノードに記載したシンタックスについて補足します。

SPSS Modeler 拡張ノードでの Python 利用時、入出力データを Spark DataFrame 形式で取り扱うことが必要です。
また、SparkのAPIを直接実行するのではなく、SPSS Modelerが提供するラッパー Analytics Serverコンテキストのインターフェースを経由することが必要です。

下記のシンタックス全体のうち、各パートに分けて説明します。

```python:（再掲）シンタックス全体
import spss.pyspark.runtime

ascontext = spss.pyspark.runtime.getContext()

import numpy
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

indf = ascontext.getSparkInputData()
sns.pairplot(indf.toPandas(), hue='species')
plt.show()
```

まず、前半です。
これらの内容は、拡張ノードでPythonを取り扱う際、常に記述が必要な内容となります。
Analytics Server対話用のライブラリ spss.pyspark.runtimeをインポートします。
変数 ascontext へ、Analytics Serverコンテキストオブジェクトを定義します。

```python:シンタックス前半
import spss.pyspark.runtime # Analytics Serverコンテキスト処理用ライブラリ読込

ascontext = spss.pyspark.runtime.getContext() # Analytics Serverコンテキストオブジェクトの定義
```

後半のペアプロット図 作成処理です。
一般的にPythonでseabornを利用する際のシンタックスとほぼ同様の流れですが、dataframeの変換処理などを追加で実施しています。

まずindfという変数へ、前のノードからのデータが格納されます。
今回の場合、iris.csvで読み込んだデータが、Spark Dataframe形式で格納されます。

次に seaborn でペアプロット図の作成を行います。
seabornは、Spark Dataframeをそのまま受け取ることができないため、pandas Dataframeに変換して渡します。
Spark Dataframe から pandas Dataframeへの変換は、toPandas()メソッドで実現できます。

最後に、plt.show() でペアプロット図を表示します。

```python:シンタックス後半
import numpy
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

indf = ascontext.getSparkInputData() # iris.csvデータの読込
sns.pairplot(indf.toPandas(), hue='species') # indf.toPandas()で、pandas Dataframeに変換したデータを、seabornに渡す。hueで色分けにspeciesを指定。
plt.show() # 図を表示
```

# 参考

Analytics Serverコンテキストに関する詳細は、下記をご確認ください。

Python for Spark を使用したスクリプト
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_r_nodes_ddita/clementine/r_pyspark_api.html

Analytic Server コンテキスト
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_r_nodes_ddita/clementine/r_pyspark_api_context.html