チュートリアル『Google アナリティクス データからの 1 つの時系列を予測する』をやってみた

2022.11.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さん、こんにちは。 クルトンです。

今回はGoogle CloudのチュートリアルでBigQuery MLをしてみました。

STEP1~8に分かれており、STEP2とSTEP8はデータの可視化をするものでスキップ可能です。今回は、こちらも含めて全部のSTEPを実行してみます。

データセットの作成

チュートリアルの[BigQuery] ページに移動となっている青いボタンをクリックします。 自身のプロジェクト名のの部分をクリックして「データセットを作成」をクリックします。

create dataset picture

その後、チュートリアルにあるように[データセット ID] にbqml_tutorialを、[データのロケーション]にus (米国の複数のリージョン)を選択します。後で実行する機械学習モデルを学習させた際にはbqml_tutorialに作られるため、チュートリアル後に必要なくなったものを消す際に便利です。

データの中身を確認

機械学習を行なう上で重要な事柄の1つが、データについて知る事です。

今回使用するデータセットの説明についてはこちらをご確認ください。

SQLを打つ場合は、エディタと書いているタブへSQL文を書き、実行というボタンを押します。 本記事上で実行しているSQLは全て同様に実行します。他のタブを開きたい場合は、画像のエディタと書いている右隣の+ボタンを押すと新しいタブが開きます。 do sql editor

#standardSQL
SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

このSQL文では、parsed_dateという内容に日時を、GROUP BY dataSUMによってtotal_visitsにその日サイトにアクセスした人の総数が表されており、日付ごとの総訪問者数が表示されます。

PARSE_TIMESTAMP("%Y%m%d", date)の部分をdateと書き換えると分かるのですが、年月日のデータが20170322という形で入っているため見やすくする意図でしているようです。

ここで使われているPARSE_TIMESTAMPの使い方について詳しくはこちらをご覧ください。

Looker Studioを使って今回実行した結果をグラフ化していますので、そちらを見る事もオススメします。 data check with looker

ここでどういったカラムがあるのか気になりましたので追加で確認してみました。

SELECT DISTINCT column_name, data_type FROM `bigquery-public-data`.google_analytics_sample.INFORMATION_SCHEMA.COLUMNS;

結果は次の通りでした。(もし実行された場合は、実行結果を是非ご覧ください。次の内容は結果のJSONをコピーして貼り付けたものになります。)

