前回(第2回)は、JMPのPython統合機能では、PythonコードからJSLを呼び出すことも、逆にJSLコードからPythonを呼び出すこともできることを紹介しました。
ここで、これまでの例として使用してきたWorld Bank(世界銀行)のデータ取り込みについて、Pythonコードの前半部分を改めて見てみます。対象とするG7の国や年、指標(3つ)を指定して、それらのデータを取り込むコードになっています。

ただし、対象国を絞り込みたい、違う指標も使いたい、対象となる年を変えたい、といった場合には、上記のコードを書き換える必要があります。
それ自体は大きな手間ではないかもしれませんが、何度も条件を変更する場合や、自分以外のJMPユーザーに使ってもらうには不便です。
このようなときは、次のような条件を選べるダイアログを用意し、利用者が分析に用いる条件を自在に指定できるようにすると便利です。

そこで今回は、列の選択やパラメータ入力のダイアログをJSLで記述することによって、条件が固定されたスクリプトに、繰り返し使うことができる汎用性を持たせる方法を紹介します。
なお、ここでは、ダイアログの作成自体の詳細な解説はしません。ダイアログを作ることによって、これほど汎用性が持たせられるのだと体感していただくことが目的です。
ダイアログの作成
ダイアログの作成にはJSLを使います。そのため、今回は「JSLを起点とした書き方(.jsl)が良いケース」となります。
前回紹介したJSLコード(Example1-2_WorldBank.jsl)を、実行時に次のことができるダイアログボックスを表示するように改良したコード(Example1-3_WorldBank.jsl)を示します。
- G7の7か国の中から対象となる国を選択する(Ctrlキーにより複数選択可)
- これまでの3つの指標に、GDP_growth(GDP成長率)、Inflation(インフレ率)、Unemployment(失業率)、Fertility_rate(出生率)を加え、その中から対象となる指標を選択する(Ctrlキーにより複数選択可)
- 開始年・終了年の指定
コード全体は本ブログに添付しています。ここではダイアログの作成に関する要点を解説します。
1. ダイアログで選択できる国や指標の定義
最初に、選択できる国・指標の一覧をリストで記述します。この例では、World Bankで使用するコードと表示用の名前を対応させるようにしています。
// 選択できる国(G7)・指標
countryNames = {"Japan", "United States", "Canada", "United Kingdom", "Germany", "France", "Italy"};
countryCodes = {"JP", "US", "CA", "GB", "DE", "FR", "IT"};
/* 選択できる指標: 人口,一人当たりGDP,経済成長率,インフレ率, 失業率,出生率,平均寿命 */
indNames = {"Population", "GDP_per_capita", "GDP_growth", "Inflation",
"Unemployment", "Fertility_rate", "Life_expectancy"};
indCodes = {"SP.POP.TOTL", "NY.GDP.PCAP.CD", "NY.GDP.MKTP.KD.ZG", "FP.CPI.TOTL.ZG",
"SL.UEM.TOTL.ZS", "SP.DYN.TFRT.IN", "SP.DYN.LE00.IN"};
2. ダイアログ部分
New Window() 関数でダイアログを作成していきます。コードの書き方の例は、JMPのスクリプトガイドに記載されています。
ダイアログは V List Box(縦)・H List Box(横)・Panel Box(見出し枠)で配置を組み、その中に一覧から選ばせる List Box や、数値を入力させる Number Edit Box を置きます。
// ダイアログの起動
selCountry = {};
selInd = {};
startY = .;
endY = .;
nw = New Window( "Get World Bank Data",
<<Modal,
<<On Validate(
selCountry = cList << Get Selected;
selInd = iList << Get Selected;
startY = sBox << Get;
endY = eBox << Get;
1
),
V List Box(
H List Box(
Panel Box( "Select Countries",
cList = List Box( countryNames, width( 160 ), nlines( 7 ), max selected( 7 ) )
),
Panel Box( "Select Indicators",
iList = List Box( indNames, width( 160 ), nlines( 7 ), max selected( 7 ) )
)
),
Panel Box( "Year",
Lineup Box( N Col( 4 ), Spacing( 6 ),
Text Box( "Start" ), sBox = Number Edit Box( 2000 ),
Text Box( "End" ), eBox = Number Edit Box( 2024 )
)
)
)
);
3. Pythonに渡す変数の作成
選ばれた国名・指標名を、連想配列でWorld Bankで使用するコードに変換してリスト化します。その後の Python Send() がポイントで、JSLの変数を同じ名前のままPython側の変数として渡します。これにより、後続の Python Submit() 内のPythonコードが countries などをそのまま使えます。
// Python に渡す変数の作成
countries = {};
For( i = 1, i <= N Items( selCountry ), i++,
Insert Into( countries, countryMap[selCountry[i]] )
);
indicators = {};
For( i = 1, i <= N Items( selInd ), i++,
Insert Into( indicators, indCodeMap[selInd[i]] )
);
colnames = selInd;
// Show( countries, indicators, colnames, startY, endY );
Python Send( countries );
Python Send( indicators );
Python Send( colnames );
Python Send( startY );
Python Send( endY );
Pythonに渡した変数の値を用いて、pandas_datareaderのパッケージにより、指定した国・指標・年に対するデータテーブルを出力します。
注意:本コードは簡潔さを優先しているため、入力した値のチェックやエラー処理などの記述はほとんどしていません。
Python連携で得られたデータをJMPで可視化・分析
JSLスクリプトを実行すると、作成したダイアログが表示されるので、国や指標、年を指定してデータを作成できます。
ここでは、日本・米国・ドイツ・フランスにおける、コロナ前とコロナ後のGDP成長率・インフレ率・失業率の推移を比較したいため、2017年から2024年を対象としたデータを作成することにします。
JMPのデータテーブルとして取得できれば、データテーブルのヒストグラムアイコン(ヘッダグラフ)をクリックすることにより、列名の下側にグラフを表示させることができます。グラフの該当部分を選択すると対応するデータが選択されるので、データテーブル内でもある程度のデータの探索ができます。

このデータに対しては、第1回で紹介したようなバブルプロットで、年ごとの推移をアニメーションで考察することもできます。また、[グラフビルダー]を使うと、次のような年ごとの指標の推移を示す折れ線グラフや棒グラフを描くことができます。

さらに、[時系列予測]を用いると、平滑化モデルをあてはめ、今後の予測値や予測区間を求めることができます。

おわりに
今回は、Pythonで書いたデータ取得のコードに、JSLで作ったダイアログを組み合わせることで、「汎用的に使えるツール」にする方法を紹介しました。
要点は次の3つです。
- ダイアログはJSLで作る:そのため、処理の中心がPythonであっても、起点となるスクリプトは .jsl にしておくと扱いやすくなります。第2回で紹介した「.pyで書くか、.jslで書くか」の判断の、具体的な分かれ道の一つです。
- 受け取った値は Python Send() でPythonへ渡す:JSLの変数名がそのままPython側の変数名になるため、Pythonコード自体はほとんど書き換えずに済みます。
- 取り込んだ後は、いつものJMPのデータテーブルで探索:グラフビルダーや時系列予測など、JMPの分析機能をそのまま使えます。
Pythonでデータを取得・加工し、JMPで可視化・分析する。その入口となる条件の指定をダイアログに任せることで、スクリプト本体は変えずに、条件だけを外から与えられるようになります。これにより、ダイアログによってスクリプトの汎用性を高めることができます。
次回(第4回)は、さらなる汎用化として、JMPには搭載されていない機能をPythonのパッケージで実行し、その分析対象となる変数(列)を今回作成したようなダイアログで指定する例を紹介します。
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.