Одна из самых частых проблем, с которыми я сталкивался в очистка данных/ Исследовательский анализ обрабатывает пропущенные значения: что делать с пропущенными данными. Во-первых, поймите, что НЕТ правильного способа справиться с отсутствующими данными.
Прежде чем перейти к методам вменения данных, нам нужно понять, почему данные отсутствуют.
Случайное отсутствие (MAR): Случайное отсутствие означает, что склонность точки данных к пропуску не связана с отсутствием данных, но связана с некоторыми наблюдаемыми данными.
Отсутствует полностью случайно (MCAR): тот факт, что определенное значение отсутствует, не имеет ничего общего с его гипотетическим значением и со значениями других переменных.
Отсутствующие неслучайные данные (MNAR): две возможные причины: отсутствующее значение зависит от гипотетического значения (например, люди с высокой зарплатой обычно не хотят раскрывать свой доход в опросах) или отсутствующее значение зависит от значения другую переменную (например, предположим, что женщины обычно не хотят раскрывать свой возраст! Здесь на отсутствующее значение переменной возраста влияет переменная пола).
В первых двух случаях безопасно удалять данные с пропущенными значениями на основе их появления, а в третьем случае удаление наблюдений с пропущенными значениями может привести к смещению в модели. Поэтому мы должны быть очень осторожны, прежде чем удалять наблюдения. Обратите внимание, что вменение не обязательно дает лучшее полученные результаты.
Удаление
- Список
Удаление списка (полный анализ случаев) удаляет все данные наблюдения, в которых есть одно или несколько отсутствующих значений. В частности, если отсутствующие данные ограничены небольшим числом наблюдений, вы можете просто исключить эти случаи из анализа. Однако в большинстве случаев часто невыгодно использовать удаление списка. В самом деле, предположения MCAR (полностью случайные пропажи), как правило, редко подтверждаются. Таким образом, методы удаления списка дают необъективные параметры и оценки.
новые данные <- na.omit(mydata)# В питоне
mydata.dropna(inplace=True)
- Попарно
Попарное удаление анализирует все случаи, в которых присутствуют интересующие переменные, и, таким образом, максимизирует все данные, доступные в базе анализа. Одна из сильных сторон этого метода заключается в том, что он увеличивает мощность вашего анализа, но у него много недостатков. Предполагается, что отсутствующие данные — это MCAR. Если вы удаляете попарно, вы получите разное количество наблюдений, относящихся к разным частям вашей модели, что может затруднить интерпретацию.

#PПопарное удаление
ncovMatrix <- cov(mydata, use="pairwise.complete.obs")#LПолистовое удаление
ncovMatrix <- cov(mydata, use="complete.obs")
- Удаление переменных
Всегда лучше сохранить данные, чем выбросить их. Иногда вы можете отбросить переменные, если данные отсутствуют для более чем 60 % случаев, но только если эта переменная незначительна. Тем не менее, вменение всегда лучше, чем отбрасывание переменных.
df <- подмножество (mydata, select = -c (x, z))
df <- мои данные[-c(1,3:4)]В питоне
del mydata.column_name
mydata.drop('имя_столбца', ось=1, inplace=Истина)
Методы временных рядов
- Последнее наблюдение перенесено вперед (LOCF) и следующее наблюдение перенесено назад (NOCB)
Это общепринятый статистический подход канализ данных продольные повторные измерения, когда некоторые последующие наблюдения могут отсутствовать. Продольные данные следуют одной и той же выборке в разные моменты времени. Оба этих метода могут внести погрешность в анализ и дать плохие результаты, когда данные показывают видимую тенденцию.
- Линейная интерполяция
Этот метод хорошо работает для серии хронологический с некоторой тенденцией, но не подходит для сезонных данных.
- Сезонность + интерполяция
Этот метод хорошо работает для данных как с трендом, так и с сезонностью.
библиотека (imputTS)na.random(mydata) # Случайное вменение
na.locf(mydata, option = "locf") # Последние наблюдения. Перенесено вперед
na.locf(mydata, option = "nocb") # Следующие наблюдения. Перенесено назад
na.interpolation(mydata) # Линейная интерполяция
na.seadec(mydata,algorithm="interpolation") # Сезонная корректировка, затем линейная интерполяция
Вменение (обычные методы)
Среднее, медиана и мода
Вычисление общего среднего, медианы или моды является очень простым методом вменения, это единственная тестируемая функция, которая не использует характеристики временного ряда или отношения между переменными. Это очень быстро, но имеет очевидные недостатки. Недостатком является то, что вменение среднего уменьшает дисперсию в наборе данных.
библиотека (imputTS)na.mean(mydata, option = "mean") # Вменение среднего значения
na.mean(mydata, option = "медиана") # Вменение медианы
na.mean(mydata, option = "mode") # Режим вмененияВ Питоне
из sklearn.preprocessing import Импутировать
значения = мои данные.значения
вменение = вменение (missing_values = 'NaN', стратегия = 'среднее')
преобразованные_значения = imputer.fit_transform (значения)Стратегию # можно изменить на «медиану» и «самую частую».
Линейная регрессия
Для начала идентифицируются несколько предикторов переменной с пропущенными значениями с помощью матрицы корреляция. Лучшие предикторы выбираются и используются как независимые переменные в уравнении регрессия. Переменная с отсутствующими данными используется как зависимая переменная. Случаи с полными данными для переменных-предикторов используются для создания уравнения регрессии; затем уравнение используется для прогнозирования пропущенных значений для неполных случаев.
В итеративном процессе вставляются значения отсутствующей переменной, а затем все случаи используются для прогнозирования зависимой переменной. Эти шаги повторяются до тех пор, пока между предсказанными значениями от одного шага к другому не будет небольшой разницы, то есть они не сойдутся.
Он «теоретически» дает хорошие оценки пропущенных значений. Однако у этой модели есть несколько недостатков, которые, как правило, перевешивают преимущества. Во-первых, поскольку замененные значения были предсказаны из других переменных, они имеют тенденцию «слишком хорошо» согласовываться, и поэтому стандартная ошибка снижается. Следует также предположить, что существует линейная зависимость между переменными, используемыми в уравнении регрессии, хотя ее может и не быть.
Множественное вменение
- Импутация: введите m умноженное на недостающие записи неполных наборов данных (m = 3 на рисунке). Обратите внимание, что вмененные значения взяты из распределения. Моделирование розыгрыша не включает неопределенность в параметрах модели. Лучшим подходом является использование моделирования цепи Маркова Монте-Карло (MCMC). Результатом этого шага является m полных наборов данных.
- Анализ: проанализируйте каждый из m заполненных наборов данных.
- Объединение: объединение результатов м-анализа в окончательный результат

