ヘッダーをスキップ
Oracle Data Miningアプリケーション開発者ガイド
11g リリース2(11.2)
E57719-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 データ・マイニングAPIの使用例

この章では、単純なSQL問合せとPL/SQLプロシージャを使用して複雑なデータ・マイニング操作を実行する方法について説明します。例では、顧客に関する重要な情報を取得する方法を示しています。この種の情報は、次のようなビジネス上の質問に答えるために必要です。製品をどのように位置付けるか。新製品の導入時期はいつにするか。どのような価格設定や販促戦略を使うか。


注意:

Oracle Data Miningの基本インタフェースは、PL/SQLパッケージとSQL関数です。このマニュアルに記載されている例のほとんどは、PL/SQLコードやSQLコードを使用しています。


関連項目:

  • 第6章「スコアリングと配置」

  • SQLデータ・マイニング関数の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

  • PL/SQL APIの構文については、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


この章には、次の項が含まれます。

顧客の人口統計データおよび購入パターンの分析

この項ではコードの一部分を示して、顧客についてより深く理解するためにデータ・マイニング・モデルを適用する方法を説明します。

これらの例では、あらかじめ作成されたモデルを使用します。モデルはOracle Database内にデータベース・オブジェクトとして存在します。簡略化のため、モデルはすでに作成されてスキーマに存在しており、それらのモデルを適用してこれからSQL文を実行すると想定します。モデルを作成するには、PL/SQL APIまたはOracle Data Minerも使用できます。

データ・マイニング・モデルは主に特殊なSQL関数を実行することによって適用されます。SQL関数には、予測、クラスタリングおよび特徴抽出という別個のグループがあります。


注意:

この章の最初の2つの項では様々な事例におけるSQL構文の例を紹介していますが、コードで使用されているオブジェクト名は仮の名前です。たとえば、表はmy_tableのように命名されています。

顧客ベースのセグメント化および減少の予測

例1-1の問合せは、顧客をセグメントに分割し、顧客の減少を予測します。

セグメントは、clus_modelという名前のモデルをクラスタリングすることによって作成されます。このモデルはヒューリスティックを利用して、類似の特性を持つグループに顧客データベースを分割します。予測は、svmC_modelという分類モデルによって生成されます。

このモデルは各セグメントの顧客それぞれについて減少の確率を予測します。セグメントの全体的な減少傾向の順序で、セグメントごとにデータが戻されます。

例1-1 顧客セグメントの減少の予測

SELECT count(*) as cnt, 
       AVG(PREDICTION_PROBABILITY(svmC_model,
               'attrite' USING *)) as avg_attrite,
       AVG(cust_value_score)
  FROM customers 
 GROUP BY CLUSTER_ID(clus_model USING *)
 ORDER BY avg_attrite DESC;

この見たところ単純な問合せで、類似度により自然なグループに分割された顧客ベースに対する高度な分析が行えます。SQLデータ・マイニング関数を使用すると、重要度の最も高い顧客または最も低い顧客がどのセグメントに存在するかがわかります。この情報は商品をどのように販売するかを決定する際の参考になります。たとえば、あるセグメントの顧客の大部分が高い減少確率を持つ場合、販促戦略を考える際にそのセグメントの人口統計データを詳細に調べることができます。

例1-1CLUSTER_ID関数は、マイニング・モデルclus_modelcustomers表に適用します。これは各顧客のセグメントを戻します。セグメントの数は、クラスタリング・アルゴリズムによって決定されます。Oracle Data Miningは、拡張k-MeansとO-Clusterという2つのクラスタリング・アルゴリズムをサポートしています。

例1-1PREDICTION_PROBABILITY関数は、マイニング・モデルsvmC_modelを適用し、各顧客の減少確率を戻します。Oracle Data Miningは多くの分類アルゴリズムをサポートしています。この場合、モデルの名前から分類子としてサポート・ベクター・マシン(SVM)が選択されていることがわかります。

欠損している収入の予測

例1-2の問合せは、agegenderannual_incomeおよびzipcodeに基づいて、減少する確率の最も高い顧客10名を戻します。

さらに、annual_incomeは欠損している場合が多いため、PREDICTION関数を使用してannual_income属性の欠損値を補完しています。PREDICTION関数は回帰モデルsvmR_modelを適用して、最も可能性の高い年収を予測します。NVL関数は年収の欠損値を予測結果と置き換えます。

例1-2 顧客数の減少の予測および欠損している収入値の変換

SELECT * FROM (
  SELECT cust_name, cust_contact_info
    FROM customers
   ORDER BY 
     PREDICTION_PROBABILITY(tree_model, 'attrite'
       USING age, gender, zipcode,
         NVL(annual_income, 
             PREDICTION(svmR_model USING *)) 
           as annual_income) DESC)
WHERE rownum < 11;

顧客データにおける異常値の検出

