SAS Studio Taskの紹介
仕事の中で、このような状況に遭遇したことはないでしょうか?普段Enterprise Guide或いはSAS Studioを利用している分析チームの中には、コーディングユーザとSAS言語ができないGUIユーザがいます。ある分析プロジェクトにおいて、特定のモデルを活用する場合に、そのモデルはSASコードを書くことで利用することはできますが、EGのGUI操作やSAS Studio のTaskだけでは活用することができません。この場合に、GUIユーザがコーディングユーザと同じような分析を行うためには、コーディングユーザが作ったSASコードを利用し、入出力情報やパラメータなどを修正した上で使用することになります。しかし、このようなやり方では、たとえば、修正を間違えることによって、エラーを起こし、コードを書いた人に助けてもらわないといけないことも時々発生していました。
この状況に置いて、SAS言語ができないユーザでも、コードを書かずにGUI上の簡単なマウス操作で実施できるような便利な機能をご紹介します。
SAS Studioには、SAS Studioカスタムタスクという機能が組み込まれています。必要な機能が既存のタスクとして用意されていなくても、プロシジャーがあれば自らタスクを簡単に作成できるインターフェースです。XML形式で必要な入出力箇所やオプションを定義することによって、GUI画面を持つタスクが簡単に作れます。そのタスクをSAS Studio上では勿論、SAS Enterprise Guide上でも使うことができます。非常に便利な機能です。この便利なSAS Studioカスタムタスクには以下のような特徴があります。
・タスクを作る際にはSAS以外のプログラミング知識は必要ありません。
・SAS Studioで作る場合は、XMLを書きながら、作成途中のGUIの画面を常に確認できます。
・タスクを使う人は簡単なマウス操作で利用可能です
・そして、SAS StudioとEnterprise Guide両方での利用が可能です。
・XMLベースなのでタスクの修正は簡単です。
・テキストボックス、チェックボックスなど多様なコントロールを定義可能です。
SAS Studio Taskの作り方
今回は混合正規モデルを例にSAS Studio Taskの作成方法を紹介します。SAS Studio Taskを作るには二つの方法があります。
一つ目は新規で一からタスクを作成する方法です。
二つ目は既存のタスクをテンプレートとして使い、内容を修正しながらタスクを作る方法です。
今回の記事は一つ目の方法をメインとして紹介しますが、記事の最後に二つ目の方法に関しても簡単に紹介します。作成ツール(XMLエディタ)としては、SAS Studioや任意のエディターのいずれかを使用しても構いませんが、この記事では最新のSAS Studio 5.2を使用しています。操作方法などは使っているSAS Studioのバージョンによって変わる場合はありますが、定義の書き方に相違はありません。
SAS Studioを開いて、メニューから新規作成をクリックし、タスクと選択します。そして下の図のようなタスクテンプレートの画面が表示され、この画面内でSAS Studio Taskの定義を行います。まずSAS Studio Taskの定義の構造を紹介します。
最初の2行はシステムにより生成されたタスクのエンコーディングとスキーマバージョンの定義です。この部分を修正する必要はありません。
<?xml version="1.0" encoding="UTF-16"?> <Task schemaVersion="7.2"> |
そして3行目からがSAS Studio Taskの定義であり、大体以下の4つの部分に構成されています。
・タスクの定義
・メタデータの定義(データソースとオプション)
・UIレイアウトの定義
・タスク実行用SASコード
1. タスクの定義
最初のはタスクの基本的な定義を記入する部分です。定義できる項目として、タスク名と説明、利用するプロシジャー名、SAS Studioのバージョンとドキュメントのリンクです。定義の内容はタスク機能に影響はありませんが、タスクを利用する人に、このタスクの機能と使用法を理解してもらう役割があるので、分かりやすく書くことをお勧めします。
2. メタデータの定義:データソース
次はメタデータです、こちらはデータソースとオプションの二つの部分の定義で構成されています。タスクの表示画面で使用するコンテンツの種類や名前をここで定義します。
まずはデータソースの定義を説明していきます。例えば、下の図に表示したデータソースと列を選択するUIを作りたい場合、UIの部分を設計する前に、まずそのUIで使用するデータソースの名前などを定義しなければなりません。
下の図のに書いてあるのは、データソース名と利用するデータライブラリのエンジンです。下のの部分ではモデリングする際に使う入力変数の数や型が定義されています。
ここに書いてあるmaxVars=”0”の意味は数無制限です。
3. メタデータの定義:オプション
オプションについては、タブやチェックボックスなどデータソース以外のインターフェースをここで定義します。例えば、”DATA”というタブを作成したい場合は、の中にそのタブ変数の名前と型、表示名をそれぞれ定義する必要があります。
ここの変数名は、タスクを定義する際に他のUIや実行コードの部分と連携するために利用されます。表示名はタスクを使用する時に表示されるタブの名前なので、表示名をここで”DATA”と定義します。また、”inputType”の設定によって、定義項目と内容が変わる場合もあります。例えば作ったモデルをファイルとして保存する必要がある場合は、ファイル選択機能を利用します。下の図の4行目に書いてある通り、今回は”inputType”を”sasserverpath”と指定する必要があります。そして”inputType”に応じて、タブを定義する時とは異なり、pathtypeを定義する必要もあります。ここでは”file”と定義しています。
最後は表示用の文字列”Choose your file”を定義します。このような定義の仕方で、SAS Studio Taskの中で様々な機能を利用することができます。定義では”pathtype”などのオプションもそれぞれ異なりますので、興味があれば下記のリンクのドキュメントをご参照ください。
SAS? Studio 5.2: Developer’s Guide to Writing Custom Tasks
4. UIレイアウトの定義
SAS Studio TaskのUIのレイアウトについては二つの階層があります。
一つ目はタブです。の中にoption=”タブ変数名”を定義します。ちなみに、タブを定義しない場合は、SAS Studio Taskは自動的に「オプション」というタグを作成してくれるので、こちらの定義は必須ではありません。
二つ目はグループです。あるタブの中にグループを作る場合は、そのタブのとの間にを入れて、その中にoption=”グループ変数名”を定義します。一つ或いは複数の機能を一つのグループにまとめることができます。グループの定義は必須ではありませんが、沢山の機能を作る場合は、グループごとにまとめたほうが見やすくなります。
グループとタブの定義が終わったら、メタデータの中に定義したデータソースとオプションをここにレイアウトすることができます。データソースの場合はの中にdata=”データソースの変数名”で、他の機能の場合はの中にoption=”オプション変数名”と定義します。あるグループの中に入れたい場合は、との間に定義を書きます。定義の順番と表示する時の順番は一致しているので、レイアウトを考えたうえで定義する必要があります。
5. タスク実行用SASコード
最後に一番重要なコードの部分を説明します。タスクを実行する際に、選択されたデータソースとユーザが設定したパラメータがこのSASコードに引数として渡され、実行されます。引数の使い方としては、定義したデータソースなどの変数名に$マークを付ければ、変数内にある値が使われます。下記の図の中に簡単な例が書いてあります。さきほどメタデータの定義コードでデータソースの変数名をDATASOURCEとして定義していたので、プロシジャーの中にデータを指定する場合、$DATASOURCEと書きます。
以下は今回用意した混合正規モデルタスクの定義コードの完成版です。
<?xml version="1.0" encoding="UTF-16"?><Task schemaVersion="7.2"> <!--- Define the registration properties for this task. --> <Registration> <Name>GMM MODEL TASK</Name> <Description>混合ガウスモデル</Description> <Procedures>gmm</Procedures> <Version>5.2</Version> <Links> <Link href="http://support.sas.com/software/products/sasstudio/index.html#s1=2">SAS Studio Documentation</Link> </Links> </Registration> <Metadata> <!--- Define the data and roles for this task. --> <DataSources> <DataSource name="DATASOURCE" libraryEngineInclude="CAS"> <Roles> <Role maxVars="0" minVars="1" required="true" name="input" type="N">入力列</Role> </Roles> </DataSource> </DataSources> <!--- Define the task options. --> <Options> <Option inputType="string" name="DATATAB">データ</Option> <Option inputType="string" name="DATAGROUP">データ</Option> <Option inputType="string" name="OUTPUTGROUP">出力</Option> <Option inputType="string" name="OPTIONGROUP">オプション</Option> <Option inputType="string" name="ROLESGROUP">役割</Option> <Option inputType="string" name="ROLESTEXT">説明変数</Option> <Option name="clusterNum" defaultValue="1" decimalPlaces="0,0" inputType="numbertext" minValue="1" maxValue="100" promptMessage="1からの整数を入力してください" missingMessage="1からの整数を入力してください" rangeMessage="T1からの整数を入力してください"> 最大クラスタ数</Option> <Option name="seed" defaultValue="0" inputType="numbertext" minValue="-10000" maxValue="10000"> シード</Option> <Option name="scoreOut" defaultValue="Public.score" libraryEngineInclude="CAS" indent="1" inputType="outputdata" unique="true" required="true">スコアテーブル</Option> <Option name="astoreOut" defaultValue="Public.astore" libraryEngineInclude="CAS" indent="1" inputType="outputdata" unique="true" required="true">モデルテーブル</Option> </Options> </Metadata> <!--- Define the UI for task options --> <!--- The UI engine will determine the best representation. --> <UI> <Container option="DATATAB"> <Group open="true" option="DATAGROUP"> <DataItem data="DATASOURCE"/> </Group> <Group open="true" option="ROLESGROUP"> <OptionItem option="ROLESTEXT"/> <RoleItem role="input"/> </Group> <Group open="true" option="OPTIONGROUP"> <OptionChoice option="clusterNum"/> <OptionChoice option="seed"/> </Group> <Group open="true" option="OUTPUTGROUP"> <OptionChoice option="scoreOut"/> <OptionChoice option="astoreOut"/> </Group> </Container> </UI> <!--- Define the velocity code template. --> <CodeTemplate> <![CDATA[data _null_; proc gmm data=$DATASOURCE nThreads=32 seed=$seed maxClusters=$clusterNum alpha=1 inference=VB (maxVbIter=1000 covariance=DIAGONAL threshold=0.001) clusterSumOut=Public.clustersum clusterCovOut=Public.clustercov; input _NUMERIC_; score out=$scoreOut copyvars=(_ALL_); ods select nObs descStats modelInfo; savestate rstore=$astoreOut(replace=yes); run; ]]> </CodeTemplate> </Task> |
タスクを開くと、表示される画面は下記のようなイメージになります。
タスクを作り終えたら、下記の手順通り、タスクをサーバー上に保存します。
SAS Studio Taskの使用
保存したSAS Studio TaskはSAS Studioでは勿論、SAS Enterprise Guide(8.2以降のバージョン)上でも活用できます。以下はその手順です。
1. Viyaサーバーへ接続します。
2. プロセスフローを作成し、入力データをフロー上にドラッグします。
3. 入力データを選択したうえで、ディレクトリから保存したタスクをダブルクリック
4. 設定したオプションに関して、値を選択や入力し、実行ボタンをクリックします。
5. 結果を確認します。
既存のSAS Studio Taskの修正方法
タスクを一から設計することで、ユーザーのニーズに細かく合わせることができる反面、時間がかかります。
特定の既存のタスクのインターフェイスが今回作成する必要のあるユーザのニーズに近いと考えられる場合、既存のタスクを修正して活用することが、より効率的な方法です。
以下では、既存のタスクを修正する方法を紹介します。
1. SAS Studioでタスクのメニューから修正したいタスクを右クリックし、「タスクテンプレートとしてコピー」、「マイタスク」という順番で選択します。
2. 「マイタスク」を開き、ステップ1で追加されたタスクを右クリックし、「タスクテンプレートの編集」と選択します。
3. タスクの定義を修正し、先ほど紹介した方法と同様にタスクを保存します。
以上のように、SAS Studio上でカスタムタスクを設計し、SAS Enterprise Guideで活用することができるようになります。日常業務でより複雑な要件が求まられる場合は、SAS Studio Taskのその他の機能も活用しながら作成してみてください。詳細については、以下の資料を参照してください。
SAS? Studio 5.2: Developer’s Guide to Writing Custom Tasks