データクリーニング欠損値と外れ値の扱い方

データクリーニングの外れ値と欠損値の扱いについて書いていこうと思う。Jupyterで動かしてると思ってください。

###　データの準備

まず最初にデータの準備
scikit-learnのmake_classification関数を使うと簡単にデータが作れるので用意しましょう。

参照:http://overlap.hatenablog.jp/entry/2015/10/08/022246

ではデータを読み込みます。

```py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

data = pd.read_csv('2d_data.csv', header = None)
```

今回用意したデータはこんな感じ

```py
data = data.as_matrix()
data

#出力

array([[  1.00000000e+00,  -7.42847611e+00,   1.50990301e+00],
       [  0.00000000e+00,   2.98069292e+00,   1.96082119e+00],
       [  0.00000000e+00,   3.98825476e+00,   4.63638899e+00],
       [  1.00000000e+00,  -5.78943741e+00,  -4.62161424e+00],
       [  1.00000000e+00,  -4.89444674e+02,  -3.26972997e+02],
       [  1.00000000e+00,  -1.93394930e+00,  -4.72763616e-02],
       [  0.00000000e+00,  -1.61177146e+00,   5.93220121e+00],
       [  1.00000000e+00,  -6.67015188e+00,              nan],
       [  1.00000000e+00,  -2.93141529e+00,  -1.04474622e-01],
       [  0.00000000e+00,  -7.47618437e-02,   1.07000182e+00],
       [  1.00000000e+00,  -2.69179269e+00,   4.16877367e+00],
       [  0.00000000e+00,              nan,   3.45343849e+00],
       [  0.00000000e+00,  -1.35413500e+00,   3.75165665e+00],
       [  1.00000000e+00,  -6.22947550e+00,  -1.20943430e+00],
       [  0.00000000e+00,   2.77859414e+00,   7.58210258e+00],
       [  1.00000000e+00,  -5.71957792e+00,  -2.43509341e-01],
       [  0.00000000e+00,   9.28321714e-01,   3.20852039e+02],
       [  0.00000000e+00,   8.50475089e+01,   2.90895510e+00],
       [  1.00000000e+00,  -6.02948927e+00,  -1.83119942e+00],
       [  0.00000000e+00,   1.11602534e+00,   3.35360162e+00]])
```

外れ値と欠損値(Nan)を確認することができます。
ではxとyのデータに分けます。

```py
X = data[:,1:3]
y = data[:,0].astype(int)
X.shape, y.shape

#出力
((20, 2), (20,))
```

ではXデータの１列目と２列目をプロットしてみます。

```py
plt.scatter(X[:, 0], X[:, 1], c=y, s=50,  cmap='Blues');
```

[![https://diveintocode.gyazo.com/5b4fd10d1edcaea456b6bf34fe54589a](https://t.gyazo.com/teams/diveintocode/5b4fd10d1edcaea456b6bf34fe54589a.png)](https://diveintocode.gyazo.com/5b4fd10d1edcaea456b6bf34fe54589a)

プロットすると外れ値をはっきり確認することができます。

### 欠損値の埋め方

`np.isnan()`を使うことによってNanを確認することが可能です。もし欠損値があればTrueを返してくれます。

```py
np.isnan(X[:, 0]),np.isnan(X[:, 1])

#出力

(array([False, False, False, False, False, False, False, False, False,
        False, False,  True, False, False, False, False, False, False,
        False, False], dtype=bool),
 array([False, False, False, False, False, False, False,  True, False,
        False, False, False, False, False, False, False, False, False,
        False, False], dtype=bool))
```

では欠損値を除いた`X1`と'y1'を作っていきます。


```py
X1 = X[~np.isnan(X[:, 1]) & ~np.isnan(X[:, 0])]
y1 = y[~np.isnan(X[:, 1]) & ~np.isnan(X[:, 0])]

X1, y1
#出力

Out[139]:
(array([[ -7.42847611e+00,   1.50990301e+00],
        [  2.98069292e+00,   1.96082119e+00],
        [  3.98825476e+00,   4.63638899e+00],
        [ -5.78943741e+00,  -4.62161424e+00],
        [ -4.89444674e+02,  -3.26972997e+02],
        [ -1.93394930e+00,  -4.72763616e-02],
        [ -1.61177146e+00,   5.93220121e+00],
        [ -2.93141529e+00,  -1.04474622e-01],
        [ -7.47618437e-02,   1.07000182e+00],
        [ -2.69179269e+00,   4.16877367e+00],
        [ -1.35413500e+00,   3.75165665e+00],
        [ -6.22947550e+00,  -1.20943430e+00],
        [  2.77859414e+00,   7.58210258e+00],
        [ -5.71957792e+00,  -2.43509341e-01],
        [  9.28321714e-01,   3.20852039e+02],
        [  8.50475089e+01,   2.90895510e+00],
        [ -6.02948927e+00,  -1.83119942e+00],
        [  1.11602534e+00,   3.35360162e+00]]),
 array([1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0]))

```

### 外れ値の外し方

```py
X2 = X1[(abs(X1[:, 0] < 10)) & (abs(X1[:, 1]) < 10)]
y2 = y1[(abs(X1[:, 0] < 10)) & (abs(X1[:, 1]) < 10)]
```

このように書くと10以上の数値を以下のように返してくれます。

```py
(array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True, False,  True,  True], dtype=bool),
 array([ True,  True,  True,  True, False,  True,  True,  True,  True,
         True,  True,  True,  True,  True, False,  True,  True,  True], dtype=bool))
```

では外れ値を除いてみましょう。

```py
X2 = X1[(abs(X1[:, 0] < 10)) & (abs(X1[:, 1]) < 10)]
y2 = y1[(abs(X1[:, 0] < 10)) & (abs(X1[:, 1]) < 10)]

```

プロットしてみます。

```py
plt.scatter(X2[:, 0], X2[:, 1],c = y2,  s=50, cmap='Blues');
```
[![https://diveintocode.gyazo.com/eeeb8ea787239a0e11ff77ea7e15f989](https://t.gyazo.com/teams/diveintocode/eeeb8ea787239a0e11ff77ea7e15f989.png)](https://diveintocode.gyazo.com/eeeb8ea787239a0e11ff77ea7e15f989)

外れ値がなくなったことを確認することができました！