これらの例では1クラスSVMモデルを使用して、異例な顧客(外れ値)を検出し、多くの典型的な顧客に共通する人口統計データの特徴を見つけ、新規顧客または仮想の顧客が典型的なアフィニティ・カード保有者になる確率を計算します。

上位10個の外れ値の検出

上位10個の外れ値(母集団の他の顧客と最も異なる顧客)を検出します。アプリケーションに応じて、そのような異例な顧客をデータから削除できます。

SELECT cust_id FROM (
 SELECT cust_id
 FROM svmo_sh_sample_prepared
  ORDER BY prediction_probability(SVMO_SH_Clas_sample, 0 using *) DESC, 1)
WHERE rownum < 11;

新規顧客が典型的なアフィニティ・カード会員である確率の計算

新規顧客または仮想の顧客が典型的なアフィニティ・カード会員である確率を計算します。量的属性の正規化を即時に行います。

WITH age_norm AS (
   SELECT shift, scale FROM SVMO_SH_sample_norm WHERE col = 'AGE'),
     yrs_residence_norm AS (
       SELECT shift, scale FROM svmo_sh_sample_norm WHERE col = 'YRS_RESIDENCE')
       SELECT prediction_probability(SVMO_SH_Clas_sample, 1 using 
                             (44 - a.shift)/a.scale AS age,
                             (6 - b.shift)/b.scale AS yrs_residence,
                             'Bach.' AS education,
                             'Married' AS cust_marital_status,
                             'Exec.' AS occupation,
                             'United States of America' AS country_name,
                             'M' AS cust_gender,
                             'L: 300,000 and above' AS cust_income_level,
                             '3' AS houshold_size
                             ) prob_typical
FROM age_norm a, yrs_residence_norm b;

典型的なアフィニティ・カード会員の人口統計データの検出

典型的なアフィニティ・カード会員の人口統計データを検出します。これらの統計は外れ値の影響を受けないので、アフィニティ会員全体に対して計算した統計よりも、問題の母集団の実態により近い結果が得られやすくなります。

SELECT a.cust_gender, round(avg(a.age)) age, 
       round(avg(a.yrs_residence)) yrs_residence,
       count(*) cnt
FROM mining_data_one_class_v a
WHERE PREDICTION(SVMO_SH_Clas_sample using *) = 1
GROUP BY a.cust_gender
ORDER BY a.cust_gender;  

販促が成功したかどうかの評価