# Мы будем использовать библиотеку мышей в r
библиотека (мыши)
# Вменение детерминированной регрессии на мышах
imp <- мыши (mydata, method = "norm.predict", m = 1)
# Хранить данные
data_imp <- завершено (имп)
# Множественное вменение
имп <- мыши (мои данные, m = 5)# построить прогностическую модель
соответствовать <- с (данные = имп, lm (y ~ x + z))#объединить результаты всех 5 моделей
комбинировать <- пул (подходить)
На сегодняшний день это предпочтительный метод вменения по следующим причинам:
- Легко использовать
- Отсутствие смещения (если модель вменения верна)
Вменение категориальных данных
- Модальное вменение — это один из методов, но он, безусловно, внесет погрешность.
- Отсутствующие значения можно рассматривать как отдельную категорию. Мы можем создать другую категорию для отсутствующих значений и использовать их как другой уровень. Это самый простой метод.
- Модели прогнозирования: здесь мы создаем модель прогнозирования для оценки значений, которые заменят отсутствующие данные. В этом случае мы разделяем наш набор данных на два набора: один набор без пропущенных значений для переменной (обучение) и другой набор с пропущенными значениями (тест). Мы можем использовать такие методы, как логистическая регрессия и ANOVA для прогнозирования.
- Множественное вменение.
С машинным обучением (knn) — более сложные методы см. в других курсах.
Существуют и другие методы машинного обучения, такие как XGBoost и Random Forest для импутации данных, но мы обсудим KNN, поскольку он широко используется. В этом методе k соседей выбираются на основе меры расстояния, и их среднее значение используется в качестве оценки вменения.
Метод требует выбора числа ближайших соседей и метрики расстояния. KNN может предсказывать как дискретные атрибуты (наиболее частое значение среди k ближайших соседей), так и непрерывные атрибуты (среднее значение среди k ближайших соседей).
Метрика расстояния зависит от типа данных:
- Непрерывные данные: обычно используемые метрики расстояния для непрерывных данных — евклидовы, манхэттенские и косинусные.
- Категориальные данные: в этом случае обычно используется расстояние Хэмминга. Он принимает все категориальные атрибуты и для каждого считает один, если значение не совпадает между двумя точками. Тогда расстояние Хэмминга равно количеству атрибутов, для которых значение было другим.
Одна из самых привлекательных особенностей алгоритма KNN заключается в том, что его легко понять и легко реализовать. Непараметрический характер KNN дает ему преимущество в определенных контекстах, где данные могут быть весьма «необычными».
Одним из очевидных недостатков алгоритма KNN является то, что при анализе больших наборов данных требуется время, так как он ищет похожие экземпляры в наборе данных.
Кроме того, точность KNN может сильно ухудшиться при работе с многомерными данными, поскольку разница между ближайшим и самым дальним соседями незначительна.
библиотека(DMwR)
knnВыход <- knnImputation(мои данные)В питоне
от fancyimpute импорт KNN
# Используйте 5 ближайших строк, в которых есть функция, чтобы заполнить недостающие функции каждой строки.
knnOutput = KNN(k=5).complete(mydata)
Из всех описанных выше методов широко используются множественное вменение и KNN, и обычно предпочтительнее использовать более простое множественное вменение.