#0. はじめに
SPSS Modelerでは一般的に分析で利用される各種機能が提供されていますが、RやPythonの機能も使いたいケースがあると思います。
SPSS Modelerの拡張ノードを利用することで、SPSS ModelerからRやPythonを実行することができます。
今回はPython連携を試します。
R連携を試す場合は、@kawada2017さんの SPSS Modelerの拡張ノードでRを利用する で紹介されています。
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を選択します。
Optional Featureはデフォルトのまま変更せず、次へ進みます。
Install for all users をチェックし、Installを押下します。
この時、install location も控えておきます。例では、C:\Program Files\Python37 です。
Pythonのインストールが完了したら、Pythonのバージョンを確認します。
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を導入しています。
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 のパスを指定し、上書き保存します。
# 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 を再起動し、変更を反映します。
3. SPSS Modelerでの動作確認
動作確認用のデータセットとして、irisのデータセットをダウンロードします。
https://github.com/mwaskom/seaborn-data/blob/master/iris.csv
SPSS Modeler を起動し、可変長ノードを追加、iris.csvを読み込みます。
拡張の出力ノードのプロパティを開き、Python for Spark のシンタックスへ以下のコードを記載し、実行します。
ライブラリseabornを利用し、ペアプロット図(散布図行列)を出力する内容です。
シンタックスの詳細は後述します。
実行完了までに、数分かかる場合があります。
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のウィンドウでペアプロット図(散布図行列)が表示されます。
各変数間の関係をまとめて確認することができます。
Rの場合、拡張出力ノード内のグラフ出力タブにグラフ出力されるのですが、現状Pythonは対応していないようで、Pythonのウィンドウで表示されます。
<ご参考> Rの拡張出力ノードでグラフ出力した例
@kawada2017さんの SPSS Modelerの拡張ノードでRを利用するより引用
ちなみに、Pythonのウィンドウでグラフを表示している間、下記のように常にストリームが実行中となっています。
ストリーム処理を完了させるために、Pythonのウィンドウを閉じる必要があります。
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コンテキストのインターフェースを経由することが必要です。
下記のシンタックス全体のうち、各パートに分けて説明します。
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コンテキストオブジェクトを定義します。
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() でペアプロット図を表示します。
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