處理遺漏資料

Python 的探索性資料分析

George Boorman

Curriculum Manager, DataCamp

為什麼遺漏資料是問題?

  • 影響分佈
    • 較高學生的身高缺失
  • 代表性下降
    • 某些族群偏多,例如最年長學生缺少資料
  • 可能導致錯誤結論

樣本與母體的身高中位圖,樣本的最大值與平均值較低

Python 的探索性資料分析

資料從業者的職務資料

Column Description Data type
Working_Year 取得資料的年份 Float
Designation 職稱 String
Experience 資歷層級,如 "Mid""Senior" String
Employment_Status 僱用型式,如 "FT""PT" String
Employee_Location 工作國家 String
Company_Size 公司規模標籤,如 "S""M""L" String
Remote_Working_Ratio 遠端工作的時間比例(%) Integer
Salary_USD 以美元計的薪資 Float
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 的探索性資料分析

一起來練習吧!

Python 的探索性資料分析

Preparing Video For Download...