3.3 クラスタリングのユースケース

小売店には、顧客の行動および購入履歴に関する情報があります。今度は入手可能なデータをもとに、顧客間に類似点があるかどうか分析して特定してほしいという要望があります。Oracle Machine Learningを使用してデータ・セット内のクラスタを検出することで顧客をセグメント化した後、それを利用して、ターゲットを絞ったマーケティング・キャンペーンを支援し、小売売上を向上させることができます。このユースケースでは、k-Meansアルゴリズムを使用してそのようなセグメントを特定する方法を学習します。

関連コンテンツ

表3-1 関連コンテンツ

トピック リンク
OML4Py GitHubの例 クラスタリングのk-Means
クラスタリングについて クラスタリングについて
モデル設定 モデルの設定について
共有設定 共有設定
k-Means - モデル・ディテール・ビュー k-Meansのモデル・ディテール・ビュー
(オプション)ここでタスクの目的など、関連する情報を入力します。

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

  • データ・セット

    このユースケースに使用されるデータ・セットは、SHスキーマからのものです。SHスキーマは、Oracle Autonomous AI Databaseで簡単にアクセスできます。オンプレミス・データベースの場合、スキーマはインストール時にインストールされるか、スクリプトをダウンロードして手動でインストールできます。サンプル・スキーマのインストールを参照してください。

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

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

3.3.1 データのロード

SHスキーマからデータ・セットにアクセスし、属性を理解するためにデータを探索します。

注意:

このユースケースに使用されるデータ・セットは、SHスキーマからのものです。SHスキーマは、Oracle Autonomous AI Databaseで簡単にアクセスできます。オンプレミス・データベースの場合、スキーマはインストール時にインストールされるか、スクリプトをダウンロードして手動でインストールできます。サンプル・スキーマのインストールを参照してください。

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

データへのアクセス

SHスキーマのCUSTOMERSおよびSUPPLEMENTARY_DEMOGRAPHICS表データを使用します。

3.3.2 データの探索

データにアクセスできたら、データを調べ、データの品質を理解して評価します。このステージでは、データを評価してデータ内のデータ型およびノイズを識別します。欠損値および数値外れ値を探します。

データ品質の評価

