はじめに
上級編では、次の内容について解説します。
- 要素毎実行のためのリスト化データの生成
- GUI 定義のスクリプト
- 入力データ利用した GUI 定義スクリプト
また、次の方を対象としています。
- 処理フローを効率的に作成したい
- GUI つきのアイコンにカスタマイズしたい
Python Script アイコンの基本的な使い方については、 基礎編 や 中級編 で解説しています。 基礎編や中級編をご存知ない方はそちらを先にお読みください。
上級編で使用しているデータは、「共有ワークスペース」にある「顧客データ.dft」です。
共有ワークスペース > サンプル > Alkano > データ > 顧客データ.dft
このデータは、ある小売店が顧客について記録した架空の表形式データです。 先頭10行を下記の表に示します。
性別 | 年代 | 居住地 | 職業 | 世帯構成 | 利益 | 購買点数 | 最終購買日 |
---|---|---|---|---|---|---|---|
男 | 40代 | 東京 | 会社員 | 夫婦 | 3 | 2 | 2013-05-28 |
男 | 10代 | 東京 | 学生 | 夫婦(子供あり) | 319 | 6 | 2013-04-22 |
男 | 30代 | 神奈川 | 会社員 | 二世帯家族 | 1315 | 15 | 2013-05-11 |
男 | 30代 | 神奈川 | その他 | 夫婦(子供あり) | 2745 | 29 | 2013-05-23 |
男 | 20代 | 埼玉 | 自営業 | 夫婦(子供あり) | 489 | 5 | 2013-01-17 |
男 | 10代 | 千葉 | 学生 | 夫婦(子供あり) | 6 | 1 | 2013-01-02 |
男 | 40代 | 埼玉 | 会社員 | 夫婦(子供あり) | 2089 | 21 | 2013-09-03 |
女 | 10代 | 東京 | 学生 | 夫婦(子供あり) | 9 | 1 | 2013-04-29 |
女 | 20代 | 神奈川 | 自営業 | 独身 | 13 | 3 | 2013-09-19 |
男 | 40代 | 埼玉 | その他 | 夫婦(子供あり) | 2601 | 21 | 2013-06-26 |
顧客データは、8列9,682行のデータです。 各列の簡単な説明を、下記の表に示します。
列名 | 説明 |
---|---|
性別 | 顧客の性別。「女」または「男」。 |
年代 | 顧客の年代。「10代」「20代」「30代」「40代」のいづれか。 |
居住地 | 顧客の居住地。「東京」「神奈川」「埼玉」「千葉」のいづれか。 |
職業 | 顧客の職業。「会社員」「学生」「公務員」「自営業」「その他」のいづれか。 |
世帯構成 | 顧客の世帯構成。「夫婦(子供あり)」「夫婦」「二世帯家族」「独身」のいづれか。 |
利益 | 顧客が生み出した利益。(単位:千円) |
購買点数 | 顧客が購入した個数。(単位:個) |
最終購買日 | 顧客が購入した直近日。(年月日の形式) |
1. 要素毎実行のためにリスト化したデータを作る
この節では、顧客データから地域別のデータを作成し、利益の値を予測する線形回帰のモデルを作成・評価して地域ごとの違いを見ます。
MSIP のモジュール機能の一つである要素毎実行では、複数のデータをモジュールに与え、各データに対してモジュール内の処理をそれぞれ行い結果を得ることができます。 要素毎実行の入力となる複数のデータは、Python Script アイコンを利用し、複数のデータを一つにまとめたリスト化したデータを作るのが便利です。
この機能を活用します。 線形回帰モデルを作成・評価するフローをモジュールにし、 Python Script アイコンで顧客データから地域毎のリストデータをモジュールの入力と して実行すると各データ毎に結果が得られます。
【手順の概要】
- 基本フローを作成する
- 基本フローをモジュール化し、「要素毎実行」の設定をする
- Python Script アイコンでリスト形式のデータを作成する
- モジュールの実行結果の確認する
基本フローは次のような処理フローです。
- データを学習/検証に分割する
- 学習データで線形回帰のモデルを作成する
- 検証データで精度検証を行う
最終的に作るモジュール化したフローは次です。 左側はモジュール化を開いた状態で、右は閉じています。
要素毎実行モジュールの出力は複数のテーブルに分かれているので、 「行結合」で一つの結果にまとめて閲覧しやすくします。
それでは、試してみましょう。
基本フローを作成する
【手順概要】
- 「顧客データ.dft」と「Python Script」のフローを作る
- 「データ分割」を追加する
- 「線形回帰」を追加する
- 「予測精度検証」を追加する
- 「予測精度検証」の入力データを評価データに設定する
【手順詳細】
「顧客データ.dft」と「Python Script」のフローを作る
「顧客データ.dft」を配置し、「Python Script」アイコンをつなぎます。
「Python Script」アイコンをダブルクリックして、パラメータ編集画面を表示します。
中央の Python スクリプト
result = table
を
result = table[table["居住地"]=="東京", :]
に変更します。 このスクリプトは、列「居住地」が「東京」であるデータを抜き出しています。
[実行]
をクリックして、スクリプト実行します。「データ分割」を追加する
「Python Script」アイコンから「データ分割」アイコンをつなげます。
パラメータは初期設定(学習/検証を8:2でランダムに分割)で実行できますので、 そのまま実行します。
[...]
のメニューから[▶]
をクリックして実行します。「線形回帰」を追加する
「データ分割」アイコンから「線形回帰」アイコンをつなげます。
「線形回帰」アイコンをダブルクリックして、パラメータ編集画面を表示します。
パラメータは次のように設定します。
- 「変数選択」の「目的変数」を 「利益」にチェック
「変数選択」の「説明変数」を「性別」 「年代」「職業」「世帯構成」にチェック
[実行]
をクリックして「線形回帰」アイコンを実行します。
「予測精度検証」を追加する
「線形回帰」アイコンから「予測精度検証」アイコンをつなげます。
「予測精度検証」アイコンをダブルクリックして、パラメータ編集画面を表示します。
パラメータは次のように設定します。
「変数選択」の「正解列」を 「利益」にチェック
次の操作で入力データを検証データへ変更するので、ここでは
[保存]
をクリックしてパラメータを保存します。
「予測精度検証」の入力データを評価データに設定する
「データ分割」アイコンから「予測精度検証」アイコンへリンクをつなげます。
「予測精度検証」アイコンの右上の
[…]
から[インプット設定]
を選択して、「Input Matching Controller」を起動します。 「予測精度検証」の検証データを「データ分割」の出力データ「validation」に変更します。[実行]
をクリックして「予測精度検証」アイコンを実行します。
基本フローをモジュール化し、「要素毎実行」の設定をする
【手順概要】
- 「データ分割」「線形回帰」「予測精度検証」アイコンをモジュール化する
- 「new module」アイコンの出力を「予測精度検証」の出力にする
- 「new module」アイコンを「通常実行」から「要素毎実行」に変更する
【手順詳細】
「データ分割」「線形回帰」「予測精度検証」アイコンをモジュール化する
「データ分割」アイコンをクリックし選択します。
さらに、Ctrl キーをクリックしたまま、「線形回帰」と「予測精度検証」もクリックします。 選択されている場合はアイコンの枠が影のように太くなります。
「データ分割」「線形回帰」「予測精度検証」が選択されていることを確認します。 シナリオ編集エリアの下側にある「Multiple Selection Menu」の「モジュール化」ボタンをクリックし 「モジュール化」 します。 これで、下図右のようにモジュール化されました。
モジュールの名前は「new module」となります。 2つ目以降のモジュールには(1),(2)…と番号が割り振られます。
「new module」アイコンの出力を「予測精度検証」の出力にする
「new module」アイコンの
[+]
をクリックしモジュールを開きます。「予測精度検証」アイコンの
[...]
のメニューから「接続リンク追加」をクリックして「outputs」アイコンにつなげます。「new module」アイコンを「通常実行」から「要素毎実行」に変更する
「inputs」もしくは「outputs」をダブルクリックして「new module」アイコンのパラメータ編集画面を表示します。
パラメータを次のように設定します。
変更パラメータ 変更内容 「実行方法」 要素毎実行
「入力設定」の「型」 table[]
「出力設定」の「名前」 「summary」「scores」 のみ残して他は削除 「出力設定」の「型」 「scores」は table[]
「出力設定」の先頭「summary」は要素毎実行で必ず出力される結果であるため、削除できません。 パラメータを設定した後
[保存]
をクリックします。「Input Matching Controller」で 「scores」が出力となっていることを確認します。もし、scores が選択されてない場合は選択してください。
Python Script アイコンでリスト形式のデータを作成する
【手順概要】
- Python スクリプトを変更する
- アイコンの出力の「型」をテーブルのリスト型「table[]」にして実行する
【手順詳細】
Python スクリプトを変更する
「Python Script」アイコンをダブルクリックしてパラメータ編集画面を表示します。
Python スクリプトの
result = table[table["居住地"]=="東京", :]
を
place = ["東京", "神奈川"] result = [table[table["居住地"]== v, :] for v in place]
に変更します。 このスクリプトは、place で指定した東京と神奈川のデータをそれぞれ抽出し、 result にリスト形式で格納する操作を行っています。
アイコンの出力の「型」をテーブルのリスト型「table[]」にして実行する
「出力設定」を開いて「型」を「table[]」に変更して
[実行]
をクリックします。正常終了すると、「Python Script」アイコンには東京と神奈川のデータがリスト形式で生成され、「new module」 の入力データとなります。
モジュールの実行結果の確認する
「行結合」アイコンを「new module」アイコンにつなげます。 要素毎実行モジュールの出力は複数のテーブルに分かれているので、 「行結合」で一つの結果にまとめて閲覧しやすくします。
「行結合」アイコンの
[...]
メニューから[▶]
をクリックします。 ここで『未確定のパラメータ設定があるため、実行に失敗する可能性があります。...』と尋ねられるかもしれませんが、これまでに入力した設定で実行可能ですので[実行]
をクリックします。正常終了しますと、「行結合」アイコンには青の
「レ」
アイコンが表示されます。モジュールの中の「データ分割」「線形回帰」「予測精度検証」アイコンには青の
「レ」
アイコンが表示されていませんが、要素毎実行ではモジュール内部のアイコンの実行結果は出力されないためです。「Inputs」もしくは「Outputs」アイコンの
[-]
をクリックして「new module」モジュールを閉じるとモジュールには青の「ㇾ」
アイコンが表示されているので、モジュールの実行結果が存在することがわかります。可視化画面では「行結合」アイコンにモデルの精度結果が表示されます。 1行目は東京のモデルであり、2行目は神奈川です。 モデルの精度結果の表示の順番は、モジュールの入力であるリストの要素の順番 (ここでは「Python Script」アイコンの出力 result の要素の順番)に対応しています。
この節のポイントです。
Python Script アイコンでリスト形式のデータを作成し、 後続のモジュールを「要素毎実行」に設定することで テーブル毎にモジュール内のフローを実行できます。 モジュールで出力されるリスト形式のデータは「行結合」で一つの結果になります。
2. GUI 定義で、ドロップダウンリストでパラメータを指定するアイコンにしてみよう
Python Script アイコンではスクリプトに GUI 定義宣言を入れることで GUI つきのアイコンにカスタマイズできます。
定義できる GUI はテキスト入力や数値入力、ドロップダウンリスト、表形式での選択 UI です。 ここでは、ドロップダウンリストの定義方法を試します。 また、元となるスクリプトは前節で説明したある特定の「居住地」を抜き出すスクリプトです。
【手順の概要】
- 「顧客データ.dft」と「Python Script」のフローを作成する
- GUI 定義の Python スクリプトを編集する
- ドロップダウンリストをアイコンに表示する
- ドロップダウンリストからパラメータに値をセットする
- ドロップダウンリストのタイトルを変更する
それでは、試してみましょう。
「顧客データ.dft」と「Python Script」のフローを作成する
「顧客データ.dft」を配置し、「Python Script」アイコンをつなぎます。
GUI 定義の Python スクリプトを編集する
「Python Script」アイコンをダブルクリックして、パラメータ編集画面を表示します。
中央の Python スクリプト
result = table
を
# MSIP\_GUI\_Definition\_v1.0.0 place = "東京" # {"type": "category", "list": [{"name": "東京", "value": "東京"}, {"name": "神奈川", "value":"神奈川"}]} # MSIP\_GUI\_Definition\_v1.0.0 result = table[table["居住地"] == place, :]
に変更します。
# MSIP_GUI_Definition_v1.0.0
は GUI 定義宣言です。 2箇所で宣言され、その間に GUI とするパラメータplace
が代入文で宣言しています。 また 、パラメータplace
の代入文と同じ行のコメントではコントロールのプロパティを定義しています。type
にはセットする値のデータ型を、list
には値の候補を指定します。 ドロップリストに「東京」や「神奈川」が選択肢として表示される設定となっています。 また、name
は表示名、value
はパラメータにセットする値となっています。次節の『【Q&A1】 文字列や数値をパラメータとして指定できますか? 』 には他の
type
も例示しています。ドロップダウンリストをアイコンに表示する
[保存]
をクリックすると、次のように上部にドロップダウンリストのコンポーネントが追加されます。ドロップダウンリストからパラメータに値をセットする
ドロップダウンリストから「神奈川」を選択し、
[保存]
をクリックします。 スクリプトのplace = "東京"
がplace = "神奈川"
となります。ドロップダウンリストの下の
[▼]
をクリックすると、スクリプト編集エリアの表示[▼]
と非表示が切り替わります。では、
[実行]
をクリックしてみましょう。 指定されたデータが出力されていることが可視化画面で確認できます。可視化画面の結果表示エリアで出力データ 「Python Script - result」をサマリ表示すると、「居住地」は指定されたデータのみであることがわかります。
ドロップダウンリストのタイトルを
居住地
に変更するタイトルを設定する時は
"title": "居住地"
と コントロールのプロパティ定義に追加します。# MSIP\_GUI\_Definition\_v1.0.0 place = "東京" # {"title" : "居住地", "type": "category", ... 省略...} # MSIP\_GUI\_Definition\_v1.0.0
[保存]
をクリックすると、ドロップダウンリストのタイトルが 「place」から「居住地」に更新されます。
この節のポイントです。
Python Script アイコンでスクリプトに GUI 定義を追加することで、 GUI によるパラメータ指定が可能となります。
GUI の定義の概要は
# MSIP_GUI_Definition_v1.0.0
という宣言文が2箇所必要- 宣言文の間にはパラメータを代入文で定義する
- パラメータの代入文の横にコメントでコントロールのプロパティを定義する
です。
この節では、コントロールのプロパティに
type
はcategory
list
は[{"name": "東京", "value": "東京"}, {"name": "神奈川", "value":"神奈川"}]}
を指定し、東京、神奈川のカテゴリ値の選択肢があるドロップダウンリストを表示しました。
また、全コントロールに共通なプロパティ title
を使い、入力するコントロールのタイトルに「居住地」を表示しました。
【Q&A1】 文字列や数値をパラメータとして指定できますか?
type
を用途にあわせて指定します。
文字列の場合:
# MSIP_GUI_Definition_v1.0.0 place = "東京" # {"type": "string"} # MSIP_GUI_Definition_v1.0.0
数値の場合:
# MSIP_GUI_Definition_v1.0.0 limit = 1 # {"type": "integer"} step = 0.1 # {"type": "float"} # MSIP_GUI_Definition_v1.0.0
真偽値の場合:
# MSIP_GUI_Definition_v1.0.0 flag = True # {"type": "boolean"} # MSIP_GUI_Definition_v1.0.0
例えば、「利益」がある値 judge_value
未満のデータを出力する場合は、次となります。
# MSIP_GUI_Definition_v1.0.0 judge_value = 100 # {"title" : "利益判定値", "type": "integer"} # MSIP_GUI_Definition_v1.0.0 result = table[table["利益"] < judge_value, :]
【Q&A2】 複数のパラメータをグループに分けて表示できますか?
# MSIP_Group
を使用します。
GUI 定義宣言内で # MSIP_Group グループ名
と宣言すると、
それ以降のパラメータは宣言されたグループに所属するとみなされます。
次は2つのグループにわけて表示する例です。
# MSIP_GUI_Definition_v1.0.0 # MSIP_Group グループA lower1 = 0.1 # { "type": "float", "title": "下限1" } upper1 = 1.0 # { "type": "float", "title": "上限1" } # MSIP_Group グループB lower2 = 0.2 # { "type": "float", "title": "下限2" } upper2 = 1.2 # { "type": "float", "title": "上限2" } # MSIP_GUI_Definition_v1.0.0
「グループA」では 「下限1」 と「上限1」のコントロールが表示され、 「グループB」では 「下限2」 と「上限2」のコントロールが表示されています。
3. 入力データの列名を選択する GUI 定義をしてみよう
前節までは 基本的な GUI の仕様を説明しました。 ここでは、入力データの列を指定するドロップダウンリストを表示します。 スクリプトは入力データから GUI で指定された列を抜き出し出力データとします。
【手順の概要】
- 「顧客データ.dft」と「Python Script」のフローを作成する
- GUI 定義の Python スクリプトを編集する
- ドロップダウンリストをアイコンに表示する
- ドロップダウンリストからパラメータに値をセットする
それでは、試してみましょう。
「顧客データ.dft」と「Python Script」のフローを作成する
「顧客データ.dft」を配置し、「Python Script」アイコンをつなぎます。
GUI 定義の Python スクリプトを編集する
入力データ列を指定する GUI 定義のスクリプトを作成します。 「Python Script」アイコンをダブルクリックして、パラメータ編集画面を表示します。
中央の Python スクリプト
result = table
を
# MSIP\_GUI\_Definition_v1.0.0 select_column = {} # {"type": "inputcolumn"} # MSIP\_GUI\_Definition_v1.0.0 result = table[[select_column["name"]]]
に変更します。
コントロールのプロパティ
type
は、入力データの列を意味するinputcolumn
です。 パラメータ select_column の値は辞書型となるので、初期値を{}
とします。ドロップダウンリストをアイコンに表示する
[保存]
をクリックすると、次のように上部にselect_column *
と表示されたドロップダウンリストが追加されます。ドロップダウンリストからパラメータに値をセットする
ドロップダウンリストから「年代」を選択し、
[保存]
をクリックします。 スクリプトのselect_column = {}
がselect_column = {"name": "年代", "type": "Category"}
となります。 ドロップダウンリストで選択した列の名前"年代"
と列の型"Category"
が select_column にセットされたことを表しています。[実行]
をクリックすると、「年代」の列のみのデータが出力されます。
この節のポイントです。
入力データの列をドロップダウンリストから指定するには、
type
はinputcolumn
- パラメータの初期値は
{}
とします。
さらに、[保存]
後、GUI から選択することで、
パラメータには{"name": "xxx", "type": "xxx"}
という形式の適切な値がセットされます。
【Q&A3】入力データの列を複数指定できますか?
単数の列を選択する場合に type
は inputcolumn
ですが、複数の列では inputcolumn[]
となります。
パラメータの値はリストとなるので、初期値を []
とします。
複数の列を抜き出し出力データとする場合は次となります。
# MSIP_GUI_Definition_v1.0.0 select_columns = [] # {"type": "inputcolumn[]"} # MSIP_GUI_Definition_v1.0.0 result = table[[v["name"] for v in select_columns]]
[保存]
をクリックすると、上部に入力データの列を複数選択できるドロップダウンリストが表示されます。
下図ではドロップダウンリストから「年代」と「職業」を選択しています。
【Q&A4】入力データの列を指定する方法は他にもありますか?
表形式で選択する変数選択用グリッドコントロールがあります。 表の各行に入力データの列情報が並び、表の各列をパラメータとして表示します。 パラメータは複数個設定可能で、各パラメータに対し、入力データの列を指定することができます。
コントロールのプロパティ type
は variable
です。
また、type
の他に columns
を設定する必要があります。
columns
にはグリッドコントロールから取得するパラメータの情報を記載します。
field
で定義された値に対して選択値がセットされます。
例えば、表形式で指定するパラメータが A
と B
の2つである場合の定義は
{ "type": "variable", "columns": [{ "field": "A" }, { "field": "B" }]
となります。
パラメータの値は辞書で、初期値を {"A":[], "B":[]}
とします。
result
には A
で選択した列のデータが、
result1
には B
で選択した列のデータが出力されるようにします。
「出力設定」で result1
を追加しておきます。
# MSIP_GUI_Definition_v1.0.0 select_columns = {"A":[], "B":[]} # { "type": "variable", "columns": [{ "field": "A" }, { "field": "B" }] } # MSIP_GUI_Definition_v1.0.0 result = table[[v["name"] for v in select_columns["A"]]] result1 = table[[v["name"] for v in select_columns["B"]]]
[保存]
をクリックすると、次のように上部に表形式の選択 UI が追加されます。
チェックをいれて [実行]
をクリックすると選択値をパラメータにセットして実行します。
下図では、「年代」と「世帯構成」を選択しているので、{"A":[{"name":"年代","type":"category"}],"B":[{"name":"世帯構成","type":"category"}]}
がパラメータにセットされます。
result
には A
で選択した列年代
のデータが、 result1
には B
で選択した列世帯構成
のデータが出力されます。
おわりに
上級編では、次の内容について解説しました。
- 要素毎実行のためのリスト化データの生成
- GUI 定義のスクリプト
- 入力データ利用した GUI 定義スクリプト
なお、詳細は製品のヘルプからたどれます
- 「3. MSIP リファレンスマニュアル」
- 「3.6.12. モジュール機能」
- 「3.13. 要素毎実行機能」
- 「3.10 スクリプトアイコン」>「Python アイコン GUI 定義機能」
をご覧ください。