Senior Data Analyst
780 subscribers
337 photos
9 videos
157 links
Data Analyst 360°
SQL, Python, ML, GPT, матстат и визуализация
BI, A/B, метрики, продуктовая аналитика
Для junior → middle → senior

Если хотите поддержать автора — здесь можно это сделать https://teletype.in/@seniorru

По вопросам: @seniorru
Download Telegram
🔹 Что такое нормализация

Нормализация — это способ организовать таблицы так, чтобы:
не дублировать одну и ту же информацию в десяти местах;
сохранять целостность (одно изменение — одно место);
• избежать аномалий при вставках/обновлениях/удалениях.
Идея простая: каждая таблица про одну сущность, связи — через ключи.

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

Когда это хорошо:
Переименовали регион — обновили одну строку в справочнике.
Нет «Москва» и «Moscow» одновременно.
Отлично работает для систем с большим количеством транзакций (CRM, ERP, биллинг).

Минусы:
Аналитика почти всегда = JOINы (иногда 5–6 подряд).
Запросы тяжелее и менее читаемы.
На больших объёмах JOINы становятся бутылочным горлышком.

Вывод: нормализация — идеальна для OLTP: важна целостность, а не скорость многотабличной аналитики.



🔹 Нормальные формы
Обычно под «нормализовали» имеют в виду до 3NF. Но давай по ступенькам:

1NF — Первая нормальная форма
Колонки атомарны: одно поле — одно значение, без списков и вложенных структур.
Строки уникальны (ключ есть).

Анти-пример: phones = '123, 456, 789'.
Правильно: выносим телефоны в отдельную таблицу user_phones.

2NF — Вторая нормальная форма
Выполнена 1NF.
Любой неключевой атрибут зависит от всего составного ключа, а не от части.

Анти-пример: таблица с ключом (student_id, course_id) и колонкой student_name. Имя зависит только от student_id → вон в students.

3NF — Третья нормальная форма
Выполнена 2NF.
Нет транзитивных зависимостей: атрибуты зависят только от ключа, а не друг от друга.

Анти-пример: employees(emp_id, dept_id, dept_name).
dept_name зависит от dept_id, а не от emp_id → отделы в отдельную таблицу.

BCNF (Boyce–Codd)
Строже 3NF: все функциональные зависимости — от суперключей.
В проде редко «доводят до идеала», но полезно понимать принцип.


Что это даёт:
1NF — атомарность, без каши в полях.
2NF — нет дублей из-за составных ключей.
3NF — модульность: меняем в одном месте.
BCNF — теория на страже порядка, на практике — точечно.


🔹 Где нормализация рулит, а где — мешает
OLTP (частые изменения, транзакции, строгая целостность) — цель номер один: качество и точность.
DWH ядро часто делают ещё более нормализованным (Data Vault), чтобы аккуратно хранить историю и связи.
BI-витринах чистая 3NF не нужна — здесь важнее удобство и скорость чтения.
👍41
🔹 Что такое денормализация

Денормализация — осознанное «расплющивание» схемы, когда мы собираем широкие таблицы с готовыми атрибутами, чтобы:
писать короткие запросы;
быстро строить графики/дашборды;
кормить ML-модели без десяти JOINов.

Примеры:
В таблице заказов уже есть имя клиента и регион (а не только customer_id).
Факт продаж содержит сразу измерения: продукт, категория, канал, дата, регион.

Плюсы:
Просто и быстро читать.
BI-инструменты «летят».
Идеально для ML-фичей: одна широкая таблица — много признаков.

Минусы:
Дублирование (Москва в миллионе строк).
Сложнее обновлять: поменялся регион → перестраиваем витрину.
Несогласованность версий, если у команд свои пайплайны.
Вывод: денормализация — выбор для OLAP: приоритет скорость чтения и удобство потребителей.


🔹 не «или-или», а «и-и»: слоистая архитектура
В реальности:
Staging (сырое): тащим из источников почти как есть. Тут возможны дубли, разные форматы — задача не потерять информацию.
Core (ядро): нормализованная модель (3NF или Data Vault) — единый словарь, «истинная версия», аккуратная историзация.
Marts (витрины): денормализованные таблицы под конкретные вопросы бизнеса (звезда, снежинка, wide-table).
Логика проста: ядро обеспечивает качество/историю, витрины — удобство/скорость.


