Perkiraan deret waktu multi-variasi dari data kualitas udara Seattle


Dalam tutorial ini, Anda akan mempelajari cara membuat model deret waktu multi-variasi (ARIMA_PLUS_XREG) untuk melakukan perkiraan deret waktu menggunakan tabel contoh berikut dari set data epa_historical_air_quality:

Set data epa_historical_air_quality berisi informasi harian PM 2,5, suhu, dan kecepatan angin yang dikumpulkan dari beberapa kota di AS.

Tujuan

Dalam tutorial ini, Anda akan menggunakan:

  • Pernyataan CREATE MODEL: untuk membuat model deret waktu.
  • Fungsi ML.ARIMA_EVALUATE: untuk memeriksa informasi evaluasi terkait ARIMA dalam model.
  • Fungsi ML.ARIMA_COEFFICIENTS: untuk memeriksa koefisien model.
  • Fungsi ML.FORECAST: untuk memperkirakan PM 2,5 harian.
  • Fungsi ML.EVALUATE: untuk mengevaluasi model dengan data aktual.
  • Fungsi ML.EXPLAIN_FORECAST: untuk mengambil berbagai komponen deret waktu (seperti atribusi musiman, tren, dan fitur) yang dapat Anda gunakan untuk menjelaskan hasil perkiraan.

Biaya

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

  • BigQuery
  • BigQuery ML

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

Untuk informasi selengkapnya 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

    Enable the BigQuery API.

    Enable the API

Langkah pertama: Buat set data Anda

Buat set data BigQuery untuk menyimpan model ML 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 Dataset ID, masukkan bqml_tutorial.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

      Set data publik disimpan di US multi-region. Untuk mempermudah, simpan set data Anda di lokasi yang sama.

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

      Halaman Create dataset.

Langkah kedua: Buat tabel deret waktu dengan fitur tambahan

Data PM2,5, suhu, dan kecepatan angin berada di tabel terpisah. Untuk menyederhanakan kueri berikut, Anda dapat membuat tabel baru bqml_tutorial.seattle_air_quality_daily dengan menggabungkan tabel-tabel tersebut ke kolom berikut:

  • date: tanggal observasi
  • PM2.5: nilai rata-rata PM2,5 untuk setiap hari
  • wind_speed: kecepatan angin rata-rata untuk setiap hari
  • temperature: suhu tertinggi untuk setiap hari

Tabel baru memiliki data harian dari 11-08-2009 hingga 31-01-2022.

Dalam kueri GoogleSQL berikut, klausa FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary menunjukkan bahwa Anda membuat kueri tabel *_daily_summary di set data epa_historical_air_quality. Tabel ini adalah tabel yang dipartisi.

#standardSQL
CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
AS
WITH
  pm25_daily AS (
    SELECT
      avg(arithmetic_mean) AS pm25, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
    WHERE
      city_name = 'Seattle'
      AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
    GROUP BY date_local
  ),
  wind_speed_daily AS (
    SELECT
      avg(arithmetic_mean) AS wind_speed, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
    GROUP BY date_local
  ),
  temperature_daily AS (
    SELECT
      avg(first_max_value) AS temperature, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
    GROUP BY date_local
  )
SELECT
  pm25_daily.date AS date, pm25, wind_speed, temperature
FROM pm25_daily
JOIN wind_speed_daily USING (date)
JOIN temperature_daily USING (date)

Untuk menjalankan kueri, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Buat kueri baru.

  2. Masukkan kueri GoogleSQL di atas di area teks Query editor.

  3. Klik Run.

Langkah ketiga (opsional): Visualisasikan deret waktu yang ingin diperkirakan

Sebelum membuat model, sebaiknya lihat tampilan deret waktu input Anda. Anda dapat melakukannya menggunakan Looker Studio.

Dalam kueri GoogleSQL berikut, klausa FROM bqml_tutorial.seattle_air_quality_daily menunjukkan bahwa Anda membuat kueri tabel seattle_air_quality_daily di set data bqml_tutorial yang baru saja Anda buat.

#standardSQL
SELECT
  *
FROM
  `bqml_tutorial.seattle_air_quality_daily`

