データ分析の様々な作業を自動化！DataRobot + TableauによるAIモデル自動作成と予測結果の可視化

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

近年、蓄積されたデータを分析をする業務が増加する一方、分析を行う人材は不足しています。それにより、AIの自動化のため機械学習自動化プラットフォームを導入する企業が増加しています。しかし、単に予測結果を得るだけでは、予測の傾向などを掴みきれず、ビジネスの意思決定に活かしづらいことがよくあります。そのため、予測結果を可視化し、どのような傾向があるのか確認することで、意思決定をより迅速に行うことができるようになります。また、可視化を通して新しいビジネスインサイトを獲得することにも役立つでしょう。

そこで、この記事では機械学習自動化プラットフォームである、DataRobotによって機械学習モデルを作成し、Tableauによって予測結果を可視化する方法をご紹介します。

<目次>
1.Tableauとは？
2.DataRobotとは？
3.準備
4.DataRobotによるモデルの作成～デプロイ
5.Tableauによる予測結果の可視化
6.終わりに

# 1.Tableauとは？
[Tableau](https://www.tableau.com/ja-jp)は、データ分析に関して専門外の人であっても、容易にデータ加工・レポート作成・分析を行うことができるソフトウェアパッケージです。その中で、Tableau Desktopはデータを接続し、可視化・分析するためのソフトウェアです。Tableau Prep BuilderはTableauでの分析用にデータを組み合わせたり、加工、クリーニングすることができます。今回使うExcelのデータセット以外にもMySQLなどの様々なデータベースと接続することができます。
![datarobot-tableau_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/588750c0-5e14-7237-e5a1-a729a1b876a2.png)

# 2.DataRobotとは？
まず、AutoMLは今まで手作業で行っていた特徴量に対する前処理の部分や、モデルの選定などの時間のかかる作業を機械で自動化することで、数多くのモデルを試すことができ、他の生産的な作業に集中して取り組める等の利点があります。このような機械学習を自動化する製品に、DataRobot社が開発した機械学習自動化プラットフォームである「[DataRobot](https://www.datarobot.com/jp/)」があります。こちらはAI導入による外注費や、モデルの偏りなどのリスクを一手に解決してくれる等の利点を持っています。また、データサイエンティストをこれらの機械学習自動化プラットフォームで代替する企業も増加しています。
![datarobot-tableau_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/4b0632b8-6be8-30d8-2321-2abe625f9abb.png)

# 3.準備
この章では、次章以降で扱うDataRobotとTableauの環境構築を行っていきます。
まず、Tableau DesktopとTableau Prep Builderは[こちらのリンク](https://www.tableau.com/products/trial/)からそれぞれインストールができます。
次に、DataRobotは[こちらのリンク](https://www.datarobot.com/jp/trial/)からトライアル環境を作成できるため、順次メールアドレスの登録を行ってください。

また、Tableauのワークブック内でPythonを使うため、そのためのAPIであるtabpyとそれに付随するライブラリとバージョンをインストールします。
まず、tabpy 等のインストールですが、mac ならターミナル、windows なら Anaconda Promt で以下を実行していきます（以降は、ターミナルやAnaconda Promtをまとめてコンソールと表記します）。

```
pip install tabpy==2.4.0
```

tabpy 以外の必要なライブラリのインストールについては以下をコンソールで実行していきます。

```
pip install requests==2.26.0
pip install pandas==1.3.4
```

最後にデータセットをダウンロードしていきます。今回使うデータセットは、DataRobot社が提供している「通信業者のサービスのレコメンデーション」についてのデータセットを使います。[こちらのリンク](https://community.datarobot.com/t5/%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/datarobot%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9ai%E5%85%A5%E9%96%80-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF/ta-p/7283)から「<font color="Red">Telco_Next_Best_Offer.zip</font>」をダウンロードして解凍してください。

以上で環境構築は終わりとなります。それでは、DataRobotを使ったモデル作成を行っていきましょう。

# 4.DataRobotによるモデルの作成～デプロイ
ここではDataRobotを使って、用意したデータセットの分析を行っていきます。
まず、前章で作ったアカウント情報を基に、以下のサイトにログインします。
[https://app2.datarobot.com/](https://app2.datarobot.com/)

![datarobot-tableau_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/7f479268-5a9c-b846-330e-a4fb012aefe5.png)

ログイン直後に他の画面が表示されている場合は下記の画像のように左上の「DataRobot」ボタンからホーム画面に戻すことができます。

![datarobot-tableau_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/4dd9c99f-c2ee-7916-cbc4-3f7bbc061fd1.png)

下記の画像のようにホーム画面に戻った後、右上の人のアイコンから「設定」を開きます。

![datarobot-tableau_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/ca5f6d6a-1662-d76b-bd92-321e6f31d790.png)

今回扱うデータはExcelファイルであるため、画面左の欄にある「BOMを含める」をオンにします。（BOM（Byte Order Mark）はファイルの先頭に3バイトを加えてエンコードを示すために使用されるバイトシーケンスです。）
オンにしたら再び左上の「DataRobot」ボタンからホーム画面に戻ります。

![datarobot-tableau_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/e2b2148a-d10b-122a-822c-e21dc462e2ba.png)

次に、用意したデータセットをDataRobot上で読み込ませる作業を行って行きます。
ホーム画面中央の「機械学習の開発」をクリックします。

![datarobot-tableau_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/24374865-ee55-4555-76ee-4de57b6a1d3c.png)

遷移した画面中央にある青枠内にダウンロードした「Telco_Next_Best_Offer_train.xlsx」をドラッグ&ドロップして、xlsxファイルをアップロードします。

![datarobot-tableau_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/fc73bb06-8188-c053-ab68-d1a26940443b.png)

データのアップロードが終わると下記の画像のように、ターゲット選択画面に遷移します。
下記の画像のように、画面右下に「ターゲットを選択する」が表示されれば、アップロードが無事完了となります。

![datarobot-tableau_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/46ad6108-6b6a-3c89-f2f5-97aefbbc3286.png)

次に、今回予測したい対象（ターゲット）を選択します。
下記の画像のように画面左に表示されている、「ターゲット名を入力」に今回の予測対象である「提案プラン」を入力します。

![datarobot-tableau_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/69905729-f381-92d6-28b8-0149f8cfd544.png)

以上まででモデル作成の準備ができたため、早速モデリングを実行します。
下記の画像のように中央の「開始」ボタンをクリックするとモデリングが開始されます。（時間を短縮するために、「開始」ボタン下のモデリングモードをクイックにすると、通常の4分の1程度の時間で完了するため、素早く分析を行いたい場合におすすめです。）

![datarobot-tableau_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/e812426e-28c3-b889-5ea1-042129f1f0b6.png)

モデリングの処理が終了した場合、下記の画像のように右の欄に「オートパイロットが終了しました」という表示がされます。

![datarobot-tableau_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/e8fab48e-1a8a-617f-f5d1-a87d1da88713.png)

下記の画像のように上部の「モデル」タブを開くと、作成されたモデル群の精度や予測速度などを鑑みた順位表（リーダーボード）が表示されます。

![datarobot-tableau_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/28832206-7ae0-63d1-22c8-970617f71227.png)

作成されたモデル群の中で最も優れたモデルをデプロイするため、画面上部にある「Automodelをデプロイ」をクリックすると、自動的に先ほどのリーダーボード最上位にあるモデルがデプロイされます。

![datarobot-tableau_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/da22cb28-bfe3-8539-2c0a-f31c00da782c.png)

デプロイされたモデルについては画面上部の「MLOps」タブをクリックすると確認できます。そして、後でTableauで今回作成したモデルを使うことから、APIキー情報を確認するため、画面左下のデプロイされたモデルをクリックします。

![datarobot-tableau_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/1aa3d7a4-262a-541d-5217-23f6a0270cf6.png)

画面が下記の画像のように遷移したら、以下の手順で行っていきます。

1. 「予測」ボタンをクリック
1. 「予測API」ボタンをクリック
1. 予測タイプの欄にある「リアルタイム」をクリック

![datarobot-tableau_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/767c94c1-bac6-ab38-7e6e-8a9b1f6e37f0.png)

以上の手順から、Pythonによる推論用コードが表示されるため、その中から「DEPLOYMENT_ID」と「API_KEY」に代入されている値を控えておきます。

![datarobot-tableau_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/b6936224-85db-e819-4daa-7c326ae9a9b3.png)

先ほど控えた「DEPLOYMENT_ID」と「API_KEY」を以下のPythonスクリプト内の14行目「DEPLOYMENT_ID」と17行目「API_KEY」の部分に代入していきます。このPythonスクリプトは「dr_prediction.py」として保存しておきましょう。

```python
import json
import requests

import pandas as pd

# DataRobot の REST API を使って予測を実行し、Pandas のデータフレームとして返す関数
def prediction(
 input_df # データソースからはデータフレームとして渡される
): 
# テストデータをCSVとして保存
input_df.to_csv('test_data.csv', index=False)

   # デプロイしたモデルに固有のID（要変更）
   DEPLOYMENT_ID = '控えたDEPLOYMENT_IDをここに代入'

   # API 利用のためのユーザ固有の認証キー（要変更）
   API_KEY = '控えたAPI_KEYをここに代入'

   # 推論のための URL
   API_URL = f'https://app2.datarobot.com/api/v2/deployments/{DEPLOYMENT_ID}/predictions/'

   # テストデータのCSVファイルをバイナリ形式で読み込み
   data = open('test_data.csv', 'rb').read()

   # HTTP リクエストのヘッダー部分
   headers = {
       'Content-Type': 'text/plain; charset=UTF-8', # 送信するデータのもとはテキスト形式
       'Authorization': 'Bearer {}'.format(API_KEY), # 認証のためのキーの情報
   }

   # REST API で推論を実行
   predictions_response = requests.post(
       API_URL, # POST 先の URL
       data=data, # 送信するバイナリデータ
       headers=headers, # ヘッダー情報
   )

   # JSON 形式で返ってきたレスポンスをPythonの辞書形式に変換
   prediction_json = predictions_response.json()

   # 辞書形式のデータを Pandas のデータフレームへ変換
   ## predictionValues：各クラスの確率
   ## deploymentApprovalStatus：予測が問題なく行われているかどうか（問題なければ APPROVED）
   ## Prediction：予測確率最大のクラス名
   ## rowId：行数
   df_prediction = pd.DataFrame.from_dict(prediction_json['data'])
  
   # 入れ子になっている辞書形式をテーブル形式に変換
   df_proba = pd.json_normalize(prediction_json['data'], # 元データ
                                           record_path='predictionValues', # どの部分を展開するか
                                           meta='rowId') # 展開結果に付与したい内容
  
   # 列にクラス名、行にrowID、値に予測確率を入れた表に変換
   df_proba_pivot = df_proba.pivot(index='rowId', # どの列をインデックスに設定するか
                               columns='label', # どの列を列に設定するか
                               values='value') # それぞれの値にどの列を設定するか
  
   # 列全体に label という名称がついているが、不要のため削除
   df_proba_pivot.columns.name = None

   # 各列名をわかりやすくするため、先頭に一律に「予測確率_」を追加
   df_proba_pivot_added_prefix = df_proba_pivot.add_prefix('予測確率_')

   # 予測確率最大のクラス名の列を、予測確率のデータフレームに追加
   df_proba_pivot_added_prefix['提案プラン'] = df_prediction['prediction']

   # 入力データフレームの顧客ID列を、予測結果のデータフレームに追加
   df_proba_pivot_added_prefix['顧客ID'] = input_df['顧客ID']   

   return df_proba_pivot_added_prefix

# prediction 関数で返されるデータフレームのスキーマを定義する関数
# 参考：https://help.tableau.com/current/prep/ja-jp/prep_scripts_TabPy.htm 　
def get_output_schema():      
 return pd.DataFrame({
   '予測確率_Daytime plan' : prep_decimal(), # 小数型
   '予測確率_Enhanced Voicemail Plan' : prep_decimal(), # 小数型
   '予測確率_Evening call plan' : prep_decimal(), # 小数型
   '予測確率_International call plan' : prep_decimal(), # 小数型
   '予測確率_No Action' : prep_decimal(), # 小数型
   '提案プラン': prep_string(), # 文字列型
   '顧客ID': prep_int() # 整数型
   })
```
以上でDataRobotでのモデル作成が終わりとなります。
次章では、ここまでで作成したモデルを使って、テストデータの予測とその可視化をTableauで行っていきます。

# 5.Tableauによる予測結果の可視化
ここでは、Tableauでテストデータの予測とそのデータの結合、および可視化を行っていきます。
まず、コンソール上で以下を実行します。

```
tabpy
```

コンソールをそのままの状態にして、Tableauの方に移っていきます。
まず、Tableau Prep Builderを開くと、下記の画面が表示されます。

![datarobot-tableau_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/d24050ab-e7f4-e80b-431a-0272260e547f.png)

画面左の「接続」の横にある「⊕」ボタンをクリックして、今回使うテストデータの形式であるMicrosoft Excelを選択して、先ほどダウンロードした「Telco_Next_Best_Offer_test.xlsx」を選択します。

![datarobot-tableau_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/82af6a14-f245-4d0a-cb60-b1d3440e91da.png)

下記の画像のようになったら、画面中央の「DR_Demo_Telecomms_Churn_Multicl」のアイコン横の「⊕」ボタンをクリックして、「スクリプト」を選択します。

![datarobot-tableau_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/e71a140b-81c6-aaaf-ab6b-6b27cafc991e.png)

下記の画像のように画面が遷移したら、以下の手順で行っていきます。

1. 接続タイプを「Tableau Python（TabPy）Server」に選択
1. ファイル名の欄にある「参照」ボタンをクリックして保存したPythonスクリプト「dr_prediction.py」を選択
1. 関数名の欄に実行したい関数名である「prediction」を入力

以上の手順を順に行うと、自動で推論が行われます。

![datarobot-tableau_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/f99c171d-d3ef-3175-49e9-037b8217b1e3.png)

推論が行われた結果、下記の画像のように表示されます。
右下にそれぞれの項目における確率の分布が可視化されています。

![datarobot-tableau_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/55781df2-ec51-2156-f89d-91ed94704c73.png)

次に、予測結果を元のテストファイルである「Telco_Next_Best_Offer_test.xlsx」と結合するため、画面中央の「DR_Demo_Telecomms_Churn_Multicl」のアイコンをドラッグした状態で「スクリプト１」のアイコンまで移動させると、横に「結合」という表示がされるため、そこまでドラッグ&ドロップします。
そうすると、自動でデータの結合が行われ、下記の画像のように結合されたデータが表示されます。

![datarobot-tableau_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/b8c821d8-ac24-0b2f-2953-87e7c1f10e4e.png)

ここまでがTableau Prep Builderで行う作業です。
次にTableau Desktopで結果の可視化を行っていくため、「結合1」のアイコン上で右クリックをして、「Tableau Desktopでプレビュー」を選択すると、自動でTableau Desktopが開かれます。

開かれた状態のTableau Desktopが下記の画像になります。
まず左の欄にある「州」にカーソルを合わせたら右クリックをして、「地理的役割」、「都道府県/州」の順に選択します。

![datarobot-tableau_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/ed3a7da9-e442-be56-4ab0-1890d80de038.png)

次に、左の欄から、「州」を画面上部の列の欄まで、「予測確率_Daytime plan」を画面上部の行の欄までそれぞれドラッグ&ドロップします。

![datarobot-tableau_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/d4295375-801e-da08-9257-69e142bdecf7.png)

今回、「予測確率_Daytime plan」を平均で表示させるため、行に表示された「予測確率_Daytime plan」にカーソルを合わせたら右クリックをして、「メジャー」、「平均」の順で選択します。
そうすると、下記の画像のように「州」ごとの「予測確率_Daytime plan」が平均値で可視化されます。

![datarobot-tableau_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/aeeca75a-437c-deca-6c75-2e36a9fa21ec.png)

このままだとまだ少し見にくいため、地図上で可視化をしていきます。
まず、右上の「表示形式」から上から2行目、左から2列目の地図のアイコンをクリックすると下記の画像のように表示されます。

![datarobot-tableau_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/69f48449-939b-55f2-1371-3f78c6c04152.png)

しかし、まだどこの地図情報なのかを認識できていないため、設定をする必要があります。
地図の右下の「40ヶ所不明」をクリックして、「地図の編集」をクリックします。
下記の画像のように画面が表示されたら、今回扱うデータは米国を基準としているため「国/地域」を「米国」に変更して、「OK」ボタンをクリックします。

![datarobot-tableau_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/dd5e3a2f-b1a0-51ea-4c28-ce21563d0185.png)

下記の画像にようになりましたでしょうか？
まだ地図上の色の表示が分かりにくいため、色の設定を変えていきます。

![datarobot-tableau_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/bc81bb94-8522-15c1-9430-dcefb743a6c3.png)

画面の右の欄にある「平均（予測確率＿Daytime Plan）」から「色の編集」を選択します。
色を変えるため、「パレット」にある「自動」から今回は「オレンジ-青-白の分化」を選択して、反転にチェックを入れます。
次に色のグラデーション具合を変えるため「詳細」から「開始」を0、「終了」を1、「中央」を0.5に設定して、「OK」ボタンをクリックします。

![datarobot-tableau_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/18b43d32-7d97-7fb9-9f85-3d36fdb1f53f.png)

そうすると、下記の画像のようになります。先ほどと違い確率が0から1の範囲で可視化され、とても見やすくなりましたね。

![datarobot-tableau_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/3693eeba-635c-b7ac-81d9-1a21876fe06c.png)

# 6.終わりに
このブログでは、DataRobotを使ってデータの読み込みから、機械学習モデルを自動的に構築しました。次にTableauを使って予測結果とテストデータの結合、および可視化を行いました。今回デプロイしたモデルはリーダーボードの最上段のものでしたが、他にも様々なモデルが精度や予測速度別に作成されているため、確認してみてください。Tableauでも地図以外に円グラフなど、用途によって可視化方法も工夫できるため、ぜひ使ってみてください。

スキルアップAIは日本初の[DataRobot AI 教育パートナー](https://www.datarobot.com/jp/partners/education-partner/)であり、DataRobotに関連する講座として「[現場で使えるAIプランニング・プロジェクト推進基礎講座（DataRobot活用編）](https://bit.ly/3f5fmjz)」を提供しています。こちらはAI活用におけるプロジェクト推進を体系的に学び、加えてPoCフェーズをDataRobotで体験することができる実践的な講座となっています。是非受講をご検討ください。
今回はモデルの作成にDataRobotを使用しましたが、同じく AutoML サービスとして Google Cloud の BigQuery ML を使用し、Tableauを使って可視化した事例も公開しています（[SQLだけでモデルが作れる！BigQuery ML による自動モデル作成と Tableau による可視化](https://qiita.com/skillup_ai/items/f6be1d47b6b6928613f2)）。是非こちらの記事もご覧ください。
今回の記事の内容は、毎週水曜日の夜に実施している無料の勉強会「スキルアップAIキャンプ」の第40回「[DataRobot によるモデル構築～デプロイの流れを体験してみよう](https://www.skillupai.com/skillupai-camp/)」で紹介した演習を元にしています。スキルアップAIキャンプでは、この記事のような実践的な内容を無料で提供しています。こちらも是非参加をご検討ください。

# 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)
スキルアップAI公式YouTube AIビジネスチャンネルは[こちら](https://www.youtube.com/AIBusinessChannel)