Добавить в корзинуПозвонить
Найти в Дзене
PythonTalk

Убийца df.isna().sum(): инструмент, который покажет то, о чем молчат ваши данные

Первая реакция любого, кто работает с Pandas и видит пропуски в данных? Правильно, вызвать df.isna().sum(). Получить аккуратную табличку с цифрами, кивнуть и почувствовать себя хозяином положения. А теперь давайте посмотрим на реальный пример. Никаких стерильных учебных датасетов, к которым все привыкли. У нас в руках данные каротажа по скважинам в Норвежском море — куча геологических измерений для поиска нефти. И как любые реальные данные, они дырявые, как швейцарский сыр. И вот вы загружаете это, вызываете df.isna().sum() и видите столбик цифр. Но что эти цифры говорят вам на самом деле? Знать, сколько данных пропущено — это как знать вес пациента, не измеряя его температуру, давление и пульс. Это лишь первый, самый поверхностный шаг. Гораздо важнее понять, КАК они пропущены: Простой подсчет NaN не ответит ни на один из этих вопросов. А без ответов вы рискуете либо удалить половину ценной информации командой dropna(), либо «замазать» дыры средним значением, исказив все скрытые связи
Оглавление

Первая реакция любого, кто работает с Pandas и видит пропуски в данных? Правильно, вызвать df.isna().sum(). Получить аккуратную табличку с цифрами, кивнуть и почувствовать себя хозяином положения.

А теперь давайте посмотрим на реальный пример. Никаких стерильных учебных датасетов, к которым все привыкли. У нас в руках данные каротажа по скважинам в Норвежском море — куча геологических измерений для поиска нефти. И как любые реальные данные, они дырявые, как швейцарский сыр.

И вот вы загружаете это, вызываете df.isna().sum() и видите столбик цифр. Но что эти цифры говорят вам на самом деле? Знать, сколько данных пропущено — это как знать вес пациента, не измеряя его температуру, давление и пульс. Это лишь первый, самый поверхностный шаг. Гораздо важнее понять, КАК они пропущены:

  • Есть ли в этих пропусках какая-то система?
  • Они случайны, как опечатка, или это сигнал о сломанном датчике?
  • Если в строке нет значения X, значит ли это, что там не будет и значения Y?

Простой подсчет NaN не ответит ни на один из этих вопросов. А без ответов вы рискуете либо удалить половину ценной информации командой dropna(), либо «замазать» дыры средним значением, исказив все скрытые связи в данных.

Чтобы перейти от слепого подсчета к реальной диагностике, нам нужен инструмент, который превратит сухую таблицу в наглядную карту. И здесь на сцену выходит missingno.

Визуальный аудит: от цифр к инсайтам

missingno — это не просто библиотека для красивых графиков. Это философия визуального аудита данных. Она даёт четыре мощных инструмента, каждый из которых — как отдельный прибор в арсенале диагноста.

Устанавливается стандартно: pip install missingno. А дальше начинается магия.

msno.bar(): Общая температура по больнице

Это, по сути, графический аналог isna().sum(). Он мгновенно показывает, какая доля данных присутствует в каждом столбце.

Первый взгляд: сразу видно самых проблемных пациентов.
Первый взгляд: сразу видно самых проблемных пациентов.

Как его читать:

  • Ось Y — полнота данных от 0.0 (пусто) до 1.0 (полностью заполнено).
  • Ось X — наши столбцы.
  • Цифры сверху — количество НЕпропущенных значений.

Это быстрый, удобный первый шаг. Вы сразу видите аутсайдеров — столбцы, где данных почти нет (привет, DTS и DCAL из примера).

Полезно? Да. Достаточно? Категорически нет. Этот график всё ещё не показывает нам расположение пропусков. Чтобы заглянуть внутрь, нам нужен следующий инструмент.

И вот тут начинается самое интересное...

msno.matrix(): Рентген вашего датафрейма

Матричный график — это, пожалуй, главный и самый мощный инструмент в missingno. Он позволяет буквально заглянуть внутрь датафрейма и увидеть точное расположение каждого пропущенного значения. Это не просто график, это рентгеновский снимок ваших данных.

Структура пропусков как на ладони. Белые полосы — это наши "переломы" в данных.
Структура пропусков как на ладони. Белые полосы — это наши "переломы" в данных.

Как его читать:

  • Черные области — это данные, которые у нас есть.
  • Белые полосы и точки — это пропуски (NaN).
  • Спарклайн справа — гениальная штука. Это мини-график, который показывает «здоровье» данных по строкам. Чем выше линия, тем больше дыр в этом участке датафрейма.

