BigQuery ML を使用して市場セグメンテーション用の K 平均法クラスタリング モデルを構築する

BigQuery ML で K 平均法クラスタを作成し、マーケティング目的で Google アナリティクス 360 のオーディエンス データをセグメント化する方法を学びます。

概要

一般的なマーケティング分析の課題は、消費者の行動のテーマを決定することです。このテーマを使って顧客のプロフィールやペルソナを開発できます。ユーザー プロフィールは、マーケティング キャンペーンに顧客情報を取り込むのに役立ちます。

データから顧客セグメントを迅速に構築するには、クラスタリングと呼ばれる手法を使用します。クラスタリングを行うと、類似した行動を持つ顧客をグループ化して、マーケティングで使用するさまざまなオーディエンスを構築できます。各顧客が属するクラスタによって示される嗜好や動作に基づいて、顧客向けの広告や他のコミュニケーションをカスタマイズして、顧客へのアウトリーチをパーソナライズできます。

このチュートリアルでは、BigQuery ML で K 平均法モデルを使用して顧客クラスタを作成する方法を説明します。トランザクションと属性情報を含むサンプル顧客データでモデルをトレーニングすると、そのデータで識別された顧客クラスタに関する情報が返されます。次に、属性データと取引履歴に基づいて、各顧客を適切なクラスタに割り当てることができるモデルから予測を取得します。各顧客をクラスタに割り当てたら、更新された顧客データを Google アナリティクス 360 に送り返して、マーケティングの活性化に使用します。

このチュートリアルでは、AI Platform ノートブックの作成を通じてこれらに手順を説明します。また、規範的なガイダンスと詳細な手順も示します。完成したノートブックを使って開始する場合は、使用しているノートブック サーバーにある BigQuery ML を使用して市場セグメンテーション用の K 平均法クラスタリング モデルを構築する方法のノートブックを使用できます。

このチュートリアルは、ビジネス上の意思決定をサポートするために ML データセットとモデルを構築するデータ エンジニア、データ サイエンティスト、データ アナリストを対象としています。以下の知識があることを前提としています。

  • 機械学習のコンセプト
  • Python
  • 標準 SQL

クラスタ化アルゴリズムの仕組み

クラスタリングは教師なし機械学習の一種です。この場合、K 平均法クラスタリングを実行して、データを論理的にグループ化する方法を識別します。アルゴリズムは、人間が提示したラベルに基づいてデータをグループ化するのではなく、類似性のトレーニング データを評価し、それに基づいてグループ化を行います。たとえば、年齢や性別で顧客をグループ化するとします。クラスタリングを使用すると、これらの属性に基づいて、データに含まれるクラスタの数を特定できます。1 つまたは 2 つの顧客属性は考慮する場合、クラスタリングは単純に見えますが、考慮する顧客属性が増えると、手動でのクラスタリングは難しくなります。

クラスタリングを使用する課題の 1 つは、正しい数のクラスタがあるかどうかを判定することです。このチュートリアルでは、最初のバージョンを作成した後にモデルを改善し、ユースケースに適したクラスタ数でモデルを作成する方法を説明します。

データセット

このチュートリアルでは、BigQuery でホストされ、一般公開されている Google アナリティクスのサンプル データセットを使用します。このデータセットは、Google ブランドの商品を販売する実在の e コマースストア、Google Merchandise Store の 12 か月間(2016 年 8 月から 2017 年 8 月)の難読化されたアナリティクス 360 データを提供します。

アナリティクス 360 のデータがある場合は、必要に応じてこれを使用できます。このチュートリアルには、その場合の方法についての情報も記載されています。

目標

  • K 平均法クラスタリング モデルを作成するために、顧客データを適切な形式に処理します。
  • BigQuery ML を使用して K 平均法モデルを作成、トレーニング、デプロイします。
  • モデルを繰り返し処理して、最適なクラスタ数を生成するバージョンを作成します。
  • モデルが作成したクラスタを分析し、顧客セグメントについて何が示されているかを把握します。
  • デプロイされたモデルから予測を取得し、顧客を適切なクラスタに割り当てます。
  • 更新された顧客データを BigQuery からエクスポートしてアナリティクス 360 で使用し、マーケティングの活性化に使用できます。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • AI Platform
  • BigQuery
  • BigQuery ML

料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを算出できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Notebooks and Compute Engine API を有効にします。

    API を有効にする

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

