Dataiku社営業マン(文系ノーコーダー)が金融データ活用チャレンジに挑む！（分析プロセスご紹介）

# はじめに
Dataiku社の（データサイエンスができるようになりたい）営業マンの中村([Linkedin](https://www.linkedin.com/in/yuki-nakamura-33097aaa/),[X/Twitter](https://twitter.com/YNdatahaiker))です。DataikuはAIの民主化を謳っており、文系ノーコーダーの私でもできるんだぞ！ということを証明するために参加させて頂きました。今回コンペ参加は2回目となります（初回はSMBC Group GREEN×DATA Challengeで105位とメダルに届かずでした（泣））

そんな私なんかがおこがましいですが、暫定スコアで0.69以上が出たので、どのようにこのコンペに取組んだかを記載致しました。

（追記：最終順位は129位に終わりました。上位10％くらいでしょうか。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/67d333a3-f18a-2df3-a3ab-913dff17d8fb.png)

コンペ全体の総括をこちらのブログにまとめましたので、こちらも併せて御覧ください。( **[FDUA金融コンペで垣間見えたDataikuへの高いニーズと強いモメンタム](https://qiita.com/yukinaka_data/items/a5cfb931a72cb9373082))**


#### 作成したフローはこちら
（※下側がTrainデータの加工、上側がTestデータの加工です。同じ工程ですが、ルールの都合上わけています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/7668af35-03df-f8aa-66ca-6f6985b328ac.png)
（本当は[【FDUA】第二回 金融データ活用チャレンジにDataikuを活用して参加してみる。](https://note.nesic.co.jp/n/n2e27d3cd43c0)のフローようにZONEで色分けして整理したかったのですが・・・）

# Dataikuとは？
今最も勢いのあるデータ分析/AIのプラットフォーム製品です。データサイエンティスト、データエンジニア、データアナリスト、ビジネスユーザーがコラボレーションできるようノーコード、ローコード、フルコートで使え、分析プロセスのEnd to Endをカバーします。（[Webページ](https://www.dataiku.com/ja/)）

企業で導入検討されたい方は私までご連絡くださいね！


# 目次
1.EDA
2.前処理
3.特徴量生成
4.欠損値処理
5.ML
6.デプロイ
 

# 1. EDA
まずはEDA（探索的データ分析）、要はデータを理解すること！いくつかあるデータの可視化機能を使って、探索的にデータを理解していきます。


下図の通りNull値があるデータがいくつかの列で確認できますし、Signateサイトのデータの説明にないもの（Y/N以外のもの）も散見されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/1a0c6ae7-5a8b-73cc-1ebd-ab8839839ba7.png)

インタラクティブ統計機能(Statistics)で貸倒れした場合の傾向が現れていないかも確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/f7b0b489-39b2-bbb3-f48a-e096c7af1ea3.png)

もう少し自分の考える軸でデータを理解したいときはChart機能を用います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/278a5b8b-4fd1-4373-3e82-9e914e855c20.png)


# 2. 前処理
このあたりはチャチャチャっと。Dataikuが自動で「これやっときます？」的に提案してくれるので、クリック操作だけで完了させます。
（ご参考：[Dataiku初体験: 新人データサイエンティストが見た可能性とは？](https://qiita.com/yasudaM/items/bee652827df0660adc14#dataiku%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D)）

行ったのは主に下記２つだけです。
+ 日付型に変更
+ ＄と金額をSplit


そして、ここで問題になるのは、欠損値（と考えられるもの）をどうするか。
RevLineCrやLowDocにはYとN以外に、Nullとか０とかCとか・・・これにはどんな意味があるのでしょう？　しかもRevLineCrはY/N以外が約15%、LowDocには約6.4％、無視できない比率です。

Chart機能で、それぞれのMIS_Statusを確認すると、その比率はマチマチで、これを１つに纏めるのは少し怖い。なにかしらの意味があるのではと考え、このまま扱うことにしました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/abd6a1d9-5354-a09a-c7a3-9c0730b3c6a8.png)


# 3. 特徴量生成
実際に下記４つの手法を使って特徴量生成を行ってきました。

### a(1). Prepare Recipe(準備レシピ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/217fc98d-0b74-80c6-dc38-851944bf0ac7.png)

+ StateとBank Stateは同じか？（TRUE or FALSE)
+ Aprroval DateとDisbuesement Dateの日数差

これもプロセッサーを使った簡単な処理です。

### a(2). Window Recipe

例えば、タクシーの経費を簡単に承認してくれる上司と、なかなか渋い上司といますよね。
そんな感覚で銀行の支店長の考えで審査に甘いところとそうでないところがあるのでは？という仮説のもとWindowレシピを使って支店(FranchiseCode)ごとのMIS_Statusの0と1の比率を取りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/c5438cbc-a23f-c6bf-678a-21ac22cf4090.png)




