Skip Navigation
Data Дзен с Олегом Дмитриевым
Telegram
Data Дзен с Олегом Дмитриевым
1 660 подписчиков 32 постов Рейтинг 0

Закулисье IT: как на самом деле работают аналитики и что скрывают дашборды! Олег Дмитриев - заведую аналитикой, 5+ лет в IT, пишу о радостях, боли и лайфхаках работы с данными. BI, аналитика, лайфстайл, саморазвитие ! Сотрудничество :@o_dmitriev1

Посты
Telegram
Хвалим себя во что бы то ни стало 😎


Хвалим себя во что бы то ни стало 😎

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

Итак, за что бы можно себя похвалить? 🤔

Монтаж уровень 2.

Когда-то я уже с ней сталкивался, примерно полгода назад, но тогда всё было на базовом уровне: нарезать видео, немного поправить звук. А вот более сложные вещи, цветокоррекция и работа с музыкой, оставались за пределами моего понимания.

Сейчас начал разбираться глубже, и, честно говоря, это очень увлекает. Особенно впечатляет цветокор: когда из тусклой, сероватой картинки буквально несколькими (десятками 😂) движений получается яркое, объёмное изображение с правильно выставленными светом и тенями. Ощущение, будто кадр действительно оживает 🔥

Пока, конечно, далеко не всё выходит идеально, первый блин комом. Но это нормально. Главное, что есть движение вперёд и удовольствие от самого процесса. А это уже кое что.

Решение конфликта без пригарания пятой точки 💪

Удалось спокойно закрыть непростую ситуацию без замечаний и недовольства со стороны клиента. И для меня это тоже отдельная маленькая победа.

Ситуация была такая: для одного из проектов в стоматологии мы сделали систему операционных дашбордов по услугам и финансам. Через пару недель использования у клиента возник вопрос:
Почему данные расходятся с медицинской системой?


Начали разбираться и выяснили, что часть данных вносится вручную. Экономист корректирует их после выгрузки из системы, чтобы привести показатели к внутренним нормативам. Из-за этого и появляются расхождения, а вместе с ними закономерный вопрос: где тогда правда?

Вообще это типичная проблема ручного ввода: нет единого источника данных. Когда всё завязано на одном человеке, риски сразу возрастают. Стоит ему уйти в отпуск, и процессы начинают проседать. Плюс нередко отсутствуют чёткие регламенты 🤦‍♂️
Раньше подобные ситуации вызывали у меня гораздо более резкую реакцию. Сейчас же всё прошло спокойно: примерно за два часа мы всё проверили, провели тесты и убедились, что система работает корректно, вплоть до мелочей 👍

И самое важное: мы не просто сказали: «У нас всё правильно. Разбирайтесь сами». Мы помогли найти источник расхождений и предложили решение. Такой подход, когда ты делаешь работу не просто формально, а действительно отвечаешь за результат, приносит особое удовлетворение.

Вот этими двумя событиями мне и запомнилась эта неделя 👏

А теперь ваш черед. Какие победы случились на этой неделе у вас? Делитесь в комментариях 👇

@data_dzen 🙂
Telegram
Бродячий торговец 🤔


Бродячий торговец 🤔

На пути к деревне «Скьюелево» мы набрели на лесок, возле которого стояла лавка торговца.
Надпись на ней была диковинная: «Лавка мудрости».

За прилавком продавец стоял. Глаза хитрющие, руки загребущие 🪙
Отоварил нас пройдоха на целых четыре свитка мудрости.

Вот и список этих свитков.
1. Логика и мышление на собесах
2. Блок по SQL на собесах.
3. Продуктовый блок ( retention, когорты) простыми аналогиями.
4. А/B тесты и с чем их едят.

Погостили немного у торговца, но пора и честь знать.
Ай да выдвигаться к деревне «Скьюелево» и получать новые свитки знаний
😎

@data_dzen 🙂
Telegram
Хроники ученья красивых кадров #1 😎


Хроники ученья красивых кадров #1 😎

А вот и видео с первым днем весны подоспело.
Как раз вам после обеда посмотреть расслабиться... и больше не работать сегодня 😂

Захотелось передать в этом видео ощущение уюта и тепла. Снимать не в лоб, а взглядом со стороны.

Запасайтесь чаем и приятного просмотра 🩷

