K 平均法クラスタリング モデルの作成

BigQuery ML は教師なし学習をサポートしています。データをクラスタにグループ化するために K 平均法アルゴリズムを適用することができます。教師あり機械学習が予測分析を目的としているのとは異なり、教師なし学習では記述分析が目的となります。データに基づいて意思決定を下せるように、データを理解することが重要になります。

このチュートリアルでは、BigQuery ML の K 平均法モデルを使用して、ロンドンのレンタル自転車のパブリック データセットからデータのクラスタを構築します。同データセットには、ロンドンの Santander Cycle Hire Scheme の 2011 年から現在までの利用者数が含まれています。また、開始時と終了時のタイムスタンプ、ステーション名、乗車時間も含まれます。

このチュートリアルのクエリでは、地理関数を使用します(BigQuery GIS 内で利用可能)。BigQuery GIS の詳細については、BigQuery GIS の概要をご覧ください。

目標

このチュートリアルの内容は次のとおりです。

  • K 平均法クラスタリング モデルの作成
  • Google データポータルを使ったモデルの可視化
  • モデルに基づいたデータ主導での意思決定

費用

このチュートリアルでは、以下を含む Cloud Platform の有料コンポーネントを使用します。

  • BigQuery
  • BigQuery ML

BigQuery の料金の詳細については、BigQuery の料金のページをご覧ください。

BigQuery ML の料金の詳細については、BigQuery ML の料金のページをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

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

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

    課金を有効にする方法について

  4. 新しいプロジェクトでは、BigQuery が自動的に有効になります。 既存のプロジェクトで BigQuery を有効にするには、以下にアクセスします。 BigQuery API を有効にします。

    APIを有効にする

はじめに

データには、自然なグループやデータのクラスタが含まれている場合があります。データに基づいた意思決定が行えるように、これらのグループを記述的に識別することをおすすめします。たとえば小売業者であれば、似たような購買習慣を持つ顧客や同一地域の顧客を自然なグループとして識別したい場合があります。このようなプロセスを「顧客セグメンテーション」と呼びます。

顧客セグメンテーションを行う際に使用するデータには、訪問した店舗、購入した商品、支払った金額などがあります。モデルを作成して、このような顧客特性を反映したグループについて把握することで、そのグループを構成するユーザーにアピールする商品を考案できるようになります。

購入した商品の中から商品グループを見つけることもできます。この場合、商品の購入者、購入時期、購入元などに基づいて商品をクラスタ化します。モデルを作成して製品グループの特性を判別することで、クロスセルの改善方法について情報に基づいた決定を下せるようになります。

このチュートリアルでは、ロンドンのレンタル自転車のデータを自転車ステーションの属性に基づいてクラスタ化します。その際、BigQuery ML を使用して K 平均法モデルを作成します。

K 平均法モデルの作成は、次の手順で行われます。

  • ステップ 1: モデルを格納するためのデータセットを作成する。
    最初のステップとして、モデルを格納するデータセットを作成します。レンタル自転車のデータセットは EU マルチリージョン ロケーションに格納されているため、データセットも EU に存在する必要があります。
  • ステップ 2: トレーニング データを確認する。
    次のステップでは、london_bicycles テーブルに対してクエリを実行し、クラスタリング モデルのトレーニングに使用するデータの確認を行います。K 平均法は教師なし学習にあたるため、モデルのトレーニングを行う際に、トレーニング データや評価用データにラベルを指定したりデータを分割したりする必要はありません。
  • ステップ 3: K 平均法モデルを作成する。
    ステップ 3 では、K 平均法モデルを作成します。モデルを作成すると、クラスタリング フィールドは station_name になり、市内中心部から駅までの距離や自転車ラック数などのステーション属性に基づいてデータがクラスタリングされます。
  • ステップ 4: ML.PREDICT 関数を使用してステーションのクラスタを予測する。
    次に、ML.PREDICT 関数を使用して、特定のステーションのクラスタを予測します。名前に Kennington という文字列を含むすべてのステーションのクラスタを予測します。
  • ステップ 5: モデルを可視化する。
    ステップ 5 では、可視化ツールを使用して各クラスタの特性を調べます。このチュートリアルでは、Google データポータルを使用してクラスタを可視化します。
  • ステップ 6: モデルを使用してデータに基づいた意思決定を行う。
    最後のステップは、モデルを使用してデータに基づいた意思決定を行うことです。たとえば、モデルの結果に基づいて、利用台数を増やすことでどのステーションにメリットが出るかが分かります。

