線形回帰について ーデータクレンジング編その①

今日はPythonの実装のアウトプット。



まだまだ知らないことがたくさんあるので、そこは、勉強勉強。


今回のメインテーマはデータクレンジング。
主に2点ある。

①欠損値の処理
②外れ値の処理

について、学んだのでそれをおもむろにアウトプット。

今回扱うデータセットは車の価格の予測モデル。
当然目的変数は車の価格になるわけだが、
色々外れ値も多そう。

f:id:kawam0t0:20200514194519p:plain
思いっきり最大値と平均のPriceがかけ離れている、そのほかの数字も
若干怖い。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression as LR
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import f_regression
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

data_csv = pd.read_csv("1.04. Real-life example.csv")
data_csv.isnull().sum()

ここまでは問題ない。
このisnullで返ってきた結果が、こちら。

f:id:kawam0t0:20200514193812p:plain

やっぱありました。
ここで、

data_csv.describe()

で統計量を確認すると、データ数が4345であることを確認。
f:id:kawam0t0:20200514194122p:plain

この場合全データに対して欠損値が5%以下なのでそのまま削除。

data = data.dropna()

f:id:kawam0t0:20200514194252p:plain


ここからがなるほど、と個人的には思った点。
じょうきのとおり、外れ値があるのでは?とまず統計量を見て勘繰る。
そこから、
実際にグラフにしてみると一目瞭然だった。

sns.distplot(data["Price"])
#実行結果は↓

f:id:kawam0t0:20200514194740p:plain
いやいや!正規分布どころか、指数関数やん!かい二乗分布やん!
そこで、
外れ値を削除するべく、新しいメソッドを学んだ。
これは今後も使えそう。

q = data["Price"].quantile(0.90)
data_q = data[data["Price"] < q]

そう、quantileという関数である。
この0.90という数字は全体の90%の所の値を単数として拾ってくる、というもの。
そこから、二行目の通りに条件を作ってあげれば、

f:id:kawam0t0:20200514195113p:plain

かなり外れ値の分布は収まってくれるようになった。
こうやって、他の変数についても同様に削除していく。

この続きは次回。