OML4Pyを使用してPythonからデータベース・データにアクセスするには、まず、データベース表、ビューまたは問合せを表すoml.DataFrameプロキシ・オブジェクトをPythonに作成する必要があります。SUPPLEMENTARY_DEMOGRAPHICSおよびCUSTOMERSのoml.DataFrameプロキシ・オブジェクトを作成し、キー列(CUST_IDなど)の内部結合によってマージします。データを評価してデータ内のデータ型およびノイズを識別します。欠損値、数値外れ値、またはラベルが一貫していない質的値を探します。

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

  1. %pythonインタプリタ・パラグラフで次のスクリプトを実行して、omlモジュール、Pandaのモジュールをインポートし、表示オプションを設定します:
    import pandas as pd
    import matplotlib.pyplot as plt
    import oml
      
    pd.set_option('display.max_rows', 500)
    pd.set_option('display.max_columns', 500)
    pd.set_option('display.width', 1000)
    
    import warnings
    warnings.simplefilter(action='ignore', category=FutureWarning)
  2. oml.sync関数を使用して、データベース表SUPPLEMENTARY_DEMOGRAPHICSのプロキシとしてPythonオブジェクトDEMOGRAPHICSを作成します。oml.sync関数は、oml.DataFrameオブジェクトを戻します。oml.syncによって返されるoml.DataFrameオブジェクトは、データベース・オブジェクトのプロキシです。

    ノート:

    指定したデータベース・スキーマに一度に存在できるのは、1つの環境のみです。"schema=None"の場合、オブジェクトは現在のユーザーのスキーマ内で作成および検索されます。
    DEMOGRAPHICS = oml.sync(table = "SUPPLEMENTARY_DEMOGRAPHICS", schema = "SH")
    z.show(DEMOGRAPHICS.head())

    デモグラフィクスを表示しています

  3. oml.DataFrameオブジェクトDEMOGRAPHICS内の行数および列数を調べるには、DataFrame.shapeを使用します。
    print("Shape:",DEMOGRAPHICS.shape)
    (4500, 14)
  4. oml.sync関数を使用して、データベース表SH.CUSTOMERSのプロキシとしてPythonオブジェクトCUSTOMERSを作成します。query引数では、SQL SELECT文を使用して、プロキシ・オブジェクトを介して使用するために含める列を選択します。
    CUSTOMERS = oml.sync(query = 'SELECT CUST_ID, CUST_GENDER, CUST_MARITAL_STATUS, CUST_YEAR_OF_BIRTH, CUST_INCOME_LEVEL, CUST_CREDIT_LIMIT FROM SH.CUSTOMERS')
    z.show(CUSTOMERS.head())

    顧客のデータを表示しています

  5. oml.DataFrameオブジェクトCUSTOMERS内の行数および列数を調べるには、DataFrame.shapeを使用します。
    print("Shape:",CUSTOMERS.shape)
    (55500, 6)
  6. CUSTOMERS表とDEMOGRAPHICS表を共通列CUST_IDの内部結合によってマージすることで、新しいoml.DataFrame CUSTOMER_DATAを作成します。merge関数は、あるoml.DataFrameを別のoml.DataFrameに結合します。suffixesパラメータは、2つのoml.DataFrameの列名が競合する場合に使用します。
    CUSTOMER_DATA = CUSTOMERS[["CUST_ID", "CUST_GENDER", "CUST_MARITAL_STATUS", "CUST_YEAR_OF_BIRTH", "CUST_INCOME_LEVEL", "CUST_CREDIT_LIMIT"]].merge(DEMOGRAPHICS[["CUST_ID", "HOUSEHOLD_SIZE","YRS_RESIDENCE", "Y_BOX_GAMES"]], how = "inner", on = 'CUST_ID',suffixes = ["",""])
    
  7. oml.DataFrameオブジェクトCUSTOMER_DATA内の行数および列数を調べるには、DataFrame.shapeを使用します。
    print("Shape:",CUSTOMER_DATA.shape)
    Shape: (4500, 9)
  8. concat関数を使用して、新しい列CUST_AGEをoml.DataFrameオブジェクトCUSTOMER_DATAに連結します。列CUST_AGEにはCUST_YEAR_OF_BIRTHに基づいた年齢が格納されていますが、これは生年を2005年時点の年齢に変換したものです。CUST_YEAR_OF_BIRTH列の情報は、CUST AGEで変更および保守されているため、CUST_YEAR_OF_BIRTH列を削除します。
    CUSTOMER_DATA=CUSTOMER_DATA.concat({'CUST_AGE':abs(CUSTOMER_DATA['CUST_YEAR_OF_BIRTH'] -2005)})
    CUSTOMER_DATA=CUSTOMER_DATA.drop('CUST_YEAR_OF_BIRTH')
    CUSTOMER_DATA.head()

    顧客データを示しています

  9. 次のスクリプトを実行して、各列のデータ型を表示します。
    print("The datatypes of the column: ","\n")
    print(CUSTOMER_DATA.dtypes)

    データ型を示しています。

  10. 欠損値があるかどうかを確認するには、次のスクリプトを実行します。count関数は、各列のNULLでない要素の数を戻し、len()関数はデータセット内の行の数を戻します。
    print("Number of missing values in each column is : \n")
    print(len(CUSTOMER_DATA)-CUSTOMER_DATA.count())

    欠損値を示しています。

  11. crosstabメソッドを使用して、データベース内のoml.DataFrameオブジェクトのクロス列分析を実行します。crosstabメソッドは、2つ以上の列のクロス集計を計算します。デフォルトでは、列と集計関数が渡されないかぎり、列の頻度表が計算されます。この例では、crosstab関数は、CUST_CREDIT_LIMITの固有値の分布をx軸に、その出現頻度をy軸に表示します。
    z.show(CUSTOMER_DATA.crosstab(‘CUST_CREDIT_LIMIT’))

    顧客限度用のクロス集計。

  12. 透過層メソッドdescribeを使用して、CUSTOMER_DATA表の各数値列における中心傾向、分散および形状を要約した記述統計を計算します。

    ノート:

    すべての計算はデータベース内で実行され、結果の統計のみがPythonクライアント(この場合はノートブック)に戻されます。データを移動する必要がなくなり、高パフォーマンスのコンピュート・エンジンとしてデータベースを使用することで、スケーラビリティが大幅に向上します。
    CUSTOMER_DATA.describe()

    Describe

  13. モデルを構築する前に、データがクリーンであることを確認することが重要です。データには外れ値が含まれることが多く、モデル品質に悪影響を及ぼす別個のクラスタを形成する可能性があります。

    次のスクリプトは、DataFrameの四分位範囲を計算する関数IQRを定義します。これは、SUMMARY_DF (describeメソッドを使用して生成されたDataFrameのサマリー統計を含む)と特徴のリストという2つの引数を取ります。IQR関数はforループを使用して、リスト内の特徴ごとに四分位範囲を計算します。

    スクリプトを実行して、指定した列の四分位範囲を計算します:
    def IQR(SUMMARY_DF, features):
        result = [0]*len(features)   
        for i, feature in enumerate(features):
            result[i] = abs(SUMMARY_DF[feature]['75%'] - SUMMARY_DF[feature]['25%'])
        return result
     
    print(IQR(CUSTOMER_DATA.describe(),['CUST_AGE', 'CUST_CREDIT_LIMIT', 'YRS_RESIDENCE', 'Y_BOX_GAMES']))
    
    [20.0, 6000.0, 2.0, 1.0]

    ユーザー定義関数remove_outlierは、四分位範囲を使用してデータ内の外れ値を検出し、削除します。ボックスプロットでは、外れ値は、上下の四分位数から、四分位範囲の1.5倍外側(Q1 - 1.5 * IQRまたはQ3 + 1.5 * IQR)にある点です。外れ値の処理方式には、クリッピングまたはキャッピングという方式もあり、極端な値を最大値または最小値(1.5 IRQ値など)に置き換えます。

    次の関数は、指定された特徴の外れ値を含む行を四分位数に基づいて削除します:
    def remove_outlier(DF, SUMMARY_DF, features):
        iqrs = IQR(SUMMARY_DF, features)   
        for i, iqr in enumerate(iqrs):
             H = 1.5*iqr
             DF = DF[ ( DF[features[i]] > SUMMARY_DF[features[i]]['25%'] - H ) & ( DF[features[i]] < SUMMARY_DF[features[i]]['75%'] + H )]
        print(DF.shape)
        return DF
         
    CUSTOMER_DATA_CLEAN= remove_outlier(CUSTOMER_DATA, CUSTOMER_DATA.describe(), ['CUST_AGE', 'CUST_CREDIT_LIMIT', 'YRS_RESIDENCE', 'Y_BOX_GAMES'])
     
    print("Shape:",CUSTOMER_DATA_CLEAN.shape)
    Shape: (4233, 9)

