В прошлом посте я рассказывал, почему без EDA нельзя делать ни аналитику, ни машинное обучение. Даже если продакт стоит над душой и требует цифры «ещё вчера». Теперь давай разберём первый и самый недооценённый шаг в исследовательском анализе: осмотр данных.
Представь, что ты лезешь в базу и... сразу пишешь
groupby() или строишь график? Это ловушка. Начинать нужно не с расчётов, а с банального знакомства с тем, что у тебя вообще в руках. Осмотр данных — это как включить свет в темной комнате. Сразу видно, где пыльно, а где стоит тумбочка, об которую легко споткнуться.Первым делом смотри на объем данных:
df.shape покажет, сколько строк и колонок. Иногда там вообще пара десятков строк — и это уже повод позвать дата-инженера. Дальше — названия колонок. Через
df.columns можно заметить лишние пробелы, странные символы, дубли названий. Здесь же удобно сразу стандартизировать названия: убрать русские слова и привести к единому стилю ("snake_case" ван лав). Такие вещи не бросаются в глаза, но потом ломают пайплайн.Теперь — в бой идет
df.info(). Это твой лучший друг. Он покажет:▪️какие типы данных у колонок,
▪️сколько ненулевых значений,
▪️сколько памяти жрёт датафрейм.
Обрати внимание: если в колонке написано, что у неё 80 000 непустых значений, а в
df.shape[0] у тебя 100 000 — значит, 20% пропусков. Это серьёзно. Ещё один лайфхак: если колонка выглядит пустой, но
info() говорит, что там всё заполнено — проверь, не строки ли там вроде " " или "None". Это визуальные, а не настоящие пропуски. Так что df.replace() тебе в помощь.Если всё типы данных соответствуют ожиданиям — отлично. Если нет — можно наткнуться на неприятности. Например,
object вместо чисел или дат — и ты не сможешь нормально группировать, фильтровать, делить на категории. В таких случаях сразу меняй тип или уточняй источник.Следом подключай
df.describe(). Это быстрый способ понять, как «живут» числовые данные. Сравни среднее и медиану — это может подсветить асимметричное распределение. Проверь минимум и максимум — там часто сидят выбросы или ошибки: отрицательные значения там, где их быть не должно, нули в колонке с деньгами, тысячи категорий у рейтинга от 1 до 5.Дополнительно пригодится
.nunique(): иногда колонка кажется категориальной, а там каждый второй элемент уникален. Это уже почти ID, и скорее всего — не то, что ты хотел анализировать.И не забывай смотреть глазами.
df.head(), df.tail() — быстрый способ поймать неявные проблемы. Например, даты, которые лежат строками. Или списки внутри ячеек. Или дубли с разницей в один символ. В табличке может быть много неожиданного — особенно если её собирали в два этапа, три человека, а выгружал четвёртый.Осмотр данных — это про внимательность и здравый смысл. Здесь ты ловишь грубые баги, структурные проблемы и мусор, который может незаметно утащить твою аналитику не туда. А ещё — экономишь себе кучу времени, потому что не придется всё переделывать после того, как уже построен отчёт.
В следующем посте поговорим про пропуски и дубликаты. Ставь лайк, если тема интересна.
#харды #eda