#data_dzen 🙂
Telegram
Пятница


Пятница. Сушим весла и готовимся отдыхать 😎

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

Почему же я молодец?
🤔

Во-первых, продолжаю держать темп в съёмке. При обычной рабочей нагрузке у меня всё равно получается не выпадать: съёмки идут, референсы собираются каждый день. Для меня это важный сдвиг. Потому что в какой-то момент интерес перестаёт быть просто интересом и становится практикой.

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

Я хотел пропустить все посты по Excel через реальный кейс. Где будет и подключение к базе и дашборды красивые и макросы. Это вам и буду показывать в скором времени.

До 20 апреля мне надобно собрать кейс и потом показать его на вебинаре. Не как душную теорию, а как нормальный практический разбор. Что было на входе, какие шаги я сделал, где Excel реально помогает, и как из этого получается понятный BI-учёт.

И ещё одна линия недели - съёмка.

Меня всё сильнее тянет к ретро-эстетике: тёплой фактуре, ощущению времени, старому визуальному языку. При этом снимать это приходится в современной квартире, где почти всё работает против нужной атмосферы. Поэтому сейчас съёмка для меня, это не только нажать на кнопку камеры, но и сначала собрать пространство так, чтобы кадр вообще начал звучать правильно.
Постепенно что-то начинает получаться 💪

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

А теперь ваша очередь. Поделитесь своими победами на неделе 👇

@data_dzen 🙂
Telegram
Весенняя эра открыта 😎


Весенняя эра открыта 😎

Время обновить дизайн на теплые оттенки согревающие душу. Собрал новый дизайн, что бы каждый пост отдавал весенней энергией 🔥

Такс пойдем теперь за вопросы продуктовые поговорим 👇

Тебе дают две таблицы - users и events. И 20 минут на задачу:
«Посчитай батенька retention по когортам M0–M3»

И вот на этом ловят ступор.
А с чего вообще стартовать? 🤔

Проще всего - не с SQL, а с картинки в голове. Представь спортзал.
100 человек купили абонемент - это твоя когорта.
Дальше обычно эту когорту принимают за 100%. Это и есть M0.
Но вот нюанс: это не закон природы, а просто негласное соглашение.
На следующий день пришли 60 человек - Day 1 = 60%.
Через неделю пришли 40 - Day 7 = 40%.

Дальше логика не меняется.
Просто вместо дней - месяцы.
И вместо спортзала - продукт.

1️⃣ Junior-уровень - понять, сколько людей вообще пришло в каждую когорту
SELECT
DATE_TRUNC('month', registration_date) AS cohort_month,
COUNT(DISTINCT user_id) AS new_users
FROM users
GROUP BY 1
ORDER BY 1;

Если уже здесь ошибка, все суши весла. Потому что DATE_TRUNC и DISTINCT - это база продуктового блока.
Хотя бы для PostgreSQL и похожих диалектов.

2️⃣ Следующий уровень - понять, кто вернулся
WITH cohort_dec AS (
SELECT user_id, registration_date
FROM users
WHERE registration_date >= '2023-12-01'
AND registration_date < '2024-01-01'
)
SELECT
COUNT(*) AS cohort_size,
COUNT(DISTINCT CASE WHEN event_date = registration_date + 1 THEN user_id END) AS day1,
COUNT(DISTINCT CASE WHEN event_date = registration_date + 7 THEN user_id END) AS day7
FROM cohort_dec u
LEFT JOIN events e ON u.user_id = e.user_id;

Тут под ноги бросаются грабли 🤔

Такой код нормален, если даты у тебя хранятся как DATE, без времени.
Но если это TIMESTAMP, простое равенство может ломать расчёт.
Потому что у одного событие в 2023-12-08 00:01, у другого в 2023-12-08 19:42, и формально это уже не то же самое значение.

Значит, нужно либо приводить к дате, либо считать через диапазоны.
То есть логика всегда одна и та же:
✅ зафиксировал когорту → посмотрел, кто вернулся

Для M1, M2, M3 всё почти то же самое, но есть принципиальный момент:
👉 сравнивают не просто даты, а смещение по календарным месяцам относительно месяца регистрации ( да сложно звучит сейчас объясню )

То есть не +30 дней. Месяцы разной длины, поэтому такой расчёт съезжает.
Для месячного retention смотрят смещение по календарным месяцам, а не просто прибавляют 30 дней.