[{
  "column_name": "visitorId",
  "data_type": "INT64"
}, {
  "column_name": "visitNumber",
  "data_type": "INT64"
}, {
  "column_name": "visitId",
  "data_type": "INT64"
}, {
  "column_name": "visitStartTime",
  "data_type": "INT64"
}, {
  "column_name": "date",
  "data_type": "STRING"
}, {
  "column_name": "totals",
  "data_type": "STRUCT\u003cvisits INT64, hits INT64, pageviews INT64, timeOnSite INT64, bounces INT64, transactions INT64, transactionRevenue INT64, newVisits INT64, screenviews INT64, uniqueScreenviews INT64, timeOnScreen INT64, totalTransactionRevenue INT64, sessionQualityDim INT64\u003e"
}, {
  "column_name": "trafficSource",
  "data_type": "STRUCT\u003creferralPath STRING, campaign STRING, source STRING, medium STRING, keyword STRING, adContent STRING, adwordsClickInfo STRUCT\u003ccampaignId INT64, adGroupId INT64, creativeId INT64, criteriaId INT64, page INT64, slot STRING, criteriaParameters STRING, gclId STRING, customerId INT64, adNetworkType STRING, targetingCriteria STRUCT\u003cboomUserlistId INT64\u003e, isVideoAd BOOL\u003e, isTrueDirect BOOL, campaignCode STRING\u003e"
}, {
  "column_name": "device",
  "data_type": "STRUCT\u003cbrowser STRING, browserVersion STRING, browserSize STRING, operatingSystem STRING, operatingSystemVersion STRING, isMobile BOOL, mobileDeviceBranding STRING, mobileDeviceModel STRING, mobileInputSelector STRING, mobileDeviceInfo STRING, mobileDeviceMarketingName STRING, flashVersion STRING, javaEnabled BOOL, language STRING, screenColors STRING, screenResolution STRING, deviceCategory STRING\u003e"
}, {
  "column_name": "geoNetwork",
  "data_type": "STRUCT\u003ccontinent STRING, subContinent STRING, country STRING, region STRING, metro STRING, city STRING, cityId STRING, networkDomain STRING, latitude STRING, longitude STRING, networkLocation STRING\u003e"
}, {
  "column_name": "customDimensions",
  "data_type": "ARRAY\u003cSTRUCT\u003cindex INT64, value STRING\u003e\u003e"
}, {
  "column_name": "hits",
  "data_type": "ARRAY\u003cSTRUCT\u003chitNumber INT64, time INT64, hour INT64, minute INT64, isSecure BOOL, isInteraction BOOL, isEntrance BOOL, isExit BOOL, referer STRING, page STRUCT\u003cpagePath STRING, hostname STRING, pageTitle STRING, searchKeyword STRING, searchCategory STRING, pagePathLevel1 STRING, pagePathLevel2 STRING, pagePathLevel3 STRING, pagePathLevel4 STRING\u003e, transaction STRUCT\u003ctransactionId STRING, transactionRevenue INT64, transactionTax INT64, transactionShipping INT64, affiliation STRING, currencyCode STRING, localTransactionRevenue INT64, localTransactionTax INT64, localTransactionShipping INT64, transactionCoupon STRING\u003e, item STRUCT\u003ctransactionId STRING, productName STRING, productCategory STRING, productSku STRING, itemQuantity INT64, itemRevenue INT64, currencyCode STRING, localItemRevenue INT64\u003e, contentInfo STRUCT\u003ccontentDescription STRING\u003e, appInfo STRUCT\u003cname STRING, version STRING, id STRING, installerId STRING, appInstallerId STRING, appName STRING, appVersion STRING, appId STRING, screenName STRING, landingScreenName STRING, exitScreenName STRING, screenDepth STRING\u003e, exceptionInfo STRUCT\u003cdescription STRING, isFatal BOOL, exceptions INT64, fatalExceptions INT64\u003e, eventInfo STRUCT\u003ceventCategory STRING, eventAction STRING, eventLabel STRING, eventValue INT64\u003e, product ARRAY\u003cSTRUCT\u003cproductSKU STRING, v2ProductName STRING, v2ProductCategory STRING, productVariant STRING, productBrand STRING, productRevenue INT64, localProductRevenue INT64, productPrice INT64, localProductPrice INT64, productQuantity INT64, productRefundAmount INT64, localProductRefundAmount INT64, isImpression BOOL, isClick BOOL, customDimensions ARRAY\u003cSTRUCT\u003cindex INT64, value STRING\u003e\u003e, customMetrics ARRAY\u003cSTRUCT\u003cindex INT64, value INT64\u003e\u003e, productListName STRING, productListPosition INT64\u003e\u003e, promotion ARRAY\u003cSTRUCT\u003cpromoId STRING, promoName STRING, promoCreative STRING, promoPosition STRING\u003e\u003e, promotionActionInfo STRUCT\u003cpromoIsView BOOL, promoIsClick BOOL\u003e, refund STRUCT\u003crefundAmount INT64, localRefundAmount INT64\u003e, eCommerceAction STRUCT\u003caction_type STRING, step INT64, option STRING\u003e, experiment ARRAY\u003cSTRUCT\u003cexperimentId STRING, experimentVariant STRING\u003e\u003e, publisher STRUCT\u003cdfpClicks INT64, dfpImpressions INT64, dfpMatchedQueries INT64, dfpMeasurableImpressions INT64, dfpQueries INT64, dfpRevenueCpm INT64, dfpRevenueCpc INT64, dfpViewableImpressions INT64, dfpPagesViewed INT64, adsenseBackfillDfpClicks INT64, adsenseBackfillDfpImpressions INT64, adsenseBackfillDfpMatchedQueries INT64, adsenseBackfillDfpMeasurableImpressions INT64, adsenseBackfillDfpQueries INT64, adsenseBackfillDfpRevenueCpm INT64, adsenseBackfillDfpRevenueCpc INT64, adsenseBackfillDfpViewableImpressions INT64, adsenseBackfillDfpPagesViewed INT64, adxBackfillDfpClicks INT64, adxBackfillDfpImpressions INT64, adxBackfillDfpMatchedQueries INT64, adxBackfillDfpMeasurableImpressions INT64, adxBackfillDfpQueries INT64, adxBackfillDfpRevenueCpm INT64, adxBackfillDfpRevenueCpc INT64, adxBackfillDfpViewableImpressions INT64, adxBackfillDfpPagesViewed INT64, adxClicks INT64, adxImpressions INT64, adxMatchedQueries INT64, adxMeasurableImpressions INT64, adxQueries INT64, adxRevenue INT64, adxViewableImpressions INT64, adxPagesViewed INT64, adsViewed INT64, adsUnitsViewed INT64, adsUnitsMatched INT64, viewableAdsViewed INT64, measurableAdsViewed INT64, adsPagesViewed INT64, adsClicked INT64, adsRevenue INT64, dfpAdGroup STRING, dfpAdUnits STRING, dfpNetworkId STRING\u003e, customVariables ARRAY\u003cSTRUCT\u003cindex INT64, customVarName STRING, customVarValue STRING\u003e\u003e, customDimensions ARRAY\u003cSTRUCT\u003cindex INT64, value STRING\u003e\u003e, customMetrics ARRAY\u003cSTRUCT\u003cindex INT64, value INT64\u003e\u003e, type STRING, social STRUCT\u003csocialInteractionNetwork STRING, socialInteractionAction STRING, socialInteractions INT64, socialInteractionTarget STRING, socialNetwork STRING, uniqueSocialInteractions INT64, hasSocialSourceReferral STRING, socialInteractionNetworkAction STRING\u003e, latencyTracking STRUCT\u003cpageLoadSample INT64, pageLoadTime INT64, pageDownloadTime INT64, redirectionTime INT64, speedMetricsSample INT64, domainLookupTime INT64, serverConnectionTime INT64, serverResponseTime INT64, domLatencyMetricsSample INT64, domInteractiveTime INT64, domContentLoadedTime INT64, userTimingValue INT64, userTimingSample INT64, userTimingVariable STRING, userTimingCategory STRING, userTimingLabel STRING\u003e, sourcePropertyInfo STRUCT\u003csourcePropertyDisplayName STRING, sourcePropertyTrackingId STRING\u003e, contentGroup STRUCT\u003ccontentGroup1 STRING, contentGroup2 STRING, contentGroup3 STRING, contentGroup4 STRING, contentGroup5 STRING, previousContentGroup1 STRING, previousContentGroup2 STRING, previousContentGroup3 STRING, previousContentGroup4 STRING, previousContentGroup5 STRING, contentGroupUniqueViews1 INT64, contentGroupUniqueViews2 INT64, contentGroupUniqueViews3 INT64, contentGroupUniqueViews4 INT64, contentGroupUniqueViews5 INT64\u003e, dataSource STRING, publisher_infos ARRAY\u003cSTRUCT\u003cdfpClicks INT64, dfpImpressions INT64, dfpMatchedQueries INT64, dfpMeasurableImpressions INT64, dfpQueries INT64, dfpRevenueCpm INT64, dfpRevenueCpc INT64, dfpViewableImpressions INT64, dfpPagesViewed INT64, adsenseBackfillDfpClicks INT64, adsenseBackfillDfpImpressions INT64, adsenseBackfillDfpMatchedQueries INT64, adsenseBackfillDfpMeasurableImpressions INT64, adsenseBackfillDfpQueries INT64, adsenseBackfillDfpRevenueCpm INT64, adsenseBackfillDfpRevenueCpc INT64, adsenseBackfillDfpViewableImpressions INT64, adsenseBackfillDfpPagesViewed INT64, adxBackfillDfpClicks INT64, adxBackfillDfpImpressions INT64, adxBackfillDfpMatchedQueries INT64, adxBackfillDfpMeasurableImpressions INT64, adxBackfillDfpQueries INT64, adxBackfillDfpRevenueCpm INT64, adxBackfillDfpRevenueCpc INT64, adxBackfillDfpViewableImpressions INT64, adxBackfillDfpPagesViewed INT64, adxClicks INT64, adxImpressions INT64, adxMatchedQueries INT64, adxMeasurableImpressions INT64, adxQueries INT64, adxRevenue INT64, adxViewableImpressions INT64, adxPagesViewed INT64, adsViewed INT64, adsUnitsViewed INT64, adsUnitsMatched INT64, viewableAdsViewed INT64, measurableAdsViewed INT64, adsPagesViewed INT64, adsClicked INT64, adsRevenue INT64, dfpAdGroup STRING, dfpAdUnits STRING, dfpNetworkId STRING\u003e\u003e\u003e\u003e"
}, {
  "column_name": "fullVisitorId",
  "data_type": "STRING"
}, {
  "column_name": "userId",
  "data_type": "STRING"
}, {
  "column_name": "channelGrouping",
  "data_type": "STRING"
}, {
  "column_name": "socialEngagementType",
  "data_type": "STRING"
}, {
  "column_name": "hits",
  "data_type": "ARRAY\u003cSTRUCT\u003chitNumber INT64, time INT64, hour INT64, minute INT64, isSecure BOOL, isInteraction BOOL, isEntrance BOOL, isExit BOOL, referer STRING, page STRUCT\u003cpagePath STRING, hostname STRING, pageTitle STRING, searchKeyword STRING, searchCategory STRING, pagePathLevel1 STRING, pagePathLevel2 STRING, pagePathLevel3 STRING, pagePathLevel4 STRING\u003e, transaction STRUCT\u003ctransactionId STRING, transactionRevenue INT64, transactionTax INT64, transactionShipping INT64, affiliation STRING, currencyCode STRING, localTransactionRevenue INT64, localTransactionTax INT64, localTransactionShipping INT64, transactionCoupon STRING\u003e, item STRUCT\u003ctransactionId STRING, productName STRING, productCategory STRING, productSku STRING, itemQuantity INT64, itemRevenue INT64, currencyCode STRING, localItemRevenue INT64\u003e, contentInfo STRUCT\u003ccontentDescription STRING\u003e, appInfo STRUCT\u003cname STRING, version STRING, id STRING, installerId STRING, appInstallerId STRING, appName STRING, appVersion STRING, appId STRING, screenName STRING, landingScreenName STRING, exitScreenName STRING, screenDepth STRING\u003e, exceptionInfo STRUCT\u003cdescription STRING, isFatal BOOL, exceptions INT64, fatalExceptions INT64\u003e, eventInfo STRUCT\u003ceventCategory STRING, eventAction STRING, eventLabel STRING, eventValue INT64\u003e, product ARRAY\u003cSTRUCT\u003cproductSKU STRING, v2ProductName STRING, v2ProductCategory STRING, productVariant STRING, productBrand STRING, productRevenue INT64, localProductRevenue INT64, productPrice INT64, localProductPrice INT64, productQuantity INT64, productRefundAmount INT64, localProductRefundAmount INT64, isImpression BOOL, isClick BOOL, customDimensions ARRAY\u003cSTRUCT\u003cindex INT64, value STRING\u003e\u003e, customMetrics ARRAY\u003cSTRUCT\u003cindex INT64, value INT64\u003e\u003e, productListName STRING, productListPosition INT64, productCouponCode STRING\u003e\u003e, promotion ARRAY\u003cSTRUCT\u003cpromoId STRING, promoName STRING, promoCreative STRING, promoPosition STRING\u003e\u003e, promotionActionInfo STRUCT\u003cpromoIsView BOOL, promoIsClick BOOL\u003e, refund STRUCT\u003crefundAmount INT64, localRefundAmount INT64\u003e, eCommerceAction STRUCT\u003caction_type STRING, step INT64, option STRING\u003e, experiment ARRAY\u003cSTRUCT\u003cexperimentId STRING, experimentVariant STRING\u003e\u003e, publisher STRUCT\u003cdfpClicks INT64, dfpImpressions INT64, dfpMatchedQueries INT64, dfpMeasurableImpressions INT64, dfpQueries INT64, dfpRevenueCpm INT64, dfpRevenueCpc INT64, dfpViewableImpressions INT64, dfpPagesViewed INT64, adsenseBackfillDfpClicks INT64, adsenseBackfillDfpImpressions INT64, adsenseBackfillDfpMatchedQueries INT64, adsenseBackfillDfpMeasurableImpressions INT64, adsenseBackfillDfpQueries INT64, adsenseBackfillDfpRevenueCpm INT64, adsenseBackfillDfpRevenueCpc INT64, adsenseBackfillDfpViewableImpressions INT64, adsenseBackfillDfpPagesViewed INT64, adxBackfillDfpClicks INT64, adxBackfillDfpImpressions INT64, adxBackfillDfpMatchedQueries INT64, adxBackfillDfpMeasurableImpressions INT64, adxBackfillDfpQueries INT64, adxBackfillDfpRevenueCpm INT64, adxBackfillDfpRevenueCpc INT64, adxBackfillDfpViewableImpressions INT64, adxBackfillDfpPagesViewed INT64, adxClicks INT64, adxImpressions INT64, adxMatchedQueries INT64, adxMeasurableImpressions INT64, adxQueries INT64, adxRevenue INT64, adxViewableImpressions INT64, adxPagesViewed INT64, adsViewed INT64, adsUnitsViewed INT64, adsUnitsMatched INT64, viewableAdsViewed INT64, measurableAdsViewed INT64, adsPagesViewed INT64, adsClicked INT64, adsRevenue INT64, dfpAdGroup STRING, dfpAdUnits STRING, dfpNetworkId STRING\u003e, customVariables ARRAY\u003cSTRUCT\u003cindex INT64, customVarName STRING, customVarValue STRING\u003e\u003e, customDimensions ARRAY\u003cSTRUCT\u003cindex INT64, value STRING\u003e\u003e, customMetrics ARRAY\u003cSTRUCT\u003cindex INT64, value INT64\u003e\u003e, type STRING, social STRUCT\u003csocialInteractionNetwork STRING, socialInteractionAction STRING, socialInteractions INT64, socialInteractionTarget STRING, socialNetwork STRING, uniqueSocialInteractions INT64, hasSocialSourceReferral STRING, socialInteractionNetworkAction STRING\u003e, latencyTracking STRUCT\u003cpageLoadSample INT64, pageLoadTime INT64, pageDownloadTime INT64, redirectionTime INT64, speedMetricsSample INT64, domainLookupTime INT64, serverConnectionTime INT64, serverResponseTime INT64, domLatencyMetricsSample INT64, domInteractiveTime INT64, domContentLoadedTime INT64, userTimingValue INT64, userTimingSample INT64, userTimingVariable STRING, userTimingCategory STRING, userTimingLabel STRING\u003e, sourcePropertyInfo STRUCT\u003csourcePropertyDisplayName STRING, sourcePropertyTrackingId STRING\u003e, contentGroup STRUCT\u003ccontentGroup1 STRING, contentGroup2 STRING, contentGroup3 STRING, contentGroup4 STRING, contentGroup5 STRING, previousContentGroup1 STRING, previousContentGroup2 STRING, previousContentGroup3 STRING, previousContentGroup4 STRING, previousContentGroup5 STRING, contentGroupUniqueViews1 INT64, contentGroupUniqueViews2 INT64, contentGroupUniqueViews3 INT64, contentGroupUniqueViews4 INT64, contentGroupUniqueViews5 INT64\u003e, dataSource STRING, publisher_infos ARRAY\u003cSTRUCT\u003cdfpClicks INT64, dfpImpressions INT64, dfpMatchedQueries INT64, dfpMeasurableImpressions INT64, dfpQueries INT64, dfpRevenueCpm INT64, dfpRevenueCpc INT64, dfpViewableImpressions INT64, dfpPagesViewed INT64, adsenseBackfillDfpClicks INT64, adsenseBackfillDfpImpressions INT64, adsenseBackfillDfpMatchedQueries INT64, adsenseBackfillDfpMeasurableImpressions INT64, adsenseBackfillDfpQueries INT64, adsenseBackfillDfpRevenueCpm INT64, adsenseBackfillDfpRevenueCpc INT64, adsenseBackfillDfpViewableImpressions INT64, adsenseBackfillDfpPagesViewed INT64, adxBackfillDfpClicks INT64, adxBackfillDfpImpressions INT64, adxBackfillDfpMatchedQueries INT64, adxBackfillDfpMeasurableImpressions INT64, adxBackfillDfpQueries INT64, adxBackfillDfpRevenueCpm INT64, adxBackfillDfpRevenueCpc INT64, adxBackfillDfpViewableImpressions INT64, adxBackfillDfpPagesViewed INT64, adxClicks INT64, adxImpressions INT64, adxMatchedQueries INT64, adxMeasurableImpressions INT64, adxQueries INT64, adxRevenue INT64, adxViewableImpressions INT64, adxPagesViewed INT64, adsViewed INT64, adsUnitsViewed INT64, adsUnitsMatched INT64, viewableAdsViewed INT64, measurableAdsViewed INT64, adsPagesViewed INT64, adsClicked INT64, adsRevenue INT64, dfpAdGroup STRING, dfpAdUnits STRING, dfpNetworkId STRING\u003e\u003e\u003e\u003e"
}, {
  "column_name": "clientId",
  "data_type": "STRING"
}]