🔹 Немного про историчность (SCD)
Когда данные меняются «понемногу и не каждый день», всплывает тема SCD.
В ядре (нормализованном) удобно хранить Type 2: отдельные записи с valid_from / valid_to. Историю поднять — не проблема.
В витрине чаще:
- либо «замораживаем» срез (snapshot) на нужную дату
- либо храним только актуальную версию.
Практический вывод: глубокая история → в нормализованное ядро; оперативная аналитика и отчёты «на сегодня» → в денормализованные витрины.

🔹 Кейсы аналитики
Кейс 1. Финансовый отчёт «как было на дату»
Финансам важно восстановить картину прошлого месяца.
Нормализация позволяет собрать справочники в состоянии на дату.
Денормализованная витрина даёт быструю выгрузку без JOINов.
Лучшее из двух миров: ядро с историей + витрина под отчёт.


Кейс 2. BI-дашборд «Продажи по регионам и категориям»
Нормализованная схема → 5 JOINов и неочевидные ошибки в фильтрах.
Денормализованная витрина → одна агрегация из «широкой» таблицы.
Для BI всегда готовим витрину, а не заставляем дашборд «склеивать» полмира.


Кейс 3. ML-признаки для модели оттока
Из ядра берём историю профиля и действий.
Во «wide»-таблице собираем признаки: сумма покупок, средний чек, частота, давность событий.
Модель учится на денормализованной таблице, но питается из нормализованной истории.


🔹 Подводные камни, о которых стоит помнить
• Несогласованные версии. Разные команды денормализуют по-своему → несколько «истин».
Решение: единый Core и централизованная сборка витрин.
• Обновления. В нормализации одно изменение = один апдейт; в денормализации иногда нужен полный пересчёт витрины.
• Производительность. JOINы на больших таблицах медленные, но и «wide» разрастаются.
Баланс зависит от задач и платформы (в облаках диски дешевле CPU — это влияет на дизайн).
• Определения метрик. «Активный клиент», «заказ», «выручка» — без чётких договорённостей цифры расползутся.
Решение: словарь метрик и контракты данных.

🔹 Архитектурные паттерны
• 3NF: чисто, предсказуемо, удобно для транзакций и истории, тяжеловато для BI.
• Data Vault: хабы-линки-сателлиты; гибкая историзация и инкрементальные загрузки; отличное ядро для DWH.
• Star Schema (звезда): факт + денормализованные измерения; любимая схема BI.
• Snowflake: «звезда», у которой часть измерений слегка нормализована — компромисс между чистотой и простотой.
• Wide Table: полностью «плоская» витрина; быстро для чтения и ML, но тяжёлая в обслуживании.

Услал читать? вот итог в одном месте
Итог в одном абзаце 👇

Нормализация делает данные надёжными и историзуемыми. Денормализация делает ответы быстрыми и удобными.
Зрелая архитектура — это staging → core → marts, где ядро отвечает за «правду», а витрины — за скорость.


💥 Как тебе ?
🔥 — узнал(а) что-то новое
🤝 — темы хорошо знакомы
🔥82👍2👌1🤝1
Библиотеки ML, которые должен знать каждый аналитик

🔹 Scikit-learn
твой первый помощник в ML. Здесь всё: от предобработки данных и обучения моделей до расчёта метрик. Подходит для MVP, A/B-тестов, скоринга, быстрых экспериментов.


🔹 Statsmodels
если важна статистическая интерпретация. Поддерживает t-тесты, ANOVA, регрессии с p-value и доверительными интервалами. Особенно полезен, когда модель нужно объяснить заказчику или прописать в отчёте.


🔹 XGBoost
лидер по точности. Работает с табличными данными, отлично справляется с задачами прогнозирования и классификации. Подходит для оценки LTV, churn, scoring-моделей. Используется в продакшн-решениях.


Вывод:
Эти 3 библиотеки закрывают 80–90% задач, с которыми сталкивается аналитик данных.

