(1) カテゴリカル変数の外れ値について
参考サイト:
数学的に、Categorical変数で外れ値を検出する方法はない。なぜなら、外れ値は距離なのでCategorical変数に距離は適用できない。
ただし、例えば1000人にりんごかオレンジのどちらが好きか尋ねて、999人がオレンジで、たった一人がりんごと答えた場合、りんごのデータを外れ値として扱うといった文脈で外れ値を判断することはできる。(頻度を見て外れ値を判断する。)
(2) 外れ値の検出法
参考サイト:
- Outlier Detection Practice: uni/multivariate
- Three ways to detect outliers
- 5 Ways to Detect Outliers/Anomalies That Every Data Scientist Should Know (Python Code)
- Fundamental Techniques of Feature Engineering for Machine Learning
大体以下の2つ
- Tukey法:四分位範囲のIQRを基準とした検出(下図参照)
- 標準偏差を基準とした検出
図:Tukey法
図:標準偏差を基準とした検出
■Tukey法のコード例:
# IQRによる外れ値を持つ変数のインデックスを返す関数
def detect_outliers(df, n, features):
'''
df: dataframe
n: 1レコード当たりの外れ値を持つ変数の数
features: dfで外れ値を見つけたい列名のリスト
戻り値:外れ値を持つレコードのインデックスのリスト
'''
outlier_indices = [] # 外れ値を持つレコードのインデックスを入れるリスト
# iterate over features(columns)
for col in features:
# 1st quartile(25%)
Q1 = np.percentile(df[col], 25)
# 3rd quartile(75%)
Q3 = np.percentile(df[col], 75)
# Interquartile range(IQR)
IQR = Q3 - Q1
# outlier step
outlier_step = 1.5 * IQR
# Determine a list of indices of outliers for feature col
# 外れ値のインデックス取得
outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step)].index
# append the found outlier indices for col to the list of outlier indices
outlier_indices.extend(outlier_list_col)
# select observations containing more than n outliers
outlier_indices = collections.Counter(outlier_indices)
multiple_outliers = list(k for k, v in outlier_indices.items() if v >= n)
return multiple_outliers
# detect outliers from list of features
lof = ['Age', 'Fare', 'SibSp', 'Parch']
# params dataset, number of outliers for rejection, list of features
Outliers_to_drop = detect_outliers(train_df, 2, lof)
# chekck outliers_records
train_df.iloc[Outliers_to_drop]
※Tukey法でデータ数減らしたくない時の代替案:外れ値をパーセンタイルの最大値・最小値で置き換える
コード例)
# 5%tile, 95%tileで置き換え
for col in out_list: # out_listは、列名のリスト
# 置き換え値
upper_lim = MICE_cup_df[col].quantile(.95)
lower_lim = MICE_cup_df[col].quantile(.05)
# IQR
Q1 = MICE_cup_df[col].quantile(.25)
Q3 = MICE_cup_df[col].quantile(.75)
IQR = Q3 - Q1
outlier_step = 1.5 * IQR
# 1.5IQR超える数値は95%tile値で埋める、下回る数値は5%tile値で埋める
MICE_cup_df.loc[(MICE_cup_df[col] > (Q3 + outlier_step)), col] = upper_lim
MICE_cup_df.loc[(MICE_cup_df[col] < (Q1 - outlier_step)), col] = lower_lim
■標準偏差値基準による外れ値検出例:
ホテルの予約レコードにおいて、予約テーブルの予約合計金額(total_price)で、平均値から標準偏差値の3倍以内の値に収まる予約レコードのみに絞る。
reserve_tb = reserve_tb[
(abs(reserve_tb['total_price'] - np.mean(reserve_tb['total_price'])) /
np.std(reserve_tb['total_price']) <= 3)
].rest_index()
データから平均値を引いた値の絶対値を標準偏差で割ることで、データが平均値から標準偏差の何倍離れているかを計算し、不等式を適用している。
0コメント