Data Science

Работа с грязными данными

Исследование Harvard Business Review: компании тратят 50% рабочего времени аналитиков на поиск, чистку и подготовку данных. Модель, обученная на грязных данных, выдаёт красивые метрики на train set и катастрофические результаты в production. 'Garbage in, garbage out' - фундаментальный закон ML.

  • Amazon Prime recommendation: один неправильный join таблиц дал рекомендации к уже купленным товарам - потеря конверсии 3% на неделю
  • Zillow Offers: модель оценки жилья обучалась на данных с систематическими ошибками геокодирования - убыток $500 миллионов, закрытие бизнеса
  • Airbnb DataQuality platform: автоматическая валидация 1000+ датасетов ежедневно через Great Expectations - data issues видны до попадания в production модели

Missing Values: стратегии работы с пропусками

Пропущенные значения бывают трёх типов: MCAR (Missing Completely At Random) - пропуски случайны, MART (Missing At Random) - зависят от других переменных, MNAR (Missing Not At Random) - зависят от самого пропущенного значения. Тип пропуска определяет стратегию.

KNN и MICE (Multiple Imputation by Chained Equations) сохраняют корреляции между переменными. Простой mean imputation уменьшает дисперсию и искажает корреляции. scikit-learn IterativeImputer реализует MICE. Для tree-based моделей (XGBoost, LightGBM) можно передавать NaN напрямую - они обрабатывают пропуски нативно.

Данные опроса о доходе: богатые люди чаще не указывают доход. Это какой тип пропусков?

Дубликаты и near-duplicates

Точные дубликаты - легко найти через df.duplicated(). Проблемнее near-duplicates: 'Иван Иванов' и 'Ivan Ivanov', 'LLC Google' и 'Google LLC'. Для строковых данных - fuzzy matching. Для продуктовых данных - MinHash или SimHash для эффективного поиска похожих записей.

Почему drop_duplicates() не находит 'Google LLC' и 'LLC Google' как дубликаты?

Inconsistency: несогласованность данных

Inconsistency - данные противоречат друг другу или ожидаемым форматам: 'M', 'Male', 'male', 'М' (кириллица) для пола; даты в трёх форматах; отрицательный возраст; заказ датируется раньше регистрации пользователя. Standardization + cross-field validation.

Great Expectations - Python библиотека для документирования и валидации ожиданий о данных. expect_column_values_to_be_between, expect_column_values_to_not_be_null, expect_column_pair_values_A_to_be_greater_than_B. Генерирует HTML отчёт. Используется в Airbnb, Netflix для Data Quality monitoring.

Лучшая практика при обнаружении невалидных записей (отрицательный возраст):

Data Validation Pipeline: автоматизация качества

Ручная проверка данных не масштабируется. Data validation pipeline: схема (типы, диапазоны, форматы), статистические ожидания (дистрибуция, mean ± стандартное отклонение), ссылочная целостность (FK в другой таблице). Запускается при каждой загрузке данных.

Почему статистические ожидания (mean в диапазоне) важны наряду с типовыми проверками (not null)?

Ключевые идеи

  • Missing values: тип пропуска (MCAR/MAR/MNAR) определяет стратегию - удаление, imputation или признак пропуска.
  • Near-duplicates требуют fuzzy matching (rapidfuzz, recordlinkage) - exact match находит только точные совпадения.
  • Validation pipeline: ожидания документируются и запускаются автоматически - data issues видимы, а не скрыты.

Связанные темы

Качество данных фундаментально для всего downstream анализа:

  • Regression и Classification — Грязные данные напрямую ухудшают качество моделей - очистка перед обучением обязательна
  • ML Pipeline: от notebook к production — Validation pipeline - часть ML pipeline; Great Expectations интегрируется с Airflow и MLflow

Вопросы для размышления

  • Как отличить MNAR от MAR в реальных данных: когда нужен дополнительный опрос или анализ механизма сбора?
  • Сколько процентов дубликатов в датасете оправдывает написание сложного pipeline дедупликации?
  • Когда стоит оставить данные с ошибками в обучающей выборке, а не исправлять их?

Связанные уроки

  • ml-04-data-preprocessing
Работа с грязными данными

0

1

Войти