Business Intelligence Tutorial : キューブの作成
ここでは、単純な Business Intelligence キューブを作成します。
基本的なキューブの作成
-
前述のように、管理ポータルにアクセスし、サンプルをインストールしたネームスペースに移動します。
-
[ホーム]→[Analytics]→[アーキテクト] に移動します。
-
[新規] をクリックします。ダイアログ・ボックスが表示されます。
-
このダイアログ・ボックスで、以下を指定します。
-
[定義タイプ : キューブ] — これを選択します。
-
[キューブ名] — Tutorial
-
[ソースクラス] — [参照] ボタンをクリックし、[BI.Study.Patient] を選択して [OK] をクリックします。
-
[キューブのクラス名] — Tutorial.Cube
-
-
[OK] をクリックします。
キューブ・クラスが生成されます。これはスタジオでも表示および変更できます。
-
中央の領域にある太字の最上行 (Tutorial のラベル) をクリックします。これによって、キューブが選択され、右側で詳細を編集できます。
-
[詳細] ペインで、[ヌル置換文字列] に None と入力します。
-
[保存] をクリックして、[OK] をクリックします。
キューブ・クラスが更新されます。
左領域にあるクラス・ビューワの表示が以下のようになります。
クラス・ビューワは、ベース・クラスのクラス・プロパティ (リレーションシップ・プロパティ以外) の有益なビューを提供します。このビューを使用すると、これらのプロパティに基づく InterSystems IRIS Business Intelligence 要素を非常に簡単に作成できます。ただし、この表示によって一部のプロパティにアクセスする便利な方法が提供されるとしても、ソース式を使用して任意のデータにアクセスすることも可能であるということを認識しておくことは重要です。これらのソース式は、キューブの構築時に評価されるため、実行時のパフォーマンスに影響しません。このチュートリアルでは、これらの点について後ほど説明します。
レベルおよびメジャーの追加
ここでは、Tutorial キューブにレベルとメジャーをいくつか追加します。
-
クラス・ビューワ (左領域) からモデル・ビューワの [メジャー] ヘッダ (中央の領域) に以下の項目をドラッグ・アンド・ドロップします。
-
Age
-
TestScore
これにより、Age および TestScore という名前のメジャーが、それぞれの名前を持つクラス・プロパティに基づいて作成されます。
-
-
TestScore メジャーを以下のように変更します。
-
[メジャー] ヘッダの下のメジャー名をクリックします。
-
[詳細] ペイン (右領域) で、[名前] を Test Score に変更します。
-
[検索可能] をクリックします。
-
-
以下の手順で、Avg Age メジャーを作成します。
-
再度、クラス・ビューワからモデル・ビューワの [メジャー] ヘッダに [Age] プロパティをドラッグ・アンド・ドロップします。
これによって、Age1 という名前の新しいメジャーが作成されます。
-
モデル・ビューワでメジャー名をクリックして、[詳細] ペインで以下の詳細を編集します。
-
[名前] に Avg Age と指定します。
-
[集計] に [AVG] を選択します。
-
[書式文字列] に #.## を指定します。
-
-
-
以下の手順で、Avg Test Score メジャーを作成します。
-
再度、クラス・ビューワからモデル・ビューワの [メジャー] ヘッダに TestScore プロパティをドラッグ・アンド・ドロップします。これによって、TestScore1 という名前の新しいメジャーが作成されます。
-
モデル・ビューワでメジャー名をクリックして、[詳細] ペインで以下の詳細を編集します。
-
[名前] に Avg Test Score と指定します。
-
[集計] に [AVG] を選択します。
-
[書式文字列] に #.## を指定します。
-
これで、4 つのメジャーが作成されました。
-
-
[保存] をクリックして、[OK] をクリックします。
キューブ・クラスが更新されます。
-
Age プロパティに基づいて、以下のようにディメンジョン、階層、およびレベルを追加します。
-
[Age] プロパティを [ディメンジョン] ヘッダにドラッグ・アンド・ドロップします。
アーキテクトによって、ディメンジョン、階層、およびレベルが即座に作成され、モデル・ビューワの表示が以下のようになります。
-
最初の [Age] 項目をクリックします。この項目には [dataディメンジョン ] のラベルが付けられています。
-
右領域で、[名前] を編集して AgeD にします。
モデル・ビューワの表示は以下のようになります。
Business Intelligence の使用計画によっては、ディメンジョン名が表示されない場合もあります。このチュートリアルでは、Patients サンプルで使用される規約に従います。ここでは、ピボット・テーブルでディメンジョンを行または列に使用しないことを前提にしています (この代わりにレベルを行または列として使用します)。
-
オプション [このディメンジョンの All レベルを有効にする] を選択します。
-
[All メンバに対するキャプション] を編集して All Patients にします。
-
[All メンバの表示名] を編集して All Patients にします。
-
-
以前と同じ方法でキューブ定義を保存します。
-
Gender プロパティに基づいて、ディメンジョン、階層、およびレベルを追加します。前述の手順を繰り返しますが、以下の点が異なります。
-
[Gender] プロパティをドラッグ・アンド・ドロップします。
-
ディメンジョンの名前を GenD に変更します。
モデル・ビューワの表示は以下のようになります。
-
-
HomeCity プロパティに基づいて、ディメンジョン、階層、およびレベルを追加します。前述の手順を繰り返しますが、以下の点が異なります。
-
[HomeCity] プロパティを展開して、このフォルダ内の [Name] プロパティを [ディメンジョン] にドラッグ・アンド・ドロップします。
-
ディメンジョンの名前を HomeD に変更します。
-
レベルの名前を City に変更します。
この新しいディメンジョン、階層、およびレベルについて、モデル・ビューワでは以下のように表示されます。
この場合、[プロパティ] オプションはドット構文を使用していることに注意してください。
-
-
プロパティを City レベルに追加します。
-
左側 (クラス・ビューワ領域) で [HomeCity] を展開します。
-
[Population] をドラッグして、中央領域の [City] レベルにドロップします。
-
[PrincipalExport] をドラッグして、中央領域の [City] レベルにドロップします。
-
新しい [PrincipalExport] プロパティを選択して、名前を Principal Export に変更します。
-
-
PrimaryCarePhysician プロパティに基づいて、ディメンジョン、階層、およびレベルを追加します。以下はその方法です。
-
[要素を追加] をクリックします。
-
[新しい要素名を入力] に、DocD と入力します。
-
[データ・ディメンジョン] をクリックします。
-
[OK] をクリックします。
-
モデル・ビューワ領域で、[New_Level1] をクリックします。
-
[名前] を Doctor に変更します。
-
[ソース値] ヘッダの下で [表現] ラジオ・ボタンを選択して、以下の ObjectScript 式を [式] にコピーします。
%source.PrimaryCarePhysician.LastName_", "_%source.PrimaryCarePhysician.FirstName
変数 %source は、現在のレコードを参照します。この式はキューブの構築時に評価されます。
代わりに、以前と同じドラッグ・アンド・ドロップ手順を使用して、定義を編集することもできます。
-
-
以前と同じ方法でキューブ定義を保存します。
-
キューブをコンパイルおよび構築します。そのためには、以下の操作を実行します。
-
[コンパイル] をクリックすると、コンパイルが開始され、進捗状況がダイアログ・ボックスに表示されます。
-
コンパイルが終了したら、[完了] をクリックします。
-
[ビルド] をクリックします。モーダル・ウィンドウで、[選択構築] が既定で選択された状態で表示されていること、および追加したメジャーとディメンジョンが下のリストに表示されていて、それぞれに 選択構築 プロセスの対象としてチェックが付いていることに注意してください。新しい列を追加するか、既存の列を変更すると、常にこのように 選択構築 のプロンプトが表示されます。[ビルド] をクリックします。
-
キューブおよびインデックスの構築が完了したら、[完了] をクリックします。
-
-
別のブラウザ・タブまたはウィンドウで、アナライザを開きます。
左上の領域を確認します。この領域には、現在選択されているキューブまたはサブジェクト領域のタイトルが表示されます。以下のように表示されます。
このタイトルが Tutorial でない場合は、変更ボタン をクリックし、[Tutorial] をクリックして [OK] をクリックします。
アナライザの左の領域では、このキューブの現在の内容が以下のように表示されます。
このように表示されない場合は、サンプルのデータが生成されていること、およびキューブのコンパイルとビルドが完了していることを確認してください。
初期キューブの検証
ここでは、キューブを検証して、変更の必要があるかどうかを調べます。
キューブを検証するには、キューブの要素を左の領域からピボット・ビルダ領域にドラッグ・アンド・ドロップして、単純なピボット・テーブルを作成します。これは、[行] 領域とその右にある 3 つのボックスで構成されます。
まず、定義していないメジャー (Count) がアナライザで表示されていることに注目してください。このメジャーは自動的に提供され、ベース・クラスのレコードをカウントします。
以下の手順を実行して、新しいキューブを十分に理解します。
-
左の領域の各ディメンジョン名の横にある三角形をクリックします。
この操作によって、以下のように表示されます。
-
[Age] レベルを [行] 領域にドラッグ・アンド・ドロップします。以下のような表示になります。
このレベルのメンバが文字列として並べ替えられていることに注意してください。このレベルでは、数値でメンバを並べ替えるほうが適しているため、調整する必要があります。
-
[Doctor] レベルを [行] 領域にドラッグ・アンド・ドロップして、[Age] のすぐ上に配置します (この操作で、Age が Doctor に置換されます)。これで、以下のような表示になります。
Note:ここで作成される他のディメンジョンと異なり、Doctor ディメンジョンは、データ・セットのサイズに応じて非常に多くのメンバを所有できます。現実の実装では、このように低いレベルでディメンジョンを作成することはほとんどありません。このチュートリアルでは、このディメンジョンを使用して、いくつかのキー・ポイントを示します。
医師名 , は、記録されている一次診療医のない患者を参照します (このような患者は、PrimaryCarePhysician フィールドの姓と名前がいずれも Null になります)。これは、このチュートリアルの次の部分でレベルを再定義するときに変更します。
ID に基づくレベルを作成する場合は常に、その ID が一意であるかどうかを配慮することが重要です。多くの場合 (製品名、手順コード、部門名など)、ID は一意です。ただし、人名が一意であることを前提とすることは安全ではありません。このレベルは、直接医師名に基づいているため、システムによって同名の医師が結合されます。
例えば、ある患者には、Doctor テーブルの行 17 で表される Agnes Djakovic という名前の医師がいて、別の患者には、名前は同じでも同じテーブルの行 380 で表される医師がいる場合があります。Doctor レベルには、これらの患者を結合する Agnes Djakovic という名前のメンバが存在することになります。
このチュートリアルの後続部分では、より堅牢なアプローチを使用します。
-
[Gender] レベルを [行] 領域にドラッグ・アンド・ドロップして、[Doctor] のすぐ上に配置します。この操作で、Doctor レベルが Gender レベルで置換されます。これで、以下のような表示になります。
このレベルは特に変更する必要はありません。
-
左側で [City] レベルを展開します。以下のように表示されます。
-
[City] レベルを [行] 領域にドラッグ・アンド・ドロップして、[Gender] のすぐ上に配置します。これで、以下のような表示になります。
-
[Population] と [Principal Export] のプロパティを [列] にドラッグ・アンド・ドロップします。以下のように表示されます。
このレベルは特に変更する必要はありません。
キューブの調整
ここでは、キューブに以下の変更を加えます。
-
Age のメンバの並べ替え方法を変更します。
-
Doctor レベルが同名の医師を結合しないようにします。
-
Doctor レベルに、, ではなく None (キューブの既定置換文字列) という名前のメンバが確実に存在するようにします。
-
アーキテクトにアクセスします。前回調べたキューブ定義が表示されます。
-
まず、Age レベルを調整して、メンバが数値で並べ替えられるようにします。そのためには、以下の操作を実行します。
-
[Age] レベルをクリックします。
-
[要素を追加] をクリックします。
-
[新しい要素名を入力] に、AgeSort と入力します。
-
[プロパティ] をクリックします。
-
[OK] をクリックします。
プロパティが追加され、アーキテクトでそれが選択されます。
-
[詳細] ペインで [表現] を選択して以下を入力します。
$CASE($LENGTH(%source.Age),2:%source.Age,:"0"_%source.Age)
この式は、文字列の並べ替えで年齢が正しく並べ替えられるように、年齢の先頭にゼロを追加します。最初の年齢が 01 で、2 番目が 02 というように続きます (このサンプルの最高年齢は 99 歳であるため、年齢が 2 文字を超えることはありません)。
-
[プロパティ値でメンバを並べ替え] で、[asc] を選択します。
このオプションにより、メンバの並べ替え方法の制御にこのプロパティの値が使用されます。
-
キューブを保存します。
Note:Patients サンプルでは別のアプローチを使用しますが、いずれのアプローチも有効です。
-
-
Doctor レベルを再定義して、同名の医師を結合できないようにします。そのためには、以下の操作を実行します。
-
[Doctor] レベルをクリックします。
-
[表現] フィールドで値を選択して、メモ帳またはその他の一時的な場所にこれをコピーします。
-
[プロパティ] を選択して、PrimaryCarePhysician と入力します。
これで、Doctor レベルが最低限の PrimaryCarePhysician プロパティに基づきます。これは OREF で医師ごとに一意です。
これによって、このレベルでは偶然同名である異なる医師が結合されないようになります。
また、この手順により、医師のいない患者に対する値が Null になります。これは、このレベルのそのようなメンバには、キューブの既定のヌル置換文字列が使用されることを意味します。
-
[Doctor] レベルが選択された状態で、[要素を追加] をクリックします。
-
[新しい要素名を入力] に、DoctorName と入力します。
-
[プロパティ] をクリックします。
-
[OK] をクリックします。
プロパティが追加され、アーキテクトでそれが選択されます。
-
[詳細] ペインで、[表現] を選択し、先ほどコピーした式を貼り付けます。
-
[メンバの名前として使用] を選択します。
このオプションにより、このプロパティの値が各メンバの名前として使用されます。
-
[プロパティ値でメンバを並べ替え] で、[asc] を選択します。
このオプションにより、このプロパティの値を基準にしてメンバが昇順で並べ替えられることになります。
-
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
-
キューブを構築します。
-
アナライザに移動して、[Analytics]→[アナライザ] リンクをクリックし、最新のモデルで更新します。
-
変更をダブル・チェックします。以下のように表示されます。
-
[Age] を [行] にドラッグ・アンド・ドロップすると、メンバが数値順に並べ替えられることがわかります。
-
[Doctor] を [行] にドラッグ・アンド・ドロップすると、None メンバが表示されます。
生成されたデータによっては、重複している医師名も表示されます。以下はその例です。
-
キューブへのリストの追加
リストを使用すると、ユーザには最下位レベルのデータから選択したフィールドが表示されます。これはさまざまなシナリオで有益です。この情報は、ユーザが異常値のレコードや、追跡処理の必要なレコードを特定する際に役立ちます。
-
まず、Patients テーブルで使用可能なフィールドを調べます。
-
前述のように、管理ポータルにアクセスし、サンプルをインストールしたネームスペースに移動します。
(これが別のブラウザ・タブで開かれている場合は、そのタブに切り替えます)。
-
[システムエクスプローラ→[SQL] をクリックします。
-
[クエリ実行] タブをクリックします。
-
以下のクエリを実行します。
select * from bi_study.patient
これで、最初の 1000 人の患者が表示され、使用可能なフィールドが示されます。
-
ここで以下のようなクエリを試行します。
select patientid, age,testscore,homecity->name as "City", primarycarephysician->lastname as "Doctor" from BI_Study.Patient
-
このクエリをメモ帳やその他の使いやすい一時的な場所にコピーします。
このブラウザ・タブまたはウィンドウは、後で使用できるように開いたままにしておきます。
-
-
今実行したクエリのフィールドを使用するリストを追加します。
-
アーキテクトにアクセスします
(これが別のブラウザ・タブで開かれている場合は、そのタブに切り替えます)。
-
[要素を追加] をクリックします。
-
[新しい要素名を入力] に、SampleListing と入力します。
-
[詳細リスト] をクリックします。
-
[OK] をクリックします。
リストが追加されます。
-
[詳細] ペインで、以下に示すように、前の手順で保存したクエリから [フィールドリスト] 領域にフィールドのリストをコピーし、select を削除します。
patientid, age,testscore,homecity->name as "City", primarycarephysician->lastname as "Doctor"
システムでは、このフィールドのリストを使用して SQL クエリを構築します。
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
キューブを再構築する必要はありません。
-
-
アナライザでこのリストにアクセスできることを確認します。そのためには、以下の操作を実行します。
-
アナライザにアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[Analytics]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
プレビュー領域に既に表示されているピボット・テーブル内のセルをクリックするか、単純なピボット・テーブルを作成してその中のセルをクリックします。
-
[リストを表示] ボタン をクリックします。
以下のように表示されます。
Note:既定では、最初の 1000 レコードが表示されます。これは、アナライザ内で変更できます。
リストがサポートされないことを示すメッセージが表示された場合は、キューブが保存され、リコンパイルされていることを確認します。
-
-
リストを変更して、レコードが別の方法で並べ替えられるようにします。
-
再度アーキテクトにアクセスします。
-
[モデル・コンテンツ] 領域でリストをクリックします。
-
[詳細] ペインで、[Order By] に以下のように入力します。
age,homecity->name
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
-
-
リストが、まず年齢で並べ替えられ、次に各年齢内で市区町村を基準にして並べ替えられることを確認します。
前と同様にリストを表示します。以下のような表示になります。
下にスクロールして、患者が各年齢内で市区町村によって並べ替えられていることを確認します。
ファクト・テーブルおよびレベル・テーブルの確認
キューブ定義の作成を担当している場合は、システムがキューブ定義をどのように使用してシステムで直接使用されるテーブル (ファクト・テーブル と レベル・テーブル) を構築するのかを理解しておくと役立ちます。ここではこれらのテーブルを検証します。
-
前述のように、管理ポータルにアクセスし、サンプルをインストールしたネームスペースに移動します。
-
[システムエクスプローラ]→[SQL] をクリックします。
-
[クエリ実行] タブをクリックします。
-
以下の SQL クエリを実行します。これはキューブで使用されるベース・テーブルに対して実行されます。
select top 1 age,gender,homecity->name,primarycarephysician->lastname, primarycarephysician->firstname, testscore from BI_Study.patient
詳細をメモしておきます。
-
左側の領域で、テーブル Tutorial_Cube.Fact に移動します。
-
[テーブルを開く] をクリックします。
以下のように表示されます。
このテーブルは、キューブのコンパイル時に生成され、キューブの構築時にデータが入力されます。ファクト・テーブルには、ソース・テーブルから使用したレコードごとに、行 (ファクト) が 1 行あります。ここでは、ファクトのそれぞれが 1 人の患者に対応します。
このテーブルの最初の行は、ベース・テーブルの最初の行に対応します (13 歳で、テスト・スコアが 88 であった患者)。
-
以下の点に注意してください。
-
%sourceId フィールドは、ファクトの基になったソース・レコードの ID を示します。
-
名前の先頭が Dx である各フィールドは、定義したレベルに対応します。ファクト・テーブルのこれらのフィールドには整数が格納され、これらはレベル・テーブルのレコードを参照します。
-
名前の先頭が Mx である各フィールドは、定義したメジャーに対応します。ファクト・テーブルのこれらのフィールドには、数値 (整数ではない) が格納されます (これがメジャーの既定のデータ型であるため)。
-
MxTestScore フィールドの値が Null のファクトもあります。
-
-
[ウィンドウを閉じる] をクリックします。
-
テーブル [Tutorial_Cube.StarGender] に移動します。
-
[テーブルを開く] をクリックします。表示は以下のようになります。
このテーブルには、Gender レベルのメンバの名前が格納されます。ファクト・テーブルの DxGender フィールドは、このテーブルの行を参照します。
場合によって、Male が Female の前に表示されることもあります。
ここでは、システムで処理された最初の患者が女性であるために、Female メンバが先に表示されています。
システムは、これらのテーブルにデータを生成する際に、ベース・テーブルのレコードを繰り返し処理します。各レコードについて、それぞれのレベルの定義が確認され、値が決定されて、その値が (必要に応じて) 対応するレベル・テーブルに追加され、ファクト・テーブルのレベル・フィールドに検索値が書き込まれます。
-
[ウィンドウを閉じる] をクリックします。
-
テーブル [Tutorial_Cube.StarAge] に移動します。以下のように表示されます。
Age レベルはベース・クラスの Age フィールドによって定義されます。この値は DxAge 列に表示されます。このレベルには、レベル・メンバの並べ替え順序の定義に使用されるレベル・プロパティがあります。この値は、Dx781900468 列に示されています。
このレベル・テーブルの最初のレコードは、13 歳のこの例で処理された最初の患者に対応します。
-
[ウィンドウを閉じる] をクリックします。
-
テーブル [Tutorial_Cube.StarNameViaHomeCity] に移動します。以下のように表示されます。
City レベルはベース・クラスの HomeCity->Name フィールド によって定義されます。この値は DxNameViaHomeCity 列に表示されます。このレベルには、2 つのレベル・プロパティがあり、別の列に表示されています。
このテーブルの最初のレコードは Magnolia です。これは、ベース・テーブルの最初の患者の出身地です。
-
[ウィンドウを閉じる] をクリックします。
-
テーブル [Tutorial_Cube.StarPrimaryCarePhysician] に移動します。以下のように表示されます。
Doctor レベルはベース・クラスの PrimaryCarePhysician フィールドによって定義されます。これは BI.Study.Doctor クラスのインスタンスへの参照 (OREF) です。OREF は整数に変換され、それが DxPrimaryCarePhysician 列に書き込まれます。
このレベルでは、姓と名前をコンマを挟んで連結したレベル・プロパティによってメンバ名が定義されています。このレベル・プロパティの値は、Dx582175229 列に格納されます。
このテーブルの最初の医師は Quince, Marvin です。これは、ベース・テーブルの最初の患者の一次診療医です。
Null の医師の名前はコンマですが、これは表示されません。その代わり、このメンバには指定したヌル置換文字列が使用されます。
これらのテーブルのフィールド名を使いやすくするために、定義したレベルおよびメジャーに対してオプション [ファクトテーブルのフィールド名] を指定できます。このオプションは、特殊な内部処理が行われる時間レベル (次の項目で説明) には適用されないことに注意してください。