相関ルールのユースケース・シナリオ

人気映画レンタルWebサイトが更新されています。映画レンタル会社は、頻繁にレンタルされる映画や購入取引履歴に基づいて、顧客に映画をお薦めしようと考えています。映画のお薦めに協力するよう、データ・サイエンティストであるあなたに打診しています。Aprioriアルゴリズムを使用して、よく一緒に視聴される人気映画を分析することでこの問題を解決します。

OML4SQLユースケースの探求を開始する前に、次の用意ができていることを確認します。

  • データ・セット
    このユースケースに使用されるデータ・セットは、MovieStreamデータ・セットという名前です。

    ノート:

    このデータ・セットは、説明の目的でのみ使用されます。
  • データベース
    次のオプションからデータベースを選択または作成します:
  • 機械学習ツール
    データベースの選択内容に応じて、次のいずれかを実行します。
    • Oracle Autonomous Database用のOML Notebooksを使用します。
    • オンプレミス・データベースまたはDBCSに接続されたOracle SQL Developerをインストールして使用します。SQL Developerのインストールおよび起動を参照してください。
  • その他の要件

    データ・マイニング権限(ADWに対して自動的に設定されます)。Oracle Machine Learning for SQLのためのシステム権限を参照してください。

データのロード

データ・セットとその属性を詳細に調べます。データをデータベースにロードします。

このユースケースでは、データ・セットをデータベースにロードします。Oracle Autonomous Databaseを使用している場合は、Oracle Cloud Infrastructure (OCI) Object Storage内の既存のデータ・ファイルを使用します。サンプル表を作成し、OCI Object Storage内のファイルからサンプル表にデータをロードし、そのデータを確認します。オンプレミス・データベースを使用している場合は、Oracle SQL Developerを使用してデータ・セットをインポートし、データを探索します。

データを理解するために、次を実行します。
  • データにアクセスします。
  • データ・セットの様々な属性または列を詳細に調べます。
  • データ品質を(データを探索することで)評価します。

データの調査

次の表では、MOVIES_SALES_FACT内の属性について情報を示します。

属性名 情報
ORDER_NUM オーダー番号を指定します
ACTUAL_PRICE 映画の実際の価格を指定します
AGE 顧客の年齢を指定します
AGE_BAND 顧客の年齢層を指定します指定可能な値は、20-29、30-39、40-49、50-59、60-69、70-79、80-89などです。
APP その映画に使用するアプリケーションを指定します
CITY 市区町村の名前を指定します
CITY_ID 市区町村IDを指定します
COMMUTE_DISTANCE 通勤距離を指定します
COMMUTE_DISTANCE_BAND 通勤距離区分を指定します
CONTINENT 大陸名を指定します
COUNTRY 国名を指定します
COUNTRY_CODE 国コードを指定します
COUNTRY_ID 国IDを指定します
CREDIT_BALANCE 顧客の預金残高を指定します
CUSTOMER_ID 顧客IDを指定します
CUSTOMER_NAME 顧客名を指定します
DAY 曜日をYYYY-mm-dd hh:mm:ss形式で指定します
DAY_NAME 曜日を指定します
DAY_NUM_OF_WEEK 曜日番号を指定します
DEVICE 顧客が使用するデバイスの情報を指定します
DISCOUNT_PERCENT 割引率を指定します
DISCOUNT_TYPE 顧客が利用可能な割引タイプを指定します。指定可能な値は、紹介、クーポン、「プロモーション」、「ボリューム」、「なし」です
EDUCATION 顧客の教育課程を指定します
EMAIL 顧客のEメールIDを指定します
FULL_TIME 顧客の雇用形態(フルタイム、雇用なし、パートタイムなど)を指定します
GENDER 顧客の性別を指定します
GENRE 映画のジャンルを指定します
HOUSEHOLD_SIZE 顧客の世帯規模を指定します
HOUSEHOLD_SIZE_BAND 世帯規模層を指定します
INCOME 顧客の所得を指定します
INCOME_BAND 顧客の所得層を指定します
INSUFF_FUNDS_INCIDENTS 顧客のこれまでの残高不足インシデントの数を指定します
JOB_TYPE 顧客の職業を指定します
LATE_MORT_RENT_PMTS 顧客に住宅ローン返済または賃貸料支払いの遅延があったことを指定します
LIST_PRICE 映画の定価を指定します
MARITAL_STATUS 顧客の配偶者の有無を指定します
MONTH 月をMON-YYYY形式で指定します
MONTH_NAME 月を指定します。たとえば、「1月」です。
MONTH_NUM_OF_YEAR 月番号を指定します
MORTGAGE_AMT 住宅ローン金額を指定します
MOVIE_ID 映画IDを指定します
NUM_CARS 顧客が所有する車の台数を指定します
NUM_MORTGAGES 住宅ローンの数を指定します
OS OS情報を指定します
PAYMENT_METHOD 支払方法を指定します
PET 顧客がペットを所有しているかどうかを指定します
POSTAL_CODE 住所の郵便番号を指定します
PROMOTION_RESPONSE プロモーション・オファーに対する顧客の回答を指定します
QUANTITY_SOLD 販売した数量を指定します
QUARTER_NAME 四半期名をQn-YYYY形式で指定します。たとえば、「Q1-2001」です。
QUARTER_NUM_OF_YEAR 四半期番号を指定します
RENT_OWN 顧客の住居が賃貸か所有かを指定します
SEARCH_GENRE 検索した映画のジャンルを指定します
SEGMENT_DESCRIPTION 人口区分を説明します
SEGMENT_NAME 人口区分名を指定します
SKU SKU IDを指定します
STATE_PROVINCE 都道府県を指定します
STATE_PROVINCE_ID 都道府県IDを指定します
STREET_ADDRESS 顧客の住所を指定します
TITLE 映画のタイトルを指定します
USERNAME 顧客から提供されたユーザー名を指定します
WORK_EXPERIENCE 顧客の職歴を指定します
WORK_EXPERIENCE_BAND 顧客の職歴区分を指定します
YEAR 年を指定します
YEARS_CURRENT_EMPLOYER 顧客の現在の雇用主を指定します
YEARS_CURRENT_EMPLOYER_BAND 現在の雇用主との顧客の雇用区分を年単位で指定します
YEARS_RESIDENCE 顧客がその住所に居住している年数を指定します
YEARS_RESIDENCE_BAND 居住区分を指定します

