「”すぐ” このデータまとめて欲しい」に ”すぐ”に超簡単に応えられる Python の・・・（DataPrep編）

### ～手元データの要約、視覚化を超簡単に実現して、探索的データ解析(EDA)しよう（DataPrep編）～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b19ef60b-ea88-899b-2503-dd7a4cbea309.png)

### 2022/05/09更新
[**公式のGithub**](https://github.com/sfu-db/dataprep) に公開されている[**Demo in Colab**](https://colab.research.google.com/drive/1U_-pAMcne3hK1HbMB3kuEt-093Np_7Uk?usp=sharing) の通り、ライブラリインストールを!pip install -U git+https://github.com/sfu-db/dataprep.git@develop --quiet としていました。以前はGoogle colabで動作していましたが、importで引っかかるので、!pip install dataprep としました。これで私の環境では動作しています。

## はじめに
　
**「”すぐ” このデータまとめて欲しい」に ”すぐ”に超簡単に応えられる Python の・・・** と題し、

「おい、悪いが”すぐに”このデータまとめてくれ」

に応えるための**探索的データ分析（EDA）ツール**を、これまでに４つ紹介しました。

今回紹介するのは、**DataPrep**という名のEDA。
この手のAutoEDAツールでは、**PandasProfiling**（以下参照）が一番ポピュラーではないかと思いますが、

https://qiita.com/hima2b4/items/65129b3c3c4a1090afae

**DataPrep**は、よりインタラクティブで、しかも処理がめちゃくちゃ速いので、個人的には一番のおすすめです。

## この記事で紹介するDataprepについて
DataPrep.EDAは、Pythonで最も速く、最も簡単なEDA（Exploratory Data Analysis）ツールです。数行のコードで美しいプロファイルレポートを作成することができます。\
このライブラリは、[**公式のGithub**](https://github.com/sfu-db/dataprep) に公開されている[**Demo in Colab**](https://colab.research.google.com/drive/1U_-pAMcne3hK1HbMB3kuEt-093Np_7Uk?usp=sharing) をベースに **①外部ファイルの読込み、②フォームによるカラム設定、③日本語化** を図ったものです。


## **データについて**
1. **csvデータの表形式は以下としてください。**

|列1|列2|列3|列4|列5|列6|…|
|---|---|---|---|---|---|---|
|data |data|data |…|data |…|data |
|data |data|data |…|data |…|data |
|･ |･|･ |…|･ |…|･ |
|･ |･|･ |…|･ |…|･ |
|･ |･|･ |…|･ |…|･ |

- [**注意**] csvデータは文字コードを「UTF-8」としてください。

 
## **実行手順**
1. メニューバーの「ランタイム」から「すべてのセルを実行」をクリック。
2. ライブラリインストール完了後、[**ファイル選択**] を促されるので、クリックしてデータ（csvファイル）を指定する。
3. Google colabのフォーム機能を利用し、分析を行うカラムを番号で指定できるようにしています。指定番号変更後は該当のセルを再実行してください。

　
## 実行条件など
>・**Google colab**で実行
・**Titanicのデータセット**で実行

https://www.kaggle.com/c/titanic/data　

## ライブラリのインストールおよびインポート

```:Python
!pip install dataprep
```

```:Python
# ライブラリのインポート
from dataprep.eda import *
from dataprep.datasets import load_dataset
from dataprep.eda import plot, plot_correlation, plot_missing, plot_diff, create_report
import pandas as pd
import warnings # 実行に関係ない警告を無視
warnings.filterwarnings('ignore')
```

## ファイル読込み
```:Python
#@title ファイルを指定してください
from google.colab import files
uploaded = files.upload()

if len(uploaded.keys()) != 1:
    print("アップロードは１ファイルにのみ限ります")
else:
    target = list(uploaded.keys())[0]

df = pd.read_csv(target)
```

## プロファイルレポート作成
create_report() で、データセットの包括的なプロファイルレポートを生成します。 このレポートには、以下の情報が含まれています。

- 概要：データフレーム内の列の種類を検出する
- 変数：変数の種類、ユニークな値、distint count、欠損値
- 最小値、Q1、中央値、Q3、最大値、範囲、四分位範囲などの四分位統計量
- 平均値、最頻値、標準偏差、総和、中央値絶対偏差、変動係数、尖度、歪度などの記述統計量
- 長さ、サンプル、レターなどのテキスト分析
- 相関関係：相関の高い変数のハイライト、スピアマン、ピアソン、ケンドール行列
- 欠損値：欠損値の棒グラフ、ヒートマップ、スペクトル


```:Python
#@title プロファイルレポート
create_report(df)
```
** ↓ 以下がプロファイルレポート**

https://docs.dataprep.ai/_downloads/1a61c6aebb3ecbe9dc9742bd6ca78ddb/titanic_dp.html


## データセット概観
plot()関数は、データセットの分布と統計量を調査します。\
データフレームdfに対するplot()の機能は以下の通りです。
- plot(df): 各カラムの分布をプロットし，データセットの統計量を計算する
- plot(df, x): 列xの分布を様々な方法でプロットし、列の統計量を計算する
- plot(df, x, y): 列 x と y の間の関係を表すプロットを生成する

```:Python
#@title データカラム、欠損値とデータ型の確認
df.info()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/cfe3da30-d9c5-5bb1-0c55-501e6a162cd0.png)

```:Python
#@title データセットの各カラムの統計量と分布のプロット
plot(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/e7e97b49-13e2-2975-41fc-f7fbe7445252.png)


# 要素毎の詳細確認
## 欠損値の影響確認
plot_missing()関数は、欠損値とそれがデータセットに与える影響を確認することができます。\
データフレーム df に対する plot_missing() の機能は以下の通りです。

- plot_missing(df): 欠損値の量と位置、および列間の関係をプロットする。
- plot_missing(df, x): 列 x の欠損値が他の全ての列に与える影響をプロットする。
- plot_missing(df, x, y): 列 x の欠損値が列 y に与える影響を様々な方法でプロットする。

### 1. データセットの欠損値
```:Python
#@title データセットの欠損値サマリ
plot_missing(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/2edee1f8-e452-5b52-e174-3da678554c41.png)

### 2. 指定したカラムの欠損値が他のカラムに与える影響
```:Python
#@title データカラムを確認しましょう
df.info()
```

```:Python
#@title 欠損値影響を確認したいカラム番号を指定してください（カラム番号は 0～です）{ run: "auto" }
Missing_column_Number = 5 #@param{type:"number"}

print('** ↓指定カラムは以下です↓ **')
df.columns[Missing_column_Number]
```

```:Python
#@title 欠損値影響の可視化
#plot_missing(df, "x")　← x を指定
plot_missing(df, df.columns[Missing_column_Number])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a5adbdef-1309-ec7f-6c41-a3f7d1805688.png)

## 相関関係の確認
plot_correlation()関数は、様々な方法で、複数の相関メトリックを使用して、列間の相関を調べます。\
与えられたデータフレーム df に対する plot_correlation() の機能は以下の通りです。

- plot_correlation(df): 相関行列をプロットする（列のすべてのペアの間の相関）。
- plot_correlation(df, x): 列xに対して最も相関のある列をプロットする。
- plot_correlation(df, x, y): 列 x と列 y の結合分布をプロットし、回帰直線を計算する。

### 1. データセットの相関関係
```:Python
#@title データセットの相関関係
plot_correlation(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b645bf24-6003-2959-a25e-27d593383ffe.png)

### 2. 指定したカラムと他のカラムとの相関
```:Python
#@title データカラムを確認しましょう
df.info()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/8de11517-00cd-ea4a-9540-cd54b8a2c8fe.png)

