120 DBMS_PREDICTIVE_ANALYTICS

データ・マイニングを使用すると、大量のデータに埋もれた有効な情報を見つけ出すことができます。ただし、これを行うために必要なプログラミング・インタフェースおよびデータ・マイニングは、幅広いユーザーが使用するには複雑すぎるため、Oracle Data Miningを使用することで十分な効果を得ることができない場合があります。

DBMS_PREDICTIVE_ANALYTICSパッケージは、データ・マイニングのプロセス全体(データの前処理からモデルの作成、新しいデータのスコアリングに至るまで)を自動化して、これらの複雑さに対処しています。このパッケージは、幅広いユーザー(特にビジネス・アナリスト)がデータ・マイニングを使用できるような便利なツールを提供します。

この章のトピックは、次のとおりです:

120.1 DBMS_PREDICTIVE_ANALYTICSの概要

データ・マイニングのプロセスの一部は、DBMS_PREDICTIVE_ANALYTICSによって自動化されます。

データ・マイニングでは、一般に使用されているプロセス・モデルに従って、次の手順を実行する必要があります。

  1. ビジネス上の問題を確認します。

  2. データを確認します。

  3. マイニングに使用するデータを準備します。

  4. 準備したデータを使用してモデルを作成します。

  5. モデルを評価します。

  6. モデルをデプロイし、使用して新しいデータのスコアリングを行います。

DBMS_PREDICTIVE_ANALYTICSは、このプロセスの手順3から5を自動化します。

予測分析プロシージャは、入力データの分析と準備、および入力データを使用したマイニング・モデルの作成とテストを行い、スコアリングに入力データを使用します。スコアリングの結果はユーザーに戻されます。操作の完了後、モデルおよびサポート・オブジェクトは保持されません。

120.2 DBMS_PREDICTIVE_ANALYTICSのセキュリティ・モデル

DBMS_PREDICTIVE_ANALYTICSパッケージは、ユーザーSYSによって所有され、データベース・インストールの一環としてインストールされます。このパッケージの実行権限は、PUBLICに付与されます。このパッケージ内のルーチンは、実行者権限(現行のユーザーの権限)を使用して実行されます。

DBMS_PREDICTIVE_ANALYTICSパッケージは、Oracle Data Miningオプションによって利用されるAPIを公開します。このパッケージのプロシージャを起動するユーザーは、CREATE TABLEおよびCREATE VIEWシステム権限に加え、CREATE MINING MODELシステム権限も必要です。

120.3 DBMS_PREDICTIVE_ANALYTICSサブプログラムの要約

この表では、DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラムをリストし、簡単に説明します。

表120-1 DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラム

サブプログラム 用途

EXPLAINプロシージャ

ターゲット列の分析時に、重要度の順に属性をランク付けします。

PREDICTプロシージャ

入力データの値に基づいてターゲット列の値を予測します。

PROFILEプロシージャ

同じターゲット値を持つレコードを識別するルールを生成します。

120.3.1 EXPLAINプロシージャ

EXPLAINプロシージャは、ターゲット列の値のバリエーションを説明する場合に重要となる属性を識別します。

入力データには、ターゲット値が判明しているレコード(NULL以外の値)を含める必要があります。これらのレコードはプロシージャによって使用され、属性の重要度を計算するモデルの調整が行われます。

注意:

EXPLAINは、DATETIMESTAMPデータ・タイプ、および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);

パラメータ

表120-2 EXPLAINプロシージャのパラメータ

パラメータ 説明

data_table_name

入力データの表またはビューの名前。

explain_column_name

分析する列の名前。

result_table_name

結果を保存する表の名前。

data_schema_name

入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。

使用上の注意

EXPLAINプロシージャは、表120-3で説明する列を使用して結果表を作成します。

表120-3 EXPLAINプロシージャの結果表

列名 データ・タイプ 説明

ATTRIBUTE_NAME

VARCHAR2(30)

入力データの列の名前。分析された列を除くすべての列が結果表に示されます。

EXPLANATORY_VALUE

NUMBER

分析された列の値を確認する場合の列の有効性を示す値。値が高くなると説明力が大きくなります。値の範囲は0から1です。

個々の列の分析値は、入力データ表の他の列とは無関係です。この値は、各列と分析された列との関連性の高さを示します。この値は、入力データ表のレコード数、および各列の値と分析された列の値との関係によって影響を受けます。

説明力の値が0の場合は、各列の値と解析された列の値との間に有効な相関関係がないことを示します。説明力が1の場合は完全な相関関係があることを示しており、このような列は、PREDICTの対象から除外する必要があります。実際には、説明力が1の場合に戻されることはほとんどありません。

RANK

NUMBER

説明力のランキング。explanatory_valueの値が等しい行は、ランクも同じです。同ランクの場合、ランクの値はスキップされません。

次の例では、販売履歴の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_GAMESYRS_RESIDENCEおよびHOUSEHOLD_SIZEが、HOME_THEATER_PACKAGEの最適な予測子であることがわかります。

120.3.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);

パラメータ

表120-4 PREDICTプロシージャのパラメータ

パラメータ 説明

accuracy

予測の信頼度を戻す出力パラメータであり、予測値の精度です。質的ターゲットの予測の信頼度は最も一般的なターゲット値で、量的ターゲットの予測の信頼度は平均値になります。

data_table_name

入力データの表またはビューの名前。

case_id_column_name

入力データの各ケース(レコード)を一意に識別する列の名前。

target_column_name

予測する列の名前。

result_table_name

結果を保存する表の名前。

data_schema_name

入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。

使用上の注意

PREDICTプロシージャは、表120-5で説明する列を使用して結果表を作成します。

表120-5 PREDICTプロシージャの結果表

列名 データ・タイプ 説明

ケースID列の名前

VARCHAR2またはNUMBER

入力データのケースID列の名前。

PREDICTION

VARCHAR2またはNUMBER

特定のケースのターゲット列の予測値。

PROBABILITY

NUMBER

分類(質的ターゲット)の場合は、予測の確率です。回帰の問題(量的ターゲット)の場合は、この列にNULLが含まれます。

注意:

ケース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
 

120.3.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);

パラメータ

表120-6 PROFILEプロシージャのパラメータ

パラメータ 説明

data_table_name

分析対象のデータが保存される表の名前。

target_column_name

ターゲット列の名前。

result_table_name

結果を保存する表の名前。

data_schema_name

入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。

使用上の注意

PROFILEプロシージャは、表120-7で説明する列を使用して結果表を作成します。

表120-7 PROFILEプロシージャの結果表

列名 データ・タイプ 説明

PROFILE_ID

NUMBER

このプロファイル(ルール)に対する一意の識別子。

RECORD_COUNT

NUMBER

プロファイルによって記述されるレコード数。

DESCRIPTION

SYS.XMLTYPE

プロファイルのルール。「プロファイルのルールの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>