💸 Поддержать канал
👉 Senior Data Analyst | #ml #python
🔥61👍1
PySpark — это не «костыль, чтобы ноутбук не падал».
Когда данных становится слишком много, ноутбук начинает страдать.
pandas не виноват — он просто не для этого.

PySpark умеет: делить данные, крутить их в кластере и делать так, что у тебя остаётся пандасовая простота, но в масштабе.


Если ты аналитик, который хочет вырасти за пределы локальной машины и «Excel-ментальности» — PySpark открывает тебе дверь в инженерный мир, при этом не отнимая любимую гибкость Python.

🚀 Попробуй: запусти Spark локально и прогон свой pandas-пайплайн.
Увидишь, что «big data» не страшный зверь, а нормальный рабочий процесс.

💸 Поддержать канал
👉 Senior Data Analyst | #pyspark #python
👍3🔥2👏1👌1
📌 Почему аналитикам пора дружить с PySpark

Когда твои данные перестают влезать в память ноутбука, pandas превращается в чемодан без ручки.
Он хорош для прототипов и быстрых исследований, но не создан для масштаба enterprise.
Здесь на сцену выходит PySpark — не как «ещё одна библиотека», а как партнёр по данным.

▫️ PySpark = распределённое мышление
Spark — это не «ускоренный pandas».
Это система, которая делит данные на части, раскидывает их по узлам кластера и работает параллельно.
Главное отличие: Spark ленив.
Ты пишешь фильтры и группировки, а он лишь строит план (DAG).
Считается всё только тогда, когда ты попросишь результат.

Что это даёт аналитику?
обработку терабайтов без упора в память;
масштабирование от ноутбука до сотен узлов;
устойчивость к сбоям — задачи переисполняются сами;
DataFrame API, где удобно как в pandas, но возможностей — на порядок больше.

▫️Аналитика с инженерным акцентом
Представь e-commerce: заказы, логи, CRM, транзакции.
В pandas — постоянная боль. В PySpark — рабочая рутина:
читаешь данные распределённо;
приводишь к единой схеме;
считаешь метрики через оконные функции;
сохраняешь в Parquet или Delta Lake.
В итоге у тебя не скрипт «на удачу», а DAG, который можно запускать по расписанию и воспроизводить снова и снова.

▫️ Как мыслить в PySpark
Схема данных явно > чем автоинференс. Иначе арифметика может рухнуть.
Партиционирование — искусство. От него зависит скорость.
UDF — крайний случай. Встроенные функции почти всегда быстрее.
Кэшировать можно, но осторожно. Экономит время, но ест память.

▫️ Когнитивный сдвиг
Если pandas — это «данные прямо здесь и сейчас»,
то PySpark — это про описание желаемого результата.
Ты перестаёшь думать «как обработать каждую строку» и начинаешь описывать:
«Как должна измениться вся таблица».

Это требует времени на перестройку мышления, но открывает масштаб и стабильность.

▫️ PySpark в стеке
Airflow — оркестрация пайплайнов.
MLflow — хранение и воспроизводимость фичей.
Delta Lake — версияция и транзакции.
ClickHouse — real-time аналитика.
Dash/Plotly — визуализация прямо с кластера.


▫️Что получает бизнес
повторяемость без ручных выгрузок;
масштабируемость без переписывания кода;
тестируемость на сэмплах локально;
надёжность и устойчивость по умолчанию.

▫️ Подводные камни
Очень широкие таблицы (1000+ колонок).
Перекосы при join’ах (skewed data).
Эволюция схемы не всегда прозрачна.
Часовые пояса → неожиданные баги с датами.

▫️ Итог: pandas — отличное начало. Но если твои данные растут быстрее, чем память ноутбука, PySpark перестаёт быть выбором. Это необходимость.

💥 Как тебе инструмент?
🔥 — что-то новое для меня
🤝 — хорошо знаком

💸 Поддержать канал
👉 Senior Data Analyst | #pyspark #python
🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
sweetviz — это библиотека для автоматического EDA, которая показывает, что с вашими данными не так (или наоборот — так) буквально за 1 минуту.
Работает с pandas, быстро генерирует отчёт в HTML и покрывает: null’ы, выбросы, распределения, корреляции, сравнение выборок.