今回のチュートリアルでは、日付ごとに訪問者数の遷移を確認する事になっています。 カラムを確認した結果、それ以外にもサイト訪問者の滞在時間といった事柄も予測出来そうです。

モデル作成

先ほど表示した総訪問者数のデータをインプットとするような、モデルを作成します。

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.ga_arima_model
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'parsed_date',
   time_series_data_col = 'total_visits',
   auto_arima = TRUE,
   data_frequency = 'AUTO_FREQUENCY',
   decompose_time_series = TRUE
  ) AS
SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

翻訳すると「時系列データを取り扱うARIMAモデルを、parsed_dateの時間、total_visitsの総訪問者数をインプットとして、学習するよ」という内容です。

最初のCREATE OR REPLACE MODELは、同じ名前のモデルがあれば入れ替えで、なければ新しく作る、という意味です。bqml_tutorial直下にga_arima_modelという名前のモデルが作成されます。

その後OPTIONS句でモデルを学習するときの設定をしています。

  • auto_arima
    • TRUEにする事でパラメータの調整を自動で行なってくれるものです。
  • data_frequency
    • データの頻度を渡すためのものです。'AUTO_FREQUENCY'と設定するとインプットされたデータから自動的にどういった頻度のデータなのかを推論してくれます。
  • decompose_time_series
    • TRUEにすると季節や休日を考慮してくれます。例えば、夏に売れやすい商品があった場合に季節を考慮する事でより正確な予測が可能となるケースがあります。
    • ML.EXPLAIN_FORECASTというモデルの予測結果を可視化する関数を実行するにはTRUEにする必要があります。

