This is Data
6.18K subscribers
188 photos
212 links
Канал Романа Романчука про аналитику и данные.

Рассказываю про метрики и мат.статистику. Обозреваю ENG и RUS статьи. Советую книги. Делюсь скриптами, ссылками, майндмэпами.

Сайт: https://thisisdata.ru
Задать вопрос: @romanchuk_roman
Download Telegram
Этот шаг спасет твою аналитику (и карьеру)

Классический кейс. К аналитику прибегает продакт с горящими глазами: «Срочно нужно посчитать метрики, отчет нужен вчера, босс ждет!». Аналитик лезет в сырые данные, быстро собирает дашборд… и всё. Ни тебе проверки распределений, ни поиска выбросов, ни визуализации. Продакт на следующий день презентует эти цифры как истину в последней инстанции. А потом на них строятся бизнесовые решения…

Так делать нельзя. Никогда.

Исследовательский анализ данных (EDA — Exploratory Data Analysis) — это первый и обязательный шаг перед тем, как ты начнёшь считать метрики, строить модели или делать выводы. Он помогает понять, с чем ты на самом деле работаешь, выявить ошибки и аномалии, а самое главное, не попасть в ловушку красивых, но ложных цифр.

Особенно критично это в машинном обучении. Когда ты обучаешь модель на плохих данных, хороший результат невозможен в принципе. В этом смысле работает железное правило: garbage in — garbage out.

Что входит в EDA?

✔️ Осмотр данных. Сколько строк? Какие типы колонок? Что выглядит странно? Уже на этом этапе можно поймать очевидные ошибки. Используй .info(), .describe(), загляни в начало и конец таблицы, проверь типы.

✔️ Пропуски и дубликаты. Пропуски не всегда нужно удалять — иногда лучше заполнить их медианой, модой или предсказанными значениями. А дубликаты — это не только точные копии строк. Часто бывают неявные: например, у одного пользователя два одинаковых заказа с разными ID.

✔️ Очистка и предобработка. Проверка категориальных значений, работа с форматами, единообразие записи. Например, если у тебя в колонке есть и «Санкт-Петербург» и «СПБ» и «Питер», то без нормализации это три разных значения. А если даты хранятся как строки — ты не сможешь нормально их анализировать.

✔️ Выбросы и аномалии. Просто посчитать среднее недостаточно. Построй распределение, используй boxplot. Эти графики мгновенно покажут, где данные выбиваются за границы нормы. И не забывай: один выброс может испортить тебе весь анализ.

✔️ Визуализация. Даже простой scatter plot может рассказать тебе гораздо больше, чем набор агрегатов. Иногда взаимосвязь между переменными становится очевидной только когда ты её увидишь, а не посчитаешь.

EDA — это не про «поковыряться в данных». Это про понять, что ты анализируешь, и быть уверенным в своих выводах. Это защита от ошибок, которые ты даже не успел заметить.

В следующих постах я постепенно разберу каждый из этапов подробнее. А также поделюсь универсальным ноутбуком для проведения EDA. Так что добавляй в закладки 😉

#харды #eda
🔥67❤19👍7🤔2
С чего начинается хорошая аналитика?

В прошлом посте я рассказывал, почему без 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
👍81❤17👎1🔥1
Дубликаты в данных: откуда берутся и почему с ними важно работать

Продолжаем говорить про EDA.

Один из частых источников искажений в аналитике — дубликаты. Они могут незаметно влиять на показатели: увеличивать количество пользователей, транзакций или заказов, создавать иллюзию активности и «раздувать» отчёты. Поэтому выявление и обработка дубликатов — обязательный этап в рамках EDA.

Дубликаты бывают двух типов:

▪️Явные — полные копии строк, где значения совпадают по всем колонкам. Их легко обнаружить с помощью df.duplicated() и удалить через df.drop_duplicates().

▪️Неявные — строки, которые описывают один и тот же объект, но отличаются по формату.

Например:
▪️"[email protected]" и "[email protected]"
▪️"ООО Ромашка" и "О.О.О. Ромашка"
▪️"Иванов И.И." и "Иванов Иван"

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

