前回(第1回)では、JMPに搭載されているPython統合(インテグレーション)機能を使うと、JMPでPythonのコードが記述でき、「Pythonで分析手法の幅を広げ、JMPで結果を探索・可視化する」というように、双方のよいところを補完し合えるメリットがあることを紹介しました。
今回は、JMP独自の言語であるJSL(JMP Scripting Language)とPythonの関係を取り上げます。
JMPのPython統合機能では、PythonのコードからJSLを呼び出すことも、逆にJSLのコードからPythonを呼び出すこともできます。つまり、同じ処理を「Pythonを起点として書く」ことも、「JSLを起点として書く」こともできるということです。

この回では、前回の例1(World Bankからのデータ取得)を題材に、この2つの書き方を並べて示し、それぞれの特徴と使い分けの考え方を整理します。
Python環境からJSLスクリプトを実行(Pythonを起点とした書き方)
前回、例1として世界銀行(World Bank)から経済指標をJMPのデータテーブルとして抽出するPythonコードを示しました。分析者は抽出されたデータに対し、JMPのメニューからバブルプロットなどを選択して、可視化や分析を行うことができます。
それなら、データの抽出とともに、JMPの分析レポートを作るところまでコード化できないかと考えるかもしれません。
前回のバブルプロットのレポートを作る例で示します。
下図は、バブルプロットのレポート(出力)に対して、左上の赤い三角ボタンから [軌跡線] > [すべて]、[ラベル] > [すべて] のオプションを選択した状態です。このオプションにより各バブルに国名を表示させ、年ごとの推移をアニメーションしたとき、どのような軌跡でバブルが動いたかを線で示すことができます。
このレポートに対し、[スクリプトの保存] > [スクリプトウィンドウへ] を選択すると、JSLのスクリプトウィンドウが起動し、今回のレポートの列の指定やオプションをコード化したスクリプトを確認できます。

このスクリプト(JSL)を、Pythonのコードと一緒にPythonスクリプトエディタに記述すれば、そのまま実行できます。下図は、前回示したPythonスクリプト(Example1-1_WorldBank.py)の後に、JSLを実行するコードを追加したものです(Example1-2_WorldBank.py)。
jmpパッケージの run_jsl() の中にJSLを記述すると、Python環境の中でJSLスクリプトを実行することができます。
run_jsl (''' ... ''') とシングルクォート3つを付けると、この間に書いたものは、改行も含めてすべて文字列として扱われます。

上図の赤色部分が、追加したJSLを実行するコードです。JSLの部分を簡単に解説します。
最初の Current Data Table() は、現在アクティブになっているデータテーブルを返すコマンドです。この例では、直前に世界銀行の経済指標をJMPのデータテーブルとして取り込んでいるので、そのテーブルを dtという変数に格納しています。また、Set Name() で、データテーブル名を「World Bank Data」に変更しています。
dt = Current Data Table();
dt << Set Name( "World Bank Data" );
その後のコマンドは、データテーブルの表示形式(Format)を変更しています。ここはJSLの記述例として示したもので、書かなくても以降の処理は問題なく動作します。
最後がバブルプロットの部分です。先ほどカレントに指定した dtに対し、どの列をX・Y・バブルのサイズなどに割り当てるか、どのオプションを付けて実行するかを記述しています。先ほど [スクリプトの保存] > [スクリプトウィンドウへ] で保存されたJSLコードをそのまま使っても動作しますが、下記は必要なコマンドに絞って簡素化しています。
dt << Bubble Plot(
X( :GDP_per_capita ),
Y( :Life_expectancy ),
Sizes( :Population ),
Time( :Year ),
Coloring( :Country ),
ID( :Country ),
Label( "All" ),
Trail Lines( "All" ),
);
このコードを実行すれば、World Bankからのデータの読み込みからバブルプロットのレポート表示までを、一度に行えます。
JSL環境でPythonとやりとりする機能(JSLを起点とした書き方)
ここまでは、Python環境からJSLを実行できることを示しましたが、逆に、JSL環境からPythonコードを実行することもできます。
先ほどのコード(Example1-2_WorldBank.py)を、JSLコードとして書き直したものを示します(Example1-2_WorldBank.jsl)。
JSLの Python Submit() 関数を使うと、引数として渡した文字列の中に書かれたPythonコードを実行できます。今回は、先ほどのPythonスクリプトのうちPythonのコード部分を、Python Submit() の中に入れただけです。
Python Submit() に渡すのは文字列ですが、"\[ と ]\" ではさむことで、この中に書いたものは文字として扱うことができます。

このJSLスクリプトについて、[編集] > [スクリプトの実行] を選択すると、Pythonスクリプトと同じ出力を得ることができます。
Pythonを起点とした書き方(.py)とJSLを起点とした書き方(.jsl)どちらを用いる?
どちらを選ぶかは、処理のメインがどちらにあるかで決まります。
Pythonライブラリが分析のメインであれば.py。列を選ばせるダイアログを用意したり、JMPのレポートを作り込んだりする場合は .jsl が向いています。
Pythonを起点とした書き方(.py)が良いケース
- scikit-learnなど、Pythonライブラリを利用した分析が中心となる
- Pythonのコードに慣れた人が利用する
JSLを起点とした書き方(.jsl)が良いケース
- JMPの操作が全体の流れの中心になる
- 分析後にJMPのレポート表示を自動化する、カスタマイズする
- 列の選択やパラメータ入力のダイアログを付けて、汎用的なツールとする
おわりに
今回は、JMPのPython統合機能における、PythonとJSLの関係を見てきました。ポイントは次の3つです。
- Python環境からは、jmpパッケージの
run_jsl() を使ってJSLを実行できる(Pythonを起点とした書き方)
- JSL環境からは、
Python Submit() を使ってPythonコードを実行できる(JSLを起点とした書き方)
- どちらを起点にしても実現できることはほぼ同じで、処理のメインがPython側かJMP側かで選べばよい
次回(第3回)では、列の選択やパラメータ入力のダイアログをJSLで付けることによって、こうした固定のスクリプトを、誰でも繰り返し使える汎用的なツールに変える例を示します。
by 増川 直裕(JMP Japan)
Naohiro Masukawa - JMP User Community
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.