Untuk menjalankan kueri, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
     *
    FROM
     `bqml_tutorial.seattle_air_quality_daily`
    
  3. Klik Run.

    Setelah kueri ini dijalankan, outputnya akan mirip dengan screenshot berikut. Di screenshot, Anda bisa melihat bahwa deret waktu ini memiliki 3.960 titik data. Klik tombol Explore data, lalu Explore with Looker Studio. Looker Studio akan terbuka di tab baru. Selesaikan langkah-langkah berikut di tab baru.

    Output kueri

    Pada panel Chart, pilih Time series chart:

    Time_series_chart

    Pada panel SETUP, di bawah panel Diagram, buka bagian Metric. Tambahkan kolom pm25, temperature, dan wind_speed, lalu hapus metrik default Record Count. Anda juga dapat menetapkan rentang tanggal kustom, misalnya, 1 Januari 2019 hingga 31 Desember 2021, untuk mempersingkat deret waktu. Hal ini ditunjukkan dalam gambar berikut:

    Time_series_data_fields

    Setelah Anda menyelesaikan langkah-langkah ini, plot berikut akan muncul. Plot menunjukkan bahwa deret waktu yang dimasukkan memiliki pola musiman mingguan.

    Result_visualization

Langkah keempat: Buat model deret waktu

Selanjutnya, buat model deret waktu menggunakan data kualitas udara di atas. Kueri GoogleSQL berikut akan membuat model yang digunakan untuk memperkirakan pm25.

Klausa CREATE MODEL membuat dan melatih model bernama bqml_tutorial.seattle_pm25_xreg_model.

#standardSQL
CREATE OR REPLACE
  MODEL
    `bqml_tutorial.seattle_pm25_xreg_model`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS_XREG',
    time_series_timestamp_col = 'date',
    time_series_data_col = 'pm25')
AS
SELECT
  date,
  pm25,
  temperature,
  wind_speed
FROM
  `bqml_tutorial.seattle_air_quality_daily`
WHERE
  date
  BETWEEN DATE('2012-01-01')
  AND DATE('2020-12-31')

Klausa OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) menunjukkan bahwa Anda membuat ARIMA dengan model regresor eksternal. Secara default, auto_arima=TRUE, sehingga algoritma auto.ARIMA otomatis menyesuaikan hyper-parameter dalam model ARIMA_PLUS_XREG. Algoritma ini sesuai dengan beberapa model kandidat dan memilih model terbaik dengan kriteria informasi Akaike (AIC) terendah. Selain itu, karena default-nya adalah data_frequency='AUTO_FREQUENCY', proses pelatihan akan otomatis menyimpulkan frekuensi data dari deret waktu input.

Jalankan kueri CREATE MODEL untuk membuat dan melatih model Anda:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL di atas di area teks Query editor.

  3. Klik Run.

    Kueri membutuhkan waktu sekitar 20 detik untuk diselesaikan, setelah itu model Anda (seattle_pm25_xreg_model) akan muncul di panel navigasi. Karena kueri tersebut menggunakan pernyataan CREATE MODEL untuk membuat model, Anda tidak akan melihat hasil kueri.

Langkah kelima: Periksa metrik evaluasi dari semua model yang dievaluasi

Setelah membuat model, Anda dapat menggunakan fungsi ML.ARIMA_EVALUATE untuk melihat metrik evaluasi semua model kandidat yang dievaluasi selama proses penyesuaian hyperparameter otomatis.

Dalam kueri GoogleSQL berikut, klausa FROM menggunakan fungsi ML.ARIMA_EVALUATE terhadap model Anda, bqml_tutorial.seattle_pm25_xreg_model. Secara default, kueri ini menampilkan metrik evaluasi dari semua model kandidat.

