SQLだけでモデルが作れる！BigQuery ML による自動モデル作成と Tableau による可視化

こんにちは。スキルアップAI編集部です。

大量のデータを保存する先として、データウェアハウスを構築する企業が増加しています。このような背景もあり、Google Cloud Platform（GCP）の BigQuery、Amazon Web Services（AWS）の Redshift など高速なデータウェアハウスを提供するサービスが続々と増えています。これらのデータウェアハウスサービスの中でも、BigQuery と Redshift は各クラウド事業者の持つ AutoML サービスと連携して、SQLベースで機械学習モデルを作成できる機能を提供しています。

また、データウェアハウスには Tableau をはじめとしたBusiness Inteligence（BI）ツールを接続して、データの可視化・分析を行っている方も多いでしょう。

そこで、この記事では BigQuery によって機械学習モデルを作成し、そして Tableau によって予測結果を可視化する方法をご紹介します。

<目次>
1.BigQueryを使った自動モデル作成
2.Tableau desktopを使った予測結果の可視化
3.おわりに

# 1.BigQueryを使った自動モデル作成
まず、自動モデル（AutoML：Automated Machine Learning）について簡単に説明します。
今までモデルを作成するとき、人間自身が手作業でデータの関係性や分布を見て、特徴量を作成し、目的に合った回帰、分類手法を選び、評価関数などを適宜設定したのち、モデルの学習、評価、推論を順々に行っていきます。
上述のような機械学習モデルの構築に必要な特徴量の作成からモデル選択、推論、評価の一連の作業をすべてAIで自動化する手法です。

次に今回のデータとしては、「[カスタマーアクティビティファイル](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv)」を使います。このデータはアメリカ合衆国における、カリフォルニア大学アーバイン校Machine Learningデータセットのリポジトリから公開されている顧客解約予測データセットです。モバイル事業者は、ある期間において、顧客がサービスを利用し、継続もしくは解約までの記録を持っています。

今回、この履歴情報をGoogle Cloud PlatformのBigQuery上で扱って、モデル作成を行います。その後、任意の顧客に対して、解約するかどうかを予測します。
BigQuery とは、Google Cloud Platformで提供するマネージドなデータウェアハウスサービスであり、大容量なデータに対する高速なSQLクエリ実行が可能であるのが特徴です。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/9ec3b002-dc0a-6b71-f470-9f734602f6cd.png">

さらに、2018年には SQL と同様の文法によって、機械学習モデルの構築を実施する BigQuery ML が機能の一部として追加されました。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/15ad099f-d0be-236c-1fda-48814eeef1b3.png">

