处理缺失数据

Python 中的探索性数据分析

George Boorman

Curriculum Manager, DataCamp

为何缺失数据是问题?

  • 影响分布
    • 例如缺少高个学生的身高
  • 降低总体代表性
    • 某些群体被不成比例地表示,如缺最年长学生数据
  • 易导致错误结论

样本与总体身高分布;样本的最大值与均值更低

Python 中的探索性数据分析

数据从业者岗位数据

说明 数据类型
Working_Year 数据获取年份 浮点数
Designation 职位名称 字符串
Experience 资历级别,如 "Mid""Senior" 字符串
Employment_Status 雇佣类型,如 "FT""PT" 字符串
Employee_Location 工作国家 字符串
Company_Size 公司规模标签,如 "S""M""L" 字符串
Remote_Working_Ratio 远程工作占比 整数
Salary_USD 薪资(美元) 浮点数
Python 中的探索性数据分析

按资历的薪资分布

使用清洗后数据按资历划分的薪资箱线图,上限接近 600000 美元

使用含缺失的数据按资历划分的薪资箱线图,上限接近 450000 美元

Python 中的探索性数据分析

检查缺失值

print(salaries.isna().sum())
Working_Year            12
Designation             27
Experience              33
Employment_Status       31
Employee_Location       28
Company_Size            40
Remote_Working_Ratio    24
Salary_USD              60
dtype: int64
Python 中的探索性数据分析

处理缺失数据的策略

  • 删除缺失值
    • 占比不超过 5%
  • 用均值/中位数/众数填补
    • 取决于分布与情境
  • 按子组填补
    • 不同资历的薪资中位数不同
Python 中的探索性数据分析

删除缺失值

threshold = len(salaries) * 0.05
print(threshold)
30
Python 中的探索性数据分析

删除缺失值

cols_to_drop = salaries.columns[salaries.isna().sum() <= threshold]

print(cols_to_drop)
Index(['Working_Year', 'Designation', 'Employee_Location',
       'Remote_Working_Ratio'],
      dtype='object')
salaries.dropna(subset=cols_to_drop, inplace=True)
Python 中的探索性数据分析

用统计量填补

cols_with_missing_values = salaries.columns[salaries.isna().sum() > 0]
print(cols_with_missing_values)
Index(['Experience', 'Employment_Status', 'Company_Size', 'Salary_USD'], 
    dtype='object')
for col in cols_with_missing_values[:-1]:
    salaries[col].fillna(salaries[col].mode()[0])
Python 中的探索性数据分析

检查剩余缺失值

print(salaries.isna().sum())
Working_Year             0
Designation              0
Experience               0
Employment_Status        0
Employee_Location        0
Company_Size             0
Remote_Working_Ratio     0
Salary_USD              41
Python 中的探索性数据分析

按子组填补

salaries_dict = salaries.groupby("Experience")["Salary_USD"].median().to_dict()

print(salaries_dict)
{'Entry': 55380.0, 'Executive': 135439.0, 'Mid': 74173.5, 'Senior': 128903.0}
Python 中的探索性数据分析

按子组填补

salaries["Salary_USD"] = salaries["Salary_USD"].fillna(salaries["Experience"].map(salaries_dict))
Python 中的探索性数据分析

不再有缺失值!

print(salaries.isna().sum())
Working_Year            0
Designation             0
Experience              0
Employment_Status       0
Employee_Location       0
Company_Size            0
Remote_Working_Ratio    0
Salary_USD              0
dtype: int64
Python 中的探索性数据分析

Passons à la pratique !

Python 中的探索性数据分析

Preparing Video For Download...