SalesforceのAIにタイタニックのデータを分析させてみた

#SalesforceのAIにタイタニックのデータを分析させてみた。

タイトルの通りAIにタイタニックのデータを分析させてみましたので、メモ代わりに記録を残しておきます。

## SalesforceのAI :Einsteinに関して
SalesforceのAIと言ってもデータ解析だけでなく、画像系や、言語系など多種多様なサービスがあります。
ただし総称はすべて「Einstein　〇〇」と呼ばれているのでちょっとわかりずらいです。

コンセプトとしては、

- データサイエンス向けではなく、ビジネスユーザーでも簡単に使うことができる。
* Salesforceプラットフォームと密な連携が可能。

である事です。
そのため、分析のエキスパートがいなくても簡単にAIを業務に組み込めるようになっています。

##Einstein Discovery
今回使用したAIはEinstein Discoveryと言うサービスです。
Salesforce内外のデータをアップロードして、目的を指示すると、関連するパラメータの組み合わせを自動的に解析して「ストーリー」を作成してくれるAIになります。

作成されるストーリは、結果だけでなく、背景にある理由も説明してくれます。

また、ストーリはモデルとして使うこともできるので、それを元にSalesforce上に予測をすることも可能です。

##今回使用するデータ
データは[kaggle](https://www.kaggle.com/ "kaggle")から[タイタニック](https://www.kaggle.com/c/titanic/data "titanic")のデータをダウンロードして使用しました。

ダウンロードデータは「学習用」と「答え合わせ用」の2つがあります。
学習用データでモデルを作成し、答え合わせ用データに当てはめ、結果を得る流れになっています。

2つのデータはフォーマットはほぼ同一です。ただ学習用データには、その人が生存・死亡したカラムが含まれています。
答え合わせ用のデータにはもちろん含まれていません。

ですので、学習用データから如何に質の高いモデルを作成して、答え合わせ用のデータに当てはめて的中率を競うのが[kaggle](https://www.kaggle.com/ "kaggle")に参加する人の目的になっています。

##データおさらい

学習用のデータですが、このようなフォーマットと内容になっています。
（※元のデータは英語ですが、わかりやすいようにカラム名や内容を日本語化しています）

![data.png](https://qiita-image-store.s3.amazonaws.com/0/260655/2cbaf3c7-d962-6cbd-c93a-83ac4cb716c1.png)
タイタニック号の乗客データ、一人一行です。
個人の名前から性別、年齢、乗客クラスや料金、同乗した兄弟や親子、生存したかどうか？などの情報が含まれています。
このCSVファイル使ってDiscoveryで使用しました。

ちなみにデータが保存されるのはSalesforceのオブジェクト内ではなく、Discovery専用の領域に分析に適した形で保管されます。
そのため大量データを扱う場合でもパフォーマンスが劣化しにくくなっています。
ちなみにDiscoveryで扱える最大行は2000万行です。。。
これを多いと見るか、少ないと見るかは人によりますが、通常のビジネスデータであれば十分だと思います。

##ストーリー作成
データをアップロードするとデータセットになります。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/fc117359-1671-334a-ade3-c8265cbc7bd6.jpeg)

その後、「ストーリーを作成」をする事により自動分析が始まります。

##目的の設定
分析を自動的にやってくれるAIですが、
2つだけ設定が必要です。

一つ目は、最初に分析の目的を与えます。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/86a30821-d80d-15af-8c35-cc970ed4f36a.jpeg)
「I want to」に何を目的とするか？また「The variable」にどのカラムを対象とするか設定します。
今回は生存した乗客が最大限になるためのストーリーが欲しいので「I want to」に「Maximize（最大化]、
「The variable」に「生存フラグ（生存）」を設定しました。

生存率が最大になるようなストーリーを作成してもらいます。

##使用パラメータの設定
2つ目の設定ですが、目的にどの項目が関連するのか？です。