さらに、2021年6月にはテーブルデータサービス AutoML Tables との連携が一般公開され、BigQuery 内でデータ取得からモデルのハイパーパラメータ調整までの一連の流れが実行できるようになりました。
※参考：[AutoML Tables が BigQuery ML で一般提供に](https://cloud.google.com/blog/ja/products/data-analytics/automl-tables-now-generally-available-bigquery-ml)

このブログは、リリースされたばかりの BigQuery から AutoML Tables を呼び出して使用する機能を利用していきます。

**準備**
まず、[こちら](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv)からデータセットをダウンロードします。

次に、Google Cloud Platformのポータルページを開くと下の画像のような画面になります。画面左上のタブから、”ビッグデータ”の欄にある”BigQuery”を押しましょう。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/0d752785-fb2f-3d71-60cb-167a3cf4cab3.png">

エクスプローラ下にあるプロジェクトのアクションを表示すると、”データセット作成”があるため、それを押すと、下の画像の画面になります。”データセットID”の欄は任意に設定することができます。今回は「testing」と入力しましょう。そして、画面右下の「データセットを作成」ボタンを押します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/30bfd6d5-ac31-1a08-aaf9-8d528b3a2ebc.png">

作成されたデータセットのアクションを押し、開かれた画面の一番左にある”テーブルを作成”を押します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/10f77eb9-67b4-dfc1-2d17-1d0fcfd23a2f.png">

ソースのテーブルの作成元にあるプルダウンを”空のテーブル”から”アップロード”に変え、”ファイルを選択”の欄に先ほどダウンロードしたデータを選択します。 テーブル名は任意に決めることができますが、今回「customer」と入力します。”スキーマと入力パラメータ”にチェックをつけて、一番下のテーブルを作成ボタンを押します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/36b96a80-2728-4b25-ed9e-52f341ae25d5.png">

以下のようにダウンロードしたデータが表示できれば完了です。
ここまでで、データを解析する前のデータの用意ができました。いよいよ解析を行っていきます。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/5ccdbbc8-f801-3d6b-8056-a1217e89eb09.png">

まず、自動モデル作成のためのコードが下のようになります。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/05c40019-c470-a280-8f3c-c20dea513c1e.png">

上記のコードを説明します。

* **1行目**：”作ったデータセットの名前”に”auto_ml_1”という名前のモデルを作成します。
* **2行目**：今回、自動モデル作成のため、optionのmodel_typeは”AUTOML_CLASSIFIER”となります。また、自動モデル作成には時間がとてもかかることから、時間制限を１時間と設定します。時間制限は budget_hours=1 の部分に対応しています。
* **3行目から9行目**：今回の特徴量と目的変数を定義しています。
    * State、Account_Length、Area_Codeはそのまま特徴量として使います。
    * **7行目**：新たな特徴量として、Total_ChargeをAccount_Lengthで割ったものを average_daily_spendとして定義しています。
    * **8行目**：CustServ_CallsをAccount_Lengthで割ったものをaverage_daily_casesとして定義しています。
    * **9行目**：今回、目的変数をChurn_にするため、labelという名前で定義し直しています。BigQuery上では、labelという名前で定義することで、その項目を目的変数として認識します。
* **10行目**：今回扱うデータは時系列データであるため、データのいつからを訓練データとして扱うかを定義しています。上記のコードでは2020年1月1日より前のデータを訓練データとして定義しています。
右上の”クエリを新規作成”を押し、先ほど記したコードを入力します。 コードを実行する際、問題なく実行可能であれば右上に緑のチェックがつきます。 緑のチェックがついていれば実行ボタンを押します。今回は1時間、AutoMLによって最適なモデルの探索が行われます。

これでモデルが作成することができました。それでは次にモデルの評価をしていきましょう。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/9b56a43a-adec-4621-569a-c3e56b033ade.png">

次に評価のためのコードが下記のようになります。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/046b7ee4-9b8c-0829-c4ed-c7c23cc13009.png">

上記のコードを説明します。

* **1行目**：モデル評価のためevaluateとしています。
* **2行目から9行目**：すべて先ほどのモデル作成のコードと同じです。
* **10行目**：検証用データの指定を行っています。今回は2020年1月1日以降のデータを検証用として使用します。

このコードを実行した結果が下の画像になります。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/500ef78c-c673-a0cd-9ebb-5393b2b6fa35.png">

それぞれの評価指標を以下で説明していきます。

* **“precision”(適合率)**：正しいモデルによって生成された肯定の予測の割合（肯定の予測は偽陽性と真陽性を組み合わせたものです）。
* **“recall”(再現率)**：モデルによって正しく予測された、このラベルが付けられた行の割合。「真陽性率」とも呼ばれます。
* **“accuracy”(正確度)**：正しいモデルによって生成された分類予測の割合。
* **“f1_score”**：適合率と再現率の調和平均。適合率と再現率のバランスを求めていて、クラス分布が不均一な場合、F1 は有用な指標となります。
* **“log_loss”**：モデル予測とターゲット値の間のクロス エントロピー。この範囲はゼロから無限大までで、値が低いほど高品質のモデルであることを示します。
* **“roc_auc”**：受信者操作特性（ROC）曲線の下の面積。この範囲は 0～1 で、値が高いほど高品質のモデルであることを示します。

※**TP(真陽性)**：陽性だと予測されて、本当に陽性だった。
　**TN(真陰性)**：陰性だと予測されて、本当に陰性だった。
　**FP(偽陽性)**：陽性だと予測されたが間違いで、実際には陰性だった。
　**FN(偽陰性)**：陰性だと予測されたが間違いで、実際には陽性だった。

最後に推論のコードを下記に記します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/80e2be86-9985-d071-43cf-1cf73f724a95.png">

上記のコード説明をします。

* **1行目から8行目**：表示する結果の項目を表しています。
* **9行目**：今回、推論であるためpredictとしています。
* **10行目から18行目**：モデル作成のコードと同じです。
* **19行目、20行目**：今回2値分類であるため、どちらか一方の結果がわかればもう一方もわかるので、すべてのデータに対して、labelがTrueとなる確率などの項目を表示させるようにしています。

推論のコードを実行すると、下の画像のように結果が表示されます。
これにより、それぞれのデータにおける解約がなされるかどうかの推論結果がpredicted_labelの列に”True”、”False”で示されており、それに付随する確率が表示されています。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/2d6f8eca-42ab-3b2e-446c-a649c8c5853e.png">

ここまでで、モデルの作成、評価、推論を行ってきました。いかがだったでしょうか。
次は、ここまでで得られた結果を可視化するための作業に入っていきます。

# 2.Tableau desktopを使った予測結果の可視化
ここまでで、BigQuery上におけるモデル作成から評価、推論までできたかと思います。
ここからは、得られたデータと予測結果に基づき、可視化を行います。

Tableauは、データに対して専門外の人であっても、容易にデータ加工・レポート作成・分析を行うことができるツールです。その中で、Tableau Desktopはデータを接続し、可視化・分析するためのソフトです。今回使うGoogle Cloud PlatformのBigQueryに加えて、MySQLなど接続可能なデータベースの量も豊富です。

まず、Tableau Desktopを開いた最初の状態が、下の画像となります。
ここから　左の接続欄にある”Google BigQuery“を選択します。（Googleアカウントにアクセス許可がきますので、許可をしてください）

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/8f873ea5-8ccd-e7e7-2a1a-3a0c091f6690.png">

画面が下の画像に変わり、”請求プロジェクトを選択”、”プロジェクトの選択”の欄をそれぞれ自身のプロジェクトに選択します。 選択した後に表示される”データセットの選択”において、自身で設定した名前を選択します。（今回の場合”testing”となります）
最後に、表示された項目のうち、”新しいカスタム SQL”を”テーブルをここまでドラッグ”までドラッグアンドドロップします。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/af6a17a7-d636-f05c-484f-ae4577b9d671.png">

表示された”カスタムSQLの編集”に、先ほど推論に使ったコードを入力し、OKを押します。次に左下の”シート1”を押します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/dd453c92-268b-92da-ce69-2539dad0f4b8.png">

左のフォルダー欄にある”State”をマーク欄にある”詳細”の上までドラッグアンドドロップします。今回、地図上にアメリカ合衆国の州の名前を表示させるため、右下の”51ヶ所が不明”を押し、”場所の編集”を選択します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/50d9e040-7a37-80bc-1494-a945444ca1e0.png">

”国/地域”が”米国”になっていない場合、”米国”に変えます。
それにより、”都道府県/州”の部分には”Stateデータ”に対応する州の名前が”一致する場所”に表示されます。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/994266c6-7dc3-ad14-acb1-d8fb034d5293.png">

”フォルダー”の欄にある”prob”を”マーク”の欄にある”色”の上までドラッグアンドドロップします。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/8de0081d-409c-5c2c-8100-11fcbe434ff2.png">

そうすると、下の画像のように、州ごとに確率が色の濃淡を使って表示できるようになります。色の配色、濃淡を変えたい場合、右上の”合計(prob)”のアクションにおいて”色の編集”を押します。

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/83f8906b-160f-2a9a-e6d5-2b3eca2eb1cb.png">
<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/75e268db-6f05-a820-5347-99f464bdc1d7.png">

配色を変える場合、パレットの部分を変えます。
色の濃淡を変えたい場合、”詳細”において、”開始”、”終了”、”中央”の値を変えます。(今回は、パレット=赤-黒の分化、開始=0、終了=12、中央=6で設定しています)

<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/48b100e4-f6ac-a485-28f9-4d786b99ca77.png">

画面が上の画像のように州ごとに色が変わります。このように可視化を行うことで、機械学習の予測結果が視覚的にわかりやすくなり、次の意思決定の助けとすることができます。今回のケースであれば、解約が多くなりそうな州に対して何らかのキャンペーンを実施するといった意思決定ができるでしょう。

# 3.おわりに
このブログでは、はじめに2021年6月に一般提供が開始されたばかりの BigQuery と AutoML Tables の連携機能を使って、BigQueryだけで優れた機械学習モデルを自動で構築を行いました。
次に、Tableau と BigQuery を連携させ、モデルの予測結果を可視化する方法を紹介しました。

今回、提供されたデータについて分類問題を目的としていたため、自動モデル作成のモデル選択は”AUTOML_CLASSIFIER”を使いました。回帰問題の場合、自動モデル作成のモデル選択は”AUTOML_REGRESSOR”となります。他にも具体的なモデル選択が可能ですので、いろいろと試してみてください。

また、データの可視化については、今回”prob”のみを色の配色と濃淡により、地域ごとに表示させました。Tableau では同時に複数項目を可視化することも可能ですので、いろいろと試してみてください。

スキルアップAIでは、BiqQuery をはじめとした Google Cloud Platform に関連する講座として「[GCP Professional Data Engineering対応 AIシステムのためのデータエンジニアリング実践講座](https://bit.ly/3mc4swS)」を提供しています。また、Googe Cloud Platform 以外にも様々なクラウド事業者があり、それらを俯瞰して比較したい方には「[機械学習クラウド講座](https://bit.ly/2Zm4YPQ)」がおすすめです。どちらも e-learning 形式で受講することができるため、好きな場所・好きな時間に学ぶことができます。是非受講をご検討ください。

# 25卒向け！AIエンジニアになるための長期インターンプログラム参加者募集中！
25卒学生向けに、AIの基礎を学びながら就活も一括サポートする無料カリキュラムを提供しています。
修了するとE資格の受験資格も獲得できるプログラムとなっています！

<img width="700" alt="長期インターン" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/bfce4c26-1ebe-c54d-bacb-e804048a7a08.png">

**特長①AIエンジニアやデータサイエンティストの基礎が身に付く**
AIジェネラリスト基礎講座や機械学習のためのPython入門講座など、市場価値向上のための基礎を習得。

**特長②AI・データ分析領域の優良求人を紹介**
非公開求人や選考直結型インターンをご紹介し、早期内定の獲得をサポート。

**特長③長期インターンプログラム専用の学生コミュニティ参加可**
学生同士で就活情報をシェアしたり、学習を進めるうえでアドバイスをしあったりできるコミュニティに参加可能。

＞＞[長期インターン詳細](https://bit.ly/3pXW5JM)

☆☆☆
スキルアップAIのメールマガジンでは会社のお知らせや講座に関するお得な情報を配信しています。
配信を希望される方は[こちら](https://share.hsforms.com/1_XlReV-4Te-zcxCl9lhffA2mtef)

また、SNSでも様々なコンテンツをお届けしています。興味を持った方は是非チェックしてください♪
Twitterは[こちら](https://twitter.com/SkillupAi)
Facebookは[こちら](https://www.facebook.com/skillupai)
LinkedInは[こちら](https://www.linkedin.com/company/skillup-ai)