Membuat model k-means untuk mengelompokkan set data penyewaan sepeda di London


Tutorial ini mengajarkan cara menggunakan model k-means di BigQuery ML untuk mengidentifikasi cluster dalam kumpulan data.

Algoritma k-means yang mengelompokkan data Anda ke dalam cluster adalah bentuk unsupervised machine learning. Tidak seperti supervised machine learning, yang berfokus pada analisis prediktif, unsupervised machine learning berfokus pada analisis deskriptif. Machine learning tanpa pengawasan dapat membantu Anda memahami data sehingga Anda dapat membuat keputusan berbasis data.

Kueri dalam tutorial ini menggunakan fungsi geografi yang tersedia dalam analisis geospasial. Untuk informasi selengkapnya, lihat Pengantar analisis geospasial.

Tutorial ini menggunakan set data publik London Bicycle Hires. Data ini mencakup stempel waktu mulai dan berhenti, nama stasiun, dan durasi perjalanan.

Tujuan

Tutorial ini memandu Anda menyelesaikan tugas-tugas berikut:

  • Periksa data yang digunakan untuk melatih model.
  • Membuat model pengelompokan k-means.
  • Menafsirkan cluster data yang dihasilkan, menggunakan visualisasi cluster BigQuery ML.
  • Jalankan fungsi ML.PREDICT pada model k-means untuk memprediksi kemungkinan cluster untuk serangkaian stasiun sewa sepeda.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih, termasuk:

  • BigQuery
  • BigQuery ML

Untuk mengetahui informasi tentang biaya BigQuery, lihat halaman harga BigQuery.

Untuk mengetahui informasi tentang biaya BigQuery ML, lihat Harga BigQuery ML.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. BigQuery secara otomatis diaktifkan dalam project baru. Untuk mengaktifkan BigQuery dalam project yang sudah ada, buka

    Aktifkan API BigQuery.

    Mengaktifkan API

Izin yang Diperlukan

  • Untuk membuat set data, Anda memerlukan izin IAM bigquery.datasets.create.
  • Untuk membuat resource koneksi, Anda memerlukan izin berikut:

    • bigquery.connections.create
    • bigquery.connections.get
  • Untuk membuat model, Anda memerlukan izin berikut:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • Untuk menjalankan inferensi, Anda memerlukan izin berikut:

    • bigquery.models.getData
    • bigquery.jobs.create

Untuk mengetahui informasi lebih lanjut tentang peran dan izin IAM di BigQuery, baca Pengantar IAM.

Membuat set data

Buat set data BigQuery untuk menyimpan model k-means Anda:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Buat set data.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk ID Set Data, masukkan bqml_tutorial.

    • Untuk Jenis lokasi, pilih Multi-region, lalu pilih UE (beberapa region di Uni Eropa).

      Set data publik London Bicycle Hires disimpan di multi-region EU. Set data Anda harus berada di lokasi yang sama.

    • Jangan ubah setelan default yang tersisa, lalu klik Buat set data.

      Halaman Create dataset.

Memeriksa data pelatihan

Periksa data yang akan Anda gunakan untuk melatih model k-means. Dalam tutorial ini, Anda akan mengelompokkan stasiun sepeda berdasarkan atribut berikut:

  • Durasi penyewaan
  • Jumlah perjalanan per hari
  • Jarak dari pusat kota

SQL

Kueri ini mengekstrak data tentang penyewaan sepeda, termasuk kolom start_station_name dan duration, lalu menggabungkan data ini dengan informasi stasiun. Hal ini termasuk membuat kolom yang dihitung yang berisi jarak stasiun dari pusat kota. Kemudian, kueri ini menghitung atribut stasiun di kolom stationstats, termasuk durasi rata-rata perjalanan dan jumlah perjalanan, serta kolom distance_from_city_center yang dihitung.

Ikuti langkah-langkah berikut untuk memeriksa data pelatihan:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    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;

Hasilnya akan terlihat seperti berikut:

Hasil kueri

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import datetime

import pandas as pd

import bigframes
import bigframes.pandas as bpd