表の作成

MOVIE_SALES_FACTという表を作成します。この表は、DBMS_CLOUD.COPY_DATAプロシージャでデータ・セットにアクセスするために使用されます。

OML Notebooksに次のコードを入力し、ノートブックを実行します。

%sql
CREATE TABLE MOVIE_SALES_FACT
( ORDER_NUM NUMBER(38,0),
 DAY DATE,
 DAY_NUM_OF_WEEK NUMBER(38,0),
 DAY_NAME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 MONTH VARCHAR2(12 BYTE) COLLATE USING_NLS_COMP,
 MONTH_NUM_OF_YEAR NUMBER(38,0),
 MONTH_NAME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 QUARTER_NAME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 QUARTER_NUM_OF_YEAR NUMBER(38,0),
 YEAR NUMBER(38,0),
 CUSTOMER_ID NUMBER(38,0),
 USERNAME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 CUSTOMER_NAME VARCHAR2(250 BYTE) COLLATE USING_NLS_COMP,
 STREET_ADDRESS VARCHAR2(250 BYTE) COLLATE USING_NLS_COMP,
 POSTAL_CODE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 CITY_ID NUMBER(38,0),
 CITY VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 STATE_PROVINCE_ID NUMBER(38,0),
 STATE_PROVINCE VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 COUNTRY_ID NUMBER(38,0),
 COUNTRY VARCHAR2(126 BYTE) COLLATE USING_NLS_COMP,
 COUNTRY_CODE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 CONTINENT VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 SEGMENT_NAME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 SEGMENT_DESCRIPTION VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 CREDIT_BALANCE NUMBER(38,0),
 EDUCATION VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 EMAIL VARCHAR2(128 BYTE) COLLATE USING_NLS_COMP,
 FULL_TIME VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 GENDER VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 HOUSEHOLD_SIZE NUMBER(38,0),
 HOUSEHOLD_SIZE_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 WORK_EXPERIENCE NUMBER(38,0),
 WORK_EXPERIENCE_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 INSUFF_FUNDS_INCIDENTS NUMBER(38,0),
 JOB_TYPE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 LATE_MORT_RENT_PMTS NUMBER(38,0),
 MARITAL_STATUS VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 MORTGAGE_AMT NUMBER(38,0),
 NUM_CARS NUMBER(38,0),
 NUM_MORTGAGES NUMBER(38,0),
 PET VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 PROMOTION_RESPONSE NUMBER(38,0),
 RENT_OWN VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 YEARS_CURRENT_EMPLOYER NUMBER(38,0),
 YEARS_CURRENT_EMPLOYER_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 YEARS_CUSTOMER NUMBER(38,0),
 YEARS_CUSTOMER_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 YEARS_RESIDENCE NUMBER(38,0),
 YEARS_RESIDENCE_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 AGE NUMBER(38,0),
 AGE_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 COMMUTE_DISTANCE NUMBER(38,0),
 COMMUTE_DISTANCE_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 INCOME NUMBER(38,0),
 INCOME_BAND VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 MOVIE_ID NUMBER(38,0),
 SEARCH_GENRE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 TITLE VARCHAR2(4000 BYTE) COLLATE USING_NLS_COMP,
 GENRE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 SKU NUMBER(38,0),
 LIST_PRICE NUMBER(38,2),
 APP VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 DEVICE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 OS VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 PAYMENT_METHOD VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 DISCOUNT_TYPE VARCHAR2(26 BYTE) COLLATE USING_NLS_COMP,
 DISCOUNT_PERCENT NUMBER(38,1),
 ACTUAL_PRICE NUMBER(38,2),
 QUANTITY_SOLD NUMBER(38,0)
 )
;

表へのデータのロード

オブジェクト・ストレージに格納されているデータ・セットをMOVIE_SALES_FACT表にロードします。

このデータをロードする前に、「コンピュート・リソース」を「中」または「高」に設定してください。「高」を選択した場合は、高リソース・サービスの「メモリー」フィールドを16に設定します。メモリー設定を構成するには、管理者権限が必要です。コンピュート・リソースを参照してください。

OMLノートブックに新しいパラグラフを追加して、次の文を実行します。
%script
BEGIN
 DBMS_CLOUD.COPY_DATA (table_name => 'MOVIE_SALES_FACT',file_uri_list => 'https://objectstorage.uk-london-1.oraclecloud.com/n/adwc4pm/b/moviestream_kl/o/d801_movie_sales_fact_m-*.csv', format => '{"delimiter":",", "recorddelimiter":"newline", "skipheaders":"1", "quote":"\\\"", "rejectlimit":"1000", "trimspaces":"rtrim", "ignoreblanklines":"false", "ignoremissingcolumns":"true", "dateformat":"DD-MON-YYYY HH24:MI:SS"}');
END;
/
 

