データ分析のプロセスにおけるEDA、データ前処理、特徴エンジニアリング、特徴量重要度抽出に関するまとめ



# はじめに
　データ分析のプロセスとして、CRISP-DM(CRoss Industry Standard Process for Data Mining)というものがあります。

* ビジネスの理解
* データの理解
* データの準備
* モデリング
* 評価
* デプロイ

　機械学習を扱うとなると、モデリングに注目しがちですが実際の作業量としては、それよりも前のステップである、ビジネスの理解、データの理解、データの準備のステップが大半を占めます。これらの作業のうち、「データの理解」は、データの中身を可視化や集計の結果から何らかの仮説を生み出していく作業（EDA (Exploratory Data Analysis) ）、「データの準備」は、生データを加工して不要なデータを削除をしていく前処理作業, 新たな特徴量を作成する作業（Feature Engineering）とします。

　EDAとFeature Engineeringについては、自分の経験上何も考えずに始めると作業を深堀しすぎたり、抜け漏れが起こると感じました。そこで今回は、kaggleのkernelや書籍を参考に各ステップでどのようなことを行えばいいのかをまとめました。また、モデリングの結果から、特徴量の重要度の抽出をすることで、さらにデータの理解を深めることができるので、特徴量の重要度（Feature Importance）抽出についてもまとめています。

# 環境、他
　python3系のjupyter notebook上で実行することを想定しています。そのため、notebook上で可視化を行う前の仮定や、可視化結果の解釈などをMarkdownで記述することができます。得られた仮定や気づきを書いていくといいと思います。可視化には、matplotlib、seaborn、plotlyを用います。(これぐらいしか使ったことがない)
　なお、この後書く便利ツールは、ドキュメントを読んだだけで使ったことがないものもあるのでご了承ください。

# データの理解（EDA）
## やることリスト
* データの各特徴名とその意味の確認
* データの大きさの確認(pandasの.shape)
* 表の一部分表示(pandasの.head())
* 型チェック(pandasの.dtypes())
* 特徴量ごとの平均値、最大値、最小値などの統計量確認(pandasの.describe())
* 欠損値チェック(pandasの.isnull().sum())
* ヒストグラムによる分布の可視化
* 散布図や箱ひげ図を用いた目的変数と、説明変数の関係の可視化
* 時系列データであれば、時系列トレンドの可視化
* 外れ値の確認

## 余裕があったらやることリスト
* 次元削減による可視化(PCA,T-SNE,UMAP)
* 複数のカテゴリ特徴で分割したときの傾向確認(数が膨大になるため、仮定を置いてから実行)

　EDAを行う目的としては、データの特徴や構造を理解することが挙げられます。こういったデータの理解をしなければ、この後のデータの準備ステップで適切な前処理やFeature Engineeringを行うことはできないでしょう。

## 便利ツール
* pandas-profiling
* missingno
* seaborn.heatmap

# データの準備（前処理、Feature Engineering）

## やることリスト
* 外れ値の除去
* 欠損値の補完または除去
* 数値型特徴の対数化
* 数値型特徴のカテゴリ化
* 数値型特徴の正規化
* カテゴリ型特徴のダミー変数化
* カテゴリ型特徴の集約
* カテゴリ型特徴の組み合わせ特徴生成

## 余裕があったらやることリスト
* 多項式特徴量の作成


## 便利ツール
* sklearn.preprocessiong
* featuretools(特徴量を自動で生成してくれるツール)
* automl系のライブラリ(前処理とモデリングを含めて最適化してくれるツール)
  * auto-sklearn
  * TPOT

# モデリング（Feature Importance）

## やることリスト
* 目的変数と説明変数間の相関係数
* ラッソ回帰やリッジ回帰による抽出
* 決定木ベースのモデルによる重要度抽出(Random Forest, XGBoost, LightGBM)

## 余裕があったらやることリスト
* 学習モデル解釈の手法(LIME, SHAP)
* 決定木の可視化(dtreeviz)

　特徴量の重要度を求めることで、重要となる特徴量や不要である特徴量が何であるかを考察することができます。この結果を受けて、特徴量の作成をし直したり、モデル解釈の補助をすることができます。

## 便利ツール
* sklearn.feature_selection.SelectKBest
* sklean.feature_selection.RFE
* sklearn.feature_selection.SelectFromModel
* mlflow(モデルの管理をしてくれるツール)


# 参考
## 記事、スライド
* [Discover Feature Engineering, How to Engineer Features and How to Get Good at It](https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)
* [ランダムフォレスト系ツールで特徴量の重要度を測る](https://qiita.com/TomokIshii/items/290adc16e2ca5032ca07)
* [LIME & SHAP-機械学習モデルによる予測結果の説明性-](https://speakerdeck.com/hightensan/lime-and-shap-ji-jie-xue-xi-moderuniyoruyu-ce-jie-guo-falseshuo-ming-xing)
* [Kaggleの練習問題（Regression）を解いてKagglerになる](https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb)

## kaggleのkernels
* [House Prices : EDA to ML (Beginner)
](https://www.kaggle.com/dejavu23/house-prices-eda-to-ml-beginner)
* [HomeCreditRisk:Extensive EDA + Baseline Model JP](https://www.kaggle.com/osciiart/homecreditrisk-extensive-eda-baseline-model-jp)
* [Effective Feature Engineering
](https://www.kaggle.com/rejasupotaro/effective-feature-engineering)
* [6 Ways for Feature Selection
](https://www.kaggle.com/sz8416/6-ways-for-feature-selection)

## 書籍
* データ解析の実務プロセス入門
* 前処理大全
* AI、IoTを成功に導くデータ前処理の極意