bigframes.options.bigquery.project = your_gcp_project_id
# Compute in the EU multi-region to query the London bicycles dataset.
bigframes.options.bigquery.location = "EU"

# Extract the information you'll need to train the k-means model in this
# tutorial. Use the read_gbq function to represent cycle hires
# data as a DataFrame.
h = bpd.read_gbq(
    "bigquery-public-data.london_bicycles.cycle_hire",
    col_order=["start_station_name", "start_station_id", "start_date", "duration"],
).rename(
    columns={
        "start_station_name": "station_name",
        "start_station_id": "station_id",
    }
)

s = bpd.read_gbq(
    # Use ST_GEOPOINT and ST_DISTANCE to analyze geographical
    # data. These functions determine spatial relationships between
    # geographical features.
    """
    SELECT
    id,
    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_stations` s
    """
)

# Define Python datetime objects in the UTC timezone for range comparison,
# because BigQuery stores timestamp data in the UTC timezone.
sample_time = datetime.datetime(2015, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)
sample_time2 = datetime.datetime(2016, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)

h = h.loc[(h["start_date"] >= sample_time) & (h["start_date"] <= sample_time2)]

# Replace each day-of-the-week number with the corresponding "weekday" or
# "weekend" label by using the Series.map method.
h = h.assign(
    isweekday=h.start_date.dt.dayofweek.map(
        {
            0: "weekday",
            1: "weekday",
            2: "weekday",
            3: "weekday",
            4: "weekday",
            5: "weekend",
            6: "weekend",
        }
    )
)

# Supplement each trip in "h" with the station distance information from
# "s" by merging the two DataFrames by station ID.
merged_df = h.merge(
    right=s,
    how="inner",
    left_on="station_id",
    right_on="id",
)

# Engineer features to cluster the stations. For each station, find the
# average trip duration, number of trips, and distance from city center.
stationstats = merged_df.groupby(["station_name", "isweekday"]).agg(
    {"duration": ["mean", "count"], "distance_from_city_center": "max"}
)
stationstats.columns = pd.Index(
    ["duration", "num_trips", "distance_from_city_center"]
)
stationstats = stationstats.sort_values(
    by="distance_from_city_center", ascending=True
).reset_index()

# Expected output results: >>> stationstats.head(3)
# station_name	isweekday duration  num_trips	distance_from_city_center
# Borough Road...	weekday	    1110	    5749	    0.12624
# Borough Road...	weekend	    2125	    1774	    0.12624
# Webber Street...	weekday	    795	        6517	    0.164021
#   3 rows × 5 columns

Membuat model k-means

Buat model k-means menggunakan data pelatihan London Bicycle Hires.

SQL

Dalam kueri berikut, pernyataan CREATE MODEL menentukan jumlah cluster yang akan digunakan — empat. Dalam pernyataan SELECT, klausa EXCEPT mengecualikan kolom station_name karena kolom ini tidak berisi fitur. Kueri ini membuat baris unik per station_name, dan hanya fitur yang disebutkan dalam pernyataan SELECT.

Ikuti langkah-langkah berikut untuk membuat model k-means:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    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;

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


from bigframes.ml.cluster import KMeans

# To determine an optimal number of clusters, construct and fit several
# K-Means objects with different values of num_clusters, find the error
# measure, and pick the point at which the error measure is at its minimum
# value.
cluster_model = KMeans(n_clusters=4)
cluster_model.fit(stationstats)
cluster_model.to_gbq(
    your_model_id,  # For example: "bqml_tutorial.london_station_clusters"
    replace=True,
)

Menafsirkan cluster data

Informasi di tab Evaluasi model dapat membantu Anda menafsirkan cluster yang dihasilkan oleh model.