PL/SQL procedure successfully completed.
 
 
---------------------------
文を詳しく見てみます。
  • table_name: ターゲット表の名前です。
  • credential_name: すでに作成した資格証明の名前です。
  • file_uri_list: ロードするソース・ファイルのカンマ区切りリストです。ファイルd801_movie_sales_fact_m-*.csv内の特殊文字*は、2018年から2020年までの販売データを含むMovieStreamデータ・セットを一括ロードすることを意味します。
  • format: ファイル・タイプがテキスト、ORC、ParquetまたはAvroのいずれであるかなど、ソース・ファイルの形式を記述するために指定できるオプションを定義します。
    • delimiter: フィールド・デリミタ(特殊文字)を指定します。ここでは、「,」(カンマ)と指定します。
    • recorddelimiter: レコード・デリミタを指定します。デフォルト値はnewlineです。デフォルトでは、DBMS_CLOUDは、デリミタとして適切な改行文字を自動的に見つけようとします。
    • skipheaders: ファイルの先頭からスキップする行数を指定します。このユースケースでは、1です。
    • quote:フィールドの引用符文字を指定します。
    • rejectlimit: 操作は、指定した数の行が拒否されるとエラーになります。ここでの値は1000です。
    • trimspaces: フィールドの先頭と末尾の空白を切り捨てる方法を指定します。ここでは、rtrimです。rtrim値の指定は、末尾の空白を切り捨てることを示します。
    • ignoreblanklines: trueに設定すると、空白行は無視されます。デフォルト値はfalseです。
    • ignoremissingcolumns: field_list内の列がソース・ファイル内の列より多い場合に、余分な列をNULLとして格納します。デフォルト値はfalseです。このユースケースでは、trueに設定します。
    • dateformat: ソース・ファイル内の日付書式を指定します。

この例では、adwc4pmはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースであり、moviestream_klはバケット名です。

データの探索

データが表にロードされたら、データを確認し、データの品質を把握して評価します。このステージでは、データを評価してデータ内のデータ型およびノイズを識別します。欠損値および数値外れ値を探します。

データ品質の評価

データを評価するには、まずデータベース内のデータを表示できる必要があります。このため、SQL文を使用して表を問い合せます。

Oracle Autonomous Databaseを使用している場合は、データ品質の評価など、データ・サイエンス・プロジェクトのためにOracle Machine Learning (OML) Notebooksを使用できます。オンプレミスOracle Databaseを使用している場合は、Oracle SQL Developerを使用してデータ品質を評価できます。説明に従ってデータを問い合せます。

ノート:

データベース内の各レコードはケースと呼ばれ、各ケースはcase_idで識別されます。このユースケースでは、CUSTOMER_IDcase_idです。

