データ分析に使える便利なpythonライブラリ4選

## はじめに
　numpy, Pandas, matplotlib, seabornなどの必須ライブラリではなく、
今回は知っていると得する、**便利なデータ分析ツール**を紹介していきたいと思います。

　最初の段階では書籍などから地道に勉強している人も多いので、私含め知らないツールが多いなと思い、本記事を書くに至りました。

## 概要
　最初は可視化するにもmatplotlibやseabornに慣れていないこともあり、
重要な特徴量を見つける、相関を見つけるのもままならない(or時間がかかる)かと思います。

ベテランの方でもまずは全体の特徴量同士の相関を、、
ベースモデルとしてとりあえずGBDTを使用して、、などルーティーンとなっている作業は多々あると思います。

もちろんモデルの選択や、なぜ高スコアとなるか考察をすること、
重要な情報に絞って自分で可視化できる力は大変必要だと思います。
しかし、EDA([探索的データ分析](https://uribo.github.io/practical-ds/01/eda.html))を行うにあたり、(駆け出しの)データ分析者が少しでも最初の一歩目を短縮できればと思い、本記事が参考になりましたら幸いです。

## データ分析で使える便利なライブラリ
 EDAツール
1. [pandas-profiling](https://pandas-profiling.github.io/pandas-profiling/docs/master/index.html)
2. [Autoviz](https://github.com/AutoViML/AutoViz)
3. [sweetviz](https://github.com/fbdesignpro/sweetviz)

モデル作成ツール
4. [Pycaret](https://pycaret.org/)

今回は**[Titanicデータ](https://www.kaggle.com/c/titanic/data)**を例にして紹介していきたいと思います。

## 環境
 - Mac OS
 - jupyter notebook
 - python 3.9.7

#### カラムの説明
今回は特に精度に対しての説明はしないですが、
表示結果のより良い把握のため、念のため各変数を記載しておきます。

| 項目       |       定義 |  キー |   
|:-----------------|:------------------|:------------------|
|PassengerId | 乗客ID ||
| survived| 生存したか否か |0:死亡,0:生存|
| Pclass  |チケットのクラス| 1 = 1st, 2 = 2nd, 3 = 3rd|
| Name  | 名前 | |
| Sex| 性別 | |
|Age | 年齢 | |
|SibSp | 乗船している兄弟や配偶者の数 | |
|Parch | 乗船している両親や子供の数 | |
|Ticket | チケット番号 | |
|Fare | 運賃 | |
|Cabin | 部屋番号 | |
|Embarked  | どの港から乗船したか|C = Cherbourg, Q = Queenstown, S = Southampton |


##1. pandas_profiling 
このツールに関しては[kaggleのスタートブック](https://www.kspub.co.jp/book/detail/5190067.html)で紹介されていることもあり知っている方もいらっしゃるのではないでしょうか。

### 1-1. インストール
```
pip install pandas-profiling
```
Name: pandas-profiling
Version: 3.1.0

### 1-2. インポート・出力
```
import pandas as pd
import pandas_profiling
train = pd.read_csv('../input/titanic/train.csv')
train.profile_report()
# pandas_profiling.profile_report(train)
```
データの型や欠損数、サンプル数などが見れます。


### 1-3. 出力結果
titanicはデータが少ないため、1分足らずで完了しますが、データ量やカラムの数により、
数分以上かかる場合もあります。

![スクリーンショット 2021-12-07 18.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/6c2333b6-2248-26f4-adf5-f5168653634a.png)

#### Overview
HTML形式で出力されます。
![スクリーンショット 2021-12-07 18.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/7cc3718f-6b98-86d6-d2b7-53a1385f69f8.png)

右上のタブのところでそれぞれ(下記項目にて抜粋)見ることができます。

#### Variables
すべてのカラムにおいて、データの内容を表示してくれます。
カテゴリ変数であれば、各カテゴリごとのデータ数、量的変数であればヒストグラムを表示します。
![スクリーンショット 2021-12-07 19.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/b840409b-57c4-fb8e-12b4-48da1598d75c.png)

#### Interactions
量的変数同士の相関を見れます。横軸と縦軸をタブで選択可能です。
![スクリーンショット 2021-12-07 19.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/404fc895-d839-dd29-084f-ad1719809fd9.png)

#### Correlations
ピアソン、スピアマン等の相関係数を見ることができます。
![スクリーンショット 2021-12-07 19.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/3a1fd2c1-beb5-fd11-8a95-d27058f281e7.png)

#### Missing values
欠損数の確認ができます。
![スクリーンショット 2021-12-07 20.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/c1df05aa-601e-39ad-514d-0763cdacea9b.png)


#### Sample
train.head()とtrain.tail()の結果を表示します。

ちなみに下記コードでレポートの出力、保存もできるみたいです。

```
profile = ProfileReport(data, title="Titanic Dataset", html={'style': {'full_width': True}}, sort="None")
profile.to_file(output_file="{PASS}.html")
```

##2. Autoviz
 こちらもEDAツールです。
macの方は`brew install libomp`するとスムーズです。

### 2-1. インストール

```
pip install autoviz
```
Name: autoviz
Version: 0.1.23

### 2-2. インポート・出力
```
AV = AutoViz_Class()
autoviz = AutoViz_Class().AutoViz('../input/titanic/train.csv')
```

### 2-3. 出力結果
一括で表示されます。

![スクリーンショット 2021-12-07 20.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/f4ed9d56-2133-aa02-d78e-8054f4bbd606.png)
![スクリーンショット 2021-12-07 20.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/4466b2c8-d7c7-fe1c-71a2-11a386192ea2.png)
![スクリーンショット 2021-12-07 20.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/7c504ef8-c9cc-2eca-cfd9-273518899cb0.png)
![スクリーンショット 2021-12-07 20.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/3237f676-93cc-c382-6fb4-442f5d08eb1f.png)
![スクリーンショット 2021-12-07 20.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/030d4036-edd0-a2ac-27ab-0bbb605535a4.png)
各カテゴリ変数ごとの平均年齢(左列)と運賃の平均(右列)がでているようです。
![スクリーンショット 2021-12-07 20.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/107d0d43-8b0f-2e48-930d-1798828896b1.png)
![スクリーンショット 2021-12-07 20.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/df054d1f-5c85-acac-273d-089b8845ec62.png)

##3. sweetviz
個人的にはこちらが見やすくて軽いと感じています。testデータとの比較もできます。
train,testデータの偏りを見たい時、時系列データの時などに役に立つのではないでしょうか。

### 3-1. インストール
```
pip install sweetviz
```
Name: sweetviz
Version: 2.1.3

### 3-2. インポート・出力
```
import sweetviz as sv
train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')
my_report = sv.compare([train, "Train"], [test, "Test"], "MEDV")
# my_report = sv.analyze(train) # trainデータ単体で分析する場合
my_report.show_html()
```
実行するとブラウザ上(オート別タブ)で閲覧することができます。

### 3-3. 出力結果
![スクリーンショット 2021-12-07 20.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/7420a8ed-0b89-13f7-b728-f2186d6cd6cc.png)
データ(行)数、カラム数、各カラムの変数がわかります。
Testデータには"Survived"が含まれていないため、CATEGORICALのカラムが一つ少ないです。

![スクリーンショット 2021-12-07 20.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/6bab82ae-4648-6176-9dac-47b29221dba6.png)

見たいカラムを選択すると右側に詳細が表示されます。
![スクリーンショット 2021-12-07 20.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/fb1d4aa1-841d-a130-3bf5-0958b31aeb26.png)

上記`Associations`ボタンをクリックすると相関係数の図が見られます。
この図はあまり見慣れていないかもしれません。
![スクリーンショット 2021-12-07 20.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/f25d1b58-2100-45c5-3b23-3f95c9a9be1e.png)


## 可視化ツールまとめ
　上記紹介した3つの可視化ツールは非常に便利であり、基礎分析の初手で活用できるかと思います。
ただ、例えば下記のようなグラフは作成しなければいけないですね。

```
sns.countplot(x='Pclass', hue='Survived', data=train)
plt.show()
```
![スクリーンショット 2021-12-07 19.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/deef8830-ee8e-fb44-1822-41b3141342aa.png)

いずれにしても細かく見たいところは自分でプロットしていく必要があります。

## 4. PyCaret
機械学習モデルの作成に使える、2020年にリリースしたローコードライブラリです。

Ridge、Rasso等の単純な線形回帰モデルや、決定木系の派生モデル、
王道のLightgbm等の勾配ブースティング木系モデルも含まれていますので、
ベースモデルの構築に最初に動かしてみるのも良いのではないでしょうか。

私の[kaggle notebook](https://www.kaggle.com/taikiikuta/titanic-pycaret-auto-modeling)にもコードを記載しています。
[公式のGithub](https://github.com/pycaret/pycaret)を参考にすれば、他回帰、クラスタリング等含め簡単に始められます。

本記事ではTitanicデータを扱いますので、分類モデルの場合を紹介します。
### 4-1. インストール
```
pip install pycaret
```
Name: pycaret
Version: 2.3.5

### 4-2. pycaret.classificationのインポートとsetup
```python
import pandas as pd
train = pd.read_csv('../input/titanic/train.csv')
data_unseen = pd.read_csv('../input/titanic/test.csv')

from pycaret.classification import *
exp = setup(data = train, target = 'Survived', session_id=123)
```

![スクリーンショット 2021-12-07 21.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/6f14a708-7821-99e5-eb0f-833027e873ca.png)

`setup`関数でtrainデータと目的変数のカラムを指定します。
途中でEnterを押してください。説明変数の認識に問題があれば`quit`で中断できます。
データタイプの変更については本記事末の参考記事をご覧ください。

`session_id`は再現可能なようにseedを与える引数です。defaultでは乱数が割り当てられます。


### 4-3. モデルの比較
```python
compare_models()
```
![スクリーンショット 2021-12-07 21.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/442f5e43-00be-01e5-cdf3-1e9cce52a479.png)

全てのモデルをAccuracyをはじめとした評価指標で比較できます。
とりあえず`dt:決定木(Decision Tree Classifier)`が一番精度が良さそうですので"dt"で進めます。
この結果は、setup時に指定した`session_id`を変えると変わります。(実行の度に結果は変わります)

### 4-4. モデルの作成
```python
dt = create_model('dt')
```
![スクリーンショット 2021-12-08 10.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/4f39a369-a179-c183-b2c1-51a45e290a78.png)

引数には使用したいモデルの名前を文字列にて入力します。(決定木の場合は'dt')
この段階では、ハイパーパラメータはある決められた値で計算しているだけですので、
次で最適化を行います。

### 4-5. モデルのハイパーパラメータのチューニング
```python
tuned_dt = tune_model(dt)
```
![スクリーンショット 2021-12-08 9.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/bc814d95-bc19-86d1-ac2b-a1eafe40fabd.png)
pre-definedの範囲内でランダムグリッドサーチを行い、チューニングを行います。
`tune_model`の引数で`n_iter`を設定することによりランダムグリッドサーチの回数を決められます。
今回は検証データでのスコアは、やや下がる結果になっています。

### 4-6. モデルのプロット
```python
 # ROC曲線
%matplotlib inline
plot_model(tuned_dt, plot = 'auc')
```
![スクリーンショット 2021-12-08 9.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/b3e98237-1114-7449-03f6-d0cff0070d0e.png)


```python
 # 混同行列
plot_model(tuned_dt, plot = 'confusion_matrix')
```
![スクリーンショット 2021-12-08 9.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/81207516-8795-ce5a-c411-cdb6614d5812.png)

ちなみに以下コードでHTML形式でモデルの各評価を見ることができます。
特徴量の重要度や学習曲線なども入っており、私はこれだけ使っています。

```python
evaluate_model(tuned_dt)
```
![スクリーンショット 2021-12-08 9.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/444f9750-465a-12d2-6bfa-577cd79359c5.png)
![スクリーンショット 2021-12-08 9.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/22f84d0a-75a6-d38f-16e3-769ce6ad9a3d.png)

### 4-7. モデルの確定
上記結果が良さそうであれば、モデルの確定を行います。

```python
final_dt = finalize_model(tuned_dt)
print(final_dt)
```
![スクリーンショット 2021-12-08 9.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/59fe35bc-9b6e-4125-96cc-ed874ff64bfb.png)
チューニングしたハイパーパラメータが確定し、学習済みモデルが出来上がりました。

### 4-8. testデータの予測の実行
```python
result_dt = predict_model(final_dt, data = data_unseen)
result_dt
```
![スクリーンショット 2021-12-08 9.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408423/7c5133b5-8c5c-b85c-bb70-d1d94a2dccc9.png)
この新しい"Label"というカラムに予測結果が入ります。

### 4-9. submitする場合(おまけ)
```python
y_pred = result_dt["Label"]
sub = pd.read_csv('../input/titanic/gender_submission.csv')
sub['Survived'] = y_pred
sub.to_csv('submission.csv', index=False)
```
スコアはやってみてのお楽しみです！笑

## PyCaretまとめ
　今回は決定木のみで例を出しましたが、他のモデルも簡単に試すことができます。
テーブルコンペの初手で試したり、簡易PoCする際とりあえず複数モデルを試したいときなどに
使えるのではないでしょうか。
実用性は、人それぞれかもしれませんが色々と面白いので触ってみるのもアリかと思います。

## 最後に
　今回紹介したもの以外にも便利ツールがあります。最近はノーコード、ローコードが流行っているので、
まとめさせていただきました。ガリガリコードを書く人がこの先は減ってくるのではないでしょうか？
とはいえ、特徴量の選択や生成、アンサンブルの細かいチューニングなどまだまだ人間がやるところ、考えるところはたくさんありますし、「こんなもんか、、」と感じた方もいらっしゃるかもしれません。
　本記事で、初学者の方ベテランの方が少しでも日々の業務が効率化できたら幸いでございます。
　また、Qiita初投稿となり、見づらい点もあるかと思いますがご容赦ください。
間違いがございましたらいつでもコメントお願いいたします。
　次はディープラーニングフレームワークPytorchの軽量ラッパーである`PyTorch Lightning`の便利さが伝わるような記事を書く予定です！
　最後まで読んでいただきありがとうございました。


## 参考
以下、2つの記事は"各評価指標"や`evaluate_model()`の詳細説明などもありますのでとても参考になりました。
[PyCaretの初心者向けまとめ（回帰編）](https://qiita.com/shuhigashi/items/0fb37468e64c76f4b245)
[PyCaretの初心者向けまとめ（分類編）](https://qiita.com/shuhigashi/items/cb6816a1da1d347bbdc2)