Где еще грабли поджидают

1️⃣ Считают события вместо людей
Один пользователь сделал 5 событий.
И внезапно retention у тебя больше 100%.
Значит, ты считаешь не возврат людей, а активность.

2️⃣ Ставят INNER JOIN
И в выборке остаются только те, кто вернулся.
Все, кто отвалился, просто исчезают.
Получается красивая цифра. И полностью фальшивая картина.

3️⃣ Не фиксируют базу расчёта
Размер когорты обычно принимают за 100%, и уже от него считают всё дальше.
Если база у тебя гуляет, проценты превращаются в мусор.

А дальше начинается главная беда... тест на мышление и софты. Вот уж где самая тернистая тропа если мало опыта.
Потому что на собесе тебя не спросят:
«Как посчитать retention?»

А спросят:
«D30 упал. Почему?»

Приехали...И вот тут SQL уже никого не впечатляет.

Нормальный ход мысли такой:
- разложить retention по когортам
- посмотреть каналы привлечения
- проверить activation
- понять, не ломался ли онбординг
- сравнить поведение до и после релизов
Можно копать еще глубже, но для старта достаточно этих основ.

Ответ который сразу поставит крест на вашем диалоге
«Ну… retention снизился, потому что пользователи стали хуже возвращаться..»

Спасибо товарищ Капитан. Но это не ответ аналитика, а догадка.

Если простыми словами:
Retention - это не про SQL, это про поведение.
SQL - это просто лопата, которой ты выкапываешь цифру.


Если ты не можешь объяснить, почему люди перестали возвращаться,
то сами по себе твои проценты ни о чем не расскажут 🤷‍♀️

У вас бывали проблемы на продуктовом блоке? И вообще любо ли вам продуктовое направление или больше нравиться инженерная часть ? 👇
Telegram
Созвон который порадовал 🔥


Созвон который порадовал 🔥

Сегодня хотел выложить основной пост. Он уже готов, про retention и когорты. В итоге у меня вышло около 5 постов на тему собесов, получился нормальный переход между Excel и SQL.

Но… сегодня слишком хороший день, чтобы грузить вас техничкой 🌞

С утра отвёз машину в сервис и решил не заходить домой. Просто сел на лавочке возле дома и провёл все рабочие созвоны прямо на улице.

И это было кайфово 😎

Реально. Я давно не получал такого удовольствия от звонков.
Просидел где-то полтора часа: солнце греет, птицы поют, ляпота.

Поэтому сегодня без собесов и сложных задач.

Я снял лёгкое видео по итогам первой недели обучения видеосъёмке.
Тема рядом, про найм будущего 😂

Посмотрите, отдохните и напишите: 👇
Как у вас стартовала неделя? Уже осознали что пришла весна и зима вышла из чата ?


@data_dzen 🙂
Telegram
Неделя как-то резко закончилась


Неделя как-то резко закончилась. Ай да хвалить себя 😎

Поймал себя на старой мысли, опять. Как только пытаюсь сделать сразу "идеально", всё начинает ехать. Слишком рано хочется результата, хотя сам ещё толком не разобрался. В итоге не ускоряешься, а просто стопоришься на месте.

С дашбордами это вообще классика. Садишься сделать "красиво", залипаешь на деталях, ковыряешь это всё несколько дней… а потом смотришь и понимаешь, что половину можно было сделать проще и быстрее.

Вспомнил кейс Airbnb. У них часть объявлений почти не бронировали. Долго можно было искать причины, строить гипотезы, усложнять. А оказалось всё банально: у людей были просто плохие фото. Тёмные, кривые. Начали помогать с нормальными снимками и всё поехало вверх. Ничего героического, просто попали в точку.

У меня на этой неделе примерно про то же.

Начал разбираться с видеосъёмкой. Пока местами получается средненько. Но уже начинаю видеть разницу. Пробую играть со светом, композицией, оставлять чуть больше "воздуха" в кадре. Пару раз пересматривал то, что снял раньше, и там, конечно, больно смотреть 😎

По ходу записываю идеи в блокнот. Не всё складывается, но уже видно, что часть принципов можно спокойно перетащить в дашборды и в обучение команды. Посмотрим, что из этого выйдет. Если не развалится по дороге, попробую применить в работе и поделюсь с вами.

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

