30.3 DBMS_PREDICTIVE_ANALYTICS
データ・マイニングを使用すると、大量のデータに埋もれた有効な情報を見つけ出すことができます。ただし、これを行うために必要なプログラミング・インタフェースおよびデータ・マイニングは、幅広いユーザーが使用するには複雑すぎるため、Oracle Data Miningを使用することで十分な効果を得ることができない場合があります。
DBMS_PREDICTIVE_ANALYTICSパッケージは、データ・マイニングのプロセス全体(データの前処理からモデルの作成、新しいデータのスコアリングに至るまで)を自動化して、これらの複雑さに対処しています。このパッケージは、幅広いユーザー(特にビジネス・アナリスト)がデータ・マイニングを使用できるような便利なツールを提供します。
この章のトピックは、次のとおりです:
30.3.1 DBMS_PREDICTIVE_ANALYTICSの使用
この項では、DBMS_PREDICTIVE_ANALYTICSパッケージの使用に関連する項目について説明します。
30.3.1.1 DBMS_PREDICTIVE_ANALYTICSの概要
データ・マイニングのプロセスの一部は、DBMS_PREDICTIVE_ANALYTICSによって自動化されます。
データ・マイニングでは、一般に使用されているプロセス・モデルに従って、次の手順を実行する必要があります。
-
ビジネス上の問題を確認します。
-
データを確認します。
-
マイニングに使用するデータを準備します。
-
準備したデータを使用してモデルを作成します。
-
モデルを評価します。
-
モデルをデプロイし、使用して新しいデータのスコアリングを行います。
DBMS_PREDICTIVE_ANALYTICSは、このプロセスの手順3から5を自動化します。
予測分析プロシージャは、入力データの分析と準備、および入力データを使用したマイニング・モデルの作成とテストを行い、スコアリングに入力データを使用します。スコアリングの結果はユーザーに戻されます。操作の完了後、モデルおよびサポート・オブジェクトは保持されません。
30.3.1.2 DBMS_PREDICTIVE_ANALYTICSのセキュリティ・モデル
DBMS_PREDICTIVE_ANALYTICSパッケージは、ユーザーSYSによって所有され、データベース・インストールの一環としてインストールされます。このパッケージの実行権限は、PUBLICに付与されます。このパッケージ内のルーチンは、実行者権限(現行のユーザーの権限)を使用して実行されます。
DBMS_PREDICTIVE_ANALYTICSパッケージは、Oracle Data Miningオプションによって利用されるAPIを公開します。このパッケージのプロシージャを起動するユーザーは、CREATE TABLEおよびCREATE VIEWシステム権限に加え、CREATE MINING MODELシステム権限も必要です。
30.3.2 DBMS_PREDICTIVE_ANALYTICSサブプログラムの要約
この表では、DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラムをリストし、簡単に説明します。
表30-151 DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラム
| サブプログラム | 用途 |
|---|---|
|
ターゲット列の分析時に、重要度の順に属性をランク付けします。 |
|
|
入力データの値に基づいてターゲット列の値を予測します。 |
|
|
同じターゲット値を持つレコードを識別するルールを生成します。 |
30.3.2.1 EXPLAINプロシージャ
EXPLAINプロシージャは、ターゲット列の値のバリエーションを説明する場合に重要となる属性を識別します。
入力データには、ターゲット値が判明しているレコード(NULL以外の値)を含める必要があります。これらのレコードはプロシージャによって使用され、属性の重要度を計算するモデルの調整が行われます。
注意:
EXPLAINは、DATEとTIMESTAMPデータ・タイプ、およびOracle Data Miningモデルによってサポートされる、数値、文字およびネストしたデータ・タイプをサポートします。
Oracle Data Miningのデータ要件については、Oracle Data Miningユーザーズ・ガイドを参照してください。
EXPLAINプロシージャは、属性を説明力の順序で表示する結果表を作成します。結果表については、「使用上の注意」を参照してください。
構文
DBMS_PREDICTIVE_ANALYTICS.EXPLAIN (
data_table_name IN VARCHAR2,
explain_column_name IN VARCHAR2,
result_table_name IN VARCHAR2,
data_schema_name IN VARCHAR2 DEFAULT NULL);パラメータ
表30-152 EXPLAINプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
入力データの表またはビューの名前。 |
|
|
分析する列の名前。 |
|
|
結果を保存する表の名前。 |
|
|
入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 |
使用上の注意
EXPLAINプロシージャは、表30-153で説明する列を使用して結果表を作成します。
表30-153 EXPLAINプロシージャの結果表
| 列名 | データ・タイプ | 説明 |
|---|---|---|
|
|
|
入力データの列の名前。分析された列を除くすべての列が結果表に示されます。 |
|
|
|
分析された列の値を確認する場合の列の有効性を示す値。値が高くなると説明力が大きくなります。値の範囲は0から1です。 個々の列の分析値は、入力データ表の他の列とは無関係です。この値は、各列と分析された列との関連性の高さを示します。この値は、入力データ表のレコード数、および各列の値と分析された列の値との関係によって影響を受けます。 説明力の値が0の場合は、各列の値と解析された列の値との間に有効な相関関係がないことを示します。説明力が1の場合は完全な相関関係があることを示しており、このような列は、 |
|
|
|
説明力のランキング。 |
例
次の例では、販売履歴のSUPPLEMENTARY_DEMOGRAPHICS表でEXPLAIN操作を実行します。
--Perform EXPLAIN operation
BEGIN
DBMS_PREDICTIVE_ANALYTICS.EXPLAIN(
data_table_name => 'supplementary_demographics',
explain_column_name => 'home_theater_package',
result_table_name => 'demographics_explain_result');
END;
/
--Display results
SELECT * FROM demographics_explain_result;
ATTRIBUTE_NAME EXPLANATORY_VALUE RANK ---------------------------------------- ----------------- ---------- Y_BOX_GAMES .524311073 1 YRS_RESIDENCE .495987246 2 HOUSEHOLD_SIZE .146208506 3 AFFINITY_CARD .0598227 4 EDUCATION .018462703 5 OCCUPATION .009721543 6 FLAT_PANEL_MONITOR .00013733 7 PRINTER_SUPPLIES 0 8 OS_DOC_SET_KANJI 0 8 BULK_PACK_DISKETTES 0 8 BOOKKEEPING_APPLICATION 0 8 COMMENTS 0 8 CUST_ID 0 8
この結果から、Y_BOX_GAMES、YRS_RESIDENCEおよびHOUSEHOLD_SIZEが、HOME_THEATER_PACKAGEの最適な予測子であることがわかります。
30.3.2.2 PREDICTプロシージャ
PREDICTプロシージャは、ターゲット列の値を予測します。
入力データには、ターゲット値が判明しているレコード(NULL以外の値)を含める必要があります。これらのレコードはプロシージャによって使用され、予測を作成するモデルの調整およびテストが行われます。
注意:
PREDICTは、DATEデータ・タイプとTIMESTAMPデータ・タイプをサポートするだけでなく、Oracle Data Miningモデルによってサポートされる数値、文字およびネストしたデータ・タイプもサポートします。
Oracle Data Miningのデータ要件については、Oracle Data Miningユーザーズ・ガイドを参照してください。
PREDICTプロシージャは、レコードごとの予測されたターゲット値を含む結果表を作成します。結果表については、「使用上の注意」を参照してください。
構文
DBMS_PREDICTIVE_ANALYTICS.PREDICT (
accuracy OUT NUMBER,
data_table_name IN VARCHAR2,
case_id_column_name IN VARCHAR2,
target_column_name IN VARCHAR2,
result_table_name IN VARCHAR2,
data_schema_name IN VARCHAR2 DEFAULT NULL);パラメータ
表30-154 PREDICTプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
予測の信頼度を戻す出力パラメータであり、予測値の精度です。質的ターゲットの予測の信頼度は最も一般的なターゲット値で、量的ターゲットの予測の信頼度は平均値になります。 |
|
|
入力データの表またはビューの名前。 |
|
|
入力データの各ケース(レコード)を一意に識別する列の名前。 |
|
|
予測する列の名前。 |
|
|
結果を保存する表の名前。 |
|
|
入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 |
使用上の注意
PREDICTプロシージャは、表30-155で説明する列を使用して結果表を作成します。
表30-155 PREDICTプロシージャの結果表
| 列名 | データ・タイプ | 説明 |
|---|---|---|
|
ケースID列の名前 |
|
入力データのケースID列の名前。 |
|
|
|
特定のケースのターゲット列の予測値。 |
|
|
|
分類(質的ターゲット)の場合は、予測の確率です。回帰の問題(量的ターゲット)の場合は、この列に |
注意:
ケースID列の名前が、'PREDICTION'または'PROBABILITY'でないことを確認してください。
予測は、入力にターゲット値を含むかどうかにかかわらず、すべてのケースに対して戻されます。
既知のケースの予測値が役立つ場合があります。たとえば、偏差分析を実行して予測値と実績値を比較する場合です。
例
次の例では、PREDICT操作を実行し、最初の10個の予測を表示します。この結果から、各顧客がアフィニティ・カードを持っているかどうかに関する予測の精度が79%であることがわかります。
--Perform PREDICT operation
DECLARE
v_accuracy NUMBER(10,9);
BEGIN
DBMS_PREDICTIVE_ANALYTICS.PREDICT(
accuracy => v_accuracy,
data_table_name => 'supplementary_demographics',
case_id_column_name => 'cust_id',
target_column_name => 'affinity_card',
result_table_name => 'pa_demographics_predict_result');
DBMS_OUTPUT.PUT_LINE('Accuracy = ' || v_accuracy);
END;
/
Accuracy = .788696903
--Display results
SELECT * FROM pa_demographics_predict_result WHERE rownum < 10;
CUST_ID PREDICTION PROBABILITY
---------- ---------- -----------
101501 1 .834069848
101502 0 .991269965
101503 0 .99978311
101504 1 .971643388
101505 1 .541754127
101506 0 .803719133
101507 0 .999999303
101508 0 .999999987
101509 0 .999953074
30.3.2.3 PROFILEプロシージャ
PROFILEプロシージャは、入力データからのケース(レコード)を記述するルールを生成します。
たとえば、ターゲット列CHURNの値がYesおよびNoである場合、PROFILEは予想される結果を記述するルール・セットを生成します。各プロファイルには、ルール、レコード数およびスコアの分散が含まれています。
入力データには、ターゲット値が判明しているケース(NULL以外の値)を含める必要があります。これらのケースはプロシージャによって使用され、ルールを計算するモデルが構築されます。
注意:
PROFILEは、ネストしたタイプまたは日付をサポートしていません。
Oracle Data Miningのデータ要件については、Oracle Data Miningユーザーズ・ガイドを参照してください。
PROFILEプロシージャは、ルール(プロファイル)および対応するターゲット値を指定する結果表を作成します。結果表については、「使用上の注意」を参照してください。
構文
DBMS_PREDICTIVE_ANALYTICS.PROFILE (
data_table_name IN VARCHAR2,
target_column_name IN VARCHAR2,
result_table_name IN VARCHAR2,
data_schema_name IN VARCHAR2 DEFAULT NULL);パラメータ
表30-156 PROFILEプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
分析対象のデータが保存される表の名前。 |
|
|
ターゲット列の名前。 |
|
|
結果を保存する表の名前。 |
|
|
入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 |
使用上の注意
PROFILEプロシージャは、表30-157で説明する列を使用して結果表を作成します。
表30-157 PROFILEプロシージャの結果表
| 列名 | データ・タイプ | 説明 |
|---|---|---|
|
|
|
このプロファイル(ルール)に対する一意の識別子。 |
|
|
|
プロファイルによって記述されるレコード数。 |
|
|
|
プロファイルのルール。「プロファイルのルールのXMLスキーマ」を参照してください。 |
プロファイルのルールのXMLスキーマ
結果表のDESCRIPTION列には、次のXSDに準拠するXMLが含まれています。
<xs:element name="SimpleRule">
<xs:complexType>
<xs:sequence>
<xs:group ref="PREDICATE"/>
<xs:element ref="ScoreDistribution" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="optional"/>
<xs:attribute name="score" type="xs:string" use="required"/>
<xs:attribute name="recordCount" type="NUMBER" use="optional"/>
</xs:complexType>
</xs:element>例
この例では、アフィニティ・カードを使用する可能性がある顧客を記述するルール(ターゲット値は1)、およびアフィニティ・カードを使用する可能性がない顧客を記述するルール・セット(ターゲット値は0)が生成されます。ルールは、educationおよびoccupationの2つの予測子のみに基づいています。
SET serveroutput ON
SET trimspool ON
SET pages 10000
SET long 10000
SET pagesize 10000
SET linesize 150
CREATE VIEW cust_edu_occ_view AS
SELECT cust_id, education, occupation, affinity_card
FROM sh.supplementary_demographics;
BEGIN
DBMS_PREDICTIVE_ANALYTICS.PROFILE(
DATA_TABLE_NAME => 'cust_edu_occ_view',
TARGET_COLUMN_NAME => 'affinity_card',
RESULT_TABLE_NAME => 'profile_result');
END;
/
この例では、結果表profile_resultに8個のルールが生成されます。このルールのうち7個はターゲット値0を示し、1つはターゲット値1を示しています。ルールのscore属性はターゲット値を識別します。
次のSELECT文は、結果表のすべてのルールを戻します。
SELECT a.profile_id, a.record_count, a.description.getstringval() FROM profile_result a;
次のSELECT文は、ターゲット値0のルールを戻します。
SELECT * FROM profile_result t WHERE extractvalue(t.description, '/SimpleRule/@score') = 0;
この例で生成された8個のルールは、次のとおりです。
<SimpleRule id="1" score="0" recordCount="443">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Armed-F" "Exec." "Prof." "Protec."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"< Bach." "Assoc-V" "HS-grad"
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="297" />
<ScoreDistribution value="1" recordCount="146" />
</SimpleRule>
<SimpleRule id="2" score="0" recordCount="18">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Armed-F" "Exec." "Prof." "Protec."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"10th" "11th" "12th" "1st-4th" "5th-6th" "7th-8th" "9th" "Presch."
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="18" />
</SimpleRule>
<SimpleRule id="3" score="0" recordCount="458">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Armed-F" "Exec." "Prof." "Protec."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"Assoc-A" "Bach."
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="248" />
<ScoreDistribution value="1" recordCount="210" />
</SimpleRule>
<SimpleRule id="4" score="1" recordCount="276">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Armed-F" "Exec." "Prof." "Protec."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"Masters" "PhD" "Profsc"
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="1" recordCount="183" />
<ScoreDistribution value="0" recordCount="93" />
</SimpleRule>
<SimpleRule id="5" score="0" recordCount="307">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"Assoc-A" "Bach." "Masters" "PhD" "Profsc"
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Crafts" "Sales" "TechSup" "Transp."
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="184" />
<ScoreDistribution value="1" recordCount="123" />
</SimpleRule>
<SimpleRule id="6" score="0" recordCount="243">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">"Assoc-A" "Bach." "Masters" "PhD" "Profsc"
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"?" "Cleric." "Farming" "Handler" "House-s" "Machine" "Other"
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="197" />
<ScoreDistribution value="1" recordCount="46" />
</SimpleRule>
<SimpleRule id="7" score="0" recordCount="2158">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">
"10th" "11th" "12th" "1st-4th" "5th-6th" "7th-8th" "9th" "< Bach." "Assoc-V" "HS-grad"
"Presch."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"?" "Cleric." "Crafts" "Farming" "Machine" "Sales" "TechSup" " Transp."
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="1819"/>
<ScoreDistribution value="1" recordCount="339"/>
</SimpleRule>
<SimpleRule id="8" score="0" recordCount="597">
<CompoundPredicate booleanOperator="and">
<SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
<Array type="string">
"10th" "11th" "12th" "1st-4th" "5th-6th" "7th-8th" "9th" "< Bach." "Assoc-V" "HS-grad"
"Presch."
</Array>
</SimpleSetPredicate>
<SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
<Array type="string">"Handler" "House-s" "Other"
</Array>
</SimpleSetPredicate>
</CompoundPredicate>
<ScoreDistribution value="0" recordCount="572"/>
<ScoreDistribution value="1" recordCount="25"/>
</SimpleRule>