```:Python
#@title 相関を確認したいカラム番号を指定してください（カラム番号は 0～です）{ run: "auto" }
Corr_column_Number = 5 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Corr_column_Number]
```

```:Python
#@title 指定したカラムと他のカラムの相関関係
#plot_correlation(df, "x")　← x を指定
plot_correlation(df, df.columns[Corr_column_Number])
```

## 詳しく見たいカラムの分析
plot()関数は、データセットの分布と統計量を調査します。以下は、与えられたデータフレームdfに対するplot()の機能を説明するものです。
- plot(df): 各カラムの分布をプロットし，データセットの統計量を計算する
- plot(df, x): 列xの分布を様々な方法でプロットし、列の統計量を計算する
- plot(df, x, y): 列 x と y の間の関係を表すプロットを生成する

**※以下3つの枠を設けていますので、3つのカラムまでは同時表示できます。\
「Column_Number1：」,「Column_Number2：」,「Column_Number3：」にてカラム番号を指定してください。**

### 1. 指定カラム1のプロット＆統計量
```:Python
#@title データカラムを確認しましょう
df.info()
```

```:Python
#@title 分析したいカラム番号を指定してください（カラム番号は 0～です）  { run: "auto" }
Column_Number1 = 5 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Column_Number1]
```

```:Python
#@title 指定カラムのプロット＆統計量
#plot(df, "x")　← x を指定
plot(df, df.columns[Column_Number1])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/f2b91be2-4188-a993-976e-b410b3e36c03.png)

### 2. 指定カラム2のプロット＆統計量
```:Python
#@title 分析したいカラム番号を指定してください（カラム番号は 0～です）  { run: "auto" }
Column_Number2 = 4 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Column_Number2]
```

```:Python
#@title 指定カラムのプロット＆統計量
#plot(df, "x")　← x を指定
plot(df, df.columns[Column_Number2])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d022b8a6-a7af-784b-cb6c-80973464dadf.png)

### 3. 指定カラム3のプロット＆統計量
```:Python
#@title 分析したいカラム番号を指定してください（カラム番号は 0～です）  { run: "auto" }
Column_Number3 = 10 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Column_Number3]
```

