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」を利用
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()
5 統計量を使って確認する
data1[['CRIM','target']].describe()
6 データの分布をみてみる
###ヒストグラム
sns.displot(data1.CRIM,kde=True)
箱ひげ図
sns.boxplot(data=data1.CRIM)
散布図
sns.scatterplot(x="CRIM", y="target", data=data1)
sns.jointplot(x="CRIM", y="target", data=data1)
ヒートマップでも表示してみた
sns.jointplot("CRIM", "target", data=data1, kind="hex")
#7 分析
ヒストグラムをみると全体の割合での犯罪発生率は、20%以下となっていて、箱ひげ図をみるとほぼ10%以下になっている。
散布図をみると犯罪発生率が低いと価格が高くなっているので負の相関関係がある。
#8 外れ値の除去を行う
引数に0から1の値を与えて、指定した分位数で値を取得する。
ここでは試しに中央値の第2四分位数の50%の値を求めるので0.5で実行してみる。
#9 指定した(中央値)の値を求めてみる
q_50 = data1.CRIM.quantile(0.5)
q_50
0.25651
0.25651が中央値として表示されたので指定した値が取れているか再度統計量を表示して確認してみる
記述統計量を確認してみると50%が中央値と同じ値になっていることが確認できた。
data1[['CRIM','target']].describe()
#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()
データ数が506件から480件へ減少し、犯罪発生率の最大値が15.57になった。
外れ値が除去されていることが散布図からも確認できた。