Робота з пропущеними даними

Exploratory Data Analysis у Python

George Boorman

Curriculum Manager, DataCamp

Чому пропуски — це проблема?

  • Впливає на розподіли
    • Немає зросту в найвищих студентів
  • Менш репрезентативні для генеральної сукупності
    • Деякі групи пере-/недопредставлені, напр., немає даних про найстарших студентів
  • Може призвести до хибних висновків

Розподіл зросту у вибірці та генеральній сукупності; у вибірки нижчі максимум і середнє

Exploratory Data Analysis у 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
Exploratory Data Analysis у Python

Зарплата за рівнем досвіду

Боксплот зарплат за рівнями досвіду в чистому наборі; верхня межа близько 600000 доларів

Боксплот зарплат за рівнями досвіду в наборі з пропусками; верхня межа близько 450000 доларів

Exploratory Data Analysis у 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
Exploratory Data Analysis у Python

Стратегії роботи з пропусками

  • Видалити пропуски
    • 5% або менше від усіх значень
  • Імпутувати середнє, медіану, моду
    • Залежить від розподілу та контексту
  • Імпутувати всередині підгруп
    • Різні рівні досвіду мають різну медіанну зарплату
Exploratory Data Analysis у Python

Видалення пропущених значень

threshold = len(salaries) * 0.05
print(threshold)
30
Exploratory Data Analysis у 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)
Exploratory Data Analysis у 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])
Exploratory Data Analysis у 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
Exploratory Data Analysis у 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}
Exploratory Data Analysis у Python

Імпутація за підгрупами

salaries["Salary_USD"] = salaries["Salary_USD"].fillna(salaries["Experience"].map(salaries_dict))
Exploratory Data Analysis у 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
Exploratory Data Analysis у Python

Давайте потренуємось!

Exploratory Data Analysis у Python

Preparing Video For Download...