次のステップは、データの探索的分析に役立ちます。

  1. 次の問合せを実行して、MOVIE_SALES_FACT表内のデータを表示します。
    SELECT * FROM MOVIE_SALES_FACT;
  2. データ・セット内の行のCOUNTを検索するには、次の文を実行します。
    SELECT DISTINCT COUNT(*) from MOVIE_SALES_FACT;
    
    COUNT(*)
     97890562 
    ---------------------------
  3. 表内の個別顧客または一意の顧客を検索するには、次の文を実行します。
    %script SELECT COUNT (DISTINCT CUST_ID) FROM MOVIE_SALES_FACT;
    COUNT(DISTINCTCUST_ID) 
    4845 
    ---------------------------
  4. 列のデータ型を表示するには、次の文を実行します。
    %script
    DESCRIBE MOVIE_SALES_FACT;
    
    Name 			    Null?      Type
    --------------------------- ----- --------------
    ORDER_NUM 				NUMBER(38)
    DAY DATE
    DAY_NUM_OF_WEEK                      	NUMBER(38)
    DAY_NAME 			        VARCHAR2(26)
    MONTH 				    	VARCHAR2(12)
    MONTH_NUM_OF_YEAR 		      	NUMBER(38)
    MONTH_NAME 				VARCHAR2(26)
    QUARTER_NAME 			     	VARCHAR2(26)
    QUARTER_NUM_OF_YEAR 		     	NUMBER(38)
    YEAR 					NUMBER(38)
    CUSTOMER_ID 				NUMBER(38)
    USERNAME 				VARCHAR2(26)
    CUSTOMER_NAME 			        VARCHAR2(250)
    STREET_ADDRESS 			    	VARCHAR2(250)
    POSTAL_CODE 				VARCHAR2(26)
    CITY_ID 				NUMBER(38)
    CITY 					VARCHAR2(128)
    STATE_PROVINCE_ID 			NUMBER(38)
    STATE_PROVINCE 				VARCHAR2(128)
    COUNTRY_ID 				NUMBER(38)
    COUNTRY 				VARCHAR2(126)
    COUNTRY_CODE 				VARCHAR2(26)
    CONTINENT 				VARCHAR2(128)
    SEGMENT_NAME 				VARCHAR2(26)
    SEGMENT_DESCRIPTION 			VARCHAR2(128)
    CREDIT_BALANCE 				NUMBER(38)
    EDUCATION 				VARCHAR2(128)
    EMAIL 					VARCHAR2(128)
    FULL_TIME 				VARCHAR2(26)
    GENDER 					VARCHAR2(26)
    HOUSEHOLD_SIZE 				NUMBER(38)
    HOUSEHOLD_SIZE_BAND 			VARCHAR2(26)
    WORK_EXPERIENCE 			NUMBER(38)
    WORK_EXPERIENCE_BAND 			VARCHAR2(26)
    INSUFF_FUNDS_INCIDENTS 			NUMBER(38)
    JOB_TYPE 				VARCHAR2(26)
    LATE_MORT_RENT_PMTS 			NUMBER(38)
    MARITAL_STATUS 				VARCHAR2(26)
    MORTGAGE_AMT 				NUMBER(38)
    NUM_CARS 				NUMBER(38)
    NUM_MORTGAGES 				NUMBER(38)
    PET 					VARCHAR2(26)
    PROMOTION_RESPONSE 			NUMBER(38)
    RENT_OWN 				VARCHAR2(26)
    YEARS_CURRENT_EMPLOYER 			NUMBER(38)
    YEARS_CURRENT_EMPLOYER_BAND 	  	VARCHAR2(26)
    YEARS_CUSTOMER 				NUMBER(38)
    YEARS_CUSTOMER_BAND 			VARCHAR2(26)
    YEARS_RESIDENCE 			NUMBER(38)
    YEARS_RESIDENCE_BAND 			VARCHAR2(26)
    AGE 					NUMBER(38)
    AGE_BAND 				VARCHAR2(26)
    COMMUTE_DISTANCE 			NUMBER(38)
    COMMUTE_DISTANCE_BAND 			VARCHAR2(26)
    INCOME 					NUMBER(38)
    INCOME_BAND 				VARCHAR2(26)
    MOVIE_ID 				NUMBER(38)
    SEARCH_GENRE 				VARCHAR2(26)
    TITLE 					VARCHAR2(4000)
    GENRE 					VARCHAR2(26)
    SKU 					NUMBER(38)
    LIST_PRICE 				NUMBER(38,2)
    APP 					VARCHAR2(26)
    DEVICE 					VARCHAR2(26)
    OS 					VARCHAR2(26)
    PAYMENT_METHOD 				VARCHAR2(26)
    DISCOUNT_TYPE 				VARCHAR2(26)
    DISCOUNT_PERCENT 			NUMBER(38,1)
    ACTUAL_PRICE 				NUMBER(38,2)
    QUANTITY_SOLD 				NUMBER(38)
     
    ---------------------------
  5. MOVIE_SALES_FACT表から、必要な列を選択します。
    %sql
     SELECT ORDER_NUM, MONTH, CUSTOMER_ID, MOVIE_ID, TITLE, GENRE, ACTUAL_PRICE, QUANTITY_SOLD FROM MOVIE_SALES_FACT
     ORDER BY CUSTOMER_ID;
     
    選択した列
  6. 視聴した顧客を選択し(たとえば、映画「Titanic」(タイタニック))、それらの顧客が視聴したその他の人気映画を確認します。
    %sql
    select title, count(1) cnt
    from movie_sales_fact a
    join (
    select distinct customer_id
    from movie_sales_fact
    where title = 'Titanic' ) b
    on a.customer_id = b.customer_id
    group by title
    having count(1) > 800000
    「Titanic」(タイタニック)を視聴したユーザー達に視聴されている人気映画の一覧
  7. このデータ・セットは巨大で、数百万件のレコードを含んでいます。MOVIESというビューを作成して、顧客ID範囲を指定することで小さいデータ・セットを選択します。
    %script
    CREATE OR REPLACE VIEW MOVIES AS
    SELECT DISTINCT CUSTOMER_ID, MOVIE_ID, TITLE, GENRE
    FROM MOVIE_SALES_FACT
    WHERE CUSTOMER_ID BETWEEN 1000000 AND 1000120;
    View MOVIES created.
     ---------------------------
  8. 新しいビューMOVIESからジャンルの分布を確認できます。
    %sql
    SELECT * FROM MOVIES;

    OML Notebooksで、棒グラフ・アイコンをクリックし、設定を展開します。GENREを「キー」に、CUSTOMER_IDを「値」にドラッグし、「数」を選択します。

    映画のジャンル
  9. 次は、次の文を実行して行数を確認します。
    %script
    SELECT DISTINCT COUNT (*) FROM MOVIES;
    
    COUNT(*)
     10194
    ---------------------------
  10. 欠損値(NULL値)があるかどうかを確認するには、次の文を実行します。
    SELECT COUNT(*) FROM MOVIES WHERE CUSTOMER_ID=NULL OR MOVIE_ID=NULL OR TITLE=NULL OR GENRE=NULL;
    COUNT(*) 
    0 
    ---------------------------

    見つかった場合、NULLはOMLアルゴリズムによって自動的に処理されます。あるいは、NVL SQLファンクションを使用してNULLを手動で置き換えることもできます。

これで、データの探索ステージが完了します。OMLでは、自動データ準備(ADP)をサポートしています。ADPはモデル設定によって有効になります。ADPを有効にすると、アルゴリズムで必要とされる変換が自動的に実行され、モデルに埋め込まれます。このステップは、モデルの構築ステージで実行します。一般的に使用されるデータの準備方法には、ビニング、正規化、欠損値の処理があります。

モデルの構築

データ・セットを使用してモデルを構築します。DBMS_DATA_MINING.CREATE_MODEL2プロシージャを使用してモデルを構築し、モデル設定を指定します。

相関ルールなどの教師なし学習の場合、精度を計算するためやパフォーマンスを評価するためのラベルまたは予測子がありません。したがって、別個のトレーニング・データ・セットでモデルをトレーニングしてからテスト・セットでそれを評価する必要はありません。データ・セット全体を使用してモデルを構築できます。教師なし学習の場合、モデルを評価する客観的方法はありません。そのため、トレーニングやテスト分割は有用ではありません。

アルゴリズムの選択

Oracleでは、相関ルール・モデルを構築するためのAprioriアルゴリズムがサポートされています。

Aprioriは、高頻度項目セット内で、ある項目が、別のある項目また項目グループが存在する場合に存在する確率を計算します。項目セットとは、トランザクション内の2つ以上の項目のあらゆる組合せのことです。高頻度項目セットとは、ユーザーが指定した最小頻度で発生する項目セットのことです。相関ルールにより、ある項目または項目グループの存在が、ある確率および支持度での別のある項目の存在を暗に示すことを表します。

