處理離群值

Python 的探索性資料分析

George Boorman

Curriculum Manager, DataCamp

什麼是離群值?

  • 與其他資料點距離很遠的觀測值
    • 房價中位數:$400,000
    • 離群房價:$5,000,000

 

  • 應思考為何數值不同:
    • 地點、臥室數、總坪數等

帶泳池的大型住宅

1 Image credit: 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 的探索性資料分析

薪資分佈

將離群值以中位數取代後的薪資直方圖,顯示約 250000 到 450000 美元的極端值

將離群值以中位數取代後的薪資直方圖,分佈近似常態

Python 的探索性資料分析

一起來練習吧!

Python 的探索性資料分析

Preparing Video For Download...