ステップ 1: データセットを作成する

最初のステップとして、モデルを格納する BigQuery データセットを作成します。データセットを作成するには、次の操作を行います。

  1. GCP Console の BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルの [リソース] セクションで、プロジェクト名をクリックします。

  3. 右側の詳細パネルで、[データセットを作成] をクリックします。

    データセットを作成

  4. [データセットを作成] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。
    • [データのロケーション] で、欧州連合(EU)を選択します。ロンドンのレンタル自転車の一般公開データセットは、EU マルチリージョン ロケーションに格納されています。データセットは同じロケーションに存在する必要があります。

      データセットの作成ページ

  5. その他のデフォルト設定はすべてそのままにし、[データセットを作成] をクリックします。

ステップ 2: トレーニング データを確認する

次に、K 平均法モデルのトレーニングに使用するデータの確認を行います。このチュートリアルでは、以下の属性に基づいて自転車ステーションのクラスタリングを行います。

  • レンタル期間
  • 1 日あたりの利用数
  • 自転車ラックの数
  • 市中心部からの距離

次のクエリで、トレーニング データをまとめます。このクエリは、チュートリアルの後半で CREATE MODEL ステートメントに含まれます。

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    h.duration,
    s.bikes_count,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(bikes_count) AS bikes_count,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name )
SELECT
  *
FROM
  stationstats
ORDER BY
  distance_from_city_center ASC

クエリの詳細

このクエリは、start_station_nameduration を含む自転車レンタルのデータを抽出し、bike_countdistance-from-city-center を含むステーション情報に結合します。そして、平均乗車時間と利用数を含んだステーション属性 stationstats を計算します。この計算には、ステーション属性 bike_countdistance_from_city_center も含まれます。

このクエリでは、WITH 句を使用してサブクエリが定義されています。また、BigQuery GIS 関数 ST_DISTANCEST_GEOGPOINT も使用しています。これらの関数の詳細については、地理関数をご覧ください。BigQuery GIS の詳細については、BigQuery GIS の概要をご覧ください。

クエリを実行する

クエリを実行して、モデル用のトレーニング データをまとめるには、次の手順に従います。

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        h.duration,
        s.bikes_count,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(bikes_count) AS bikes_count,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name )
    SELECT
      *
    FROM
      stationstats
    ORDER BY
      distance_from_city_center ASC
    
  3. [実行] をクリックします。

  4. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。[結果] タブの列には、モデルのトレーニングに使用されたクエリ(station_namedurationnum_tripsbikes_countdistance_from_city_center)が表示されます。結果は次のようになります。

    クエリ結果

ステップ 3: K 平均法モデルを作成する

トレーニング データを確認したら、次のステップでは、そのデータを使用して K 平均法モデルを作成します。

CREATE MODEL ステートメントを model_type=kmeans オプションで使用することで、K 平均法モデルの作成とトレーニングが行えます。次のクエリでは、上記のクエリに CREATE MODEL ステートメントを追加し、データ内の id フィールドを削除します。

CREATE OR REPLACE MODEL
  bqml_tutorial.london_station_clusters
OPTIONS
  (model_type='kmeans',
    num_clusters=4,
    standardize_features = TRUE) AS
WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    h.duration,
    s.bikes_count,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(bikes_count) AS bikes_count,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name )
SELECT
  * EXCEPT(station_name,
    isweekday)
FROM
  stationstats

クエリの詳細

CREATE MODEL ステートメントでは、必要なクラスタ数(4)を指定します。station_name は特徴ではないため、SELECT ステートメントで EXCEPT 句を使って station_name 列を除外します。クエリによって station_name ごとに個別に行が作成されますが、SELECT ステートメントにより特徴だけが抽出されます。