モデル作成の方法やその他のオプションはこちらをご覧ください。

ARIMAモデルについてはこちらもご参考ください。

モデルの学習結果を確認

モデルの評価指標

学習した結果を見るために、モデルの評価指標を確認します。評価指標とは平均2乗誤差(MSE)のように、どれだけ予測と実測値がずれているかなど、モデルの学習状態を確認するのに使います。 ARIMAモデルにおいては、AICの略称で知られる赤池情報量規準を使用しています。

詳しくはARIMA_EVALUATEを実行することで確認します。

#standardSQL
SELECT
 *
FROM
 ML.ARIMA_EVALUATE(MODEL bqml_tutorial.ga_arima_model)

他の指標についても公式チュートリアルで言及されていますので、ご興味おありならご確認ください。

モデルの係数

ここでいう、モデルの係数とは、公式チュートリアルにも書いている(p,d,q)の3つの組の事です。それぞれ、ARIMAモデルにおける自己回帰(pに相当)、移動平均(qに相当)、定数項(dに相当)の事です。

つまり、データの傾向がどのようになっているのか(移動平均)を考慮しつつ、過去のデータを見ながら予測(自己回帰)した結果が確認できます。

#standardSQL
SELECT
 *
FROM
 ML.ARIMA_COEFFICIENTS(MODEL bqml_tutorial.ga_arima_model)

