Чуть подробнее о том, что такое Sweetviz
Когда ты впервые сталкиваешься с новым датасетом, главное — быстро понять, что внутри. Не копаться вручную в сотнях строк и колонок, а увидеть ключевые сигналы: где пропуски, где перекосы, где потенциальные ловушки.
И вот тут появляется Sweetviz.
Один импорт — и ты уже понимаешь данные
Sweetviz — инструмент первого взгляда. Он не строит модели и не убирает шум, зато сразу показывает, с чем ты имеешь дело. И делает это красиво.
Загрузил датасет — получил наглядный отчёт:
всё это — в одном HTML-файле, который можно скинуть в рабочий чат или показать заказчику.
Когда особенно полезен Sweetviz:
Главное преимущество Sweetviz — он экономит твоё внимание.
📎 GitHub
💸 Поддержать канал
👉 Senior Data Analyst | #Python
Когда ты впервые сталкиваешься с новым датасетом, главное — быстро понять, что внутри. Не копаться вручную в сотнях строк и колонок, а увидеть ключевые сигналы: где пропуски, где перекосы, где потенциальные ловушки.
И вот тут появляется Sweetviz.
Один импорт — и ты уже понимаешь данные
Sweetviz — инструмент первого взгляда. Он не строит модели и не убирает шум, зато сразу показывает, с чем ты имеешь дело. И делает это красиво.
Загрузил датасет — получил наглядный отчёт:
где пропуски,
где перекосы,
где можно легко ошибиться.
всё это — в одном HTML-файле, который можно скинуть в рабочий чат или показать заказчику.
Когда особенно полезен Sweetviz:
Новый датасет — нужно быстро понять, с чем работаешь.
A/B-тест — нужен sanity check, прежде чем углубляться.
Начинаешь писать ML-пайплайн — хочется сразу вычистить мусор.
Главное преимущество Sweetviz — он экономит твоё внимание.
📎 GitHub
💸 Поддержать канал
👉 Senior Data Analyst | #Python
👍5🔥2
Разбор: Почему Sweetviz = твой аналитический напарник
Когда не хочется тратить вечер на
Он превращает DataFrame в готовый EDA-отчёт — быстрый, красивый и понятный даже менеджеру.
▫️Что умеет Sweetviz
• показывает распределения и пропуски
• ищет корреляции и выбросы
• сравнивает подгруппы (идеально для A/B)
• оценивает важность фичей при заданном target
▫️Почему это удобно в коде
• функции чётко разделены (
• Pathlib вместо строк → кроссплатформенно и чище;
• встроенные проверки колонок → меньше боли с KeyError.
▫️Где применять
• sanity-check выгрузки от коллег
• быстрый A/B-анализ без десятка
• разведка перед ML — видно шум, дисбаланс и сильные корреляции
• автогенерация отчётов для дашбордов
▫️Ограничения
• медленный на >100k строк
• мало гибкости (нет кастомных агрегаций)
• HTML-отчёт нельзя встроить в Streamlit/Dash напрямую
• нет JSON-выгрузки → отчёт только «для глаз»
🤝 Вывод
Sweetviz — это как Excel-аналитик, у которого никогда не устают глаза.
Он не заменит глубокий анализ, но спасает, когда нужно быстро понять:
«А вообще, с какими данными я работаю?»
Импортируй sweetviz и забудь про
💥 Как тебе 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
объясняем
практика с # TODO:
20+ примеров с комментариями:
полный обзор встроенных операторов:
вложенные и многоуровневые конструкции:
❤️ И да, поставь реакцию за старание
💾 Скачать серию
💸 Поддержать канал
👉 Senior Data Analyst #python #модуль_03 #серия_03
Это третья серия модуля 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 почти всегда лучше;
▫️чистка источников = меньше дублей на входе.
В бою:
Я всегда отношусь к
💸 Поддержать канал
👉 Senior Data Analyst | #sql
На первый взгляд, COUNT(*) — надёжный. Он ведь просто считает строки, верно?
Но тут и ловушка: он считает всё, что попало в результат, а не то, что мы называем бизнес-сущностью.
Где чаще всего обманывает:
▫️Дубликаты в источниках. ETL сломался — order_id задублировался, а COUNT(*) считает всё подряд.
▫️JOIN-размножение. Соединил пользователей с заказами и доставками? Один заказ превращается в несколько строк.
▫️Путаница в сущностях. Нам нужно посчитать «пользователей» или «заказы», а на деле считаем просто строки.
Как мыслить правильно:
▫️сначала определить что именно считаем (строки, уникальные заказы, пользователей);
▫️COUNT(DISTINCT) спасает, но стоит дорого;
▫️предагрегация перед JOIN почти всегда лучше;
▫️чистка источников = меньше дублей на входе.
В бою:
Я всегда отношусь к
COUNT(*)
с подозрением.На ревью самый частый вопрос: «А не размножает ли JOIN строки?»
Если да — COUNT(*) почти наверняка врёт.
💸 Поддержать канал
👉 Senior Data Analyst | #sql
👍6🤝2
❓Как объяснить метрику продакту: экспертные приёмы
Переведи метрику в язык историй
Сухо: «Retention D7 = 18%».
По делу: «Из 100 новых пользователей только 18 возвращаются на 7-й день. Остальные 82 уходят, так и не увидев ценность продукта».
Привяжи динамику к бизнес-единицам
Сухо: «Конверсия упала на 2 п.п.»
По делу: «Это минус 200 оплат за неделю и –250k ₽ к выручке. Если тренд сохранится, потеряем миллион за месяц».
Покажи, что метрика встроена в правила игры
Сухо: «Мы мерим NPS ежеквартально».
По делу: «У нас правило: не выкатываем новый функционал, если NPS падает ниже 30. Это встроенный стоп-кран для команды».
💸 Поддержать канал
👉 Senior Data Analyst | #python #bi
Аналитик работает на стыке цифр и бизнеса. Но если продакт слышит только «ARPPU = 170», ценность теряется. Для него важен не сам показатель, а то, как он влияет на деньги, пользователей и решения.
Переведи метрику в язык историй
Сухо: «Retention D7 = 18%».
По делу: «Из 100 новых пользователей только 18 возвращаются на 7-й день. Остальные 82 уходят, так и не увидев ценность продукта».
Привяжи динамику к бизнес-единицам
Сухо: «Конверсия упала на 2 п.п.»
По делу: «Это минус 200 оплат за неделю и –250k ₽ к выручке. Если тренд сохранится, потеряем миллион за месяц».
Покажи, что метрика встроена в правила игры
Сухо: «Мы мерим NPS ежеквартально».
По делу: «У нас правило: не выкатываем новый функционал, если NPS падает ниже 30. Это встроенный стоп-кран для команды».
💸 Поддержать канал
👉 Senior Data Analyst | #python #bi
🔥5
❗️ Проблема
Большинство аналитиков докладывают метрики «как есть»: проценты и цифры.
Звучит умно. Но для продакта это скорее «радиошум», чем сигнал.
Что делать с этими числами? Радоваться? Плакать? Бежать чинить?
◾️ История вместо процента
18% retention звучит как сухая статистика.
А вот: «Из 100 новых пользователей 82 ушли, не увидев ценность» — это уже история.
Истории включают бизнес-мышление: кто эти 82, почему уходят, где мы потеряли value?
Приём:
→ говорите «каждый третий», «9 из 10», «из 100 — 82 ушли»;
→ переводите процент в людей, тогда цифра перестаёт быть абстракцией.
◾️ Динамика в бизнес-единицы
Для продакта «–2 п.п. конверсии» — это загадка.
А вот «–200 оплат за неделю, минус 250k ₽ выручки» — это уже проблема.
В процентах никто не живёт. Живут в деньгах, пользователях, транзакциях.
Приём:
→ всегда добавляйте абсолютные числа;
→ переводите метрику в деньги — лучший аргумент для приоритизации.
◾️ Метрика как правило игры
Метрика становится ценной, когда превращается в «правило».
Например: NPS < 30 = стоп релиза.
В этот момент аналитика перестаёт быть «отчётом в Excel» и становится частью процесса управления.
Приём:
→ договоритесь о порогах вместе с продуктовой командой;
→ формулируйте правила: если X < Y → не делаем Z.
Чеклист аналитика перед встречей
• могу ли я объяснить метрику без формулы?
• перевёл ли я динамику в людей или деньги?
• понятно ли, какое решение примет команда на основе этой цифры?
👉 Разница не в цифрах, а в языке.
И именно язык превращает тебя из ПОСТАВЩИКА дашбордов в того, к кому команда приходит за решениями.
Большинство аналитиков докладывают метрики «как есть»: проценты и цифры.
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.
Чеклист аналитика перед встречей
• могу ли я объяснить метрику без формулы?
• перевёл ли я динамику в людей или деньги?
• понятно ли, какое решение примет команда на основе этой цифры?
👉 Разница не в цифрах, а в языке.
И именно язык превращает тебя из ПОСТАВЩИКА дашбордов в того, к кому команда приходит за решениями.
🔥6👍4
Cartesian explosion — это когда после JOIN таблицы начинают раздуваться, как шарик на дне вечеринке. Хотел соединить заказы и платежи, а получил не 20 млн строк, а все 200.
Итог: метрики врут, отчёты тормозят,
В посте — разбор, как это заметить и обезвредить до того, как BI уйдёт в кому.
💸 Поддержать канал
👉 Senior Data Analyst | #SQL
SQL тут не виноват — он честно перемножил строки.
Виноваты мы, потому что забыли про кардинальность.
Итог: метрики врут, отчёты тормозят,
COUNT(*)
смотрит на тебя невинными глазами.В посте — разбор, как это заметить и обезвредить до того, как BI уйдёт в кому.
💸 Поддержать канал
👉 Senior Data Analyst | #SQL
🔥3
Что на самом деле происходит
Cartesian explosion — это не «баг SQL», а математика связей. Ожидаемое число строк после соединения ≈
> сумма по всем ключам
Если у тебя «многие-ко-многим» (или несколько «один-ко-многим» поверх одного ключа), произведение взлетает. SQL честен: он возвращает все комбинации. Боль — на нашей стороне модели.
▪️Где это прячется системах?
• ТFact × Fact. Соединяешь две транзакционные таблицы «по пользователю/дате» — получаешь карнавал дублей.
• Несколько 1:N за раз. Заказы × платежи × доставки: один заказ внезапно «размножается» ×(платежи×доставки).
• SCD Type 2 / интервальные джойны. «Актуальная версия профиля на момент события» без point-in-time логики даёт пересечения интервалов и копии.
• Мосты (bridge) и M:N. Категории, теги, кампании — фан-аут по определению.
• Плавающие ключи. JOIN по региону/имени/дате без суррогатного id.
• Нулевые/пустые ключи. NULL в ключе + «случайный» фильтр → неожиданные комбинации.
• EXPLODE/UNNEST. Вытягивание массивов в строки — скрытый множитель.
• Data skew. Один «супер-ключ» встречается в 30% строк → локальные взрывы и перекос нагрузки.
▪️Диагностика
1) Назови зерно (grain) вслух.
2) Померь «мультипликаторы».
Посмотри распределение n_left(k) и n_right(k) по ключу: топ-значения, медианы, 95-й перцентиль. Ищи хвосты — именно они делают каскад.
3) Посчитай фан-аут.
fanout
4) Смотри план, а не верь на слово.
5) Канареечный прогон.
Запускай на узком окне (день/неделя), фиксируй метрики: строки до/после JOIN, дубликат-рейт по ключу, топ-«жирные» ключи.
Профилактика (модель → запрос → рантайм)
На уровне модели данных
• Определи и задокументируй grain для каждого факта и измерения. Любой JOIN начинается с вопроса: «Где у нас 1:1?»
• Суррогатные ключи > натуральных. Текстовые «регион/имя» не годятся для целостности.
• SCD и точка во времени. Для Type 2 готовь
• Уникальность — не пожелание, а контракт. Уникальные индексы/тесты в staging, а не «где-то потом».
На уровне запросов
• Предагрегируй «многие-ко-многим». Своди платежи/доставки до 1 строки на факт (сумма, MAX, counts) до JOIN.
• Выбирай одну запись явно. Оконные функции/ранжирование для «последней/текущей» вместо «потащу всё, а там разберёмся».
• Сначала фильтруй, потом соединяй. Любая лишняя строка до JOIN — лишние комбинации после.
• Семиджойн там, где тебе не нужны колонки.
• Не склеивай несколько 1:N на одном шаге. Делай этапами: факт×платежи → свёл до 1:1 → факт×доставки → снова свёл.
На уровне исполнения
• Учитывай skew. Соль key_salt для топ-ключей, перераспределение партиций, broadcast маленьких таблиц, включение bloom-фильтров/динамического прунинга, если движок поддерживает.
• Лимиты и сторожа. Бюджет на fanout, алерты на «rows_after_join», квоты на временное хранилище.
Что считать «хорошим результатом»
💸 Поддержать канал
👉 Senior Data Analyst | #SQL
Cartesian explosion — это не «баг SQL», а математика связей. Ожидаемое число строк после соединения ≈
> сумма по всем ключам
k от n_left(k) × n_right(k).
Если у тебя «многие-ко-многим» (или несколько «один-ко-многим» поверх одного ключа), произведение взлетает. SQL честен: он возвращает все комбинации. Боль — на нашей стороне модели.
▪️Где это прячется системах?
• ТFact × Fact. Соединяешь две транзакционные таблицы «по пользователю/дате» — получаешь карнавал дублей.
• Несколько 1:N за раз. Заказы × платежи × доставки: один заказ внезапно «размножается» ×(платежи×доставки).
• SCD Type 2 / интервальные джойны. «Актуальная версия профиля на момент события» без point-in-time логики даёт пересечения интервалов и копии.
• Мосты (bridge) и M:N. Категории, теги, кампании — фан-аут по определению.
• Плавающие ключи. JOIN по региону/имени/дате без суррогатного id.
• Нулевые/пустые ключи. NULL в ключе + «случайный» фильтр → неожиданные комбинации.
• EXPLODE/UNNEST. Вытягивание массивов в строки — скрытый множитель.
• Data skew. Один «супер-ключ» встречается в 30% строк → локальные взрывы и перекос нагрузки.
Правило большого пальца: если ты соединяешь две таблицы, каждая из которых способна иметь >1 строку на ключ, у тебя по умолчанию есть риск explosion.
▪️Диагностика
1) Назови зерно (grain) вслух.
«Факт заказов: 1 строка = 1 заказ. Платежи: 1 строка = 1 платёж».
Если зерно не 1:1 — ты уже в зоне риска.
2) Померь «мультипликаторы».
Посмотри распределение n_left(k) и n_right(k) по ключу: топ-значения, медианы, 95-й перцентиль. Ищи хвосты — именно они делают каскад.
3) Посчитай фан-аут.
fanout
= rows_after_join / max(rows_left, rows_right).
Нормально: ~1.0–1.2. Подозрительно: >1.5. Красная зона: >2–3.
4) Смотри план, а не верь на слово.
EXPLAIN/EXPLAIN ANALYZE:
несоответствие estimated vs actual rows, проливы на диск, перестановки JOIN-порядка — всё это индикаторы проблемы кардинальности.5) Канареечный прогон.
Запускай на узком окне (день/неделя), фиксируй метрики: строки до/после JOIN, дубликат-рейт по ключу, топ-«жирные» ключи.
Профилактика (модель → запрос → рантайм)
На уровне модели данных
• Определи и задокументируй grain для каждого факта и измерения. Любой JOIN начинается с вопроса: «Где у нас 1:1?»
• Суррогатные ключи > натуральных. Текстовые «регион/имя» не годятся для целостности.
• SCD и точка во времени. Для Type 2 готовь
point-in-time с effective_from/effective_to
и снимки «на момент события».• Уникальность — не пожелание, а контракт. Уникальные индексы/тесты в staging, а не «где-то потом».
На уровне запросов
• Предагрегируй «многие-ко-многим». Своди платежи/доставки до 1 строки на факт (сумма, MAX, counts) до JOIN.
• Выбирай одну запись явно. Оконные функции/ранжирование для «последней/текущей» вместо «потащу всё, а там разберёмся».
• Сначала фильтруй, потом соединяй. Любая лишняя строка до JOIN — лишние комбинации после.
• Семиджойн там, где тебе не нужны колонки.
EXISTS/IN
часто заменяет «плотный» JOIN и сохраняет зерно.• Не склеивай несколько 1:N на одном шаге. Делай этапами: факт×платежи → свёл до 1:1 → факт×доставки → снова свёл.
На уровне исполнения
• Учитывай skew. Соль key_salt для топ-ключей, перераспределение партиций, broadcast маленьких таблиц, включение bloom-фильтров/динамического прунинга, если движок поддерживает.
• Лимиты и сторожа. Бюджет на fanout, алерты на «rows_after_join», квоты на временное хранилище.
Мысленно держи «бюджет кардинальности». Если после каждого шага fanout растёт на +20–30%, ты уже не контролируешь процесс.
Что считать «хорошим результатом»
«Мы получили те же агрегаты на проде и на тесте, но путь — воспроизводимый:
документированное зерно, явные ключи, фан-аут ≤ 1.2 на каждом шаге, нули/дубли пойманы тестами.»
💸 Поддержать канал
👉 Senior Data Analyst | #SQL
🔥2👍1
Ты запускаешь запрос и внезапно видишь: строк стало в 10 раз больше, чем самая большая таблица в join?
Anonymous Quiz
0%
A) Пользователи реально стали в 10 раз активнее — срочно звонить маркетингу
18%
B) DISTINCT ещё не прикрутили, а кто-то верит, что это «нормально»
79%
C) У тебя классический cartesian explosion: join many-to-many без контроля
0%
D) PostgreSQL запустил режим fun mode и умножил данные ради развлечения
3%
E) Всё так и должно быть, просто Вселенная расширяется вместе с твоим запросом
👍2🔥1