Основные причины появления дубликатов:

▪️Повторная выгрузка или объединение таблиц без фильтрации.
▪️Ошибки при джойне.
▪️Разные источники с разной структурой.
▪️Отсутствие стандартизации ввода данных.
▪️Человеческий фактор (опечатки, лишние пробелы, регистр).

Что помогает:

✔️ Приведение строк к единому регистру .str.lower()
✔️ Удаление пробелов .str.strip() и лишних символов .str.replace()
✔️ Поиск дубликатов по ключевым колонкам с помощью duplicated(subset=...)
✔️ В отдельных случаях — предварительная агрегация или группировка

Лайфхак: duplicated(subset=...) особенно полезен, когда в таблице есть автоинкрементные ID. Такие поля делают строки уникальными, хотя по сути данные могут дублироваться.

Например, в датасете мы видим, что один и тот же пользователь почему-то сделал два одинаковых заказа — разный order_id, но одинаковые user_id, product_id и order_date. В этом случае duplicated(subset=['user_id', 'product_id', 'order_date']) поможет найти дубли, которые не видны при обычной проверке.


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

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

В следующем посте — разберёмся с пропущенными значениями: от типовых NaN до «пустых» строк, которые такими не являются.

#харды #eda
🔥32❤8
Что делать с пропусками в данных?

Продолжаем говорить про исследовательский анализ данных. Я уже рассказал о том, что делать с дубликатами, а сегодня речь пойдет о пропусках.

Пропуски – это достаточно частая ситуация при работе с данными. Они могут появляться по разным причинам: сбои в системе, ошибки сбора или просто кто-то не заполнил нужное поле. Игнорировать их нельзя так как они искажают расчёты, мешают визуализации и могут привести к неправильным выводам.
Что бы это ни было, с пропусками надо разбираться до того, как вы понесете цифры стейкхолдерам.

Работу с пропусками всегда начинаем с базы: df.isna().sum() – покажет нам, где и сколько пропущено.

Так, пропуски найдены. Может просто удалить их? Нееет, подожди.
Удаление – это крайняя мера, так как можно потерять слишком много ценных данных. Особенно если это не просто пустая строчка, а редкий, но важный пользователь. Поэтому чаще выбирают заполнение. Вот основные методы:

1️⃣ Среднее, медиана, мода

Самый простой и популярный способ – подставить среднее или медиану по колонке. Но не делай это «тупо» по всем строкам сразу. Лучше сгруппируй их по категориям. Например, если у тебя не указан доход клиента – бери медиану по возрастной группе или региону. Так получится ближе к реальности.

df['income'] = df.groupby('region')['income'].transform(lambda x: x.fillna(x.median()))


2️⃣ Предыдущее или следующее значение

Идеально подходит для временных рядов. Если один день в продажах пропал, но до и после были – можно заполнить с помощью .ffill() или .bfill().

df['sales'] = df['sales'].ffill()


Только помни: это работает, если данные меняются постепенно, а не скачками.

3️⃣ Интерполяция

Вот тут начинается магия. Интерполяция – способ аккуратно восстановить пропущенные значения по соседним точкам. Простой вариант – линейный:

df['metric'] = df['metric'].interpolate(method='linear')


Если тренд сложный, можно попробовать polynomial, а если данные колеблются, то spline. Это особенно полезно в метриках с сезонностью или кривыми трендами.

Важно: интерполяция работает, когда есть хотя бы несколько точек до и после. Если пропуски в начале или в конце ряда – лучше использовать .ffill() или .bfill().

Как выбирать метод?

✔️ Пропуск один – заполни медианой.
✔️ Пропуск в середине временного ряда – попробуй интерполяцию.
✔️ Пропуск в начале или в конце – используй ближайшее значение.
✔️ Пропуски только в отдельных группах – группируй перед заполнением.

Пропуски не повод паниковать. Это повод задуматься: почему их так много и что будет, если их игнорировать?

#харды #eda
❤19👍14🔥5