学習したモデルを使用して時系列予測

先ほど学習したモデルを使って予測を行います。予測にはML.FORECASTを使います。

#standardSQL
SELECT
 *
FROM
 ML.FORECAST(MODEL bqml_tutorial.ga_arima_model,
             STRUCT(30 AS horizon, 0.8 AS confidence_level))

ML.FORECASTで渡しているSTRUCTは順序が関係する構造体です。翻訳すると「未来の30日間で、信頼区間80%のものを予測し、それを表示する」となります。

予測結果の可視化

予測結果の可視化には、ML.EXPLAIN_FORECASTを使います。ML.FORECASTと違うところは返ってくる値です。

Explainable AIのため、予測結果を可視化するのにML.FORECASTでの予測に加え、可視化に必要な情報も返すようにされた関数です。

#standardSQL
SELECT
 *
FROM
 ML.EXPLAIN_FORECAST(MODEL bqml_tutorial.ga_arima_model,
                     STRUCT(30 AS horizon, 0.8 AS confidence_level))

実行した結果を可視化するにはLooker Studioを使用します。

Explanable AIについてはこちらもご参照ください。

decompose_time_seriesがFALSE時の予測結果可視化

モデル学習のOPTIONS句で、decompose_time_series = TRUEとせずにFALSEにしていた場合に、予測結果を可視化する方法について紹介されていました。