Подходит для:
— быстрого анализа выгрузки
— A/B-сравнений
— подготовки ML-фичей
— объяснений для менеджеров


Не надо вручную писать десятки .groupby() и sns.histplot().
Особенно удобно, если ты middle и времени мало — sweetviz берёт рутину на себя.

📎 GitHub
💸 Поддержать канал
👉 Senior Data Analyst | #Python
🔥10
Чуть подробнее о том, что такое Sweetviz

Когда ты впервые сталкиваешься с новым датасетом, главное — быстро понять, что внутри. Не копаться вручную в сотнях строк и колонок, а увидеть ключевые сигналы: где пропуски, где перекосы, где потенциальные ловушки.

И вот тут появляется Sweetviz.

Один импорт — и ты уже понимаешь данные

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

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


всё это — в одном HTML-файле, который можно скинуть в рабочий чат или показать заказчику.

Когда особенно полезен Sweetviz:
Новый датасет — нужно быстро понять, с чем работаешь.
A/B-тест — нужен sanity check, прежде чем углубляться.
Начинаешь писать ML-пайплайн — хочется сразу вычистить мусор.


Главное преимущество Sweetviz — он экономит твоё внимание.

📎 GitHub
💸 Поддержать канал
👉 Senior Data Analyst | #Python
👍5🔥2
Разбор: Почему Sweetviz = твой аналитический напарник

Когда не хочется тратить вечер на df.groupby().agg() и бесконечные sns.histplot(), на помощь приходит Sweetviz.
Он превращает DataFrame в готовый EDA-отчёт — быстрый, красивый и понятный даже менеджеру.

▫️Что умеет Sweetviz
• показывает распределения и пропуски
• ищет корреляции и выбросы
• сравнивает подгруппы (идеально для A/B)
• оценивает важность фичей при заданном target

Всё это сразу в HTML-отчёте: открыл в браузере и смотришь интерактив.


▫️Почему это удобно в коде
• функции чётко разделены (load_data, generate_full_report, generate_group_comparison) → проще тестировать и переиспользовать;
• Pathlib вместо строк → кроссплатформенно и чище;
• встроенные проверки колонок → меньше боли с KeyError.

▫️Где применять
• sanity-check выгрузки от коллег
• быстрый A/B-анализ без десятка groupby
• разведка перед ML — видно шум, дисбаланс и сильные корреляции
• автогенерация отчётов для дашбордов

▫️Ограничения
• медленный на >100k строк
• мало гибкости (нет кастомных агрегаций)
• HTML-отчёт нельзя встроить в Streamlit/Dash напрямую
• нет JSON-выгрузки → отчёт только «для глаз»

🤝 Вывод
Sweetviz — это как Excel-аналитик, у которого никогда не устают глаза.
Он не заменит глубокий анализ, но спасает, когда нужно быстро понять:
«А вообще, с какими данными я работаю?»

Импортируй sweetviz и забудь про sns.pairplot().

💥 Как тебе Sweetviz?
🔥 — активно пользуюсь
🤔 — слышал(а), но не пробовал(а)
👍 — узнал(а) о нём впервые
👍4🤔4
🧠 Python для аналитиков: list comprehensions и полезные операторы

Это третья серия модуля 3 — и она про то, как писать Python: компактно, читаемо и в духе «питоничности».

кейс с CSV
→ агрегируем продажи и выводим топ-5 товаров


объясняем

→ синтаксис list comprehension


практика с # TODO:

→ уникальные слова, таблица умножения, сортировка студентов


20+ примеров с комментариями:

→ от фильтрации чисел до генерации таблиц


полный обзор встроенных операторов:

→ any, all, zip, enumerate, sorted, map, filter


вложенные и многоуровневые конструкции:

→ матрицы, flatten, словари и множества


❤️ И да, поставь реакцию за старание

💾 Скачать серию
💸 Поддержать канал
👉 Senior Data Analyst #python #модуль_03 #серия_03
12
Почему COUNT(*) может врать