次のステップでは、Aprioriアルゴリズムを使用してモデルを構築する方法について説明します。

  1. CREATE_MODEL2プロシージャを使用してモデルを構築します。最初に、モデル設定またはハイパーパラメータを格納する変数を宣言します。次のスクリプトを実行します。
    %script
     BEGIN DBMS_DATA_MINING.DROP_MODEL('AR_MOVIES');
    EXCEPTION WHEN OTHERS THEN NULL; END;
    /
    DECLARE
     v_setlist DBMS_DATA_MINING.SETTING_LIST;
    BEGIN
     v_setlist('ALGO_NAME') := 'ALGO_APRIORI_ASSOCIATION_RULES';
     V_setlist('PREP_AUTO') := 'ON';
     V_setlist('ASSO_MIN_SUPPORT') := '0.02';
     V_setlist('ASSO_MIN_CONFIDENCE') := '0.1';
     V_setlist('ASSO_MAX_RULE_LENGTH'):= '2';
     V_setlist('ODMS_ITEM_ID_COLUMN_NAME'):= 'TITLE';
     
     DBMS_DATA_MINING.CREATE_MODEL2(MODEL_NAME 	    => 'AR_MOVIES',
    			       MINING_FUNCTION     => 'ASSOCIATION',
    			       DATA_QUERY 	    => 'select * from MOVIES',
    	                       SET_LIST 	    => v_setlist,
    			       CASE_ID_COLUMN_NAME => 'CUSTOMER_ID');
    END;
    
    PL/SQL procedure successfully completed.
    ---------------------------
    PL/SQL procedure successfully completed.
    

    スクリプトを詳しく見てみます。

    • v_setlistは、SETTING_LISTを格納する変数です。
    • DBMS_DATA_MININGは、機械学習に使用されるPL/SQLパッケージです。これらの設定の詳細は、DBMS_DATA_MINING - モデル設定を参照してください。
    • SETTING_LISTは、モデルのモデル設定またはハイパーパラメータを指定します。
    • ALGO_NAMEは、アルゴリズム名を指定します。アルゴリズムとしてAprioriを使用しているため、ALGO_APRIORI_ASSOCIATION_RULESを設定します。
    • PREP_AUTOは、自動データ準備に使用する設定です。ここでは、自動データ準備を有効にします。設定の値はONです。
    • ASSO_MIN_SUPPORTは、相関ルールに使用される項目セットの数を制限する、相関ルールの最小支持度(パーセンテージ)です。項目セットは、ルールの基盤として使用されるためには、全トランザクションにおいて少なくともこの割合で出現する必要があります。Aprioriは、頻度が最小支持度のしきい値を超えるパターンを発見します。これは、各ルールが満たす必要がある最小しきい値です。ここでは、アルゴリズムにより、頻度が0.02を超えるパターンが検索されます。モデルの作成時間を短縮し、生成されるルールの数を減らすには、最小支持度の値を大きくします。
    • ASSO_MIN_CONFIDENCEにより、相関ルールの最小信頼度を決定します。これは、前件が発生した場合に後件が発生する条件付き確率です。つまり、ルールの信頼度は、同一のトランザクションで前件と後件の両方が発生する確率を示します。デフォルト値は0.1です。
    • ASSO_MAX_RULE_LENGTHにより、項目セット内の項目の最大数を指定します。最大数を2にした場合は、2項目から構成されるすべての組合せがカウントされます。このユースケースでは、この値を3に増やす場合は、各顧客が多数の映画を視聴するため、小さいデータ・セットを使用することを検討してください。最大数が2を超える場合は、2項目から構成されるすべての組合せ、3項目から構成されるすべての組合せ、以降指定した最大数の項目から構成されるすべての組合せがカウントされます。この値を大きくすると、実行時間と複雑度が大幅に増加します。そのため、このデータ・セットでのデモンストレーションが目的の場合は、値を2に設定することをお薦めします。

      ヒント:

      生成されるルールの数を制限する方法の1つは、支持度と信頼度を上げることです。支持度とは、2つの項目が一緒に購入される同時確率です。たとえば、0.1の確率で項目のビールとおむつが一緒に購入され、0.05の確率でウォッカとアイスクリームが一緒に購入されます。支持度のしきい値を0.1に上げた場合。ルールにウォッカとアイスクリームは表示されなくなります。同様に、信頼度とは、Bを購入した人物が項目Aを購入する確率です。おむつを購入済の人物がビールを購入する確率は0.2で、ウォッカを購入済の人物がアイスクリームを購入する確率は0.6です。しきい値を0.6にすると、おむつを購入済でビールを購入する人物のルールを削除できます。
    • ODMS_ITEM_ID_COLUMN_NAME トランザクションにそれらの項目を含む列の名前。このユースケースでは、TITLEです。この設定が指定されていると、アルゴリズムは、2つの列で構成されたネイティブ・トランザクション形式でデータが表されると想定します。
      • ケースID: 質的または量的のいずれか
      • 項目ID: 質的または量的のいずれか

    CREATE_MODEL2プロシージャでは、次のパラメータを使用します。

    • MODEL_NAME: モデルの一意の名前を指定します。モデル名の形式は、[schema_name.]model_nameです。スキーマを指定しない場合は、ユーザー独自のスキーマが使用されます。ここでのモデル名はAR_MOVIESです。
    • MINING_FUNCTION: 機械学習機能を指定します。このユースケースでは相関の問題を解決するため、ASSOCIATIONを選択します。
    • DATA_QUERY: モデルを構築するためのトレーニング・データを提供する問合せ。ここでの問合せは、SELECT * FROM MOVIESです。
    • SET_LIST: SETTING_LIST変数を指定します。ここでは、v_setlistです。
    • CASE_ID_COLUMN_NAME: 構築データの一意のケース識別子列。このユースケースでは、case_idはCUSTOMER_IDです。複合キーがある場合は、モデルを作成する前に新しい属性を作成する必要があります。これには、列の値を連結したり、一意の識別子を値の個別の組合せにマップすることが含まれる場合があります。CASE_IDは、再現可能な結果を支援し、個々の顧客のスコアをスコアリング・データ表などの他のデータと結合します。

    ノート:

    指定されていないパラメータまたは設定は、システムによって決定されるか、デフォルト値が使用されます。