Untuk menjalankan kueri ML.ARIMA_EVALUATE, gunakan langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. Klik Run.

  4. Setelah kueri selesai, klik tab Results di bawah area teks kueri. Hasilnya akan terlihat mirip dengan screenshot berikut:

    Output ML.ARIMA_EVALUATE.

    Hasilnya mencakup kolom berikut:

    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    Empat kolom berikut (non_seasonal_{p,d,q} dan has_drift) menentukan model ARIMA dalam pipeline pelatihan. Tiga metrik setelah itu (log_likelihood, AIC, dan variance) relevan dengan proses penyesuaian model ARIMA.

    Algoritma auto.ARIMA terlebih dahulu menggunakan pengujian KPSS untuk menentukan bahwa nilai terbaik untuk non_seasonal_d adalah 1. Jika non_seasonal_d adalah 1, auto.ARIMA kemudian akan melatih 42 model ARIMA kandidat berbeda secara paralel. Perlu diingat bahwa jika non_seasonal_d bukan 1, auto.ARIMA akan melatih 21 model kandidat yang berbeda. Dalam contoh ini, ke-42 model kandidat sudah valid. Oleh karena itu, outputnya berisi 42 baris, dengan setiap baris dikaitkan dengan model ARIMA kandidat. Perlu diingat bahwa untuk beberapa deret waktu, beberapa model kandidat tidak valid karena model tersebut tidak dapat dibalik atau tidak diam. Model yang tidak valid ini dikecualikan dari output, yang akan membuat output memiliki kurang dari 42 baris. Model kandidat ini diurutkan oleh AIC dalam urutan menaik. Model di baris pertama memiliki AIC terendah, dan dianggap sebagai model terbaik. Model terbaik ini disimpan sebagai model akhir dan digunakan saat Anda memanggil ML.FORECAST, ML.EVALUATE, dan ML.ARIMA_COEFFICIENTS seperti yang ditunjukkan pada langkah-langkah berikut.

    Kolom seasonal_periods adalah tentang pola musiman dalam deret waktu input. Hal ini tidak ada hubungannya dengan pemodelan ARIMA karena memiliki nilai yang sama di semua baris output. Laporan ini melaporkan pola mingguan, yang sesuai ekspektasi seperti dijelaskan pada langkah kedua di atas.

    Kolom has_holiday_effect, has_spikes_and_dips, dan has_step_changes hanya diisi saat decompose_time_series=TRUE. Metrik ini tentang efek liburan, lonjakan dan penurunan, serta perubahan langkah di dalam deret waktu input, yang tidak terkait dengan pemodelan ARIMA. Oleh karena itu, keduanya sama di semua baris output, kecuali untuk model yang gagal tersebut.

    Kolom error_message menunjukkan bahwa kemungkinan error yang terjadi selama proses penyesuaian auto.ARIMA. Kemungkinan alasannya adalah kolom non_seasonal_p, non_seasonal_d, non_seasonal_q, dan has_drift yang dipilih tidak dapat menstabilkan deret waktu. Untuk mengambil kemungkinan pesan error dari semua model kandidat, tetapkan show_all_candidate_models=true.

Langkah keenam: Periksa koefisien model Anda

Fungsi ML.ARIMA_COEFFICIENTS mengambil koefisien model dari model ARIMA_PLUS Anda, bqml_tutorial.seattle_pm25_xreg_model. ML.ARIMA_COEFFICIENTS menggunakan model sebagai satu-satunya input.

Jalankan kueri ML.ARIMA_COEFFICIENTS:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. Klik Run.

    Hasilnya akan terlihat seperti berikut ini:

    Output ML.ARIMA_COEFFICIENTS.

    Hasilnya mencakup kolom berikut:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift
    • processed_input
    • weight
    • category_weights.category
    • category_weights.weight

    ar_coefficients menunjukkan koefisien model bagian autoregresif (AR) dari model ARIMA. Demikian pula, ma_coefficients menunjukkan koefisien model bagian rata-rata bergerak (MA). Keduanya adalah array yang panjangnya sama dengan non_seasonal_p dan non_seasonal_q secara berurutan. Dari output ML.ARIMA_EVALUATE, model terbaik seperti di baris atas memiliki non_seasonal_p sebesar 0 dan non_seasonal_q sebesar 5. Oleh karena itu, ar_coefficients adalah array kosong dan ma_coefficients adalah array length-5. intercept_or_drift adalah istilah konstan dalam model ARIMA.

    processed_input serta kolom weight dan category_weights yang sesuai menunjukkan bobot untuk setiap fitur dan intersepsi dalam model regresi linear. Jika ini adalah fitur numerik, bobotnya ada di kolom weight. Jika ini adalah fitur kategoris, category_weights adalah ARRAY dari STRUCT dengan STRUCT berisi nama dan bobot kategori.

Langkah ketujuh: Gunakan model Anda untuk memperkirakan deret waktu

