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 дедупликации?
- Когда стоит оставить данные с ошибками в обучающей выборке, а не исправлять их?