なお、ARIMAモデルは学習している前提です。チュートリアルで言うと、STEP3を実行終えている場合に次のSQLが実行可能です。

#standardSQL
SELECT
 history_timestamp AS timestamp,
 history_value,
 NULL AS forecast_value,
 NULL AS prediction_interval_lower_bound,
 NULL AS prediction_interval_upper_bound
FROM
 (
   SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
     SUM(totals.visits) AS history_value
   FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
   GROUP BY date
   ORDER BY date ASC
 )
UNION ALL
SELECT
 forecast_timestamp AS timestamp,
 NULL AS history_value,
 forecast_value,
 prediction_interval_lower_bound,
 prediction_interval_upper_bound
FROM
 ML.FORECAST(MODEL bqml_tutorial.ga_arima_model,
             STRUCT(30 AS horizon, 0.8 AS confidence_level))

UNION ALL句で前後で実行したSELECT文の結果を重複を含めて結合しています。

こういったSQLの書き方に慣れていない場合、上記のままだと分かりづらいかもしれません。UNION ALL句を境目に前半部分と後半部分で分解して理解してみましょう。

SQL前半部分

次のものが前半部分です。

#standardSQL
SELECT
 history_timestamp AS timestamp,
 history_value,
 NULL AS forecast_value,
 NULL AS prediction_interval_lower_bound,
 NULL AS prediction_interval_upper_bound