特徴ごとに動的な範囲が異なる場合は、特徴の標準化を行うことをおすすめします。ここでは、bikes_count の範囲が 10 〜 50 になりますが、num_trips は 1000 以内です。したがって、standardize_features オプションを true に設定します。standardize_features はデフォルトで true に設定されているため、設定自体は省略できます。

num_clusters オプションを省略すると、BigQuery ML がトレーニング データの総行数から適切なデフォルト値を選択します。また、ハイパーパラメータを調整して適切な数値を見つけることもできます。適切なクラスタ数を決定するには、複数の num_clusters 値で CREATE MODEL クエリを実行して、誤差測定値を確認します。そして、誤差測定値が最小になるポイントを選択します。誤差測定値は、モデルを選択して [トレーニング] タブをクリックすると取得できます。[トレーニング] タブに、Davies–Bouldin インデックスが表示されます。

トレーニング タブ

CREATE MODEL クエリを実行する

K 平均法モデルを作成するクエリを実行するには、次の手順に従います。

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    CREATE OR REPLACE MODEL
      bqml_tutorial.london_station_clusters
    OPTIONS
      (model_type='kmeans',
        num_clusters=4,
        standardize_features = TRUE) AS
    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        h.duration,
        s.bikes_count,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(bikes_count) AS bikes_count,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name )
    SELECT
      * EXCEPT(station_name)
    FROM
      stationstats
    
  3. [実行] をクリックします。

  4. BigQuery ウェブ UI の [リソース] セクションで、[PROJECT_ID] > bqml_tutorial の順に開き、london_station_clusters をクリックします。

  5. [スキーマ] タブをクリックします。モデルのスキーマには、BigQuery ML がクラスタリングを行う際に使用した 4 つのステーション属性が一覧表示されています。スキーマは次のように表示されます。

    クラスタ スキーマ情報

ステップ 4: ML.PREDICT 関数を使用してステーションのクラスタを予測する

特定のステーションが属するクラスタを特定するには、ML.PREDICT 関数を使用します。次のクエリは、名前に「Kennington」という文字列を含むすべてのステーションのクラスタを予測します。

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    h.duration,
    s.bikes_count,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(bikes_count) AS bikes_count,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name )
SELECT
  * EXCEPT(nearest_centroids_distance)
FROM
  ML.PREDICT( MODEL bqml_tutorial.london_station_clusters,
    (
    SELECT
      *
    FROM
      stationstats
    WHERE
      REGEXP_CONTAINS(station_name, 'Kennington')))

クエリの詳細

このクエリは REGEXP_CONTAINS 関数を使用して、station_name 列に文字列「Kennington」を含むすべてのエントリを検索します。ML.PREDICT 関数は、これらの値を使用して、どのクラスタにステーションが含まれるかを予測します。

ML.PREDICT クエリを実行する

ML.PREDICT クエリを実行するには、次の手順に従います。

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        h.duration,
        s.bikes_count,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(bikes_count) AS bikes_count,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name )
    SELECT
      * EXCEPT(nearest_centroids_distance)
    FROM
      ML.PREDICT( MODEL bqml_tutorial.london_station_clusters,
        (
        SELECT
          *
        FROM
          stationstats
        WHERE
          REGEXP_CONTAINS(station_name, 'Kennington')))
    
  3. [実行] をクリックします。

  4. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.PREDICT の結果

ステップ 5: モデルを視覚化する

各クラスタでは、それぞれの列に入力として使用される値があります。これらの値を取得するには、ML.CENTROIDS 関数を次の標準 SQL クエリのようにして使用します。

SELECT
  *
FROM
  ML.CENTROIDS(MODEL bqml_tutorial.london_station_clusters)
ORDER BY
  centroid_id