Ikuti langkah-langkah berikut untuk melihat informasi evaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda, luaskan set data bqml_tutorial, lalu luaskan folder Models.

  3. Pilih model london_station_clusters.

  4. Pilih tab Evaluasi. Tab ini menampilkan visualisasi cluster yang diidentifikasi oleh model k-means. Di bagian Fitur numerik, grafik batang menampilkan nilai fitur numerik terpenting untuk setiap sentroid. Setiap centroid mewakili cluster data tertentu. Anda dapat memilih fitur yang akan divisualisasikan dari menu drop-down.

    Grafik fitur numerik

    Model ini membuat centroid berikut:

    • Sentroid 1 menampilkan stasiun kota yang tidak terlalu ramai, dengan penyewaan berdurasi lebih singkat.
    • Sentroid 2 menunjukkan stasiun kota kedua yang tidak terlalu ramai dan digunakan untuk penyewaan berdurasi lebih lama.
    • Sentroid 3 menunjukkan stasiun kota yang ramai dan dekat dengan pusat kota.
    • Sentroid 4 menampilkan stasiun pinggiran kota dengan perjalanan yang lebih lama.

    Jika menjalankan bisnis penyewaan sepeda, Anda dapat menggunakan informasi ini untuk menentukan keputusan bisnis. Contoh:

    • Anggaplah Anda perlu bereksperimen dengan jenis kunci baru. Cluster stasiun mana yang akan Anda pilih sebagai subjek untuk eksperimen ini? Stasiun di sentroid 1, sentroid 2, atau sentroid 4 tampak seperti pilihan logis karena bukan stasiun tersibuk.

    • Anggaplah Anda ingin mengisi beberapa stasiun dengan sepeda balap. Stasiun mana yang harus Anda pilih? Sentroid 4 adalah kelompok stasiun yang jauh dari pusat kota, dan memiliki perjalanan terpanjang. Kelompok ini adalah kandidat untuk sepeda balap.

Menggunakan fungsi ML.PREDICT untuk memprediksi cluster stasiun

Identifikasi cluster tempat stasiun tertentu berada menggunakan fungsi SQL ML.PREDICT atau fungsi DataFrame BigQuery predict.

SQL

Kueri berikut menggunakan fungsi REGEXP_CONTAINS untuk menemukan semua entri dalam kolom station_name yang berisi string Kennington. Fungsi ML.PREDICT menggunakan nilai tersebut untuk memprediksi cluster mana yang mungkin berisi stasiun tersebut.

Ikuti langkah-langkah berikut untuk memprediksi cluster setiap stasiun yang memiliki string Kennington dalam namanya:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    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')
      ));

Hasilnya akan terlihat seperti berikut.

Hasil ML.PREDICT

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


# Select model you'll use for predictions. `read_gbq_model` loads model
# data from BigQuery, but you could also use the `cluster_model` object
# from previous steps.
cluster_model = bpd.read_gbq_model(
    your_model_id,
    # For example: "bqml_tutorial.london_station_clusters",
)

# Use 'contains' function to filter by stations containing the string
# "Kennington".
stationstats = stationstats.loc[
    stationstats["station_name"].str.contains("Kennington")
]

result = cluster_model.predict(stationstats)

# Expected output results:   >>>results.peek(3)
# CENTROID...	NEAREST...	station_name  isweekday	 duration num_trips dist...
# 	1	[{'CENTROID_ID'...	Borough...	  weekday	  1110	    5749	0.13
# 	2	[{'CENTROID_ID'...	Borough...	  weekend	  2125      1774	0.13
# 	1	[{'CENTROID_ID'...	Webber...	  weekday	  795	    6517	0.16
#   3 rows × 7 columns

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus resource satu per satu.

  • Anda dapat menghapus project yang dibuat.
  • Atau, Anda dapat menyimpan project dan menghapus set data.

Menghapus set data

Jika project Anda dihapus, semua set data dan semua tabel dalam project akan dihapus. Jika ingin menggunakan kembali project tersebut, Anda dapat menghapus set data yang dibuat dalam tutorial ini:

  1. Jika perlu, buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di navigasi, klik set data bqml_tutorial yang telah Anda buat.

  3. Klik Hapus set data di sisi kanan jendela. Tindakan ini akan menghapus set data dan model.

  4. Pada dialog Hapus set data, konfirmasi perintah hapus dengan mengetikkan nama set data Anda (bqml_tutorial), lalu klik Hapus.

Menghapus project Anda

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya