外れ値について(Boxplotとかカテゴリカル変数の外れ値とか、Tukey法のコードとか)


(1) カテゴリカル変数の外れ値について

参考サイト:


 数学的に、Categorical変数で外れ値を検出する方法はない。なぜなら、外れ値は距離なのでCategorical変数に距離は適用できない。

 ただし、例えば1000人にりんごかオレンジのどちらが好きか尋ねて、999人がオレンジで、たった一人がりんごと答えた場合、りんごのデータを外れ値として扱うといった文脈で外れ値を判断することはできる。(頻度を見て外れ値を判断する。)



(2) 外れ値の検出法

参考サイト:


大体以下の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()

データから平均値を引いた値の絶対値を標準偏差で割ることで、データが平均値から標準偏差の何倍離れているかを計算し、不等式を適用している。

機械学習Tips保管庫

データ解析、機械学習のための学習内容の保管庫。復習用。

0コメント

  • 1000 / 1000