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


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

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

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

目標

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

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

料金

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

  • BigQuery
  • BigQuery ML

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

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

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. 新しいプロジェクトでは、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: データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. [アクションを表示] > [データセットを作成] をクリックします。

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

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

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で、[マルチリージョン] を選択し、[EU(欧州連合の複数のリージョン)] を選択します。

      ロンドンのレンタル自転車の一般公開データセットは、EUマルチリージョンロケーションに格納されています。データセットも同じロケーションに存在する必要があります。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

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

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

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

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

クエリの詳細

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

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

クエリを実行する

次のクエリはトレーニング データをコンパイルします。このチュートリアル後半の CREATE MODEL ステートメントでもこれが使用されます。

クエリを実行するには:

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  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,
        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
      *
    FROM
      stationstats
    ORDER BY
      distance_from_city_center ASC
    
    
  3. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。[結果] タブの列には、モデルのトレーニングに使用したクエリ station_namedurationnum_tripsdistance_from_city_center が表示されます。結果は次のようになります。

    クエリ結果

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

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

CREATE MODEL ステートメントを model_type=kmeans オプション付きで使用することで、K 平均法モデルの作成とトレーニングが行えます。

クエリの詳細

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

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

トレーニング タブ

クエリを実行する

次のクエリでは、トレーニング データの確認で使用したクエリに CREATE MODEL ステートメントを追加し、さらにデータ内の id フィールドを削除します。

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

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

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

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

    クラスタ スキーマ情報

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

    数値特徴のグラフ

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

特定のステーションが属するクラスタを特定するには、ML.PREDICT 関数を使用します。

クエリの詳細

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

クエリを実行する

次のクエリは、名前に「Kennington」という文字列を含むすべてのステーションのクラスタを予測します。

ML.PREDICT クエリを実行するには:

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  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,
        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(nearest_centroids_distance)
    FROM
      ML.PREDICT( MODEL `bqml_tutorial.london_station_clusters`,
        (
        SELECT
          *
        FROM
          stationstats
        WHERE
          REGEXP_CONTAINS(station_name, 'Kennington')))
    
    
  3. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.PREDICT の結果

ステップ 5: モデルを使用してデータドリブンの意思決定を行う

評価結果により、さまざまなクラスタの状況を把握しやすくなります。次の例のセントロイド 3 は、市内中心部に近い混雑している都市ステーションを示しています。セントロイド 2 は、あまり混雑しておらずレンタル使用期間が長い、2 番目の都市ステーションを示しています。セントロイド 1 は、あまり混雑しておらず、レンタル期間が短い都市ステーションを示しています。セントロイド 4 は、移動がより長い郊外のステーションを示しています。

数値特徴のグラフ

以上のような結果に基づき、データを参考にして判断を行うことができます。次に例を示します。

  • 新しいタイプの鍵を試す必要があるとします。この実験の対象として、どのステーション クラスタを選択すればよいでしょうか。セントロイド 1、セントロイド 2、またはセントロイド 4 のステーションは最も混雑しているステーションではないので、論理的に言ってこれらを選択するのがよいでしょう。

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

クリーンアップ

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

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

データセットを削除する

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

  1. 必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

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

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

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

プロジェクトの削除

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

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

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

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

次のステップ