これで、データの理解およびデータの準備ステージが完了します。

3.3.3 モデルの構築

モデルのパフォーマンスを評価するには、データをトレーニング・セットとテスト・セットに分割するのが一般的です。これにより、モデルが未知のデータに対してどの程度一般化されているか評価できます。ただし、クラスタリングなどの教師なし学習では、精度を計算したりパフォーマンスを評価するために使用できるラベルや予測子がありません。その結果、分割しなくてもデータセット全体を使用してモデルを構築できます。結果を比較するための真の正解データがないため、教師なし学習では、トレーニングとテストへの分割は適用できず、有用でもありません。

アルゴリズムの選択

OML4Pyを使用すると、次のアルゴリズムのいずれかを選択して、クラスタリングの問題を解決できます:
  1. 期待値最大化(EM)
  2. k-Means (KM)

期待値最大化(EM)アルゴリズムでは、密度推定アルゴリズムに基づいた確率的クラスタリングを使用します。EMアルゴリズムは、データに隠れた要素が含まれている場合や、一部のデータ・ポイントが存在しない場合に使用されます。一方、k-Means (KM)アルゴリズムは、指定された数のクラスタにデータを分割する、距離ベースのクラスタリング・アルゴリズムです。距離ベースのアルゴリズムは、近くのデータ・ポイントは遠くのデータ・ポイントよりも相互に密接に関連しているという原則に基づいています。このアルゴリズムは反復的に動作し、最も近いクラスタ重心を基準にしてクラスタ内分散を最小化します。

