SPSS Modeler ヒモトク

第3回 複数ファイル同処理のループ処理 – IBM SPSS Modelerスクリプトによる分析作業の効率化

記事をシェアする:

複数ファイル同処理のループ処理(ループ処理+リストのパラメータ展開)

前回(第2回)の100個の入力ファイルの例のように、同じストリームを複数のファイルに適用するにはどうしたらよいでしょうか。入力ファイル名が 自動的に変更されながら、繰り返し処理が出来ると便利です。そこで、例を示しながら具体的な処理をご紹介します。今回は、ある企業における全国6支店の データに対して同じ処理を行う例を見てみます。

使用するストリームは下記の通りです。

spssmodeler_fig03-01


処理概要

最初に、読み込むファイルのリストを作成します。そして、スクリプトにファイル名の変数を用意し、リストから1つずつ読み込ませるようにします。


1. ファイル名の取得

事前にファイル名の一覧をファイルに保存しておきます。今回は1つのフォルダにある全ファイルを対象とし、MSDOSでコマンド「ls > ../filelist.txt」を実行してファイルリストを作成しました。これをループ処理で使えるように加工します。この方法は、特定のフォルダ内にある全ファイルを対象とする場合にファイル数がわからなくてもよいため、自動処理に向いています。


2. ストリーム:ファイルリスト作成

入力パレットの「可変長ファイル」ノードでfilelist.txtを指定して「ファイルからフィールド名を取得」のチェックを外し、区切り文字で 「タブ」をチェックします。また、スクリプト実行用にノードをユニークにするため、「注釈」タブの「名前」で「ユーザー設定」を選択し、ノード名を「対象 ファイル」とします。

spssmodeler_fig03-02

spssmodeler_fig03-03

このままではファイル名が横持ちですので、フィールドパレットの「行列入替」ノードで縦持ちに加工します。「新規フィールド」を1、「行列入替」を「すべて文字列」に設定します。

spssmodeler_fig03-04

「テーブル」ノードを繋いでノード名を「ファイルリスト」とします。テーブルを実行すると「フィールド1」にファイル名がリストされます。

spssmodeler_fig03-05

このようにリストを作成することで、ファイル数を固定する必要がなく、フォルダ内の全ファイルが対象となります。毎回ファイル数が変わる場合でも、スムーズに自動処理が行えます。


3. ストリーム:支店別データのエクスポート

次に、データ入力「支店データ」、データ加工「タイムスタンプ」、エクスポート「支店別データ」までのストリームを作成します。ここでは、データ加工として「タイムスタンプ」フィールドの追加を行います。


4. スクリプト

最後に、スクリプトを記述します。ポイントは、tablenodeオブジェクトのパラメータ「output」を使うことです。テーブル出力結果をループ処理で一行ずつ順に読み込ませることが出来ます。そして、ファイルリストのp行目2列目の値をファイル名「file_nm」とし、それを「支店データ」ノードの参照ファイルとして設定します。

また、テーブル行数をカウントできる「row_count」を使うと、「行数=ループ回数」として変数に当てはめられます。ループ回数を固定する必要がないので、毎回対象ファイル数が変わるバッチ処理にも最適です。ここでも、ループ処理をファイルリストの行数分だけ繰り返します。

「tablenode.output」を有効にするには、スクリプト内でテーブルノードを実行する必要があります。そして、リスト参照処理が終わったら、必要に応じてテーブル出力を閉じて(削除して)おきます。

スクリプト全体は下記の通りです。

execute ‘ファイルリスト’ /* リストを読むためにテーブルが出力される */var last_low
set last_row= ファイルリスト:tablenode.output.row_count /* ファイルリストの行数カウント */
var p
set p=1
var file_nmfor p from 1 to last_row /* ループ処理 ここから*/set file_nm= value ファイルリスト:tablenode.output at ^p 2 /* p行目2列目の値をファイル名「file_nm」に設定 */
set 支店データ:variablefilenode.full_filename = “C:Documents and SettingsAdministratorデスクトップModelerScript_tecDoc\” >< ^file_nmif p=1 then
set 支店別データ:databaseexportnode.write_mode = Create /*初回はモードを「テーブ作成」に設定*/
else
set 支店別データ:databaseexportnode.write_mode = Append /*次の処理のためにモードを「テーブルへ挿入」に設定*/
endifexecute ‘支店別データ’set p=^p+1endfor /* ループ処理 ここまで*/delete output :tableoutput /* 出力されたテーブルを閉じる */

ループ処理やテーブル出力によるパラメータ展開は、自動化処理で重宝する手段の一つです。他にも様々な場面に利用できます。そこで、次章以降はこれらを使った効率的な処理方法をいくつかご紹介します。

More SPSS Modeler ヒモトク stories

ブログで学ぶSPSS_Modeler #08- パッと見地味でもベテラン推し!平均値ノードで示す施策の有効性

Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...

  こんにちは、株式会社MAIの木暮です。   今回は、SPSS Modelerの平均値ノードで示す施策の有効性検証に活用するTipsを、具体例を交えながら掘り下げていきます。   SPSS ...続きを読む


身近な疑問をヒモトク#07-ニュースでよく見るイケてる地図グラフを自分でもサクッと描いてみたい

Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...

  こんにちはIBMの角田です。ビジネス・インテリジェンス(BI)製品の担当をしています。 最近テレビでニュースを見ているとグラフの表現力が上がったと感心します。とりわけ地図による可視化はバリエーションも豊富に ...続きを読む


ブログで学ぶSPSS_Modeler #07- モデル評価に欠かせない予測変数の重要度!そのカラクリと存在意義

Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...

  皆様こんにちはIBMの西牧です。   SPSS Modelerでモデルを作成すると大抵の場合、予測変数の相対重要度が出ます。     個々のフィールドがどの程度予測に影響を与え ...続きを読む