0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

目的

日々の業務にMicrosoft Copilotを導入されている企業が多い印象を受けます。
現状SPSS ModelerとCopilotの直接的な公式の連携はありませんが
活用例として分析結果の解釈をCopilotに依頼する案を考えてみました。

PMMLファイルには決定木の分岐ルールや各ノードの確率分布といったモデルのロジックそのものが含まれるため、生成AIに投入するにはリスクがあります。
一方で、精度分析ノードのHTML(混同行列・AUC)と評価ノードのtxt(グラフの数値データ)は、いずれも集計された統計量やグラフ座標のみで、個人を特定できる情報を含まないので、気兼ねなく生成AIに投入できるのが良い点かなというのが雑感です。

対象読者

・Copilotを日々の業務で使用している方
・SPSS Modeler Clientを日々の業務で使用している方
・SPSS Modelerと生成AIの連携方法を検討している方

使用データについて

今回は銀行マーケティングのオープンデータを使用しています。

下記ページからデータをダウンロードして、bank-additional.zipを展開し、bank-additional-full.csvを使用しています。
区切り文字が「;」である点に気を付けてください。

全体の流れ

まずSPSS Modeler Clientを使って簡単な分析ストリームを作成します。
次に作成したモデルナゲットに精度分析ノードと評価ノードをリンクさせます。
スクリプトを使用して、モデルからはPMMLファイルを、
精度分析ノードからは混同行列とAUCの結果のHTMLファイルを、
評価ノードからはゲイングラフとROCグラフの結果をテキストファイルとして出力します。
最後に取得したファイルをCopilotに読み込ませて分析結果の解釈を依頼します。

ファイルの出力先としてはOneDriveを指定します。

目次

1章 SPSSクライアントでのストリーム作成

1-1.ストリーム作成について

使用データについて、にてご紹介したデータをSPSSクライアントで
読み込み、簡単な分析ストリームを作成します。

区切り文字が「;」なので、その他にチェックを入れて直接入力してください。
「y」フィールドが対象フィールドになります。
今回はCHAIDモデルを使用していて、他はデフォルトのままで問題ありませんので
モデルナゲットを作成します。

0527_6.png

精度分析ノードと評価ノードをモデルナゲットからリンクさせます。

0527_3.png

1-2.分析結果出力スクリプトの作成について

今回はSPSSの機能であるModeler Scriptを使って
・モデルナゲットのPMMLファイル
・精度分析ノードの混同行列とAUCの結果を出力するHTMLファイル
・評価ノードのゲイン・ROCグラフの内容を出力するtxtファイル
を作成します。

以下が出力スクリプトの一例になります。
ちなみにですが、このスクリプトはIBMBobを使用して作成しています。

IBM社の Python スクリプトおよび自動化ガイドを参照する形で
各ノードからの出力ファイルを指定する形でスクリプト作成を指示しています。
Copilotに投入するので、OneDrive上に出力しています。ローカルでも問題ありません。

作成の時の注意点としては、各ノードで出力できる拡張子は決まっているので
指示の中に盛り込む必要がありました。
(指示をしないと精度分析ノードの出力で延々とエラーを吐き続けてBobがずっと動く形に私はなりました。。。)

import modeler.api
import os

stream = modeler.script.stream()

# ===== 出力先 =====
output_dir = u"C:/Users/user_name/OneDrive - 組織名/analytics_0528"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

html_path        = os.path.join(output_dir, "evaluation_report.html")
gains_data_path  = os.path.join(output_dir, "gains_chart_data.txt")
roc_data_path    = os.path.join(output_dir, "roc_chart_data.txt")

# ===== 1. ノード取得(typeNameだけで判定) =====
analysis = None
evaluation = None

for node in stream.iterator():
    type_name = node.getTypeName()
    if type_name == "analysis":
        analysis = node
        print("精度分析ノード検出:", node.getLabel())
    elif type_name == "evaluation":
        evaluation = node
        print("評価グラフノード検出:", node.getLabel())

if analysis is None:
    raise Exception("精度分析ノードが見つかりません")
if evaluation is None:
    raise Exception("評価グラフノードが見つかりません")

# ===== 2. 精度分析ノード設定 =====
analysis.setPropertyValue("output_mode", "File")
analysis.setPropertyValue("output_format", "HTML")
analysis.setPropertyValue("full_filename", html_path)
analysis.setPropertyValue("performance", True)
analysis.setPropertyValue("coincidence", True)
analysis.setPropertyValue("evaluation_binary", True)
analysis.setPropertyValue("confidence", True)

# ===== 3. 評価グラフ共通エクスポート設定 =====
def configure_evaluation_export(node, filename):
    node.setPropertyValue("export_data", True)
    node.setPropertyValue("data_filename", filename)
    node.setPropertyValue("delimiter", ",")
    node.setPropertyValue("new_line", True)
    node.setPropertyValue("inc_field_names", True)
    node.setPropertyValue("inc_baseline", True)

# ===== 4. ゲイングラフ実行 =====
evaluation.setPropertyValue("chart_type", "Gains")
evaluation.setPropertyValue("cumulative", True)
evaluation.setPropertyValue("inc_best_line", True)
evaluation.setPropertyValue("n_tile", "Percentiles")
evaluation.setPropertyValue("style", "Line")
configure_evaluation_export(evaluation, gains_data_path)
evaluation.run([])
print("ゲイングラフのデータを出力:", gains_data_path)

# ===== 5. ROCグラフ実行 =====
evaluation.setPropertyValue("chart_type", "ROC")
configure_evaluation_export(evaluation, roc_data_path)
evaluation.run([])
print("ROCグラフのデータを出力:", roc_data_path)

