

実際のデータで分析する時には、データが不完全な場合が多々あります。不完全なデータとは、欠損値や外れ値があるということです。
不完全なデータのまま分析してしまうと、正しい結果が得られません。不完全データの取り扱いについての理解が必要になります。
欠損値の取扱については、こちらをご覧下さい。
今回は、外れ値の取り扱いについて解説していきます
必要なライブラリをインポート
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns import warnings warnings.filterwarnings('ignore') from sklearn.datasets import fetch_california_housing housing = fetch_california_housing()
データセットの確認
今回は、sklearnにあるカリフォルニアの住宅価格のデータセットを使用します。
データセットを読み込んだら、データの中身を要約統計量で確認してみましょう。
original = pd.DataFrame(housing.data, columns=housing.feature_names) original[housing.target_names[0]] = housing.target original.describe()
各変数の意味は、
データの可視化
例として、「AveRooms(部屋の数)」を使って、データを確認してみましょう。
まずは、箱ひげ図(box plot)で確認してみましょう。
sns.distplot(original["AveRooms"])
なんかよく分かりませんね。箱が直線になってしまっています。非常に大きな値(120以上)もありますね。
ヒストグラムでも確認してみましょう。
sns.boxplot(original["AveRooms"])
0から10あたりに大きな集団がありますが、横軸が長くて、ばらつきが大きいですね。
データ分析の目的によっては、このままでもいいかもしれませんが、今回は外れ値があると考えて、その対処方法をみていきましょう。
パーセンテージで外れ値を削除する
外れ値の定義はありません。
箱ひげ図のデフォルトでは、ドットで表される数値が外れ値であると考えられます。つまり、四分位範囲から±四分位範囲の 1.5倍離れている数値です。
しかしこれは一般的な見解ではありません。基本的には、データ分析の目的やデータを確認してから決定する必要があります。
今回は、外れ値の取り扱いをコードで解説するので、詳細は解説しません。
データの 99%を超えるデータは欠損であると考えて、対処方法をみていきましょう。
outlier = original["AveRooms"].quantile(0.99) outlier
出力:
10.357033023735813
つまり、データの99%は10.35…より小さいということです。
では、データの99%を超えるデータの数を確認してみましょう。
sum(original["AveRooms"]>outlier)
出力:
207
99%を超えるデータは、207個あります。すべてのデータ数は、20640なので、わずかなデータ数と言えるでしょう。なので、99%を超えるデータを外れ値として削除してしまいましょう。
外れ値を削除する(パーセンテージ)
outlier_099 = original.query('AveRooms < @outlier') outlier_099.describe()
基本統計量はこんな感じになりました。データ数(count)は、20433となっており、20640(すべてのデータ)から、207(99%以上の外れ値)を引いた値になっています。
「AveRooms」をみてみると、max(最大値)が141.9から10.35になっています。75%の数値からみても妥当な最大値であると思われます。
データの可視化
箱ひげ図でデータを確認してみましょう
sns.boxplot(outlier_099["AveRooms"])
次に、ヒストグラムでデータを確認してみましょう。
sns.distplot(outlier_099["AveRooms"])
外れ値を削除する(数値で指定する)
オリジナルデータの箱ひげ図からは、明らかに120以上が外れ値であると確認できます。
そこで、120より大きい値を外れ値として、データから削除してみましょう。
outlier_120 = df_housing[df_housing["AveRooms"]<120] outlier_120.describe()
コードの「>120」に数値を指定すると、任意の数値で削除できます。
基本統計量はこんな感じになりました。データ数(count)は、20638になっています。
データの可視化
箱ひげ図でデータの分布を確認してみましょう。
plt.figure(figsize=(6,4),dpi=150) sns.boxplot(outlier_120["AveRooms"])
出力:
次にヒストグラムで確認してみましょう。
plt.figure(figsize=(6,4),dpi=150) sns.distplot(outlier_120["AveRooms"])
出力:
こんな感じです。
外れ値の取り扱いの注意点としては、外れ値の意味を知ること、分布から外れ値を定義することなどがあります。扱いを間違えないように注意してデータ分析や機械学習を行っていきましょう。
コメント