Python 実践 データ加工/可視化 100本ノック に挑戦 ノック84

Python 実践 データ加工/可視化 100本ノック」を購入したので、

一通りやっているところです。今日はノック84を行います。

資料は以下から入手できます。

Python実践 データ加工/可視化 100本ノック|サポート|秀和システム

 

ノック84 : 外れ値の検出をしよう

統計的に標準のサンプル値とは大きくかけ離れている値を外れ値と呼ばれています。

 

今回は箱ひげとIQRという値をもちいた外れ値検出を行います。

下から1/4番目のサンプル値を1/4quantile(分位数)と呼びます。

3/4番目のサンプル値を3/4quantileと呼びます。

3/4quantileと1/4quantileの差をIQRと呼びます。

今回は、下限を1/4quantileより1.5xIQR小さい値、

上限を3/4quantileより1.5xIQR大きい値としたとき、上限値と下限値の間に収まっていない値を外れ値とします。

import seaborn as sns
from sklearn.model_selection import train_test_split
import pandas as pd

dataset = sns.load_dataset('titanic')
label = dataset.pop('survived')

train_ds,test_ds,train_label,test_label=train_test_split(
    dataset,label,random_state=2021,stratify=label)

train_ds.drop(columns=['embark_town','alive'],inplace=True)

one_hot_encoded = pd.get_dummies(train_ds)
one_hot_encoded = pd.get_dummies(one_hot_encoded,columns=['pclass'])
train_ds = one_hot_encoded
#ノック84
q = train_ds.quantile([1/4,3/4])
q1,q3 = q.loc[1/4],q.loc[3/4]
iqr=q3-q1
mx = q3+1.5*iqr
mn = q1-1.5*iqr

print(((train_ds > mx)|(train_ds < mn)).sum())

 

 

実行結果

age               4
sibsp            40
parch           164
fare             88
adult_male        0
alone             0
sex_female        0
sex_male          0
embarked_C      127
embarked_Q       58
embarked_S        0
class_First     164
class_Second    133
class_Third       0
who_child        64
who_man           0
who_woman         0
deck_A           11
deck_B           33
deck_C           45
deck_D           27
deck_E           24
deck_F            9
deck_G            2
pclass_1        164
pclass_2        133
pclass_3          0

 

実行結果より例えばageは4個外れ値があることがわかります。

ageの箱ひげ図を見てみます。

import matplotlib.pyplot as plt
label = train_ds.pop('age')
label.plot.box()
plt.show()

 

実行結果

age 箱ひげ図

 

一番下の線が最小値、一番上の線が最大値、真ん中の緑の線が中央値です。

〇は外れ値で、4個あるのでこれが除外された4つなります。

 

 

 

 

/* -----codeの行番号----- */