この例は、分類モデルを使用して、DVDの販売促進キャンペーンに反応する顧客とその理由を予測します。

  1. まず、反応する顧客を予測します。

    この文ではPREDICTION関数とPREDICTION_DETAILS関数を使用して、モデルcampaign_modelを適用します。

    SELECT cust_name, 
       PREDICTION(campaign_model USING *) 
          AS responder,
       PREDICTION_DETAILS(campaign_model USING *) 
          AS reason
    FROM customers;
    
  2. 予測と関連データを組み合せます。

    この文は、予測された反応する顧客とsales表にある追加情報とを組み合せます。反応する顧客を予測するのみでなく、キャンペーン開始前後の3か月間に各顧客が使用した金額も表示されます。

    SELECT cust_name, 
            PREDICTION(campaign_model USING *) AS responder,
            SUM(CASE WHEN purchase_date < 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS pre_purch,
            SUM(CASE WHEN purchase_date >= 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS post_purch
     FROM customers, sales 
     WHERE sales.cust_id = customers.cust_id 
       AND purchase_date BETWEEN 15-Jan-2005 AND 14-Jul-2005
     GROUP BY cust_id, PREDICTION(campaign_model USING *);
    
  3. 予測および関連データを、複数ドメイン、複数データベースのデータと組み合せます。

    反応する顧客の予測に加えて、キャンペーン開始前後の3か月間に各顧客がDVDに使用した金額もわかります。

    SELECT cust_name, 
            PREDICTION(campaign_model USING *) as responder,
            SUM(CASE WHEN purchase_date < 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS pre_purch,
            SUM(CASE WHEN purchase_date >= 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS post_purch
     FROM customers, sales, products@PRODDB 
     WHERE sales.cust_id = customers.cust_id 
       AND purchase_date BETWEEN 15-Jan-2005 AND 14-Jul-2005
       AND sales.prod_id = products.prod_id
       AND CONTAINS(prod_description, 'DVD') > 0 
     GROUP BY cust_id, PREDICTION(campaign_model USING *);
    
  4. 取得した情報の有効性と有意性を評価します。

    予測された反応する顧客と反応しない顧客の成功率を、様々な範囲および全社で比較します。この成功は統計的に有意でしょうか。

    SELECT responder, cust_region, COUNT(*) AS cnt,
           SUM(post_purch – pre_purch) AS tot_increase,
           AVG(post_purch – pre_purch) AS avg_increase,
           STATS_T_TEST_PAIRED(pre_purch, post_purch) AS significance
    FROM (
     SELECT cust_name, cust_region
            PREDICTION(campaign_model USING *) AS responder,
            SUM(CASE WHEN purchase_date < 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS pre_purch,
            SUM(CASE WHEN purchase_date >= 15-Apr-2005 THEN
                purchase_amt ELSE 0 END) AS post_purch
     FROM customers, sales, products@PRODDB 
     WHERE sales.cust_id = customers.cust_id 
       AND purchase_date BETWEEN 15-Jan-2005 AND 14-Jul-2005
       AND sales.prod_id = products.prod_id
       AND CONTAINS(prod_description, 'DVD') > 0 
     GROUP BY cust_id, PREDICTION(campaign_model USING *) )
    GROUP BY ROLLUP responder, cust_region ORDER BY 4 DESC;
    

予測分析を使用した顧客プロファイルの作成

DBMS_PREDICTIVE_ANALYTICSパッケージに実装されている予測分析は、予測作成、属性評価およびプロファイル作成のルーチンをサポートしています。例1-3は、予測分析を使用した顧客プロファイルの生成方法を示しています。


注意:

予測分析を使用する場合、モデルを作成する必要はありません。ルーチンによってモデルは動的に作成および適用され、完了時に永続しません。


関連項目:

Oracleの予測分析の概要については、『Oracle Data Mining概要』を参照してください。

例1-3PROFILE文は、顧客がアフィニティ・カードを使用しそうかどうかを示すルールを戻します。これらのルールは、顧客の性別と顧客の職業という2つの予測子に基づいて生成されます。ルールは、次の2つの列を持つ結果表にXMLとして出力されます。

 Name                        Type
 -------------------------    ------------
 PROFILE_ID                   NUMBER
 RECORD_COUNT                 NUMBER
 DESCRIPTION                  XMLTYPE

ルール識別子はPROFILE_IDに格納されます。そのルールにより記述されるケースの数はRECORD_COUNTに格納されます。そのルールを記述したXMLはDESCRIPTION列に格納されます。


注意:

この例では、SHスキーマのサンプル・データを使用しています。このデータは、データ・マイニングのサンプル・プログラムとともに使用されます。サンプル・プログラムの詳細は、『Oracle Data Mining管理者ガイド』を参照してください。

例1-3 顧客プロファイルの生成

--create a source view
CREATE VIEW cust_gend_occ_view AS
                 SELECT cust_gender, occupation, affinity_card
                 FROM mining_data_apply;

-- describe the source data
DESCRIBE cust_gend_occ_view
 Name                            Null?    Type
 ----------------------------------------------
 CUST_GENDER                     VARCHAR2(1)
 OCCUPATION                      VARCHAR2(21)
 AFFINITY_CARD                   NUMBER(10)

-- find the rules
BEGIN
    DBMS_PREDICTIVE_ANALYTICS.PROFILE(
         DATA_TABLE_NAME    => 'cust_gend_occ_view',
         TARGET_COLUMN_NAME => 'affinity_card',
         RESULT_TABLE_NAME  => 'profile_result');
END;
/

-- PROFILE has created 5 rules
SELECT profile_id from cust_gend_occ_profile_results;

PROFILE_ID
----------
         1
         2
         3
         4
         5

-- display the rules

<SimpleRule id="1" score="1" recordCount="275">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"Exec." "Prof." "Protec."
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="CUST_GENDER" booleanOperator="isIn">
      <Array type="string">"M"</Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="1" recordCount="146"/>
<ScoreDistribution value="0" recordCount="129"/>
</SimpleRule>

<SimpleRule id="2" score="0" recordCount="124">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"Exec." "Prof." "Protec."
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="CUST_GENDER" booleanOperator="isIn">
      <Array type="string">"F"
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="0" recordCount="96"/>
<ScoreDistribution value="1" recordCount="28"/>
</SimpleRule>

<SimpleRule id="3" score="0" recordCount="397">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="CUST_GENDER" booleanOperator="isIn">
      <Array type="string">"M"
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"Crafts" "Sales" "TechSup" "Transp."
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="0" recordCount="289"/>
<ScoreDistribution value="1" recordCount="108"/>
</SimpleRule>

<SimpleRule id="4" score="0" recordCount="316">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="CUST_GENDER" booleanOperator="isIn">
      <Array type="string">"M"
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">
        "?" "Cleric." "Farming" "Handler" "House-s" "Machine" "Other"
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="0" recordCount="277"/>
<ScoreDistribution value="1" recordCount="39"/>
</SimpleRule

<SimpleRule id="5" score="0" recordCount="388">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">
        "?" "Cleric." "Crafts" "Farming" "Handler" "House-s" "Machine" 
        "Other" "Sales" "TechSup" "Transp."
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="CUST_GENDER" booleanOperator="isIn">
      <Array type="string">"F"
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="0" recordCount="363"/>
<ScoreDistribution value="1" recordCount="25"/>
</SimpleRule>