Что мы видим на этом «снимке»?

  1. Пропуски не случайны. Они образуют огромные белые блоки. Это кричит о том, что данные отсутствуют не точечно, а целыми сегментами. Вероятно, для каких-то скважин или на определенных глубинах эти измерения просто не проводились.
  2. Есть горячие точки. Спарклайн справа рваный. Это значит, что есть целые группы строк, где данных не хватает катастрофически.
  3. Визуальная корреляция. Посмотрите на столбцы X_LOC, Y_LOC, Z_LOC и RDEP. Белые горизонтальные «шрамы» в них появляются и исчезают синхронно. Это прямое подтверждение гипотезы: если пропало одно — пропали и остальные.

Матричный график переводит наш анализ с уровня «сколько» на уровень «где и как». Но что если мы хотим измерить эту синхронность численно?

msno.heatmap(): Детектор скрытых связей

Мы уже подозреваем, что пропуски связаны. Тепловая карта создана, чтобы измерить эту связь количественно. Она вычисляет корреляцию отсутствия данных (nullity correlation) между столбцами.

Светлые квадраты — это "банды" столбцов, которые теряют данные вместе.
Светлые квадраты — это "банды" столбцов, которые теряют данные вместе.

Как её читать:

  • Светлые тона (близко к 1): Сильная положительная корреляция. Если значение отсутствует в одном столбце, оно с высокой вероятностью отсутствует и в другом.
  • Темные тона (близко к 0): Связи нет. Пропуски в этих столбцах живут своей жизнью.
  • Отрицательные значения (редкость): Если в одном пусто, то в другом густо.

Что нам это даёт? Мы видим яркий светлый квадрат в области столбцов RDEP, RMED, X_LOC, Y_LOC, Z_LOC. Они — настоящая банда. Пропадают почти всегда вместе. А вот DTS и RSHA — одиночки. Их проблемы с данными — их личные проблемы, не связанные с другими.

А чтобы увидеть всю иерархию этих связей, есть дендрограмма.

msno.dendrogram(): Генеалогическое древо пропусков

Дендрограмма группирует столбцы с похожими паттернами пропусков. Это как построить генеалогическое древо, где близкие родственники — это столбцы, чьи пропуски ведут себя похоже.

Кто кому родственник в пропущенных данных.
Кто кому родственник в пропущенных данных.

Столбцы, которые объединяются низко (ближе к 0), — ближайшие родственники с почти идентичной структурой пропусков. Чем выше по дереву происходит объединение, тем дальше родство.

Здесь мы снова видим клан «идеальных» (полностью заполненные столбцы, объединенные на уровне 0), клан «геопозиции» (X_LOC, Y_LOC, Z_LOC и другие) и «дальних родственников» вроде DTS, которые ни на кого не похожи.

Так что со всем этим делать?

Библиотека missingno не заполняет пропуски за вас. Она делает нечто более важное — дает вам исчерпывающую информацию для принятия осознанного решения.

Вместо гадания на кофейной гуще у нас есть четкий план действий:

  1. Столбец DTS: Пропущено >85% данных. Пытаться его лечить — значит, скорее всего, навредить. Вердикт — удалить.
  2. Кластер X_LOC, Y_LOC, Z_LOC, RDEP: Теряют данные синхронно. Если удалять строки с пропусками, то с учетом всей группы. Удаление строк по X_LOC почти наверняка убьет те же строки для Y_LOC и Z_LOC.
  3. Столбцы с умеренными пропусками (FORMATION, RHOB и т.д.): Их пропуски не связаны. Значит, для каждого можно подбирать свою, индивидуальную стратегию заполнения (импутации).

Простой вызов df.isna().sum() никогда не дал бы нам такой глубины. Визуальный анализ превращает рутинную проблему в интересный квест, после которого вы знаете о своих данных на порядок больше. А хорошее знание данных — это и есть ключ к сильным моделям.

🔥 Полный пошаговый разбор этого кейса с кодом и всеми графиками я уже оформил в подробную статью. Забирайте в базе знаний на моем сайте, чтобы всегда иметь под рукой.
👉
Пропуски в данных — не приговор: Полное руководство

А обсудить свои кейсы и задать вопросы можно в нашем телеграм-канале. Там материалы, которые не попадают в блог. Подписывайтесь!
👉
PythonTalk в Telegram