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

Разведочный анализ данных на Python

George Boorman

Curriculum Manager, DataCamp

Почему пропущенные данные — это проблема?

  • Искажают распределения
    • Пропуск роста высоких студентов
  • Снижают репрезентативность выборки
    • Отдельные группы представлены непропорционально, например, данные о старших студентах отсутствуют
  • Могут приводить к неверным выводам

Распределение роста в выборке и генеральной совокупности: максимум и среднее в выборке ниже

Разведочный анализ данных на Python

Данные о работе специалистов по данным

Столбец Описание Тип данных
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

Зарплата по уровням опыта

Ящичная диаграмма зарплат по уровням опыта на основе чистого набора данных: верхняя граница около 600 000 долларов

Ящичная диаграмма зарплат по уровням опыта на основе набора данных с пропусками: верхняя граница около 450 000 долларов

Разведочный анализ данных на 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...