ここでは「乗客ID」は生死に明らかに関係なさそうなので、チェックを外しています。
それ以外の項目は全部使ってストーリを作成してもらいます。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/0614a273-d5de-370f-bff9-da9249f14812.jpeg)

###分析中。。。
しばらくEinstein君の分析終了を待ちます。
今回のデータは900行程度ですので、それほど時間はかかりません。
この間にEinsten君は様々な切り口で生存に関わる情報を分析してくれています。
![WS0000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/5193cc31-8394-86d1-0d60-cd1d126c5e38.jpeg)

##ストーリができた！
結果が表示されました。重要なのは、ここまで一切データ処理や分析っぽい事をしていません。
CSVファイルをアップロードして目的を設定しただけです。

それでは、結果を見てみましょう。

###性別が一番重要！
結果は説明とグラフのペアになっていて、関連が一番高いものが最初に表示されます。
そして、下にスクロールすると次の説明を見ることができます。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/5b64bc64-fe4b-b966-3dc6-0c3a37ca289b.jpeg)

結果として一番重要だったのは性別で30％以上は性別で説明できるそうです。
女性だと生存確率が高く、男性は低いです。
グラフを見ると一目瞭然ですね。
ただ、左の赤枠の中に他のパラメータに関連した情報も表示されています。

緑の文字では生存確率が高い「女性」グループでも乗客クラスが「ロウワークラス」の場合は悪くなる。赤文字「男性」グループでも同じことが示唆されています。

このように一つのパラメータだけでなく、その中のサブグループに関して異常値がある場合に指摘してくれるのが嬉しいですね。

###若い男性
先の説明では「男性」だと死亡率が高いという結果が出ましたが、「男性」グループの中でも特別に生き残るグループがあります。

それは「年齢が16歳以下」という条件です。
それ以外のグループに対して驚異的な生存率を誇ります。

逆に女性は16歳以下でも生存率は逆に下がっています。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/cf2cf188-0a31-c8ac-606f-69673b4ab178.jpeg)
###乗客クラス
次に出てきたのは乗客クラスです。
乗客クラスが「ロウワークラス」の場合は男女ともに生存率が低いです。
注目すべきは、「ロウワークラス」と「その他のすべてのクラスのグループ」を比較した結果として表示されている点です。

実はデータ上は「ミドルクラス」も「アッパークラス」もそれなりの生存率で、「ロウワークラス」だけが異常に低いのです。
人間でも全カテゴリー間での比較はよくやりますが、カテゴリをグルーピングして比較するのはすごく手間がかかります。
その辺を見抜いて２カテゴリー化してくれる辺り、なかなかやります。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/7008d820-dcad-244a-f1da-f527bd879dd0.jpeg)

###親か子が同乗していない男性
ただでさえ生存率が少ない「男性」ですが、「同乗している親と子」が0人の場合は更に下がります。
女性はそうでもないというか、逆に上昇傾向があるみたいですね。
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/799eb076-a421-9620-ac05-fb28dc2e4b4b.jpeg)

###料金
乗船クラスとも関係ありそうな気はしますが、乗船チケットの値段に比例して生存率は上昇しています。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/1bf7a837-ff1f-e2dd-4a8f-866e4a5a896c.jpeg)

###乗船地と料金
乗船地がクイーンズタウンで料金が7~8ドルだった場合は生存率が高いという説明ですが、
これはノイズでしょう。たまたまそのようなグループが生き残り傾向が出てしまったのだと思います。
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/05f5eab7-1ff2-a8da-da2a-2c1de375c3c3.jpeg)
ただ、実際にはこのようなデータをノイズとして無視するのではなく、
なぜこのような外れ値が発生したのかを考察するのは非常に重要です。
データ分析において大事なのは「全体の傾向をつかむ」のみならず「外れ値にフォーカス」し、原因を追究する事も必要だからです。