А теперь ваш черед 🔥

Была ли у вас беда от гонки за идеалом? И расскажите какие у вас победы на неделе 👇
Telegram
Шарик, ну ты и жрёшь 🐕


А точнее - жрёт бюджет, который уходит в слепую зону между производителем и полкой магазина.

Написал статью про кейс моей команды с компанией «Гранд-Альфа». Одного из крупнейших производителей кормов в России.
Раньше аналитика у них жила в Excel, но не применялся ни один из моих советов по его настройке. (Кощунство не иначе 😡)

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

Что сделали:
- сшили 1С и CISLINK в единое хранилище;
- построили дашборды, где видно путь товара до конкретной полки;
- убрали зависимость от ad-hoc анализа: заходишь → видишь картину → понимаешь, кого похвалить, а кому дать пинка. Без звонков Семёну Семёновичу.

Внутри: полный кейс + 7 ошибок аналитики производителей.

👉 [Ссылка на статью]
Telegram
Поговорим о собесах (часть 2) 😎


Поговорим о собесах (часть 2) 😎

В прошлом посте затронули софты, методологию STAR и Excel. Это базовый набор. Теперь идём дальше, SQL.

Если вы хорошо освоили Excel, вы уже понимаете основы: как данные связываются, какие проблемы бывают при связках, как работают группировки. Переход к SQL на старте это по сути 5 команд: SELECT, FROM, WHERE, JOIN, GROUP BY. Оконные функции и временные таблицы полезны, но на старте не критичны.

А вот теперь к главному. Основная проблема не в синтаксисе. Проблема в блоках, которые не роняют запрос. Код отрабатывает, интерпретатор молчит, а результат не тот, который ждёт интервьюер. Именно на этом сыпятся.

1️⃣NOT IN + NULL: тишина вместо данных

В SQL: NULL ≠ пусто ≠ 0. Кто изучал Python, знает: ноль это ноль, а NULL это пустота, ничто. Держите в голове.

Задача: найти пользователей не из чёрного списка.


SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked)

Казалось бы, всё верно. Но если в blocked хоть одна строка с user_id = NULL, результат: 0 строк. SQL не может сравнить с NULL и молча возвращает пустоту.


SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked b
WHERE b.user_id = u.id
)

Кстати, NOT EXISTS ещё и быстрее: берёт id, идёт во вторую таблицу, нашёл первое вхождение, остановился. NOT IN шерстит таблицу сверху донизу целиком. На больших таблицах разница заметная.

2️⃣ LEFT JOIN, который молча стал INNER JOIN

Про типы JOIN подробно разберём в следующих постах серии. Сейчас только суть ловушки.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'

Что происходит: WHERE убивает NULL-строки из правой таблицы. Клиенты без заказов просто исчезли. LEFT JOIN превратился в INNER JOIN. А результат мимо.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
AND o.status = 'completed'

Одна строчка через AND. Разница принципиальная.

3️⃣AVG врёт красиво

Вот вам задачка. 10 строк по продажам. У трёх NULL. Сколько вернёт AVG? Среднее по 7, не по 10. Если значения похожи на правду, подвох заметить сложно. Цифра реалистична, но искажена.

SELECT AVG(salary) FROM employees



SELECT AVG(COALESCE(salary, 0)) FROM employees

COALESCE: встретил NULL, заменил на 0. Можно и без него, но тогда объясните интервьюеру, что понимаете поведение AVG и принимаете его осознанно. Оба варианта зачтутся 👌

4️⃣Порядок выполнения: главный подвох

Пишем: SELECT → FROM → WHERE → GROUP BY.
Выполняется: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Нелогично? Ещё как 🤷‍♀️


SELECT category, AVG(sales) AS avg_sales
FROM orders
WHERE avg_sales > 1000
GROUP BY category

Алиас avg_sales ещё не существует на этапе WHERE. Система просто не знает этого поля.


SELECT category, AVG(sales) AS avg_sales
FROM orders
GROUP BY category
HAVING AVG(sales) > 1000

HAVING это фильтрация после группировки. Подробнее разберём в отдельном посте серии.

5️⃣Забыли синтаксис? Не паникуйте

Бывает: нервы, давно не касались темы. Ну с кем не бывает. Говорите прямо: «Я понимаю логику, могу описать шаги. Точный синтаксис загуглил бы». Любой адекватный специалист это оценит. Логику понимать одно дело. Функцию загуглить = 30 секунд.