```:Python
#@title 指定カラムのプロット＆統計量
#plot(df, "x")　← x を指定
plot(df, df.columns[Column_Number3])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/8a031487-295d-09bb-79cf-56d17ed13524.png)

```:Python
#@title データカラムを確認しましょう
df.info()
```

```:Python
#@title ヒストグラムを描きたいカラム番号を指定してください（カラム番号は 0～です）  { run: "auto" }
Hist_column_Number = 5 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Hist_column_Number]
```

```:Python
#@title ヒストグラム表示
plot(df,df.columns[Hist_column_Number], display = ["Histogram"])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b427dc6e-6024-18ce-d889-a0ca67b4378e.png)

```:Python
#@title ヒストグラム表示（カスタマイズ） { run: "auto" }
plot(df, df.columns[Hist_column_Number], display = ["Histogram"], config = {"hist.bins": 1000, "height":500})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/4b65aa37-db04-1a51-9b6a-4f7c417b67f7.png)

## 変数間の関係確認

### 1. カラムA1とB1の関係
```:Python
#@title データカラムを確認しましょう
df.info()
```

```:Python
#@title 比較したいカラム番号を指定してください（カラム番号は 0～です）
Column_Number_A1 =  5#@param{type:"number"}
Column_Number_B1 =  9#@param{type:"number"}

print('↓指定カラム A, B↓')
df.columns[Column_Number_A1],df.columns[Column_Number_B1]
```

```:Python
#@title カラム同士の関係
#plot(df, "x", "y")　← x, y を指定

plot(df, df.columns[Column_Number_A1], df.columns[Column_Number_B1])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/51932f00-8a5e-3510-01df-43cb1a552c0b.png)

### 2. カラムA2とB2の関係
```:Python
#@title 比較したいカラム番号を指定してください（カラム番号は 0～です）
Column_Number_A2 =  5#@param{type:"number"}
Column_Number_B2 =  4#@param{type:"number"}
#plot(df, "x", "y")　← x, y を指定

print('↓指定カラム A2, B2↓')
df.columns[Column_Number_A2],df.columns[Column_Number_B2]
```

```:Python
#@title カラム同士の関係
#plot(df, "x", "y")　← x, y を指定

plot(df, df.columns[Column_Number_A2], df.columns[Column_Number_B2])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d735787a-7165-ad81-7801-ad78d07a2a93.png)

### 3. カラムA3とB3の関係
```:Python
#@title 比較したいカラム番号を指定してください（カラム番号は 0～です）
Column_Number_A3 =  4#@param{type:"number"}
Column_Number_B3 =  1#@param{type:"number"}
#plot(df, "x", "y")　← x, y を指定

print('↓指定カラム A3, B3↓')
df.columns[Column_Number_A3],df.columns[Column_Number_B3]
```

```:Python
#@title カラム同士の関係
#plot(df, "x", "y")　← x, y を指定

plot(df, df.columns[Column_Number_A3], df.columns[Column_Number_B3])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/4e043a8c-45fb-4edf-3d54-542bafe1fc0a.png)


## 0/1の目的変数を0と1で区分し、説明変数毎で比較
plot_diff()関数は、0/1の目的変数を0と1で区分し、説明変数毎で比較するような場合に、データフレームを目的変数 0と1のデータに分割し、説明変数毎の分布や統計量の違いを調べることができます。複数のデータセットにまたがる場合も同様です。


```:Python
#@title データカラムを確認しましょう
df.info()
```

```:Python
#@title 0/1でデータ区分したい目的変数カラムを指定してください（カラム番号は 0～です）  { run: "auto" }
Diff_column_Number = 1 #@param{type:"number"}

print('↓指定カラム↓')
df.columns[Diff_column_Number]
```

```:Python
#@title 0/1区分 可視化
df1 = df[df[df.columns[Diff_column_Number]] == 0]
df2 = df[df[df.columns[Diff_column_Number]] == 1]
plot_diff([df1, df2])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/aaa1950a-bd34-5139-3697-a959d1690b9e.png)


## 【参考】地理的データ分析
```:Python
country = load_dataset("countries")
plot(country, "Country")
```


## 最後に

とにかく速い。
まったくストレスを感じないし、インタラクティブでとてもいい。
私は、これまで試した Auto-EDAのなかで **DataPrep** が一番のお気に入り。、


　
## 関連記事

https://qiita.com/hima2b4/items/2c742c766ecbd5ba7ab1

https://qiita.com/hima2b4/items/f24a472fcb56bece22e0

https://qiita.com/hima2b4/items/da29530c1f58c7211d44

https://qiita.com/hima2b4/items/65129b3c3c4a1090afae



## 参考サイト

https://analyticsindiamag.com/exploring-dataprep-a-python-library-for-data-preparation-eda/

https://github.com/sfu-db/dataprep

https://docs.dataprep.ai/user_guide/eda/introduction.html#Create-a-profile-report-with-create_report()