社会人3年目が流行のローコードツールを触ってみてデータサイエンティストの今後について考えてみた件



## 1.はじめに   
こんにちは！
この記事は，NTTドコモ R&D Advent Calendar 2021カレンダー2の20日目の記事です．
NTTドコモサービスイノベーション部で働いております橋本です．   
[前回の記事](https://qiita.com/dcm_hashimotos/items/055a3b0b41e5f375415b)を書いてから，もう1年も経ってしまったなんて驚きです．   
気づいたら社会人3年目になっていました．私の体感ですが，3年目にしてやっと仕事に慣れてきたな〜という感覚です．
自分の業務ももちろんですが，最近は後輩の方と一緒に仕事をしてフォローする側に回ったり，少しずつ新米感が薄れてきているかなと思う今日この頃です．

もうすぐクリスマスですね！   
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/c6337bf1-6d1b-22cc-6703-7e6a469d72c6.png" alt="christmas_party_animal.png" title="クリスマス" width="300">
</div> 
昨年度は私がデータ分析業務に従事して得た知見について記事を書かせていただきました．   

今年は2020年~2021年の機械学習のトレンドから，no codeやlow codeについて少し触れてみて，今後データサイエンティストが必要なスキルや，データサイエンティストとして生き残るにはどうしたらよいのか?考えてみようと思います．   
皆さんもこの記事を読んでみて，ぜひ今後について考えてみてください！！

なお，本文の構成は下記になります．
思ったより4.PyCaret触ってみたのところが長くなってしまったので，本編で触れたかったどんなスキルが必要か？の考察について気になるかたは6章まで飛ばして読んでみてください！

[1. はじめに](#1はじめに) 
[2. データサイエンティストとは？](#2.データサイエンティストとは？　) 
[3. NoCode開発やLowCode開発とは？](#3.NoCode開発やLowCode開発とは？ ) 
[4. PyCaret触ってみた](#4.PyCaret触ってみた) 
[5. PyCaretを使わないとどれくらいのコーディング量になるのか？](#5.PyCaretを使わないとどれくらいのコーディング量になるのか？)
[6.どんなスキルが必要なんだろう？](#5.どんなスキルが必要なんだろう？)
[7.まとめ](#6.まとめ)
[8.参考文献](#6.参考文献)

## 2.データサイエンティストとは？　
一言でデータサイエンティストと言っても，様々な業務に携わっている方がいらっしゃるかなと思います．   
データアナリスト的なところの仕事をしている方や，データの可視化を行うなど，様々な業務が含まれていますよね．   
そこで今回は，データサイエンティスト協会の定義にのっとってデータサイエンティストを位置付けたいと思います．   
**「データサイエンティストとは、データサイエンス力、データエンジニアリング力をベースにデータから価値を創出し、ビジネス課題に答えを出すプロフェッショナル」** のことです．   
データサイエンティストとして必要なスキルは，データサイエンティスト協会で下記のように定められています．   
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/7ce6e4a1-cbc6-b760-a19b-af130a89bc96.png" alt="skill.png" title="スキル" width="500">
</div> 

なお，上記の図は[こちら](https://www.datascientist.or.jp/symp/2021/pdf/20211116_1400-1600_skill.pdf)から引用させていただいております．   
2021年11月にスキルチェックの第四版が公開されているようですので，気になる方は見てみるとよいかもしれません．   


## 3.NoCode開発やLowCode開発とは？   
文字通り，
NoCode開発とは**コーディングをすることなく，GUIを通した（マウス操作などにより）アプリケーションやプロセスを構築するソフトウェア開発手法**
LowCode開発とは**従来のコーディングから遥かに少ないコーディングでアプリケーションやプロセスを構築するソフトウェア開発手法**のことです．   
文字だけではどんなものかイメージしづらいと思ったので，NoCode開発の一つであるScratchの開発画面を置いておきます．
左側にあるタブから，動きや背景を設定し動かすことができます．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/fea460e9-2584-d1c6-b409-7871fec569b6.png" alt="scratch.png" title="スキル" width="500">
</div> 

記事によっては，NoCode開発では，GUIでの操作開発によりプログラミングが全く必要なくなるので，ビジネスユーザを対象としており，LowCode開発では技術者を対象としているという違いがあると記載されているものもありました．   
どちらも，**従来のプログラミングが必要でなくなり，開発のハードルが大幅に下がる**という点は同様です．   
ここでは，本題からずれてしまうので違いについての詳細は割愛します． 

それでは，NoCode・LowCode開発が広がることによるメリット・デメリットはなんなのでしょうか？
ここでは，これらのツールのメリット・デメリットについて記載しておきます． 

NoCode開発・ LowCode開発のメリット 
1.  コーディング量が少なくて済む
2.  生産性向上・開発スピード向上
3.  開発サイクルの短縮
4.  理解が簡単になる

NoCode開発・ LowCode開発のデメリット
1.  柔軟性が失われる
2.  セキュリティ観点
3.  異なるプラットフォームへの切り替えが難しくなる

意外にもNoCodeの歴史は昔からあるようで，1980年代あたりから既にその動きがあったようです 
近年注目されている理由は，上記のメリットによるDX推進という観点が大きいようでした．

### 機械学習界隈のNoCodeやLowCodeについて   
機械学習の部分でも，NoCodeやLowCodeが流行する流れは同様にあるかなと思っています．   

最近では，2021年12月２日にAWSからAmazon SageMaker Canvasが発表されたりと
今後も更にNoCodeやLowCode関連のツールが進化する可能性はあるのかなと考えています．   
ここでは，LowCode開発ツールに分類されるPyCaretを少し触ってみたいと思います．

## 4.PyCaret触ってみた   
PyCaretとは，[公式ドキュメント](https://pycaret.readthedocs.io/en/latest/)によると，実験サイクルを指数関数的にスピードアップし、生産性を高める，機械学習ワークフローを自動化するPythonのオープンソース，ローコード機械学習ライブラリです．


まずはインストールしてみましょう! 
以降の作業はドキュメントを参考に進めています．

```
pip install pycaret
```
PyCaretがどんなツールなのか使ってみるのが今回の目的なので，データはPyCaretで取れるものを使ってみます

```
from pycaret.datasets import get_data
dataset = get_data('bank')
```
以下のようにデータを取得することができました．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/e5336fc5-35cb-3ffc-5a47-f56f791336ba.png" alt="bank_data.png" title="データフレーム" width="800">
</div> 


get_dataでとれるデータについては[こちら](https://pycaret.org/get-data/)を参考にしてください．   
今回は分類のモデルについて予測してみるので，下記のようにインポートを行います．

```
from pycaret.classification import *
```
つづいて，取得したデータがどんなデータなのか見てみましょう！

```
exp_mclf101 = setup(data = data, target = 'deposit' ,profile=True) 
```
set_up関数によって学習する環境の初期化を行います． 
dataで学習に使うデータを，targetには正解データにするものを入れます． 
dataとtargetは必ず指定が必要で，他の引数は任意で入れることができます．   
今回はprofile=Trueを入れていますが，この引数をTrueにすることで探索的データ解析（Exploratory data analysis: EDA、以下EDAと示す) EDAの結果を表示してくれます．   
それぞれのカラムがどんな値なのかをまとめて表示してくれます．
ここでは，一部のみ切り取ってきていますが，カラム数が17個あるので，その全てについてどんなデータなのか可視化してくれます．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/4c47c1ee-9510-a68b-baf4-768665c41b4d.png" alt="profile.png" title="データフレーム" width="500">
</div> 


カラム同士の相関なども可視化して表示してくれます．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/6df8fcd3-b964-481c-45b0-678e69b4a9e9.png" alt="correlation.png" title="データフレーム" width="400">
</div> 

EDAが終わったら，下記のように記載して，モデルを比較してみましょう．

```
best_model = compare_models()
```
compare_models関数は交差検証を用いて，全ての推定パフォーマンスについての訓練と評価がなされます．   
lightgbmやrandom forestなど複数のアルゴリズムについて，訓練時間やaucなどの評価値を出してくれます．   
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/da78a46b-02ee-10a6-16d8-00b6b63d39a4.png" alt="compare_model.png" title="データフレーム" width="400">



```
lgm = create_model('lightgbm')
```
create_model関数では，モデルを訓練し，評価を行います．   
今回はlightgbmを用いてみます．


```
tuned_lgm = tune_model(lgm)
```
tune_model関数では，パラメータ調整を行います．こちらを実行することで，精度向上をしていきます．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/b5104c51-f7dd-1aa6-4df4-75b508979b38.png" alt="tune_model.png" title="データフレーム" width="400">
</div> 

```
plot_model(tuned_lgm, plot = 'auc')
```
作成したモデルについて，精度を確認してみましょう．
plot_modelを使うことで，簡単に可視化を行うことができます．
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/ad77b118-444d-553a-9d5a-92df2453c8de.png" alt="auc.png" title="データフレーム" width="400">
</div> 

```
interpret_model(tuned_lgm)
```

また，shapの値も簡単に確認することができます！
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/8698462d-366f-450d-f992-4f09f3ebb09a.png" alt="shap.png" title="データフレーム" width="400">
</div> 

#### 触ってみた感想   
ドキュメントを見ながら，簡単にモデルを作成し，精度の検証まで行うことができましたね！   
わずか数行で，モデルの作成から検証，可視化まで行うことができました。   
日頃データ分析をする中でモデルを作成して検証するフェーズでは使うことができそうです！
今後，どんどんモデルの作成・予測が簡単にできるようになっていくかなと思います．

## 5.PyCaretを使わないとどれくらいのコーディング量になるのか？
PyCaretだけでは，どれくらいコーディング量が減ったのかわかりづらいかもしれないですよね．
そこで，PyCaretを使わない時のコーディング量を確認してみましょう！
(※各セルが長いものは折り畳んで表示しているので気になる場合はクリックしてどのくらいのコード量か確認してみてください)

PyCaretでは，EDAはわずか一行で行うことができました．

```
exp_mclf101 = setup(data = data, target = 'deposit' ,profile=True) 
```

まずそれぞれのカラムについて調査する必要があります．
それぞれのカラムにnullがあるかどうか確認してみましょう！

```
dataset.isnull().sum()
```

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/b9355f06-999e-db62-c49e-1d3f00f1c6da.png" alt="null.png" title="データフレーム" height="100">
</div> 
Nullはなさそうですね．
つづいて，それぞれのカラムに異常値などがないか，どんな値が入っているのか確認してみましょう！

```
dataset.age.describe()
```
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/036b3e93-25e3-3158-0599-5c6f10019154.png" alt="describe.png" title="データフレーム" height="100">
</div> 
ageの平均や最大最小が取ることができます．
異常な値はなさそうですね．
また直感的にわかりやすくするために，可視化してみましょう．

<details><summary>年齢の可視化</summary><div>

```
dataset['age2']='hoge'
dataset.loc[(dataset['age']<20),'age2']='10s'
dataset.loc[(20<=dataset['age'])&(dataset['age']<30),'age2']='20s'
dataset.loc[(30<=dataset['age'])&(dataset['age']<40),'age2']='30s'
dataset.loc[(40<=dataset['age'])&(dataset['age']<50),'age2']='40s'
dataset.loc[(50<=dataset['age'])&(dataset['age']<60),'age2']='50s'
dataset.loc[(60<=dataset['age'])&(dataset['age']<70),'age2']='60s'
dataset.loc[(70<=dataset['age']),'age2']='over70s'

import seaborn as sns
sns.countplot(x='age2',data=dataset,order=['10s','20s','30s','40s','50s','60s','over70s'])
```
</div></details>

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/04a5e114-5a6f-9bf9-4b8e-ca1115bb7507.png" alt="age_image.png" title="データフレーム" width="500">
</div> 
このような形でPyCaretと似たような可視化を行うことができました．
30代の人数が多いことがわかりましたね．
1つのカラムに対して，どんな値が入っているのか確認するだけでこれくらいのコード量になります．
全部のカラムに対して行おうとすると，単純計算でもこれを17回行わなければいけません．

上の方で，各カラムの相関も可視化していたので，同様に出してみましょう．

<details><summary>各カラムの相関を可視化</summary><div>
```
df_corr = data.corr()
sns.heatmap(df_corr, vmax=1, vmin=-1, center=0,cmap='RdBu')
```
</div></details>

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/1f93a156-e1da-f57f-5ea8-deb507652f65.png" alt="corr_image.png" title="相関画像" width="400">
</div> 

続いて，前処理を行います．
<details><summary>前処理</summary><div>
```
ダミー化の関数を用います
def toDummyCol(df, cols):
    df_c = df.copy()
    for col in cols:
        df_dummy = pd.get_dummies(df_c[col])
        pre_colnames = df_dummy.columns
        df_dummy.columns = [str(col) + '_' + str(pre_col) for pre_col in pre_colnames] 
        df_c = df_c.drop(col, axis=1) 
        df_c = pd.concat([df_c, df_dummy], axis=1) 
    return df_c

import numpy as np
df_model = toDummyCol(dataset, list(np.array(dataset.dtypes[dataset.dtypes=='object'].index)))
```
</div></details>

続いて学習です．
<details><summary>学習</summary><div>

```
from sklearn.model_selection import KFold, StratifiedKFold, train_test_split, GridSearchCV
from sklearn.metrics import (auc, classification_report, confusion_matrix,
mean_squared_error, precision_recall_curve,roc_auc_score, roc_curve)
train,test = train_test_split(df_model, test_size=0.25,random_state=np.random.RandomState(42))
X_train = train.drop(['deposit'], axis=1)
y_train = train['deposit']
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train,test_size=0.25, random_state=np.random.RandomState(42))
X_test = test.drop(['deposit'], axis=1)
y_test = test['deposit']
```
</div></details>

モデルを学習したら精度を確認します．

<details><summary>精度の確認</summary><div>

```
best_param={'objective':'binary',
       'metric':'auc',
       'verbose':-1,
       'learning_rate':0.01,
       'num_leaves':32,
       'tree_learner':'serial',
       'num_threads':24,
       'device_type':'cpu',
       'seed':42,
       'bagging_fraction':0.6,
       'feature_fraction':0.6,
       'is_unbalance':False}
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_valid, y_valid)
best_m=lgb.train(best_param,lgb_train,valid_sets=[lgb_eval],
                 num_boost_round=50000,early_stopping_rounds=100,verbose_eval=200)
pred = best_m.predict(X_valid,num_iteration = best_m.best_iteration)
fpr, tpr, thresholds = roc_curve(y_valid, pred)
roc_auc = auc(fpr, tpr)
```
</div></details>

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/c7ee0a30-fa0a-4789-9071-435e64f3fc41.png" alt="corr_image.png" title="相関画像" width="400">
</div> 

同様にshapも確認します．

<details><summary>shapの確認</summary><div>
```
import shap
explainer = shap.TreeExplainer(best_m)
shap_values = explainer.shap_values(X_test)
d_columns = X_train.columns
shap.summary_plot(features=X_test,shap_values =shap_values[1],feature_names=d_columns,show=False)
shap.summary_plot(features=X_test,shap_values =shap_values[1],feature_names=d_columns,plot_type = 'bar',show=False)
```
</div></details>

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/aa4612c5-f84f-579d-6b1a-4810865931e0.png" alt="corr_image.png" title="相関画像" width="400">
</div> 

PyCaretはたった一行で，全てのカラムに対して値を調査し，可視化まで行ってくれていました．
PyCaretだけだとありがたさがわかりづらいかもしれませんが，同等の情報量を出してくるには，多くのコード量が必要になりそうというのがおわかりいただけましたでしょうか？
実際に同じデータで確認したところ，PyCaretではshapの値を出すまで約10行程度でしたが，PyCaretを用いない場合は30行程度ありました．約1/3に減らすことができましたね！
今回はnullがなかったので行っていませんが，EDAの結果からnullなどが入っている場合は，値を補完する必要があります．
0埋めしたり，値によっては列の平均や中央値などで埋めたり様々なケースがあるかと思います．
今回は欠損値がないことを事前に知っていたのでEDAや前処理が少なくて済みましたが，本来はもう少しデータが汚なかったりするのでPyCaretを使わない場合は，もう少しコードが長くなるかなと思います．
一方PyCaretでは，setup関数のところで引数を指定してあげるだけでEDAや欠損値の処理対応ができるようです．
すごいですね！！！！



## 6.どんなスキルが必要なんだろう？   
今回はLowCodeライブラリの一つであるPyCaretを使って，今話題のNoCodeやLowCodeについて取り上げました．   
実際に使ってみて，とても簡単に実装ができることを確認しました．   
このようなツールを使うことで，モデルの実装のハードルは下がる可能性がありそうです．
今回試行したツールは，上記で書いたデータサイエンティストで必要なスキルの内，データエンジニアリングとデータサイエンスに跨がる領域のスキルのところで用いられるようになるかなと考えております．   
今後，NoCodeやLowCodeの動きが活発化するに従って，**機械学習知識は浅くても，特定の分野のビジネス力がある人のデータ分析の新規参入**が増えるかなと考えられます．   
そのため，モデルを作成してスコアリングする部分についてはビジネス力が高い人が行う可能性が増えそうです．   
どんなバックグラウンドを持っているかによって今後の立ち回り方は変化していきそうですが，私のほうでデータサイエンスを軸に活動してきた人の今後の方針を2つほど考えてみました．   
1.  NoCodeやLowCodeが参画できない分野での技術検証を行っていく 
2.  データ分析のバックグラウンドを持った特定のビジネス分野で活動していく   


#### NoCodeやLowCodeが参画できない分野での技術検証を行っていく   
NoCodeやLowCodeのメリット・デメリットについては上で記載しました．   
NoCodeやLowCodeでは，簡単なモデルを作成して精度を検証する点でとても優れています．   
実際に使ってみて，コーディングの量は半分以下になっています．
一方で柔軟性に欠ける点があるため，例えばマルチモーダル（画像やテキストなども含んだ）データや新しい技術の検討といった部分では，今回のツールは使いづらいかなと思います．   
そのため，論文からアルゴリズム実装に落とし込んでビジネスに使えるか検討したり，より高い技術レベルやコーディングが求められる部分については今後もNoCodeやLowCodeでの置き換えは難しいと思います．

#### データ分析のバックグラウンドを持った特定のビジネス分野で活動していく   
データ分析の力とは別に，ビジネス的な部分をバックグラウンドに追加して活躍していくこともできるかなと思います．   
今回のPyCaretを用いたモデルの作成でも，出てきたモデルの精度などについてはやはりデータ分析の基礎となる部分を知らないと評価が難しかったりするかなと思います．   
そのためデータ分析を軸として，少しビジネス範囲に行動範囲を広げていくのもよいかと思います．


## 7.まとめ   
いかがでしたでしょうか？   
今回は，PyCaretを例に，NoCodeやLowCode開発の流行について考え，今後データサイエンティストとしてどのように活躍していくべきなのか考えてみました．   
ビジネスサイドの人がNoCode，LowCode開発に取り組むことでより多くの人が機械学習に触れることができるのはとても良いことだと思っています．   
とはいえやはり自分の専門性は大切かと思うので，今後，どのように専門性を磨いて技術者として活動していくのは常日頃から考えておいてもよいかもしれないです．   
今回の記事をきっかけに，ぜひ今後のキャリアについて考えてみてください．


## 8.参考文献   
https://kissflow.com/low-code/low-code-overview/#low-code-vs-no-code
https://www.unqork.com/resources/latest-content/a-brief-history-of-no-code
https://mendix.buildsystem.jp/mx-blog-understand-no-code-vs-low-code-development-tools/
https://en.wikipedia.org/wiki/No-code_development_platform
https://en.wikipedia.org/wiki/Low-code_development_platform
https://pycaret.readthedocs.io/en/latest/
https://qiita.com/s_fukuzawa/items/5dd40a008dac76595eea