### b. Python Recipe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/edf634de-941b-b385-487f-c6e7e90963cd.png)

Dataikuは”ノーコード”に注目されがちですが、コーディングもできるのです。
そして私はコーディングできませんが（ﾄﾞﾔｯ）、今はChatGPTが代わりに行ってくれるのです。

Sectorの番号をSignateページに記載の業種を割り当てました。（31〜33が製造業というように、複数の番号が同じ業種を意味するものがあったためです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/a8658e75-6f31-f4b1-1d09-fa5df248df3b.png)

### c. LLM Recipe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/f7f9567a-bc26-3228-fdd1-5aabe6133abc.png)

上の作業で業種名を割り当てました。これらの業種を成長した業種(1)、あまり変化ない業種(2)、衰退した業種(3)に分類分けみようと考えました。そこで利用したのがLLMレシピです。

LLMを選択し、対象の列を選択し、プロンプトを作成しました。
作成したプロンプトはこちら
『_米国で1989年から2011年の間で成長した業種で成長した業種は1、あまり変化がない業種は2、衰退した業種は3を返してください。不明な場合は0を返してください。数字のみで返答してください。_』

これで成長したかどうかの特徴量が生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/a4f5c6f5-3dc7-9ba4-5c01-12327b4995e0.png)

ちなみにDataikuは様々なLLMと連携できるようになっています。Custom LLMを選択すれば、国産LLM（NTT社のTsuzumiとかソフトバンク社か開発しているもの等）とも連携できる仕様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/b944fccd-fab9-c821-d76e-169b3f40bb15.png)




### d. Plugin（Geocoder)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/d7cbc566-b372-1dea-f42e-b099672b0bed.png)

Stateのデータを使って緯度経度の特徴量も算出しました。
（なんとなく、気候がいい地域は審査ゆるそうとか、お金返さない人が多そうとか、そんなことあるのかなぁって考えました笑）

デフォルト設定でない機能はPlug-inで追加できます。
今回は[Geocoder](https://www.dataiku.com/product/plugins/geocoder/)のPluginをワンクリックでインストールしました。Stateを指定し、実行するだけで緯度経度を出してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/fc11acc4-09c7-1661-842a-e2534e162b09.png)

# 4. 欠損値処理
上記の前処理のパートで記載した通り、RevLineCrやLowDocの欠損値処理は行わずそのままのデータとして取り扱いました。しかし、、DisbursementDateに150件（0.4%)にNull値があり、これを埋めることで予測精度が上がるのではと考えました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/dafe4aa3-b3a1-c96b-e8a2-ea97bb92b1bd.png)

これを予測するために、Aprroval DateとDisbuesement Dateの日数差をAutoMLで予測し、Disbuesement Dateの予測を行いました。（高い精度はでなかったですが。。。）「

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/8d41fc0b-ea6c-ba21-6eca-b2cacdad9abc.png)

# 5. ML
分析のプロセスのほとんどがデータ理解とデータ加工と言われていますが、本当にその通りです。“Garbage In, Garbage Out”（ゴミを入れたら、ゴミが出てくる）ですから、ここまでのプロセスが非常に重要でした。ここまできっとやっと機械学習です。


### a. AutoML

モデル作成にどの特徴量を入れるか入れないか、数値としてかカテゴリーとしてか、Null値はどう処理するか？などをクリック操作でハンドリングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/8d7f339e-feaf-0f90-c732-b475069245f7.png)

アルゴリズムを選択し、ハイパーパラメーターを調整し、学習をスタート。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/2cc2b5a3-fec2-23de-89c2-d327f762ac59.png)

### b. 説明性

精度が高いモデルの特徴量の重要度（Valuable Importance）を確認し、さらに理解を深めます。
下図は左がRandom Forest、右がLASSO LARS。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/74cc34af-91b3-33ca-e390-f3c9fe1a203a.png)

### c. アンサンブル

上記説明性のパートの図であることに気付きます。Random ForestもLASSO LARSのどちらも高い精度が出ているのですが、それぞれ効いている特徴量が異なります。精度は高いが傾向の異なるこの２つのモデルのアンサンブル（平均）を作りました。

# 6.デプロイ

デプロイし、MIS_Statusの0の比率が8.5くらいになるように閾値を調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/7e1a0c8b-0d48-7c07-a76b-80d58267a719.png)

これでSubmitして完了！

# さいごに
今回のコンペを通してたくさん勉強させて頂きました。本来業務でも同じように、データが汚かったり、本当に必要なデータが入手できなかったり、様々な障壁があるなかでデータを使って意思決定をしなくてはいけない。そういう意味ではとても実践的な内容でした。今後も皆様と一緒に学んでいければなと思います。また次回も楽しみにしています。