SalesforceのAIとTableauで最適化問題を解いてみる

今回はSalesforceのAIとTableauを使って**完全ノーコードで最適化問題**に挑戦してみます!


##最適化とは？
最適化の目的は**結果を最大化するための最適な条件**を探し出すことです。

例えば原価80円のパンを100円で1000個販売している場合、(100-80)x1,000=20,000円の利益が出ます。
条件を変えてパンを90円で販売する場合は2,000個売れれば同じ利益になります。120円で販売する場合は500個売れれば同じ利益が出ます。

ただ、90円で販売した場合1500個しか売れないかもしれないですし、120円にした場合でも800個は売れるかもしれません。

いくらで販売した時に利益が最大化するのか？に関しては、設定価格に対して販売個数の仮説を立て、ベストな価格を決定することが出来ます。

ただ、外部環境は一定ではありません。天気や周りのイベント状況、実施しているキャンペーン等で訪問顧客数も変化しますので、様々な条件を元に判断したいというのが課題として発生します。

最適化を実現化するための手法としては大きく分けて**目的関数の解を求める方法**と**逆問題を解析する方法**の2つに分けられます。

**この目的関数、仮説を元に自分で作成する事もできますが、今回はAIを使って過去データから導き出します。**

###目的関数の最大化/最小化による最適化
1つ目は目的関数という目標値を算出するための関数の最大化です。
例えば y=ax+b のような式があり、yが最大／最小化するようなa,x,bの組み合わせを見つける方法です。
この手法では最適な解の組み合わせが見つかります。
ただし、a, x , b の組み合わせに複雑な相互条件が存在すると、条件を変更して複数回実行する必要が出てきますし、条件の取り得る範囲を把握するのは困難です。

###逆問題解析による最適化
2つ目の手法はa,x,bの値をランダムに発生させ、その組み合わせを関数に入力し、yを取得します。
これらを無数に繰り返し、パラメータの組み合わせの中から、実現可能な組み合わせを見つける方法で、逆問題と呼ばれたりします。

この逆問題は**ある程度の制限下でどの条件が最適か**を見つけ出すのに向いています。
例えばいろんな気候条件での来店客数をランダムに発生させておいて、ある天気や気温での来店客数を最大化する条件を見つけたり、
製品の配合や製造条件を変更したときの物性や品質の変化δを見るような時にも使えます。

今回はこの逆問題を使用して
SalesforceのAIであるEinstein Discoveryで作成した予測を元に、Tableauで自分の希望する条件で絞り込んで分析したい思います。

##全体の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/97c63c26-b2fd-c502-1382-2674c5933f5a.png)
ざっくり下記の流れです。
1.Einstein Discoveryを使って機械学習モデルを作成
2.Tableau Prepでランダムデータを作成
3.1で作成したモデルで 2のデータに予測値を追加
4.Tableauで条件を変更してWhat if分析

##Einstein Discoveryを使って機械学習モデルを作成

SalesforceのAIであるDiscoveryを使用すると特別な知識無しでも、クリックベースでAI分析が可能です。
今回は以前使用したタイタニックの乗客データを元に作成したモデルを使用します。

[モデルの作成に関しての記事はこちら](https://qiita.com/kiura30/items/a8268253d51db0ebbc31)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/700422f3-4de6-2348-dbb0-56a74cbfcda2.png)

予測分析を行う場合は、予測精度（モデルの予測がどれだけ信用できるか？）には注意してください。信頼性の低い予測は参考になりませんので、精度が低い場合は、まずモデルをブラッシュアップしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/c7fd3d43-cbba-a6a9-8c76-e2ba57675cad.png)

今回はAUCで0.86という非常に高い値が出ているので、このモデルで予測したいと思います。

##Tableau Prepでランダムデータを作成
今回は最適なデータの組み合わせを見つけるのが目的なので、データは均一に発生させます。
パラメータとしては「性別」「乗船地」「同乗した兄弟配偶者数」「同乗した親と子の数」「乗客クラス」「年齢」です。これらを組み合わせたデータを作成します。Excelのシートにそれぞれのデータを記述します。このときBの列’Key’がすべて’A’になっていることに注目してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/72f3ae79-7c85-9304-707c-ea9e3ef199dc.png)

###Tableau Prep Builderでデータ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/cffab8b4-c8f2-2eba-202d-e2c7fb3db0a7.png)
これらExcelシートをTableau Prepを使用してKeyの列をキーにしてJoinします。するとすべての列の掛け合わせたデータを発生させることができます。