ML.CENTROIDS クエリを実行するには、次の手順に従います。

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    SELECT
      *
    FROM
      ML.CENTROIDS(MODEL bqml_tutorial.london_station_clusters)
    ORDER BY
      centroid_id
    
  3. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.CENTROIDS の結果

  4. 各クラスタのそれぞれの値をより簡単に比較するには、UNNEST 演算子を使用して上記のクエリ結果をピボットします。[クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    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 bqml_tutorial.london_station_clusters)
      GROUP BY
        centroid_id )
    SELECT
      CONCAT('Cluster#', CAST(centroid_id AS STRING)) AS centroid,
      (
      SELECT
        value
      FROM
        UNNEST(cluster)
      WHERE
        name = 'duration') AS duration,
      (
      SELECT
        value
      FROM
        UNNEST(cluster)
      WHERE
        name = 'num_trips') AS num_trips,
      (
      SELECT
        value
      FROM
        UNNEST(cluster)
      WHERE
        name = 'bikes_count') AS bikes_count,
      (
      SELECT
        value
      FROM
        UNNEST(cluster)
      WHERE
        name = 'distance_from_city_center') AS distance_from_city_center
    FROM
      T
    ORDER BY
      duration DESC
    
  5. [実行] をクリックします。

  6. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ピボットの結果

Google データポータルで結果を可視化する

Google データポータルで結果を可視化するには、次の手順に従います。

  1. クエリ結果の上にある [データポータルで調べる] をクリックします。

  2. [使ってみる] をクリックして利用規約に同意します。以前に Google データポータルを使用したことがある場合は、このダイアログが表示されない場合があります。

  3. グラフ選択ツールで、[棒グラフ付きの表] をクリックします。

    グラフ選択ツールの棒グラフアイコン

  4. [データ] タブで、[ディメンション] が centroid 列に設定されていることを確認します。

    Google データポータルの [ディメンション] セクション

  5. [指標] セクションで、デフォルトの指標(通常は Record Count)にカーソルを合わせ、[X] アイコンをクリックして削除します。

  6. [使用可能なフィールド] セクションから、bikes_countdistance_from_city_centerdurationnum_trips を [指標を追加] ボックスにドラッグします。グラフは次のようになります。

    完成したグラフ

Google データポータルでグラフのコンポーネントを構成する方法については、Google データポータル ヘルプセンターのコンポーネントの追加と構成をご覧ください。

ステップ 6: モデルを使用してデータ主導の意思決定を行う

結果を可視化すれば、さまざまなクラスタの状況を把握しやすくなります。この例では、Cluster#4 は比較的利用が少なく、市内中心部からの距離もそれほど遠くはない一方、利用距離の長いことがわかります。これは、Cluster#4 ステーションが郊外の混雑の少ないステーションであることを示しています。

Cluster#1 は、市内中心部からの距離が遠く、利用距離が長く利用数も少なくなっています。つまり、ここも郊外の混雑の少ないステーションだと考えられます。

Cluster#2 は、利用数が多く、市内中心部にも近くなっており、比較的混み合った都市部のステーションです。

Cluster#3 は、市内中心部にも近く、非常に多くの利用数がみられます。非常に混み合った都市部のステーションであることがわかります。

以上のような結果を元にして、判断の根拠を示すためにデータを使用することができます。次に例を示します。

  • 新しいタイプの鍵を試す必要があるとします。実験の対象には、どのクラスタのステーションを選択すればいいでしょうか。Cluster#4 のステーションは、A/B テストに利用できる自転車が多くあり、理にかなった選択のように思えます。

  • 長距離用の自転車をいくつかのステーションに置いてみたいと考えているとします。どのステーションが適しているでしょうか。Cluster#1 は、市内中心部から最も離れた場所にあるステーションのグループで、利用距離も最も長くなっています。したがって、長距離用の自転車を置くには最も適したステーションと思われます。

  • 追加の資金を使って、ステーションの利用可能な自転車の数を増やすことができます。自転車を追加するステーションは、どこにすべきでしょうか。Cluster#2 は、自転車の数が最も少なく、利用数が 2 番目に多いステーションです。利用数を追加するには適した場所だと言えるでしょう。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットの削除

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、BigQuery ウェブ UI を開きます。

    BigQuery ウェブ UI に移動

  2. ナビゲーションで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側にある [データセットの削除] をクリックします。この操作を行うと、データセットとモデルが削除されます。

  4. [データセットを削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして削除コマンドを確定します。

プロジェクトの削除

プロジェクトを削除する手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

BigQuery ML のドキュメント