Fungsi ML.FORECAST memperkirakan nilai deret waktu di masa mendatang dengan interval prediksi menggunakan model bqml_tutorial.seattle_pm25_xreg_model dan nilai fitur mendatang.

Dalam kueri GoogleSQL berikut, klausa STRUCT(30 AS horizon, 0.8 AS confidence_level) menunjukkan bahwa kueri memperkirakan 30 titik waktu di masa mendatang, dan menghasilkan interval prediksi dengan tingkat keyakinan 80%. ML.FORECAST mengambil model, nilai fitur mendatang, serta beberapa argumen opsional.

Untuk menjalankan kueri ML.FORECAST, gunakan langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
    *
    FROM
    ML.FORECAST(
    MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
    STRUCT(30 AS horizon, 0.8 AS confidence_level),
    (
      SELECT
        date,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ))
    
  3. Klik Run.

    Hasilnya akan terlihat seperti berikut ini:

    Output ML.FORECAST.

    Hasilnya mencakup kolom berikut:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound

    Baris output diurutkan dalam urutan kronologis forecast_timestamp. Dalam perkiraan deret waktu, prediksi interval, yang ditangkap dari batas bawah dan atas, sama pentingnya dengan forecast_value. forecast_value adalah titik tengah interval prediksi. Interval prediksi bergantung pada standard_error dan confidence_level.

Langkah kedelapan: Evaluasi akurasi perkiraan dengan data aktual

Untuk mengevaluasi akurasi perkiraan dengan data aktual, Anda dapat menggunakan fungsi ML.EVALUATE dengan model, bqml_tutorial.seattle_pm25_xreg_model, dan tabel data aktual.

Untuk menjalankan kueri ML.EVALUATE, gunakan langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
    *
    FROM
    ML.EVALUATE(
    MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
    (
      SELECT
        date,
        pm25,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ),
    STRUCT(
      TRUE AS perform_aggregation,
      30 AS horizon))
    

    Parameter kedua adalah data aktual dengan fitur mendatang, yang digunakan untuk memperkirakan nilai mendatang agar dibandingkan dengan data aktual. Parameter ketiga adalah struct parameter untuk fungsi ini.

  3. Klik Run.

    Hasilnya akan terlihat seperti berikut ini:

    Output ML.EVALUATE.

Langkah kesembilan: Jelaskan hasil perkiraan

Untuk memahami cara deret waktu diperkirakan, fungsi ML.EXPLAIN_FORECAST memperkirakan nilai deret waktu masa mendatang dengan interval prediksi menggunakan model Anda, bqml_tutorial.seattle_pm25_xreg_model. Pada saat yang sama, waktu mengembalikan semua komponen terpisah dari deret waktu.

Seperti fungsi ML.FORECAST, klausa STRUCT(30 AS horizon, 0.8 AS confidence_level) menunjukkan bahwa kueri memperkirakan 30 titik waktu di masa mendatang dan menghasilkan interval prediksi dengan keyakinan 80%. Fungsi ML.EXPLAIN_FORECAST menggunakan model, nilai fitur mendatang, dan beberapa argumen opsional sebagai input.

Untuk menjalankan kueri ML.EXPLAIN_FORECAST, gunakan langkah-langkah berikut:

  1. Di konsol Google Cloud, klik tombol Compose new query.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ))
    
  3. Klik Run.

    Kueri ini selesai dalam waktu kurang dari satu detik. Hasilnya akan terlihat seperti berikut:

    ML.EXPLAIN_FORECAST output1. ML.EXPLAIN_FORECAST output2.

    Hasilnya mencakup kolom berikut:

    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual
    • attribution_temperature
    • attribution_wind_speed
    • attribution___INTERCEPT__

    Baris output diurutkan dalam urutan kronologis time_series_timestamp. Berbagai komponen dicantumkan sebagai kolom output. Untuk informasi selengkapnya, lihat ML.EXPLAIN_FORECAST.

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 Delete dataset di sisi kanan jendela. Tindakan ini akan menghapus set data, tabel, dan semua data.

  4. Di kotak dialog Delete dataset, konfirmasi perintah hapus dengan mengetikkan nama set data Anda (bqml_tutorial), lalu klik Delete.

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 selanjutnya