期待値最大化(EM)アルゴリズムよりも単純であるため、k-Meansアルゴリズムを選択します。最適なクラスタ数は不明であるため、1つのクラスタから始めて、徐々にクラスタの数を増やします。エルボー法を使用して、最適なクラスタ数を決定します。

モデル設定を指定し、データを分割してセグメント化するk-Meansモデル・オブジェクトを構築するには、次のスクリプトを実行します。設定は、キーと値またはディクショナリのペアとして指定し、各キーはパラメータ名を表し、対応する値は設定を表します。指定される設定には、KMNS_ITERATIONSとKMNS_DISTANCEがあります。k-Meansアルゴリズムは、クラスタ数(k)とこれらの設定を使用してアルゴリズムを構成します。

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

  • oml.kmアルゴリズムを使用してモデルを構築し、モデル設定を指定します。次のスクリプトを実行します。

    try:
        oml.drop(model="CUST_CLUSTER_MODEL")
    except:
        pass
         
    setting = {'KMNS_ITERATIONS': 10,
               'KMNS_DISTANCE': 'KMNS_EUCLIDEAN',
               'KMNS_NUM_BINS': 10,
               'KMNS_DETAILS': 'KMNS_DETAILS_ALL',
               'PREP_AUTO': 'ON'}
     
    km_mod1 = oml.km(n_clusters = 1, **setting).fit(CUSTOMER_DATA_CLEAN, model_name = "CUST_CLUSTER_MODEL", case_id = 'CUST_ID')
    

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

    • KMNS_ITERATIONS: 許容される反復の最大数を指定します。デフォルトは20です。
    • KMNS_DISTANCE: 使用する距離関数のタイプを指定します。デフォルトでは、距離関数はユークリッド距離です。
    • KMNS_NUM_BINS: k-Meansで生成される属性ヒストグラム内にあるビンの数を指定します。
    • KMNS_DETAILS: 構築中に計算されるクラスタ詳細のレベルを決定します。値KMNS_DETAILS_ALLは、クラスタ階層、レコード数および記述統計(分散値、最頻値、ヒストグラム、ルールなど)が計算されることを示します。
    • PREP_AUTO: 自動データ準備に使用されます。デフォルトでは、'PREP_AUTO': PREP_AUTO_ONで有効になっており、DBMS_DATA_MININGパッケージを必要とします。あるいは、'PREP_AUTO': 'ON'と設定することもできます。これにより、コンパイラはPL/SQL定数名が正しいことを検証できます。

3.3.4 評価

モデルを評価するには、様々なメトリックおよび手法を使用してパフォーマンスを評価し、モデルが新しい未知のデータに対してどれだけ効果的に一般化できるかを判断します。このプロセスでは、モデル・タイプに応じて、精度、適合率、再現率、F1スコア、平均平方誤差などのメトリックを使用して、予測と実際の結果を比較します。評価は、モデルの長所と短所を特定するのに役立ち、さらなる改善またはチューニングの指針となります。

情報とモデル設定

ノート:

k-Meansモジュールで使用可能な設定に関する情報の完全なリストを取得するには、次のスクリプトを実行します:
help(oml.algo.km)