評価

診断メトリックを表示し、品質チェックを実行してモデルを評価します。

ディクショナリ・ビューおよびモデル・ディテール・ビューを問い合せれば、モデルのパフォーマンスを測定するのに十分な場合もあります。ただし、平均絶対誤差(MAE)、二乗平均平方根誤差(RMSE)、混同行列、リフト統計、コスト行列などのテスト・メトリックを計算して、モデルを評価できます。相関ルールの場合、様々なルールを調査して、それらによって項目の依存関係(前件の項目セットが後件を暗に示す)または項目間の想定外の関係について新しいインサイトが明らかになるかどうかを確認できます。

ディクショナリ・ビューおよびモデル・ビュー

モデルおよびビュー・モデル設定に関する情報を取得するには、データ・ディクショナリ・ビューおよびモデル・ディテール・ビューを問い合せることができます。モデル・ディテール・ビューの特定のビューには、モデルの評価に役立つモデル統計が表示されます。

モデル・ディテール・ビューで様々な統計を詳しく調べることで、モデルを比較して、評価基準を満たす1つのモデルに到達できます。

相関モデルの結果は、データ内の相関のパターンを識別するルールです。Oracle Machine Learning for SQLでは、相関モデルのスコアリング操作はサポートされていません。かわりに、支持度と信頼度が、このモデルで生成されるルールの質を評価するための主要なメトリックとなります。これらの統計上の測度は、ルールのランク付けに使用できるので予測に役立ちます。

相関ルールは次のように適用できます。

  • 支持度: 相関ルールの適用時にデータ内でこれらの項目が一緒に発生する頻度。
  • 信頼度: 前件を含むトランザクション内で後件が発生する頻度。
  • 値: 項目相関に結び付けられるビジネス価値の大きさ

また、Oracle Machine Learning for SQLは相関ルールのリフトもサポートしています。リフトは、それぞれの支持度を持つ前件と後件のランダムな同時発生に対するルールの強度を示します。リフトにより、改良度(前件を前提とする後件の確率の増加)に関する情報が得られます。リフトは、後件の支持度で除算した項目の組合せの信頼度として定義されます。改良度が1未満のルールでは、偶然以上に購入を確実に予測できないため、支持度と信頼度が高くても、実際の組合せ購入の確率は示されません。

次の表に、Oracle Machine Learningのデータ・ディクショナリ・ビューを示します。ビューのデータベース管理者(DBA)およびUSERバージョンも使用可能です。

ビュー名 説明
ALL_MINING_MODELS アクセス可能なすべての機械学習モデルに関する情報を示します
ALL_MINING_MODEL_ATTRIBUTES アクセス可能なすべての機械学習モデルの属性に関する情報を示します
ALL_MINING_MODEL_SETTINGS アクセス可能なすべての機械学習モデルの構成設定に関する情報を示します
ALL_MINING_MODEL_VIEWS アクセス可能なすべての機械学習モデルのモデル・ビューに関する情報を示します
ALL_MINING_MODEL_XFORMS アクセス可能なすべての機械学習モデルに埋め込まれたユーザー指定の変換を示します。