「性別」 2 x 「乗船地」 3 x 「同乗した兄弟配偶者数」 7 x 「同乗した親と子の数」 7 x 「乗客クラス」 3 x 「年齢」 84 = 74088通りの乗客パターンが発生出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/13b30302-9153-55de-827a-48f9289cde72.png)

今回は発生頻度は気にしていませんが、年齢や男女比など、分布を作りたい場合はNormInv関数を使用すると分布を作れます。こうすると顧客ポートフォリオの変化による収益の影響なども見れますよね。あまり条件が複雑になって来る場合は勿論ExcelよりRやPythonの方が向いていますね。。。

## Einstein Discoveryで予測
Einstein Discoveryの予測をそのままTableau Online上に保存することも出来ますが、
今回はTableauサーバーを経由しないでデータをダウンロードする方式でご紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/e13652c4-4a4d-c608-c218-1484da468e09.png)


####CSVファイルをDiscovery上にアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/f69eef0d-eb0c-7a2f-5ba1-e643541a60c9.png)

####レシピを使ってDiscoveryオペレータを使用して予測を付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/22b8a6a0-bf10-d8ea-0ad0-f37608756f10.png)
####CSVデータと予測に使ったデータセットの項目紐付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/02ad1ef0-5cf5-8468-418f-0f1eed3301d5.png)

この時Discoveryの予測オペレーターのオプションで「上位の予測因子」「上位の改善点」を指定すると、
予測だけでなく予測値に影響のある要素と改善に効果がある要素も付与してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/2fc5bdc2-6ec4-1347-a077-9f1b13696101.png)

プレビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/16bb3dbb-509f-ee06-626b-0c647d92afd6.png)
####実行するとデータセットが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/17b95fac-e784-012a-fae0-74d191835e84.png)

####データのダウンロード
データセットを開いてテーブル形式で表示します。その後「共有」から「Excel形式でダウンロード」を選択します。
ここで気をつけたいのが、規定だと１００行のみExport対象になっています。行数を増やしたい場合は「クエリモード」からLimitの行数を増加して「クエリを実行」する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/ccd01647-49d3-df46-58f0-2e0c4bb18517.png)

####共有からExcelファイルの取得
クエリ実行が準備出来たらいよいよデータをエクスポートしていきます。「共有」から「Excel形式でダウンロード」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/760dab85-8e80-588c-f447-b060136e173d.png)

##Tableauでの可視化分析
これで予測を含むランダムデータが準備出来ました。
これを元にTableau Desktopで可視化してみます。

[Tablea Publicはこちら](https://public.tableau.com/shared/8W2P4DRTH?:display_count=y&:origin=viz_share_link)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/d5a09cea-755c-b17c-e024-ec4f26d6afeb.png)

####一番生存率の高いグループ
平均生存率が４２％くらいなのに対して、一番生存率の高いグループは９４％です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/21c06342-54ff-088c-b8d5-88c2fc9329b9.png)
そのグループの属性ですが、「女性」で乗客クラスが「ミドルクラス」「アッパークラス」の人が多いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/4071a44d-adb4-21ca-0887-67d8bb576a1f.png)

####生存率の悪いグループ
逆に条件の悪いグループ内で最大限の結果を出すにはどのような条件が必要でしょうか？
「男性」で「アッパークラス」以外の条件にすると生存確率は１６％と低くなります。
この条件下で高い生存率を出している人がいれば、その原因と全体的な改善方法を見つけましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/df375b3f-94e3-ae28-c4bb-7614f4a1b899.png)
その中でも６８％以上の生存確率を出しているグループがあるのでこちらを選択すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/4d46c404-9d74-e51d-db24-8b6c1a0ea538.png)

乗船地、シェルブールでミドルクラスの人が多いですね。グラフには含まれてないですが、年齢が１５才以下というのも影響度大きいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/f15b9d81-0c09-b7ae-4e09-38a1c4b652fd.png)
あと、右下にある改善方法ですが、クラスをアッパークラスに変更したり、同乗した親と子の数を１にする（これは０から１にするのか、２以上から１にするのか？もう少し見てみないとわからないですね）などが選択肢として表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/e26715fe-4bf8-a6aa-592a-7282f254eec7.png)

##まとめ
いかがでしょうか？Einstein DiscoveryとTableauを使用してノンコーティングでの最適化分析のやり方をご紹介しました。
このような条件変更時のWhat if分析、またAIとBIを組み合わせた分析手法というのはこれからもっと多くのニーズがありそうな分野だと思います。
是非、皆さんお手持ちの課題でチャレンジしてみてください！