【Python初心者】直感的に分かる外れ値の取り扱い

スポンサーリンク
Python
ゼロ知識の初心者がデータサイエンスを完全無料で学習する方法5選
データサイエンスの知識や技術、またはPythonについて学びたい。でも「大学に行くほど本気度がない」、「スクールに行くほどお金がない」、なんせ「時間がない」という方も多いはずです。というよりほとんどの方がそうだと思います(当然わたし...
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...

実際のデータで分析する時には、データが不完全な場合が多々あります。不完全なデータとは、欠損値や外れ値があるということです。
不完全なデータのまま分析してしまうと、正しい結果が得られません。不完全データの取り扱いについての理解が必要になります。
欠損値の取扱については、こちらをご覧下さい。
今回は、外れ値の取り扱いについて解説していきます

必要なライブラリをインポート

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()

出力:

各変数の意味は、

Medlnc           :医療費
HouseAge      :築年数
AveRooms     :部屋の数
AveBedrms    :ベッドの数
Population     :人口
AveOccup     :世帯数
Latitude         :軽度
Logitude        :緯度
MedHouseVal:住宅価格

データの可視化

例として、「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"])

出力:

こんな感じです。

外れ値の取り扱いの注意点としては、外れ値の意味を知ること、分布から外れ値を定義することなどがあります。扱いを間違えないように注意してデータ分析や機械学習を行っていきましょう。

【2021年】ゼロから統計学を独学したい人が読むべき書籍10冊

社会人なら知らないとまずい因果推論(Hillの基準)

コメント

タイトルとURLをコピーしました