# ===== 6. 精度分析ノード実行 =====
analysis.run([])
print("精度分析HTMLを出力:", html_path)

# ===== 7. PMML(XML) 出力 =====
results = []
stream.runAll(results)

taskrunner = modeler.script.session().getTaskRunner()
exported_count = 0
for obj in results:
    if isinstance(obj, modeler.api.ModelOutput):
        label = obj.getLabel()
        safe_label = "".join(c if c.isalnum() or c in "-_" else "_" for c in label)
        out_path = os.path.join(output_dir, "model_" + safe_label + ".xml")
        taskrunner.exportModelToFile(obj, out_path, modeler.api.FileFormat.XML)
        exported_count += 1
        print("XML(PMML)出力:", out_path)

# ===== サマリー =====
print("=" * 50)
print("出力ファイル一覧:")
print("  HTML(精度分析):    " + html_path)
print("  TXT(ゲインデータ): " + gains_data_path)
print("  TXT(ROCデータ):    " + roc_data_path)
print("  XML(PMML):         " + str(exported_count) + "")
print("完了")

作成したスクリプトを実行します。
ツールタブの中の「ストリームのプロパティ」を開きます。
実行タブを開いて、作成したスクリプトを貼り付けます。
赤枠の「このスクリプトを実行」ボタンをクリックするとファイルが出力されます。

0527_4.png

簡単に作成したファイルをご紹介します。

・model_y.xml
SPSS Modelerで作成したモデルナゲットをまとめているファイルです。
今回はCHAIDモデルなので決定木の内容がまとまっています。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<PMML version="4.3" xmlns="http://www.dmg.org/PMML-4_3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-4_3 pmml-4-3.xsd">
  <Header copyright="Copyright(c) IBM Corp. 1989-2017. All rights reserved.">
    <Application name="IBM SPSS Modeler Common" version="19.0.0.0"/>
    <Timestamp/>
</Header>
  <DataDictionary numberOfFields="21">
    <DataField dataType="double" displayName="age" isCyclic="0" name="age" optype="continuous"/>
    <DataField dataType="string" displayName="job" isCyclic="0" name="job" 
<~~~~中略~~~~>
</Extension>
      <True/>
      <ScoreDistribution confidence="0.885006353240153" probability="0.885006353240153" recordCount="18109" value="no">
        <Extension extender="spss.com" name="probability" value="0.885006353240153"/>
</ScoreDistribution>
      <ScoreDistribution confidence="0.114993646759848" probability="0.114993646759848" recordCount="2353" value="yes">
        <Extension extender="spss.com" name="probability" value="0.114993646759848"/>
</ScoreDistribution>
<~~~~後略~~~~>

・evaluation_report.html
精度分析ノードを実行した出力画面を保存したようなファイルです。
分析結果をそのままCopilotに渡すことが出来ます。

image.png

・gains_chart_data.txt
・roc_chart_data.txt
評価ノードでゲイングラフとROCグラフを出力した時の結果をテキスト形式で出力しています。

データ区分,FPR,$R-y
1_学習,0.000000,0.000000
1_学習,0.003203,0.063748
1_学習,0.008891,0.154271
~~~~~
1_学習,0.598542,0.999150
1_学習,0.622508,0.999150
1_学習,0.694572,1.000000
1_学習,0.732398,1.000000
1_学習,0.772931,1.000000
1_学習,0.816887,1.000000
1_学習,0.886686,1.000000
1_学習,1.000000,1.000000
2_テスト,0.000000,0.000000
2_テスト,0.002386,0.056843
2_テスト,0.008786,0.137735
~~~~~
2_テスト,0.818374,0.999563
2_テスト,0.884592,0.999563
2_テスト,1.000000,1.000000

2章 M365 Copilot上での分析レポートの作成

作成したファイルを元にCopilotで分析レポートを作成してみます。
Basicプランでは3ファイルまでしか添付できないため、まずモデルの結果と
混同行列・AUCの結果をもとにレポート作成してもらいます。
「Attach cloud files」からOneDriveのファイルは添付できます。

ちなみにですが、proプランになるとCopilotがプロンプトに応じて自律的に自分のOneDrive内を検索してくれるようですが、Basicプランでは出来ませんでした。

0527_5.png

個人情報や元データは与えていませんが、PMMLファイルを基に使用データについてまとめてくれます。

image.png

分析の中の重要なルールもまとめてくれます。

image.png

ゲインチャートグラフとROCグラフの結果も追加して、レポートの改善を指示します。

image.png

グラフの結果も踏まえた、分析結果のまとめとスライド作成の案を提案してくれます。
分析結果の見方を質問したり、特徴量作成について議論するには十分使えると思います。
このまま分析のレポートを作成したり、パワーポイントの資料を作成したりするにはプロンプトに工夫が必要なようです。

image.png

あとがき

今回はSPSS Modelerで出力できる分析結果をCopilotに読み込ませて簡単なレポートを作成してもらったり、要点を整理してもらう方法をご紹介しました。

精度分析ノードのHTMLや評価ノードのtxtは集計された統計量やグラフ数値のみで個人情報を含まないため、生成AIで分析結果の解釈を確認できる点がこの使い方の利点かなと思います。

作成したスクリプトは複数の精度分析ノードや評価ノードがある場合には対応していないためノードIDなどで指定する形に改良する必要があります。

記事の内容につきましてご不明点、ご指摘ございましたらお気軽にコメントください。
拙い文章ではございますが、最後までお付き合いいただきありがとうございました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?