外れ値の扱い

Pythonで学ぶ探索的データ分析

George Boorman

Curriculum Manager, DataCamp

外れ値とは?

  • 他の点から大きく離れた観測値
    • 住宅価格の中央値: $400,000
    • 外れ値の住宅価格: $5,000,000

 

  • なぜ異なるかを検討する:
    • 立地、寝室数、広さなど

プール付きの大きな家

1 画像クレジット: https://unsplash.com/@ralphkayden
Pythonで学ぶ探索的データ分析

記述統計の利用

print(salaries["Salary_USD"].describe())
count       518.000
mean     104905.826
std       62660.107
min        3819.000
25%       61191.000
50%       95483.000
75%      137496.000
max      429675.000
Name: Salary_USD, dtype: float64
Pythonで学ぶ探索的データ分析

四分位範囲の利用

四分位範囲(IQR)

  • IQR = 第75百分位 − 第25百分位
Pythonで学ぶ探索的データ分析

箱ひげ図でのIQR

sns.boxplot(data=salaries,
            y="Salary_USD")
plt.show()

データ専門職の給与の箱ひげ図。箱の下端が第25百分位、中央線が第50百分位、上端が第75百分位、箱外の菱形が外れ値を示す

Pythonで学ぶ探索的データ分析

四分位範囲の利用

四分位範囲(IQR)

  • IQR = 第75百分位 − 第25百分位
  • 上側の外れ値 > 第75百分位 + (1.5 × IQR)
  • 下側の外れ値 < 第25百分位 − (1.5 × IQR)
Pythonで学ぶ探索的データ分析

しきい値の算出

# 75th percentile
seventy_fifth = salaries["Salary_USD"].quantile(0.75)

# 25th percentile twenty_fifth = salaries["Salary_USD"].quantile(0.25)
# Interquartile range salaries_iqr = seventy_fifth - twenty_fifth
print(salaries_iqr)
76305.0
Pythonで学ぶ探索的データ分析

外れ値の特定

# Upper threshold
upper = seventy_fifth + (1.5 * salaries_iqr)

# Lower threshold lower = twenty_fifth - (1.5 * salaries_iqr)
print(upper, lower)
251953.5 -53266.5
Pythonで学ぶ探索的データ分析

データの抽出

salaries[(salaries["Salary_USD"] < lower) | (salaries["Salary_USD"] > upper)] \

[["Experience", "Employee_Location", "Salary_USD"]]
        Experience    Employee_Location    Salary_USD
29      Mid           US                   429675.0
67      Mid           US                   257805.0
80      Senior        US                   263534.0
83      Mid           US                   429675.0
133     Mid           US                   403895.0
410     Executive     US                   309366.0
441     Senior        US                   362837.0
445     Senior        US                   386708.0
454     Senior        US                   254368.0
Pythonで学ぶ探索的データ分析

外れ値を調べる理由

  • 外れ値は極端な値

    • データを正確に代表しない可能性
  • 平均や標準偏差を変えてしまう

  • 統計的検定や機械学習モデルは正規分布を前提とすることが多い

Pythonで学ぶ探索的データ分析

外れ値への対処

確認すべきこと

  • なぜこれらの外れ値があるのか?
    • 上位役職/国の違いで高給の可能性
    • データセットに残す選択肢も検討

 

  • データは正確か?
    • 収集時の誤りの可能性は?
      • その場合は削除
Pythonで学ぶ探索的データ分析

外れ値の除去

no_outliers = salaries[(salaries["Salary_USD"] > lower) & (salaries["Salary_USD"] < upper)]
print(no_outliers["Salary_USD"].describe())
count       509.000000
mean     100674.567780
std       53643.050057
min        3819.000000
25%       60928.000000
50%       95483.000000
75%      134059.000000
max      248257.000000
Name: Salary_USD, dtype: float64
Pythonで学ぶ探索的データ分析

給与の分布

外れ値を中央値に置換する前の給与ヒストグラム。約25万〜45万ドルの極端な値を含む

外れ値を中央値に置換した後の給与ヒストグラム。ほぼ正規分布に近い形状

Pythonで学ぶ探索的データ分析

練習しましょう!

Pythonで学ぶ探索的データ分析

Preparing Video For Download...