モデル・ディテール・ビューはアルゴリズムに固有です。モデル・ディテール・ビューを表示することで、作成したモデルに関する詳細なインサイトを取得できます。モデル・ディテール・ビューの名前はDM$xxで始まります(xxはビュー接頭辞に相当します)。「モデル・ディテール・ビュー」を参照してください。

  1. USER_MINING_MODEL_SETTINGS内のモデル設定を確認するには、次の問合せを実行します。
    SELECT SETTING_NAME, SETTING_VALUE
     FROM USER_MINING_MODEL_SETTINGS
     WHERE MODEL_NAME = 'AR_MOVIES'
     ORDER BY SETTING_NAME;
    
    SETTING_NAME                   SETTING_VALUE                   
    ALGO_NAME                      ALGO_APRIORI_ASSOCIATION_RULES  
    ASSO_MAX_RULE_LENGTH           2                               
    ASSO_MIN_CONFIDENCE            0.1                             
    ASSO_MIN_REV_CONFIDENCE        0                               
    ASSO_MIN_SUPPORT               0.02                            
    ASSO_MIN_SUPPORT_INT           1                               
    ODMS_DETAILS                   ODMS_ENABLE                     
    ODMS_ITEM_ID_COLUMN_NAME       TITLE                           
    ODMS_MISSING_VALUE_TREATMENT   ODMS_MISSING_VALUE_AUTO         
    ODMS_SAMPLING                  ODMS_SAMPLING_DISABLE           
    PREP_AUTO                      ON                              
     
     
    11 rows selected.
     
     
    ---------------------------
  2. 次の文を実行して、USER_MINING_MODEL_VIEWSの様々なビューに関する情報を表示します。
    SELECT view_name, view_type FROM USER_MINING_MODEL_VIEWS
     WHERE MODEL_NAME = 'AR_MOVIES'
     ORDER BY VIEW_NAME;
    
    VIEW_NAME        VIEW_TYPE                                         
    DM$VAAR_MOVIES   Association Rules For Transactional Data          
    DM$VGAR_MOVIES   Global Name-Value Pairs                           
    DM$VIAR_MOVIES   Association Rule Itemsets                         
    DM$VRAR_MOVIES   Association Rules                                 
    DM$VSAR_MOVIES   Computed Settings                                 
    DM$VTAR_MOVIES   Association Rule Itemsets For Transactional Data  
    DM$VWAR_MOVIES   Model Build Alerts                                
     
     
    7 rows selected.
     
     
    ---------------------------
  3. トランザクション・データ用相関ルール項目セット(DM$VTxx)モデル・ディテール・ビューを表示するには、次のスクリプトを実行します。
    %script
    SELECT ITEM_NAME, SUPPORT, NUMBER_OF_ITEMS
    FROM DM$VTAR_MOVIES;
     
    
    ITEM_NAME                SUPPORT               NUMBER_OF_ITEMS  
    Dallas Buyers Club                           1                 2
    Dallas Buyers Club         0.66666666666666663                 2
    Dallas Buyers Club         0.33333333333333331                 2
    Elvira's Haunted Hills                       1                 2
    Elvira's Haunted Hills     0.66666666666666663                 2
    Elvira's Haunted Hills     0.33333333333333331                 2
    Elvira's Haunted Hills                       1                 2
    Elvira's Haunted Hills                       1                 2
    Ghostbusters {{nbsp II                       1                 2
    Ghostbusters {{nbsp II     0.66666666666666663                 2
    Ghostbusters {{nbsp II     0.33333333333333331                 2
    Ghostbusters {{nbsp II                       1                 2
    Ghostbusters {{nbsp II                       1                 2
    Hits                       0.33333333333333331                 2
    ...

    このビューでは、トランザクション形式で項目セット情報が示されます。最初のトランザクションでは、100%の支持度(支持度1)で「Dallas Buyers Club」(ダラス・バイヤーズ・クラブ)と別の映画が一緒に購入またはレンタルされます。

  4. 次に、トランザクション・データ用相関ルール(DM$VAxx)モデル・ディテール・ビューを表示します。
    %sql SELECT * FROM DM$VAAR_MOVIES;
    トランザクション・データ用相関ルールDM$VAxxモデル・ディテール・ビュー

    このビューから、前件と後件の両方が頻繁に同時購入されることがわかります(支持度=1)。リストされた前件が存在する場合は必ず後件が存在すると予想できます(信頼度=1)。リストされた前件が存在すると後件を購入する確率が高くなると言えます(リフト=1)。

  5. 上位10件の相関ルールを確認するには、次の問合せを実行します。

    相関ルールのIFコンポーネントは、前件と呼ばれます。THENコンポーネントは、後件と呼ばれます。前件と後件は結合しておらず、共通の項目を持ちません。Oracle Machine Learning for SQLは、前件の項目が1つ以上で、後件の項目が1つの相関ルールをサポートします。

    %script 
    SELECT * FROM 
     (SELECT RULE_ID, ANTECEDENT_PREDICATE ANTECEDENT,
    CONSEQUENT_PREDICATE CONSEQUENT,
    ROUND(RULE_SUPPORT,3) SUPP, ROUND(RULE_CONFIDENCE,3) CONF, NUMBER_OF_ITEMS NUM_ITEMS
    FROM DM$VAAR_MOVIES
    ORDER BY RULE_CONFIDENCE DESC, RULE_SUPPORT DESC)
    WHERE ROWNUM <= 10 
    ORDER BY RULE_ID;
    
    RULE_ID   ANTECEDENT                     CONSEQUENT   SUPP   CONF   NUM_ITEMS   
        10759 101 Dalmatians                 10                1      1           2 
        10761 12 Years a Slave               10                1      1           2 
        10763 127 Hours                      10                1      1           2 
        10771 1984                           10                1      1           2 
        10773 2-Headed Shark Attack          10                1      1           2 
        10777 20,000 Leagues Under the Sea   10                1      1           2 
        10779 2001: A Space Odyssey          10                1      1           2 
        10781 2012                           10                1      1           2 
        10785 3 Ninjas                       10                1      1           2 
        10787 3 from Hell                    10                1      1           2 
    
    
    10 rows selected. 
    
    
    ---------------------------
    文を詳しく見てみます。
    • RULE_IDはルール識別子です。
    • ANTECEDENT_PREDICATE: 前件の名前を指定します。
    • CONSEQUENT_PREDICATE: 後件の項目名を指定します。
    • ROUND (RULE_SUPPORT, 3) SUPP: ルールの支持度を小数点以下3桁に丸めて提供します。
    • ROUND(RULE_CONFIDENCE, 3) CONF: 前件を含む場合にトランザクションがルールを満たす可能性を小数点以下3桁に丸めたもの。
    • NUM_OF_ITEMS: ルール内の項目の数を指定します。
  6. 最も頻繁に発生する後件項目や、ほとんどのルールに含まれている後件項目も表示できます。これを行うには、次の問合せを実行します。
    %sql
    SELECT CONSEQUENT, COUNT(1) CNT FROM
    (SELECT ANTECEDENT_PREDICATE ANTECEDENT,
    CONSEQUENT_PREDICATE CONSEQUENT,
    RULE_SUPPORT SUPP, RULE_CONFIDENCE CONF, NUMBER_OF_ITEMS NUM
    FROM DM$VAAR_MOVIES
    ORDER BY RULE_CONFIDENCE DESC)
    GROUP BY  CONSEQUENT
    ORDER BY CNT;

    OML Notebooksで、「設定」をクリックし、「棒グラフ」アイコンをクリックして結果をビジュアル化します。棒グラフを45度回転するには、「ローテーション」をクリックします。

    最も頻繁に発生している後件の数最も頻繁に発生している後件のビジュアル表現
  7. 最も頻繁に発生する前件項目、またはほとんどのルールに含まれている前件項目を表示するには、次のスクリプトを実行します。
    
    SELECT ANTECEDENT, COUNT(1) CNT 
    FROM
    (SELECT ANTECEDENT_PREDICATE ANTECEDENT,
    CONSEQUENT_PREDICATE CONSEQUENT,
    RULE_SUPPORT SUPP, RULE_CONFIDENCE CONF, NUMBER_OF_ITEMS NUM
    FROM DM$VAAR_MOVIES
    ORDER BY RULE_CONFIDENCE DESC)
    GROUP BY  ANTECEDENT
    ORDER BY CNT

    OML Notebooksで、「設定」をクリックし、「棒グラフ」アイコンをクリックして結果をビジュアル化します。棒グラフを45度回転するには、「ローテーション」をクリックします。

    最も頻繁に発生する前件を表示します最も頻繁に発生している前件のビジュアル表現
  8. 支持度層ごとに表示されるルールの数を確認するには、次の問合せを実行します。
    
    %sql
    SELECT '['|| (SUPP_BIN -1)*0.2 ||','||SUPP_BIN*0.2||']' BUCKET, COUNT(1)
    FROM (
    SELECT ANTECEDENT_PREDICATE ANTECEDENT,
    CONSEQUENT_PREDICATE CONSEQUENT,
    RULE_SUPPORT SUPP, RULE_CONFIDENCE CONF, NUMBER_OF_ITEMS NUM, WIDTH_BUCKET(RULE_SUPPORT, 0, 1, 4) SUPP_BIN 
     FROM DM$VAAR_MOVIES ) a
    GROUP BY SUPP_BIN
    ORDER BY SUPP_BIN;
    
    問合せを詳しく見てみます。
    • SELECT '['|| (SUPP_BIN -1)*0.2 ||','||SUPP_BIN*0.2||']' BUCKET, COUNT(1)では、バケットの間隔が作成されます。
    • ファンクションWIDTH_BUCKETを使用すると、ヒストグラムの範囲が同じサイズの間隔に分割された、等幅ヒストグラムを作成できます。ここでは、同じサイズ(0.2)の、0から1までのバケットが生成され、番号1、...、5が割り当てられます。たとえば、最初のバケットのこの値は1で、範囲は[0, 0.2]です。

    OML Notebooksで、「設定」をクリックし、「棒グラフ」アイコンをクリックして結果をビジュアル化します。

    支持度のバケットごとに存在するルールの数支持度のバケットごとに存在するルールの数のビジュアル表現
  9. 信頼度層ごとに表示されるルールの数を確認するには、次の問合せを実行します。
    
    %sql
    SELECT '['|| (CONF_BIN -1)*0.2 ||','||CONF_BIN*0.2||']' BUCKET, COUNT(1)
    FROM (
    SELECT ANTECEDENT_PREDICATE ANTECEDENT,
    CONSEQUENT_PREDICATE CONSEQUENT,
    RULE_SUPPORT SUPP, RULE_CONFIDENCE CONF, NUMBER_OF_ITEMS NUM, WIDTH_BUCKET(RULE_CONFIDENCE, 0, 1, 4) CONF_BIN 
     FROM DM$VAAR_MOVIES ) a
    GROUP BY CONF_BIN
    ORDER BY CONF_BIN;
    
    
    信頼度のバケットごとに存在するルールの数

    OML Notebooksで、「設定」をクリックし、「棒グラフ」アイコンをクリックして結果をビジュアル化します。

    信頼度のバケットごとに存在するルールの数のビジュアル表現
  10. 顧客の選択内容に基づいて上位5件の映画をお薦めするには、述語としてNUMBER_OF_ITEMSおよびEXTRACTを使用し、相関ルール・モデル・ディテール・ビュー(DM$VRxx)を問い合せます。

    相関ルールでは、1つの後件項目のみがサポートされます。

    %sql
    
    SELECT ROWNUM RANK,
     CONSEQUENT_NAME RECOMMENDATION,
     NUMBER_OF_ITEMS NUM,
     ROUND(RULE_SUPPORT, 3) SUPPORT, 
     ROUND(RULE_CONFIDENCE, 3) CONFIDENCE,
     ROUND(RULE_LIFT, 3) LIFT,
     ROUND(RULE_REVCONFIDENCE, 3) REVERSE_CONFIDENCE
     FROM (SELECT * FROM DM$VRAR_MOVIES
     WHERE NUMBER_OF_ITEMS = 2
     AND EXTRACT(antecedent, '//item[item_name="101 Dalmatians"]') IS NOT NULL
     ORDER BY NUMBER_OF_ITEMS
     )
     WHERE ROWNUM <= 5;
    問合せを詳しく見てみます。
    • ROUND(RULE_LIFT, 3) LIFT: ルールが満たされた場合に、ランダムな可能性を上回る予測の改善の程度。
    • ROUND(RULE_REVCONFIDENCE, 3) REVERSE_CONFIDENCE: ルールが発生するトランザクションの数を後件が発生するトランザクションの数で割り、小数点以下3桁に丸めたもの。
    • NUMBER_OF_ITEMS: ここでは、このパラメータによってルールのサイズを制御します。

      ノート:

      このユースケースでは、ASSO_MAX_RULE_LENGTH =2を検索しているため、このパラメータはスキップできます。
    • EXTRACT: 前件に対するフィルタ。前件に「101 Dalmatians」(101)を含める必要がある場合は、extract(antecedent, '//item[item_name="101 Dalmatians"]') IS NOT NULLを使用します
    EXTRACT述語

    このステップでは、顧客のカートに「101 Dalmatians」(101)という映画がある場合、顧客が「Graduation Day」(鮮血!悪夢の卒業式)、「How to Be」(真夜中のギタリスト)および「10 Minutes Gone」(10ミニッツ)をレンタルまたは購入する可能性は66.7%で、「10」(テン)を購入する可能性は100%です。

結論として、相関ルールを調査し、購入やレンタルの頻度が高い映画に基づいて上位の映画をお薦めすることに成功しました。