На первый взгляд, COUNT(*) — надёжный. Он ведь просто считает строки, верно?
Но тут и ловушка: он считает всё, что попало в результат, а не то, что мы называем бизнес-сущностью.


Где чаще всего обманывает:
▫️Дубликаты в источниках. ETL сломался — order_id задублировался, а COUNT(*) считает всё подряд.
▫️JOIN-размножение. Соединил пользователей с заказами и доставками? Один заказ превращается в несколько строк.
▫️Путаница в сущностях. Нам нужно посчитать «пользователей» или «заказы», а на деле считаем просто строки.

Как мыслить правильно:
▫️сначала определить что именно считаем (строки, уникальные заказы, пользователей);
▫️COUNT(DISTINCT) спасает, но стоит дорого;
▫️предагрегация перед JOIN почти всегда лучше;
▫️чистка источников = меньше дублей на входе.

В бою:
Я всегда отношусь к COUNT(*) с подозрением.
На ревью самый частый вопрос: «А не размножает ли JOIN строки?»
Если да — COUNT(*) почти наверняка врёт.


💸 Поддержать канал
👉 Senior Data Analyst | #sql
👍6🤝2
Как объяснить метрику продакту: экспертные приёмы
Аналитик работает на стыке цифр и бизнеса. Но если продакт слышит только «ARPPU = 170», ценность теряется. Для него важен не сам показатель, а то, как он влияет на деньги, пользователей и решения.


Переведи метрику в язык историй
Сухо: «Retention D7 = 18%».
По делу: «Из 100 новых пользователей только 18 возвращаются на 7-й день. Остальные 82 уходят, так и не увидев ценность продукта».

Привяжи динамику к бизнес-единицам
Сухо: «Конверсия упала на 2 п.п.»
По делу: «Это минус 200 оплат за неделю и –250k ₽ к выручке. Если тренд сохранится, потеряем миллион за месяц».

Покажи, что метрика встроена в правила игры
Сухо: «Мы мерим NPS ежеквартально».
По делу: «У нас правило: не выкатываем новый функционал, если NPS падает ниже 30. Это встроенный стоп-кран для команды».


💸 Поддержать канал
👉 Senior Data Analyst | #python #bi
🔥5
❗️ Проблема

Большинство аналитиков докладывают метрики «как есть»: проценты и цифры.
Retention D7 = 18% — и что?
Конверсия –2 п.п. — критично или нет?
NPS 27 — это хорошо или плохо?

Звучит умно. Но для продакта это скорее «радиошум», чем сигнал.
Что делать с этими числами? Радоваться? Плакать? Бежать чинить?


◾️ История вместо процента
18% retention звучит как сухая статистика.
А вот: «Из 100 новых пользователей 82 ушли, не увидев ценность» — это уже история.

Истории включают бизнес-мышление: кто эти 82, почему уходят, где мы потеряли value?

Приём:
→ говорите «каждый третий», «9 из 10», «из 100 — 82 ушли»;
→ переводите процент в людей, тогда цифра перестаёт быть абстракцией.

◾️ Динамика в бизнес-единицы
Для продакта «–2 п.п. конверсии» — это загадка.
А вот «–200 оплат за неделю, минус 250k ₽ выручки» — это уже проблема.

В процентах никто не живёт. Живут в деньгах, пользователях, транзакциях.

Приём:
→ всегда добавляйте абсолютные числа;
→ переводите метрику в деньги — лучший аргумент для приоритизации.

◾️ Метрика как правило игры
Метрика становится ценной, когда превращается в «правило».
Например: NPS < 30 = стоп релиза.

В этот момент аналитика перестаёт быть «отчётом в Excel» и становится частью процесса управления.

Приём:
→ договоритесь о порогах вместе с продуктовой командой;
→ формулируйте правила: если X < Y → не делаем Z.

Чеклист аналитика перед встречей
• могу ли я объяснить метрику без формулы?
• перевёл ли я динамику в людей или деньги?
• понятно ли, какое решение примет команда на основе этой цифры?

👉 Разница не в цифрах, а в языке.
И именно язык превращает тебя из ПОСТАВЩИКА дашбордов в того, к кому команда приходит за решениями.
🔥5👍4