ロンドンのレンタル自転車のデータセットをクラスタ化するための K 平均法モデルの作成

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

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

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

目標

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

  • K 平均法クラスタリング モデルの作成
  • BigQuery ML のクラスタの可視化に基づいたデータドリブンの意思決定

料金

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

  • BigQuery
  • BigQuery ML

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

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

始める前に

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

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

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

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

    API を有効にする

    にアクセスします。

はじめに

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

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

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

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

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

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

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

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

  1. Cloud Console で、[BigQuery] ページに移動します。

    [BigQuery] ページに移動

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

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

    データセットを作成する

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

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

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

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

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

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

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

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

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    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(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 を含む自転車レンタルのデータを抽出し、distance-from-city-center を含むステーション情報に結合します。そして、平均乗車時間と利用数を含んだ stationstats でステーションの属性を計算します。この計算には、ステーション属性 distance_from_city_center も含まれます。

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

クエリを実行する

モデル用のトレーニング データをまとめるクエリを実行するには:

  1. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

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

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        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(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_tripsdistance_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) AS
WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
  IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    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,
    isweekday,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name, isweekday)
SELECT
  * EXCEPT(station_name, isweekday)
FROM
  stationstats

クエリの詳細

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

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

トレーニング タブ

CREATE MODEL クエリを実行する

K 平均法モデルを作成するクエリを実行するには:

  1. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

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

    CREATE OR REPLACE MODEL
      bqml_tutorial.london_station_clusters OPTIONS(model_type='kmeans',
        num_clusters=4) AS
    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
      IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        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,
        isweekday,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name, isweekday)
    SELECT
      * EXCEPT(station_name, isweekday)
    FROM
      stationstats
    
  3. [実行] をクリックします。

  4. ナビゲーション パネルの [リソース] セクションでプロジェクト名を展開し、[bqml_tutorial] をクリックしてから [london_station_clusters] をクリックします。

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

    クラスタ スキーマ情報

  6. [評価] タブをクリックします。このタブには、K 平均法モデルによって識別されたクラスタが可視化されます。[数値の特徴] では、棒グラフで、セントロイドごとに最大 10 個の重要な特徴値が表示されます。可視化する特徴をプルダウン メニューから選択できます。

    数値特徴のグラフ

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

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

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    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(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. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

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

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        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(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: モデルを使用してデータドリブンの意思決定を行う

評価結果により、さまざまなクラスタの状況を把握しやすくなります。

数値特徴のグラフ

この例では、Cluster#3 は、市中心部付近の混雑している市内のステーションを表示します。Cluster#2 は、より混雑度の低い 2 つ目の市内のステーションを表示します。Cluster#1 は、より混雑度が低く、よりレンタル時間が長い、郊外のサブステーションを表示します。Cluster#4 は、よりレンタル時間が短い、もう 1 つの郊外のサブステーションを表示します。以上のような結果を元にして、判断の根拠を示すためにデータを使用できます。例:

  • 新しいタイプの鍵を試す必要があるとします。実験の対象には、どのクラスタのステーションを選択すればいいでしょうか。Cluster#1Cluster#2Cluster#4 は、最も混雑したステーションではないので、妥当な選択肢のようです。

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

クリーンアップ

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

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

データセットの削除

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

  1. 必要に応じて、Cloud Console で [BigQuery] ページを開きます。

    [BigQuery] ページに移動

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

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

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

プロジェクトの削除

プロジェクトを削除するには:

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

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

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

次のステップ