Бонус напоследок: первый вопрос при тестовом = «Какая у вас СУБД?».
DATE_TRUNC — PostgreSQL. DATE_FORMAT — MySQL. Правильный запрос для неправильной базы = ошибка на ровном месте.

В следующем посте SQL: Retention и когорты. А завтра пост и статья про кейс моей команды с компанией Гранд-Альфа. Занимаются кормами для животных.

Вопрос к вам. У вас бывало такое, что забыли ответ и хоть убей не помнишь ? Как действовали в этой ситуации? 👇

#sql
@data_dzen
Telegram
Поговорим о собесах (часть 1) 😎


Поговорим о собесах (часть 1) 😎

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

Знать, что надо написать GROUP BY, но не знать зачем - бесполезно 💯

Я собрал вопросы, которые задают на собеседованиях аналитикам. Разыграем сценки.

Soft skills. HR-этап.

По статистике, именно тут чаще всего отказывают. Из-за неумения формулировать мысли.

1️⃣ "Расскажите о ситуации, когда работали под давлением дедлайна"

❌ "Ну, у нас всегда дедлайны, я привык"
✅ "Готовили отчёт для клиента. Обычный срок 2 недели, дали 5 дней. Разбил задачу на блоки, автоматизировал сбор данных скриптом, убрал ручную сверку. Сдали вовремя"

Разница 🤔
Первый не сказал ничего. Второй дал ситуацию, действие, результат. Метод STAR.
Запомни это слово. Уж очень любят модные названия методологий.
Вы можете следовать этой методике по наитию, но на собеседовании важно говорить общепринятыми фразами 👌

2️⃣ "Как объясните сложный анализ человеку без технического бэкграунда?"

❌ "Ну, я использую визуализации..."
✅ "Убираю термины. Вместо "p-value < 0.05" говорю: мы на 95% уверены, что это не случайность. Вместо "retention Day 7": из 100 новых пользователей через неделю вернутся 30."

Интервьюер тут проверяет не знания. Сможешь ли разговаривать с бизнесом. 80% работы аналитика именно в этом 💯

Наш любимый Excel

Первые полгода карьерного пути по большей части состоят из Excel. Разыграем и тут сценку.

3️⃣ "Объясните, как работает ВПР и когда не подходит?"

✅ "VLOOKUP ищет значение в первом столбце диапазона и возвращает значение из указанного столбца. Не подходит, когда ключ правее значения. Тогда INDEX+MATCH. В новых версиях XLOOKUP ищет в любом направлении"

4️⃣ "Как найдёте дубликаты в таблице на 50 000 строк?"

✅ "Условное форматирование или COUNTIF: =COUNTIF(A:A, A2)>1. Или Data → Remove Duplicates с предварительным копированием."

Ещё порой спрашивают про горячие клавиши. Не ответил - и пункт собеса мимо.
Ctrl+Shift+L, Ctrl+T, Alt+=. Это базовый минимум.
Пост-сводка с горячими клавишами.

5️⃣ Продуктовый кейс

"Retention упал на 15% за месяц. Ваши действия?"

❌ "Надо улучшить продукт и запустить рекламу"
✅ "Сначала уточню: какой retention?
Day 1, Day 7, Day 30?
Потом разрежу данные по когортам и каналам привлечения.
Если падение только в одном канале - это не проблема продукта, а проблема трафика. Проверю внешние факторы: сезонность, обновления, изменения в рекламе. И только потом гипотезы."

Эти примеры из моей практики и из опыта ребят, кто часто бегает на собесы. Большинство провалов сводятся к мышлению, а не к инструментам.

Самые частые причины отказа:
- слабый инструментарий (Excel,SQL,Python),
- нет конкретных примеров (STAR!),
- ни одного встречного вопроса к работодателю (пришёл на собес, а чем компания занимается не знаешь),
- завышенные зарплатные ожидания (да, просить 100к с нулевым опытом не стоит; такое встречается сплошь и рядом).

Это фундамент: soft skills, Excel, мышление. А SQL-вопросы с собесов разберём в следующем посте.

С какими вопросами вы чаще всего встречаетесь? Кидайте в комменты, поглядим.

@data_dzen🙂