pythonで外れ値を可視化して除外する

# 1 概要
pythonで外れ値を見つけて除外する
# 2 環境
Google Colaboratory
# 3 モジュールのインポート
```
import warnings
warnings.simplefilter('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", palette="muted", color_codes=True)
```
# 4 データ準備
ここでは、snsのデータセット「load_boston」を利用
<img width="70%"　alt="1" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/aab17abe-31b2-cc72-5d9e-8bbea191e0e1.png">

```
from sklearn.datasets import load_boston
boston = load_boston()
data1 = pd.DataFrame(data=boston.data,columns=boston.feature_names)
data1['target'] = boston.target
data1.head()
```
<img width="100%"　alt="2" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/12148c2f-ed40-1793-61cf-5bc824e4c48d.png">
# 5 統計量を使って確認する
```
data1[['CRIM','target']].describe()
```
<img width="40%"　alt="3" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/fa430142-5d0d-d0b1-9e58-b539e168bc4a.png">

# 6 データの分布をみてみる
###ヒストグラム
```
sns.displot(data1.CRIM,kde=True)
```
<img width="60%"　alt="4" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/f7ea90ea-1893-8334-dca4-ffe9d63b6730.png">

### 箱ひげ図
```
sns.boxplot(data=data1.CRIM)
```
<img width="70%"　alt="5" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/07c9a5a8-0edd-2c8a-a264-40868d8b53a6.png">

### 散布図　
```
sns.scatterplot(x="CRIM", y="target", data=data1)
```
<img width="70%"　alt="6" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/89065339-7320-798e-dada-64bd4c7401bc.png">

```
sns.jointplot(x="CRIM", y="target", data=data1)
```
<img width="70%"　alt="7" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/b6a3428d-4290-f962-4708-975642a09cd0.png">

### ヒートマップでも表示してみた
```
sns.jointplot("CRIM", "target", data=data1, kind="hex")
```
<img width="70%"　alt="8" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/6c21d807-b67e-d0d6-f43f-2f196ec813bf.png">

#7 分析
ヒストグラムをみると全体の割合での犯罪発生率は、２０％以下となっていて、箱ひげ図をみるとほぼ１０％以下になっている。
散布図をみると犯罪発生率が低いと価格が高くなっているので負の相関関係がある。

#8 外れ値の除去を行う

引数に0から1の値を与えて、指定した分位数で値を取得する。
ここでは試しに中央値の第2四分位数の50％の値を求めるので0.5で実行してみる。

#9 指定した（中央値）の値を求めてみる
```
q_50 = data1.CRIM.quantile(0.5)
q_50

0.25651
```
0.25651が中央値として表示されたので指定した値が取れているか再度統計量を表示して確認してみる
記述統計量を確認してみると５０％が中央値と同じ値になっていることが確認できた。

```
data1[['CRIM','target']].describe()
```

<img width="50%"　alt="9" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/5414cee8-74cb-3cd9-be18-0d3247bce7f4.png">

#10 実際に外れ値を除去してみる
今回は、分位数95％の値を取得して、外れ値を除去する。

```
q = data1.CRIM.quantile(0.95)
q
```
15.78915

95％の分位数の値が約15.7となった。

#11 犯罪発生率95％の分位数よりも値が小さいデータを抽出してそれ以上の値を除外する
```
new_data = data1.query('CRIM < @q')
```

#12 外れ値が除去できているか再度統計量を確認
```
new_data[['CRIM', 'target']].describe()
```
<img width="50%"　alt="10" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/273ba2de-43f7-24a7-c4bb-f2ac88b0843c.png">


データ数が506件から480件へ減少し、犯罪発生率の最大値が15.57になった。

#12 散布図で確認
<img width="70%"　alt="11" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/34b3e1f5-105b-e975-65b1-f1cee6b6a6e9.png">

外れ値が除去されていることが散布図からも確認できた。