この章では、単純なSQL問合せと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 BYCLUSTER_ID
(clus_model
USING *) ORDER BY avg_attrite DESC;
この見たところ単純な問合せで、類似度により自然なグループに分割された顧客ベースに対する高度な分析が行えます。SQLデータ・マイニング関数を使用すると、重要度の最も高い顧客または最も低い顧客がどのセグメントに存在するかがわかります。この情報は商品をどのように販売するかを決定する際の参考になります。たとえば、あるセグメントの顧客の大部分が高い減少確率を持つ場合、販促戦略を考える際にそのセグメントの人口統計データを詳細に調べることができます。
例1-1のCLUSTER_ID
関数は、マイニング・モデルclus_model
をcustomers
表に適用します。これは各顧客のセグメントを戻します。セグメントの数は、クラスタリング・アルゴリズムによって決定されます。Oracle Data Miningは、拡張k-MeansとO-Clusterという2つのクラスタリング・アルゴリズムをサポートしています。
例1-1のPREDICTION_PROBABILITY
関数は、マイニング・モデルsvmC_model
を適用し、各顧客の減少確率を戻します。Oracle Data Miningは多くの分類アルゴリズムをサポートしています。この場合、モデルの名前から分類子としてサポート・ベクター・マシン(SVM)が選択されていることがわかります。
例1-2の問合せは、age
、gender
、annual_income
およびzipcode
に基づいて、減少する確率の最も高い顧客10名を戻します。
さらに、annual_income
は欠損している場合が多いため、PREDICTION
関数を使用してannual_income
属性の欠損値を補完しています。PREDICTION
関数は回帰モデルsvmR_model
を適用して、最も可能性の高い年収を予測します。NVL
関数は年収の欠損値を予測結果と置き換えます。
これらの例では1クラスSVMモデルを使用して、異例な顧客(外れ値)を検出し、多くの典型的な顧客に共通する人口統計データの特徴を見つけ、新規顧客または仮想の顧客が典型的なアフィニティ・カード保有者になる確率を計算します。
上位10個の外れ値(母集団の他の顧客と最も異なる顧客)を検出します。アプリケーションに応じて、そのような異例な顧客をデータから削除できます。
SELECT cust_id FROM ( SELECT cust_id FROM svmo_sh_sample_prepared ORDER BYprediction_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') SELECTprediction_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 WHEREPREDICTION
(SVMO_SH_Clas_sample
using *) = 1 GROUP BY a.cust_gender ORDER BY a.cust_gender;
この例は、分類モデルを使用して、DVDの販売促進キャンペーンに反応する顧客とその理由を予測します。
まず、反応する顧客を予測します。
この文ではPREDICTION
関数とPREDICTION_DETAILS
関数を使用して、モデルcampaign_model
を適用します。
SELECT cust_name,PREDICTION(campaign_model USING *)
AS responder,
PREDICTION_DETAILS(campaign_model USING *)
AS reason
FROM customers;
予測と関連データを組み合せます。
この文は、予測された反応する顧客と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 ANDpurchase_date BETWEEN 15-Jan-2005 AND 14-Jul-2005
GROUP BY cust_id, PREDICTION(campaign_model USING *);
予測および関連データを、複数ドメイン、複数データベースのデータと組み合せます。
反応する顧客の予測に加えて、キャンペーン開始前後の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_idAND CONTAINS(prod_description, 'DVD') > 0
GROUP BY cust_id, PREDICTION(campaign_model USING *);
取得した情報の有効性と有意性を評価します。
予測された反応する顧客と反応しない顧客の成功率を、様々な範囲および全社で比較します。この成功は統計的に有意でしょうか。
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-3のPROFILE
文は、顧客がアフィニティ・カードを使用しそうかどうかを示すルールを戻します。これらのルールは、顧客の性別と顧客の職業という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>