FROM
 (
   SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
     SUM(totals.visits) AS history_value
   FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
   GROUP BY date
   ORDER BY date ASC
 )

こちらではFROM句の中にSELECT文が使われています。これはサブクエリというものでSQL文の中にSQL文が書かれたものです。

FROM句の中で使われているSQL文は、データの中身を確認した時とほとんど同じ内容になっています。つまりhistory_timestampという内容に日時を、history_valueにその日サイトにアクセスした人の総数が表されております。さらに、ORDER BY date ASCで、データの並び替えを日付が昇順になるようにしています。

FROM句内で得られたデータを元に、データを並べつつもSQL後半部分で必要となるforecast_valueなどの列をNULL(この時にはまだデータが存在しない)として列だけ確保しておきます。 BigQuery tutorial SQL in the first half

後半のSELECT文

後半のSELECT文は次のようになります。

SELECT
 forecast_timestamp AS timestamp,
 NULL AS history_value,
 forecast_value,
 prediction_interval_lower_bound,
 prediction_interval_upper_bound
FROM
 ML.FORECAST(MODEL bqml_tutorial.ga_arima_model,
             STRUCT(30 AS horizon, 0.8 AS confidence_level))

ML.FORECASTで学習済みARIMAモデルを使って予測を行なっています。予測して得られる結果とプラスして、SQL文前半と同じ名前の列でhistory_valueを用意しています。

SQL文全体の意味

翻訳すると「日時や訪問者数の今までのデータと、ARIMAモデルで予測した結果を合わせたものを表示します」という意味になります。

表示された結果を用いてLooker Studioグラフ化する事ができるため、可視化できます。

実行環境削除

ここまで、チュートリアルの内容を実行してきました。チュートリアル後も使用する場合を除きますが、データを削除しましょう。

方法は簡単で、自身のデータセット名のの部分をクリックして「削除」をクリックします。 その後、「データセットを削除しますか?」とモーダルウィンドウが出てくるのでdeleteと入力して青い「削除」のボタンをクリックします。 modal window delet option

プロジェクトごと削除をしたい場合はチュートリアルに注意事項も含めて記載されているので、そちらをご覧ください。

終わりに

今回はBigQueryMLのチュートリアルを実行してきました。実行自体は簡単にすぐ出来るのですが、内容をしっかり把握してから進めようと思うと、とても為になりました。

今回はここまで。

それでは、また!

参考にしたサイト