次のステップを使用すると、様々なモデル・ディテール・ビューを表示できます。

  • km_mod1を使用して、k-Meansモデル・オブジェクトで使用可能なモデル詳細(モデル設定、係数、適合詳細など)にアクセスします。
     km_mod1

    km_mod1モデルの出力を示しています。

  • km_mod1.clustersを使用して、クラスタ情報をリストします。
    z.show(km_mod1.clusters)

    km_mod1のクラスタを示しています。

  • 次のスクリプトを実行して、各列に関するモデルの重心を表示します。これは、数値属性の平均、分散と質的属性の最頻値を示します。
    z.show(km_mod1.centroids)

    km_mod1の重心を示しています

  • kの最適値を決定するには、エルボー法を使用します。kが指定された範囲内にあると仮定し、指定された範囲内の各kに対してk-Meansを実行して、最適なkを探します。各kについて、クラスタ内分散を見つけます。kの値が増えるにつれて、クラスタ内分散は減少します。これは、中心の数が増えるほど、特定の重心に対するデータ・ポイント間の平均距離が小さくなることを意味するためです。各データ・ポイントが中心であるとすると、クラスタ内分散はゼロになります。kの最適値になるまでは、新しいクラスタ内のデータ・ポイントが次第に近くなるため、クラスタ内分散の減少は比較的大きくなります。kの最適値を超えると、形成される新しいクラスタが互いに類似するため、減少は緩やかになります。kの範囲は、最適値で急激な減少が見られ、その後は緩やかな減少となり、グラフではほぼ直線的なパターンが形成されるように選択する必要があります。曲線全体は通常L字型のように見え、最適なKはL字型の転換点(肘の部分)にあります。
    incluster_sum = []
    for cluster in range(1, 9):
        setting = {'kmns_iterations': 15, 'KMNS_RANDOM_SEED': 1}   
        km_mod2 = oml.km(n_clusters = cluster, **setting).fit(CUSTOMER_DATA_CLEAN)
        incluster_sum.append(abs(km_mod2.score(CUSTOMER_DATA_CLEAN)))
         
    plt.plot(range(1, 9),incluster_sum) 
    plt.title('The Elobw Method Graph') 
    plt.xlabel('Number of clusters(k)') 
    plt.ylabel('wcss_list') 
    plt.show()

    エルボー・グラフを示しています。

    肘関節(最適なクラスタ数)は、k=3で観測できます。

  • クラスタの最適値に従って最終モデルを構築します。
    try:
        oml.drop(model="CUST_CLUSTER_MODEL")
    except:
        pass
          
    setting = {'KMNS_ITERATIONS': 20,
               'KMNS_DISTANCE': 'KMNS_EUCLIDEAN',
               'KMNS_NUM_BINS': 10,
               'KMNS_DETAILS': 'KMNS_DETAILS_ALL',
               'PREP_AUTO': 'ON'}
    km_mod3 = oml.km(n_clusters = 3, **setting).fit(CUSTOMER_DATA_CLEAN, model_name = "CUST_CLUSTER_MODEL", case_id = 'CUST_ID')
  • 次のスクリプトを実行して、モデルのクラスタおよびクラスタ階層内の親子関係を表示します。
    z.show(km_mod3.clusters)

    km_mod3のクラスタを示しています。

    cluster_id 3、4および5のクラスタはそれぞれ、1369行、1442行および1422行のデータ・ポイントを含むリーフ・クラスタです。cluster_idが1のクラスタは、parent_cluster_idがnanであるため、バイナリ・ツリーのルートです。

  • 次のスクリプトを実行して、親子関係のみを取得します。
    z.show(km_mod3.taxonomy)

    タクソノミを示しています。

  • リーフ・クラスタのクラスタ属性中心(重心)ごとの情報を表示するには、各クラスタおよび属性のモデル統計(平均、分散、最頻値など)を表示するモデル属性重心を使用します。
    km_mod3.centroids[km_mod3.centroids["CLUSTER_ID"]>=3]

    3以上のクラスタリングを示しています。

    クラスタID 3には、Y_BOX_GAMESおよびCUST_INCOME_LEVELの平均が最も高いユーザーが含まれています。

  • モデルkm_mod3では、モデル属性cluster_histsを使用してクラスタ・ヒストグラムの詳細を表示します。クラスタID 5のCUST_INCOME_LEVEL属性のヒストグラムの詳細を表示するには、次のようにします。
    mod_histogram=km_mod3.cluster_hists
     
    z.show(mod_histogram[(mod_histogram['cluster.id']==3) & 
           ((mod_histogram['variable']=='CUST_INCOME_LEVEL:A: Below 30,000') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:B: 30,000 - 49,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:C: 50,000 - 69,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:D: 70,000 - 89,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:E: 90,000 - 109,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:F: 110,000 - 129,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:G: 130,000 - 149,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:H: 150,000 - 169,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:I: 170,000 - 189,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:J: 190,000 - 249,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:K: 250,000 - 299,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:L: 300,000 and above'))])

    km_mod3のmod_histogramを示しています

    このヒストグラムでは、クラスタID 3がCUST_INCOME_LEVELに基づいてビンにグループ化されています。顧客数が最も多いビンは、年間給与が190,000から249,999の範囲です。

  • あるケースが一定の確率でクラスタに割り当てられる条件を指定するモデル属性ルールを使用して、リーフ・クラスタ(3、4および5)の支持度レベルと信頼度レベルをチェックします。支持度および信頼度は、クラスタリング・ルールとケースとの関係を説明するメトリックです。支持度は、ルールに該当するケースの割合です。信頼度は、このルールによって記述されたケースがクラスタに割り当てられる確率です。

    km_mod3.rules

    ルールを示しています。

    前述のデータ・フレームの列ヘッダーは、次の情報を指定してます:

    • cluster.id: モデル内のクラスタのID
    • rhs.support: レコード数
    • rhs.conf: レコードの信頼度
    • lhr.support: ルールの支持度
    • lhs.conf: ルールの信頼度
    • lhs.var: 属性述語名
    • lhs.var.support: 属性述語の支持度
    • lhs.var.conf: 属性述語の信頼度
    • predicate: 属性述語
  • 次のスクリプトを実行して、クラスタIDと各リーフ・ノードに存在するデータ・ポイントの総数を取得します。各ツリー・レベルのデータ・ポイントの総数は、常に一定に保つ必要があります。ルート・ノードに存在するデータ・ポイントの総数は、リーフ・ノードに存在するすべてのデータ・ポイントの合計(1369+1442+1422=4233)と等しくなる必要があります。
    z.show(km_mod3.leaf_cluster_counts)

スコア

k-Meansによって検出されたクラスタは、新しいレコードがk個のクラスタそれぞれに属する確率を推定することで、新しいレコードをスコアリングするのに使用されます。確率が最も高いクラスタがレコードに割り当てられます。

  1. このステップでは、CUSTOMER_DATA_CLEANに対して予測を行い、スコアをデータに一意に関連付けることができるように、CUST_IDをサプリメンタル列として追加します。これを行うには、次のスクリプトを実行します:

    pred = km_mod3.predict(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]])
    z.show(pred)

    テスト・データの予測を示しています。

  2. データに対して各クラスタの確率を戻す予測を行うには、predict_proba関数を使用します。
    pred = km_mod3.predict_proba(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]])
    z.show(pred)

    予測確率を示しています。

  3. Embedded Python Executionを使用すると、前述のタスクをすべて実行できます。データベース環境によって生成および管理されるPythonエンジンでユーザー定義Python関数を呼び出すことができます。oml.do_eval関数を使用して、k-Meansモデルを構築し、レコードをスコアリングし、結果を表示するユーザー定義入力関数を実行します。
    def build_km_1():
        
        setting = {'KMNS_ITERATIONS': 20,
               'KMNS_DISTANCE': 'KMNS_EUCLIDEAN',
               'KMNS_NUM_BINS': 10,
               'KMNS_DETAILS': 'KMNS_DETAILS_ALL',
               'PREP_AUTO': 'ON'}
       
        # Create a KM model object and fit it.
        try:
            oml.drop(model="CUST_CLUSTER_MODEL_EPE")
        except:
            pass
        km_mod_epe = oml.km(n_clusters = 3, **setting).fit(CUSTOMER_DATA_CLEAN, model_name = "CUST_CLUSTER_MODEL_EPE", case_id = 'CUST_ID')
         
        # Show model details.
        #km_mod_epe
        pred=(km_mod_epe.predict(CUSTOMER_DATA_CLEAN,  supplemental_cols =CUSTOMER_DATA_CLEAN[:, ['CUST_ID']]))
        return pred
     
    z.show(oml.do_eval(func = build_km_1))

    do_evalの出力を示しています。

  4. 次のスクリプトを実行して、各クラスタに属するCUST_ID (102308)を持つ顧客c1の確率スコアを表示します。
    c1=CUSTOMER_DATA_CLEAN[CUSTOMER_DATA_CLEAN['CUST_ID']==102308]
    km_mod3.predict_proba(c1, supplemental_cols =c1['CUST_ID'])

    顧客1名の予測確率を示しています。

新しいゲーム製品を販売するには、すでにY_BOX_GAMESを購入し、与信限度額が高い顧客をターゲットにする必要があります。母集団を様々なクラスタに分割することに成功し、クラスタID 3のクラスタには、Y_BOX_GAMESをすでに購入した顧客の割合が最も高く、平均CUST_CREDIT_LIMITが8322であるターゲット母集団があります。したがって、新しいゲーム製品を販売するために、クラスタID 3の顧客を確信を持ってターゲット設定できます。