その他、かなりの量の説明が出てきます。
ただ、下に行くに従い説得力が落ちてくるので、今回はこの程度にしたいと思います。

見ていただいてわかる通り、データを色々な角度から分析してくれています。
これを人間でやろうとすると、かなり時間がかかります。
そもそも分析できる人間も限られてくるので、AIを使った解析というのは、ビジネスユーザーに対しては非常に有難い存在となりそうです。

#分析結果を元に生死を予測
今回Discoveryが分析した内容はモデルとして保存されています。
これをSalesforceのオブジェクトに適用して、結果を予測することができます。

###モデルのデプロイ
一般的に作成したモデルを業務に組み込むのは、かなりハードルが高いのですが、この辺はプラットフォームが統一されているため非常に簡素です。
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/fd24e55c-51e9-6b1d-3c39-f277c4487d93.jpeg)

###パラメータ設定
モデルをデプロイすると、まずどのオブジェクトに対して適用するか設定します。


今回は「タイタニック乗客」というオブジェクトを作成してKaggleからダウンロードしたテスト用のデータをインポートしています。

なので、カラムマッピングは同一名称のものを当てはめます。
一応説明しておくと、左がDiscoveryがストーリを作成する際に使用したデータセットの項目名で
右が予測したいオブジェクトの項目名になります。
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/013be372-aa49-beb7-8266-e96aa5ed8c65.jpeg)
あとは、予測用の項目を追加するなど多少の作業は必要ですが、これだけで完了です。

##タイタニック乗客
タイタニック乗客リストです。こちらはテスト用のデータです。
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/bec9cc37-0a9e-9ff6-deef-9774427facf5.jpeg)

###乗客詳細を表示
それでは予測結果を見てみましょう。「ロウワークラス・男性・35歳」とかなり条件が厳しそうです。
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/0f006d40-eb40-0097-a01d-be708743c6a6.jpeg)

##予測結果の表示
右側に表示されているのがDiscoveryの予測結果です。
この方の場合は予想通りかなり厳しめな結果となっています。
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/330792df-4410-98eb-761d-2b5e59e4a44a.jpeg)

##もし女性だったら
この予測はリアルタイムで再適用されます。
例えば性別を「女性」に変えたらどれくらい生存率が上がるでしょうか？
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/983e8d57-5990-207f-5698-eab41176b79c.jpeg)

###再度予測される
予測生存確率は70%を超えました。
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/6510d5c3-60f9-574b-733a-116d15ff0fed.jpeg)

ついでに乗客クラスも「ミドルクラス」に変更してみると生存率は85%を超えてきます。
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/260655/099ac0c3-fc50-a97e-0770-cb9e24147090.jpeg)

##まとめ
Einstein Discoveryを使ってデータ分析をしてみました。
データの前処理やグラフ作成に時間を使わず、結果の解釈だけに集中できるので（本来の人間の仕事です）かなり楽です。

予測に関しては実際には変更できるパラメータは限られると思いますが、
営業現場などで

- 「この安全装備をつけていただければ、事故の際の助手席の生存率が〇パーセント上昇します」
- 「この製品を追加で購入していただければ、割引率を〇パーセントにすることができそうです」

などの提案がその場でできると面白そうですね！

###予測ビルダー
ちなみにEinsteinには予測ビルダーという似た機能があります。
こちらはストーリーは作成してくれませんが、より簡単に予測を実装できるサービスになっています。
記事にもなっているので合わせてご覧ください。
[SalesforceのAIにタイタニックのデータを分析させてみた（予測ビルダー編）](https://qiita.com/az-ak/items/5dd711535093b5e849ef "SalesforceのAIにタイタニックのデータを分析させてみた（予測ビルダー編）")


###Trailhead
興味がある方はSalesforceのE-learningサイト[Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/wave_analytics_basics/wave_start_surfing_the_wave "Trailhead")からEinstein Analytics/Discoveryの使える環境が取得できるので、そちらでもお試しできます。