Exploratory Data Analysis: распределения и аномалии
Содержание курса
5. Пропущенные значения: три разных механизма
Пропуск в данных — это не просто отсутствующая ячейка. Важно понимать, почему она пустая, потому что от этого зависит, что с ней делать дальше. Существует три принципиально разных механизма пропусков:
- MCAR (Missing Completely At Random) — пропуск никак не связан ни с самим пропущенным значением, ни с другими признаками. Например, часть записей потерялась из-за случайного сбоя при выгрузке. Такие пропуски можно удалить или заполнить без риска внести смещение.
- MAR (Missing At Random) — пропуск зависит от других наблюдаемых признаков, но не от самого пропущенного значения. Например, данные о промо-активности отсутствуют чаще для магазинов определённого типа, но не потому, что промо там было или не было. Здесь удаление строк уже может дать смещённую выборку.
- MNAR (Missing Not At Random) — пропуск зависит именно от самого пропущенного значения. Например, магазины с очень низкими продажами могут не передавать данные — тогда пропуск в
Salesсвязан с его реальным значением. Это самый опасный случай: никакая импутация не устраняет смещение без дополнительных предположений. Вrossmann_train.csvпо сводке пропусков все ключевые столбцы —Store,DayOfWeek,Date,Sales,Customers,Open— заполнены полностью, пропусков нет. Это упрощает анализ, но не означает, что данные идеальны: нули вSalesприOpen=1— это тоже форма аномалии, которую стоит проверять отдельно. Проверить количество и долю пропусков по каждому столбцу элементарно:
import pandas as pd
df = pd.read_csv('rossmann_train.csv')
missing = df.isnull().sum()
missing_pct = df.isnull().mean() * 100
pd.DataFrame({'missing_count': missing, 'missing_pct': missing_pct.round(2)})
Если датасет расширенный и содержит, например, дополнительные характеристики магазинов (StoreType, Assortment, CompetitionDistance), там пропуски уже встречаются — и паттерн их распределения становится информативным: CompetitionDistance отсутствует у части магазинов, и это, скорее всего, MAR или MNAR, а не случайный сбой. Почему механизм пропуска важен до того, как вы выбрали стратегию заполнения? Потому что одна и та же операция — скажем, заполнение медианой — даёт разные последствия в зависимости от природы пропуска. При MCAR это нейтрально. При MNAR это маскирует систематический паттерн и портит обучение модели. Разбираться с механизмом нужно до кода, не после.