ノートブックを作成する

  1. Notebooks コンソールを開く
  2. [新しいインスタンス] をクリックします。
  3. Python 2 および 3 を選択します。
  4. [インスタンス名] に「kmeans」と入力します。
  5. [作成] をクリックします。ノートブック インスタンスが作成されるまで数分かかります。
  6. インスタンスが利用可能になったら、[JupyterLab を開く] をクリックします。
  7. JupyterLab Launcher の [Notebook] セクションで [Python 3] をクリックします。

ライブラリをインストールする

このチュートリアルに必要なライブラリをインストールします。

  1. ノートブックの最初のセルに次のコードをコピーします。

    # Install libraries.
    !pip install pandas-gbq
    !pip install google-cloud-bigquery
    !pip install google-cloud-bigquery-storage
    # Needed to setup flex slots for flat-rate pricing
    !pip install google-cloud-bigquery-reservation
    
    # Automatically restart kernel after installs
    import IPython
    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)
    
  2. メニューバーの実行アイコン をクリックします。

パッケージをインポートする

このチュートリアルで必要となるパッケージをインストールするには、以下のコードをノートブックの次の空白セルにコピーして実行します。

from google.cloud import bigquery
import numpy as np
import pandas as pd
import pandas_gbq
import matplotlib.pyplot as plt

# used to display float format
pd.set_option('display.float_format', lambda x: '%.3f' % x)

BigQuery クライアントを作成する

以下のコードをノートブックの次の空白セルにコピーして実行し、BigQuery 用の Python クライアント ライブラリに BigQuery クライアントを作成します。myProject は、このチュートリアルで使用するプロジェクトの ID に置き換えます。

client = bigquery.Client(project="myProject")

データを処理する

このセクションでは、K 平均法モデルをトレーニングするために必要なデータを準備します。データを準備するには、アナリティクス 360 から取得した顧客トランザクション データを集計し、サンプルのユーザー属性データを生成して、これら 2 つのデータセットを結合してトレーニング データセットを作成します。

このチュートリアルでは、Google アナリティクスのサンプルデータを使用しますが、本番環境で使用する場合は、アナリティクス 360 のデータを使用します。

BigQuery データセットを作成する

以下のコードをノートブックの次の空白セルにコピーして実行し、顧客データと K 平均法モデルを含む BigQuery データセットを作成します。

! bq mk myProject:kmeans

トランザクション データを集計する

このセクションでは、アナリティクス 360 のサンプル データセットから顧客トランザクション データを集計します。集計データは、顧客が商品を購入する頻度、購入したアイテムのタイプ、購入金額を明確に把握するのに役立ちます。

このチュートリアルでは、pagetype = "EVENT" のときに購入が発生したと仮定します。本番環境のユースケースでは、アナリティクス 360 の構成に応じて他の方法で購入を特定することもできます。

