处理离群值

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百分位,中位数为箱体中线,箱体顶部为第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 中的探索性数据分析

Passons à la pratique !

Python 中的探索性数据分析

Preparing Video For Download...