このチュートリアルでは、fullVisitorID を顧客データのキーとして使用します。本番環境のユースケースでは、このクエリと後続のクエリで fullVisitorID のインスタンスを clientId に置き換える必要があります。これは、オーディエンス データをアナリティクス 360 にインポートする際に、キーフィールドとして clientId を使用する必要があるためです。clientId は通常、fullVisitorId のハッシュ バージョンですが、この列は Google アナリティクスのサンプル データセットには入力されません。独自のアナリティクス 360 データで clientId を使用するには、カスタム ディメンションを作成して入力します。

  1. ノートブックの次の空白のセルに以下のコードをコピーして実行し、トランザクション データの集計を含むビューを作成します。

    ga360_only_view = 'GA360_View'
    shared_dataset_ref = client.dataset('kmeans')
    ga360_view_ref = shared_dataset_ref.table(ga360_only_view)
    ga360_view = bigquery.Table(ga360_view_ref)
    
    ga360_query = '''
    SELECT
      fullVisitorID,
      # This will be used to generate random data.
      ABS(farm_fingerprint(fullVisitorID)) AS Hashed_fullVisitorID,
      # You can aggregate this because an
      # operating system is tied to a fullVisitorID.
      MAX(device.operatingSystem) AS OS,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Apparel' THEN 1 ELSE 0 END) AS Apparel,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Office' THEN 1 ELSE 0 END) AS Office,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Electronics' THEN 1 ELSE 0 END) AS Electronics,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Limited Supply' THEN 1 ELSE 0 END) AS LimitedSupply,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Accessories' THEN 1 ELSE 0 END) AS Accessories,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Shop by Brand' THEN 1 ELSE 0 END) AS ShopByBrand,
      SUM (CASE
           WHEN REGEXP_EXTRACT (v2ProductCategory,
                               r'^(?:(?:.*?)Home/)(.*?)/')
                               = 'Bags' THEN 1 ELSE 0 END) AS Bags,
      ROUND (SUM (productPrice/1000000),2) AS totalSpent_USD
      FROM
      `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
      UNNEST(hits) AS hits,
      UNNEST(hits.product) AS hits_product
    WHERE
      _TABLE_SUFFIX BETWEEN '20160801'
      AND '20160831'
      AND geoNetwork.country = 'United States'
      AND type = 'EVENT'
    GROUP BY
      1,
      2
    '''
    
    ga360_view.view_query = ga360_query.format('myProject')
    ga360_view = client.create_table(ga360_view)
    
    
  2. 以下のコードをノートブックの次の空白セルにコピーして実行し、顧客トランザクション集計データのサンプルを確認します。

    # Show a sample of GA360 data
    
    ga360_query_df = f'''
    SELECT * FROM {ga360_view.full_table_id.replace(":", ".")}
    ORDER BY fullVisitorID
    LIMIT 5
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(ga360_query_df, job_config=job_config) #API Request
    df_ga360 = query_job.result()
    df_ga360 = df_ga360.to_dataframe()
    
    df_ga360
    

    次のような結果が表示されます。

    集計されたトランザクション データの最初の 5 行。

属性データを生成する

次の手順で顧客属性の合成データを生成します。

本番環境のユースケースでは、顧客管理(CRM)システムから独自のデータを使用することもできます。このステップをスキップして次のステップに進み、CRM データを顧客のトランザクション集計データと統合します。

  1. 以下のコードをノートブックの次の空白のセルにコピーして実行し、生成された顧客データを含むビューを作成します。

    CRM_only_view = 'CRM_View'
    shared_dataset_ref = client.dataset('kmeans')
    CRM_view_ref = shared_dataset_ref.table(CRM_only_view)
    CRM_view = bigquery.Table(CRM_view_ref)
    
    # The query below works by hashing the fullVisitorID, which creates a
    # random distribution. It uses modulo to artificially split gender and
    # household income distribution.
    CRM_query = '''
    SELECT
      fullVisitorID,
    IF
      (MOD(Hashed_fullVisitorID,2) = 0,
        "M",
        "F") AS gender,
      # Generate household income
      CASE
        WHEN MOD(Hashed_fullVisitorID,10) = 0 THEN 55000
        WHEN MOD(Hashed_fullVisitorID,10) < 3 THEN 65000
        WHEN MOD(Hashed_fullVisitorID,10) < 7 THEN 75000
        WHEN MOD(Hashed_fullVisitorID,10) < 9 THEN 85000
        WHEN MOD(Hashed_fullVisitorID,10) = 9 THEN 95000
      ELSE
      Hashed_fullVisitorID
    END
      AS hhi
    FROM (
      SELECT
        fullVisitorID,
        ABS(farm_fingerprint(fullVisitorID)) AS Hashed_fullVisitorID,
      FROM
        `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
        UNNEST(hits) AS hits,
        UNNEST(hits.product) AS hits_product
          WHERE
        _TABLE_SUFFIX BETWEEN '20160801'
        AND '20160831'
        AND geoNetwork.country = 'United States'
        AND type = 'EVENT'
      GROUP BY
        1,
        2)
    '''
    
    CRM_view.view_query = CRM_query.format('myProject')
    CRM_view = client.create_table(CRM_view)
    
  2. 以下のコードをノートブックの次の空白セルにコピーして実行し、生成された顧客データのサンプルを確認します。

    # See an output of the synthetic CRM data
    
    CRM_query_df = f'''
    SELECT * FROM {CRM_view.full_table_id.replace(":", ".")}
    ORDER BY fullVisitorID
    LIMIT 5
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(CRM_query_df, job_config=job_config)
    df_CRM = query_job.result()
    df_CRM = df_CRM.to_dataframe()
    
    df_CRM
    

    次のような結果が表示されます。

    生成した顧客データの最初の 5 行。

トレーニング データセットを作成する

次の手順で、顧客トランザクション集計データと生成した顧客属性データを結合して、トレーニング データセットを作成します。

  1. 以下のコードをノートブックの次の空白のセルにコピーして実行し、結合された顧客データとトランザクション データを含むビューを作成します。

    # Build a final view, which joins GA360 data with CRM data
    
    final_data_view = 'Final_View'
    shared_dataset_ref = client.dataset('kmeans')
    final_view_ref = shared_dataset_ref.table(final_data_view)
    final_view = bigquery.Table(final_view_ref)
    
    final_data_query = f'''
    SELECT
        g.*,
        c.* EXCEPT(fullVisitorId)
    FROM {ga360_view.full_table_id.replace(":", ".")} g
    JOIN {CRM_view.full_table_id.replace(":", ".")} c
    ON g.fullVisitorId = c.fullVisitorId
    '''
    
    final_view.view_query = final_data_query.format('myProject')
    final_view = client.create_table(final_view)
    
    print(f"Successfully created view at {final_view.full_table_id}")
    
  2. 以下のコードをノートブックの次の空白セルにコピーして実行し、結合データのサンプルを確認します。

    # Show final data used before modeling
    
    sql_demo = f'''
    SELECT * FROM {final_view.full_table_id.replace(":", ".")}
    ORDER BY fullVisitorID
    LIMIT 5
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(sql_demo, job_config=job_config)
    df_demo = query_job.result()
    df_demo = df_demo.to_dataframe()
    
    df_demo
    

    次のような結果が表示されます。

    結合された顧客データとトランザクション データの最初の 5 行。

初期モデルの作成、トレーニング、デプロイを行う

このセクションでは、K 平均法モデルを構築する Python 関数を作成します。SQL を使用するだけでなく関数を作成すると、複数のモデルを定義して、BigQuery でモデルを並行してビルドできます。この関数をモデルを改善するセクションで再び使用して、比較のためモデルの複数のバージョンを作成します。

クラスタリング用に特徴を作成するためにデータは必要ないため、fullVisitorId をモデルへの入力としては使用しません。一般に、一意のデータや一般的でないデータは、この目的で使用できません。

通常、数値特徴は正規化する必要がありますが、BigQuery ML は自動的に処理するため、この手順は省略できます。

  1. 以下のコードをノートブックの次の空白セルにコピーして実行し、makeModel 関数を定義します。

    PROJECT_ID = "myProject"
    
    def makeModel (n_Clusters, Model_Name):
        sql =f'''
        CREATE OR REPLACE MODEL `{PROJECT_ID}.kmeans.{Model_Name}`
        OPTIONS(model_type='kmeans',
        kmeans_init_method = 'KMEANS++',
        num_clusters={n_Clusters}) AS
        SELECT * except(fullVisitorID, Hashed_fullVisitorID) FROM `{final_view.full_table_id.replace(":", ".")}`
        '''
        job_config = bigquery.QueryJobConfig()
        client.query(sql, job_config=job_config)
    
  2. データを 3 つのクラスタにセグメント化する test モデルを作成して関数をテストします。モデルの構築には 5 分ほどかかります。

    以下のコードをノートブックの次の空白セルにコピーして実行します。

    model_test_name = "test"
    makeModel(3, model_test_name)
    
  3. 以下のコードをノートブックの次の空白セルにコピーして実行し、モデルが作成されたことを確認します。

    for model in client.list_models('kmeans'):
      print(model)
    

    次のような結果が表示されます。

    Model(reference=ModelReference(project_id='myProject', dataset_id='kmeans', model_id='test'))
    
  4. 以下のコードをノートブックの次の空白セルにコピーして実行し、test データセットを削除します。

    model_id = "kmeans."+model_test_name
    client.delete_model(model_id)
    print(f"Deleted model '{model_id}'")
    

モデルを改善する

このセクションでは、ユースケースに合わせて最適なクラスタ数を提供するようにモデルを調整して、モデルを改善する方法について説明します。

適切なクラスタ数の決定(「K 平均法」の「k」)は、ユースケースによって異なります。必要なクラスタの数の決定は容易な場合があります。たとえば、手書きの数字 1 桁の画像を処理する場合は、数字 0~9 ごとに 1 つずつ、10 個のクラスタが必要です。わかりづらいユースケースでは、異なる数のクラスタを使用する複数のバージョンのモデルでテストできます。バージョンの異なるモデルを比較すると、各クラスタのエラーを最小限に抑えながら、データのグループ化でどのモデルのパフォーマンスが高いかを確認できます。

エルボー法を使用して最良のグループ化を提供するモデル バージョンを決定できます。この方法は、モデルの Davies–Bouldin スコアと組み合わせて、モデルのクラスタの数に対して損失をグラフ化する方法です。このスコアは、クラスタのデータポイント同士がどのように違うかを示します。これは、特定のクラスタ内のデータポイントの分散とクラスタ自体の散布比率の比率として定義され、値が小さいほど、クラスタリングに役立ちます。

比較のために複数のモデルを作成する

複数バージョンの K 平均法モデル(3 つから最大 15 のクラスタを作成するモデル)を生成します。

  1. K 平均法モデルの複数のバージョンを生成します。モデルの構築には約 7 分かかります。

    以下のコードをノートブックの次の空白セルにコピーして実行します。

    low_k = 3
    high_k = 15
    model_prefix_name = 'kmeans_clusters_'
    
    lst = list(range (low_k, high_k+1)) #build list to iterate through k values
    
    for k in lst:
        model_name = model_prefix_name + str(k)
        makeModel(k, model_name)
    
  2. 以下のコードをノートブックの次の空白セルにコピーして実行し、生成したモデルのリストを取得します。

    models = client.list_models('kmeans')
    print("Listing current models:")
    for model in models:
        full_model_id = f"{model.dataset_id}.{model.model_id}"
        print(full_model_id)
    

    次のような結果が表示されます。

    異なるモデル バージョンのリスト。

モデルのパフォーマンスを比較する

次の手順で、モデルの損失を識別する平均二乗距離と各モデルの Davies–Bouldin スコアを確認して、さまざまなモデルのパフォーマンスを比較します。

  1. ML.EVALUATE SQL ステートメントを使用して、各モデルの平均二乗距離と Davies–Bouldin スコアを生成します。完了までに 1 分ほどかかる場合があります。

    以下のコードをノートブックの次の空白セルにコピーして実行します。

    # This creates a dataframe with each model name, the Davies Bouldin Index, and Loss.
    
    df = pd.DataFrame(columns=['davies_bouldin_index', 'mean_squared_distance'])
    models = client.list_models('kmeans')
    for model in models:
        full_model_id = f"{model.dataset_id}.{model.model_id}"
        sql =f'''
            SELECT
                davies_bouldin_index,
                mean_squared_distance
            FROM ML.EVALUATE(MODEL `{full_model_id}`)
        '''
    
        job_config = bigquery.QueryJobConfig()
    
        # Start the query, passing in the extra configuration.
        query_job = client.query(sql, job_config=job_config)
        df_temp = query_job.to_dataframe()  # Wait for the job to complete.
        df_temp['model_name'] = model.model_id
        df =  pd.concat([df, df_temp], axis=0)
    
  2. モデルで使用されるクラスタの数を特定する列を追加し、グラフのデータを並べ替えて、データフレームを更新します。それには、以下のコードをノートブックの次の空白のセルにコピーして実行します。

    df['n_clusters'] = df['model_name'].str.split('_').map(lambda x: x[2])
    df['n_clusters'] = df['n_clusters'].apply(pd.to_numeric)
    df = df.sort_values(by='n_clusters', ascending=True)
    df
    

    次の表のような結果が表示されます。

    各モデルの平均二乗距離と Davies–Bouldin スコア情報。

  3. 以下のコードをノートブックの次の空白セルにコピーして実行し、データのグラフを作成します。

    df.plot.line(x='n_clusters', y=['davies_bouldin_index', 'mean_squared_distance'])
    

    次の表のような結果が表示されます。

    各モデルのクラスタ数に対する平均二乗距離と Davies–Bouldin スコアをプロットするグラフ

    ユースケースに最適なクラスタ数を判断するための完全なアプローチはありません。この決定を行う際は、次のアプローチをおすすめします。

    1. エルボー法を適用し、損失が均一になる箇所が明確に示されているかを確認します。
    2. モデルの Davies-Bouldin スコアを考慮します。
    3. 操作するクラスタの数に影響する可能性のあるビジネスルールや要件を考慮します。
    4. ビジネス要件を満たし、低いスコアと Davies-Bouldin スコアの最適な組み合わせがあるモデルを選択します。

    上のグラフでは、オレンジ色の線は各モデルの損失を表します。これは平均二乗距離で表され、モデル内のクラスタの数に対してグラフ化されます。この線の傾向は、予想されるように、クラスタ数を増やすと損失が減少することを示しています。また、この線では、損失が均一になり、エルボーの形を作成するポイントにヒットするのではなく、徐々に減少していきます。このデータセットの場合、エルボー法を使用するだけでは最適なクラスタ数を決定するには十分ではないことがわかります。

    青い線は各モデルの Davies-Bouldin スコアを表し、モデル内のクラスタ数に対してグラフ化されています。エルボー法でパフォーマンスの悪いモデルがはっきりと識別されなかったため、代わりに Davies-Bouldin スコアの低いモデルを選択してパフォーマンスの悪いモデルを識別します。

    11 のクラスタを持つモデルは損失が非常に低く、最も優れた Davies-Bouldin スコアを示すので、クラスタが少ないモデルは使用しないというビジネスルールは最適な判断となります。ビジネスルール上、クラスタが少ないモデルでも使用する場合、4 つのクラスタを持つモデルの Davies-Bouldin スコアは 2 番目に高くなります。わかりやすくするために、このチュートリアルでは 4 つのクラスタを持つモデルを使用します。

選択したモデルのデータクラスタを分析する

モデルのセントロイドを見つけることで、このモデルでデータがクラスタ化される方法を理解してから、各クラスタ内のデータを分析し、クラスタ内のユーザー数とクラスタリングで示される顧客の行動を把握します。

  1. ML.CENTROIDS SQL ステートメントを使用して、次のコードをノートブックの次の空白セルにコピーして実行することで、gender 機能の各クラスタ内のセントロイドに関する情報を取得します。

    model_to_use = 'kmeans_clusters_4' # Edit this to use a different model
    final_model = 'kmeans.'+model_to_use
    
    pd.set_option('max_colwidth', 400)
    
    sql_get_attributes = f'''
    SELECT
      centroid_id,
      feature,
      categorical_value
    FROM
      ML.CENTROIDS(MODEL {final_model})
    WHERE
      feature IN ('gender')
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(sql_get_attributes, job_config=job_config)
    df_attributes = query_job.result()
    df_attributes = df_attributes.to_dataframe()
    df_attributes
    

    次のような結果が表示されます。

    K 平均法モデルの性別特徴のセントロイド。

  2. 次のコードをノートブックの次の空白セルにコピーして実行することで、ML.PREDICT と ML.CENTROIDS からの情報を使用して、クラスタデータの要約統計を計算します。

    sql_get_numerical_attributes = f'''
    WITH T AS (
    SELECT
      centroid_id,
      ARRAY_AGG(STRUCT(feature AS name,
                       ROUND(numerical_value,1) AS value)
                       ORDER BY centroid_id)
                       AS cluster
    FROM ML.CENTROIDS(MODEL {final_model})
    GROUP BY centroid_id
    ),
    
    Users AS(
    SELECT
      centroid_id,
      COUNT(*) AS Total_Users
    FROM(
    SELECT
      * EXCEPT(nearest_centroids_distance)
    FROM
      ML.PREDICT(MODEL {final_model},
        (
        SELECT
          *
        FROM
          {final_view.full_table_id.replace(":", ".")}
          )))
    GROUP BY centroid_id
    )
    
    SELECT
      centroid_id,
      Total_Users,
      (SELECT value from unnest(cluster) WHERE name = 'Apparel') AS Apparel,
      (SELECT value from unnest(cluster) WHERE name = 'Office') AS Office,
      (SELECT value from unnest(cluster) WHERE name = 'Electronics') AS Electronics,
      (SELECT value from unnest(cluster) WHERE name = 'LimitedSupply') AS LimitedSupply,
      (SELECT value from unnest(cluster) WHERE name = 'Accessories') AS Accessories,
      (SELECT value from unnest(cluster) WHERE name = 'Bags') AS Bags,
      (SELECT value from unnest(cluster) WHERE name = 'ShopByBrand') AS ShopByBrand,
      (SELECT value from unnest(cluster) WHERE name = 'totalSpent_USD') AS totalSpent_USD,
      (SELECT value from unnest(cluster) WHERE name = 'hhi') AS HouseholdIncome
    
    FROM T LEFT JOIN Users USING(centroid_id)
    ORDER BY centroid_id ASC
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(sql_get_numerical_attributes, job_config=job_config)
    df_numerical_attributes = query_job.result()
    df_numerical_attributes = df_numerical_attributes.to_dataframe()
    df_numerical_attributes.head()
    

    次のような結果が表示されます。

    クラスタデータの要約統計。

セントロイドと要約された統計データの両方を考慮すると、モデルのクラスタに関する次の特性を判断できます。

  • クラスタ 1 - このクラスタの顧客は衣料品を多数購入しています。最も多くのアイテムを購入しており、アイテムあたりの支出が 2 番目に高くなっています。ブランドは強い動機ではありません。このクラスタは女性にわずかに偏ります。
  • クラスタ 2 - このクラスタの顧客はすべてのカテゴリを購入しますが、アパレル分野で最も購入しています。クラスタ 1 の顧客よりもアイテム購入量は少ないですが、アイテムあたりの支出はかなり多くなっています。ブランドによって購入する可能性が高い顧客です。このクラスタは、さらに女性に偏っています。
  • クラスタ 3 - このクラスタは 1 人だけが属する外れ値です。
  • クラスタ 4 - 最も人数の多いクラスタです。このクラスタの顧客の購入は少ないため、支出は平均より少なくなっています。通常、ブランドのリピータではなく、1 回限りの購入者です。性別での偏りは少ないです。

予測の取得

選択したモデルを使用してユーザーをクラスタに割り当てると、マーケティング セグメンテーションに使用できます。

  1. ノートブックの次の空白のセルに以下のコードをコピーして実行し、トランザクション データの集計を含むテーブルを作成します。

    sql_score = f'''
    SELECT * EXCEPT(nearest_centroids_distance)
    FROM
      ML.PREDICT(MODEL {final_model},
        (
        SELECT
          *
        FROM
          {final_view.full_table_id.replace(":", ".")}
          LIMIT 10))
    '''
    
    job_config = bigquery.QueryJobConfig()
    
    # Start the query
    query_job = client.query(sql_score, job_config=job_config)
    df_score = query_job.result()
    df_score = df_score.to_dataframe()
    
    df_score
    

    次のような結果が表示されます。

    処理されたトレーニング データの最初の 10 行。

アナリティクス 360 にデータをエクスポートする

K 平均法モデルから顧客のクラスタ情報を取得したら、それをアナリティクス 360 にエクスポートして、マーケティング キャンペーンで使用できます。

それには、次の SQL 疑似コードのように、BigQuery コンソールを使用して、エクスポートするデータを返すクエリを実行します。

CREATE OR REPLACE TABLE myDataset.myCustomerDataTable AS (
    SELECT * EXCEPT(nearest_centroids_distance)
    FROM
      ML.PREDICT(MODEL myDataset.myModel,
        (
        SELECT
          *
        FROM
          myDataset.myTable)))

CSV ファイルとしてクエリ結果を保存してから、データのインポートを使用し、データをアナリティクス 360 にインポートします。エクスポートされたレコメンデーション データの列名は、アナリティクス 360 のデータ インポート スキーマにマッピングされている必要があります。たとえば、データ インポート スキーマが ga:clientId, ga:dimension1, ga:dimension2 の場合、データの列名も ga:clientId, ga:dimension1, ga:dimension2 とする必要があります。BigQuery では列名でコロンを使用できないため、エクスポートした CSV ファイル内の列名をインポートする前に更新する必要があります。

BigQuery ML モデルMoDeM(Model Deployment for Marketing)のリファレンス実装を使用して、データをアナリティクス 360 に簡単に読み込むこともできます。まずは、BQML デプロイ テンプレート ノートブックのインタラクティブな手順を使用してください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトは削除せず、これらのリソースのみを削除します。

いずれにしても、今後これらのリソースについて料金が発生しないように、削除する必要があります。以降のセクションでは、このようなリソースを削除する方法を説明します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

コンポーネントの削除

プロジェクトを削除しない場合は、以下のセクションに従って、このチュートリアルの課金対象コンポーネントを削除してください。

BigQuery データセットの削除

  1. BigQuery コンソールを開きます
  2. [リソース] セクションで、このチュートリアルを実施しているプロジェクトを展開し、kmeans データセットを選択します。
  3. データセット ペインのヘッダーにある [データセットの削除] をクリックします。
  4. 上に重なったウィンドウで、「kmeans」と入力し、[削除] をクリックします。

AI Platform ノートブックの削除

  1. AI Platform Notebooks のページを開きます
  2. K 平均法ノートブック インスタンスのチェックボックスを選択します。
  3. [削除] をクリックします。
  4. 上に重なったウィンドウで [削除] をクリックします。

次のステップ