Data Driven / Bogdan Ivanov
892 subscribers
68 photos
47 videos
2 files
53 links
Данные, карьера, саморазвитие

https://datadrivenbogdan.com/

Помогаю вырасти в работе с данными и зарабатывать больше.
За менторством и сотрудничеством — @b_ivanov_kz
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7
Causal Inference: как оценивать эффект, когда A/B — не вариант (Ч. 1)

В какой-то момент на работе мне понадобилось глубже разобраться, как оценивать эффекты, когда классический A/B-тест провести невозможно (частая специфика оффлайна). Начал копать про Causal Inference — и оказалось, что это прям отдельный мир со своими подходами и подводными камнями.

Сразу дисклеймер:
ниже — не истина в последней инстанции.
Не считаю себя гуру в Causal Inference, поэтому буду рад, если кто-то более опытный в этой теме дополнит или поспорит 👇

Что такое Causal Inference❓
Попробую простыми словами


Causal Inference — это набор подходов, которые позволяют ответить на вопрос:
👉 «А что именно изменилось из-за нашего действия, а не просто совпало?»

То есть мы хотим отделить*️⃣эффект фичи / акции / изменения
от*️⃣сезонности, тренда, шума и внешних факторов.

Почему A/B-тесты не всегда возможны❓

*️⃣ Эксперимент сложно или невозможно провести
Технические, бизнес- или этические ограничения, либо просто нет времени и ресурсов на полноценный A/B.

*️⃣ Группы уже сформированы неслучайно
Пользователи изначально разные, и прямое сравнение даёт смещённый результат.

*️⃣ Нужно оценить эффект задним числом
Изменения уже внедрены, а понять — был ли от них эффект — всё равно нужно.

*️⃣ Требуется уточнить результаты A/B
Даже в случайных тестах группы могут различаться — и без корректировок оценка получается шумной.

В таких случаях приходится восстанавливать контрфакт - что было бы, если бы изменения не было, чтобы уже оттуда вычленить эффект

Разберем три популярных подхода Causal Inference

и начнем с

1️⃣ Difference-in-Difference (DiD)

Идея:

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

Условия применимости DiD (❗️очень важно❗️):

*️⃣ Параллельный тренд — до изменений группы должны вести себя похоже
*️⃣ Независимость объектов — метрики участников не влияют друг на друга (студенты не влияют на активность друг друга/ просмотры в web, не влияют на просмотры в ios и тд)
*️⃣ Отсутствие других вмешательств в тот же момент времени

Если хотя бы одно условие нарушено — оценка эффекта становится сомнительной.

Как это работает:

1️⃣ Берем две группы участников (метрику):

*️⃣тестовую (тут легко, на нее идет эффект от фичи/акции)
*️⃣контрольную (тут сложнее, нужно выбрать контроль с похожим поведением, в зависимости от контекста задачи/бизнеса - это должна быть либо другая метрика, но с похожим трендом или может быть другие люди, но с похожим трендом по такой же метрике)

2️⃣ Выбираем метрику, по которой у групп параллельный тренд
(повторюсь - до изменений они ведут себя похоже, тк это важный assumption в DiD)

3️⃣ Смотрим период до момента X (X - начало воздействия эффекта на тестовую группу)
Если метрика в обеих группах растет / падает синхронно — это хороший знак

4️⃣ После момента X:

*️⃣контрольная группа продолжает двигаться по старому тренду
*️⃣в тестовой группе происходит изменение - она отклоняется от тренда (или нет, тогда это может нам говорить о том, что эффекта нет)

5️⃣ Сравниваем:
насколько метрика тестовой группы отклонилась (остановимся на ситуации, где отклонение есть) от своего ожидаемого тренда, который мы восстанавливаем по динамике тренда контрольной группы

Ключевая логика DiD:

если бы изменений не было, тестовая группа продолжила бы двигаться параллельно контрольной
=> Вся суть метода держится именно на этом предположении.

Как выбрать метрику с похожим трендом❓ но напрямую не зависимые от нашего изменения
Помогут проверки на синхронность, например корреляция Пирсона/Спирмена

Пишите в комментах, слышали ли вы что-то про Causal Inference и DiD в частности👇

Дальше будет еще 2 части про популярные методы CI

Подпишись и при желании поддержи канал бустом.
P.S. Сделать это можно здесь (для Premium — бесплатно).

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥6❤‍🔥5🤝1
Новогодний корпоратив — официально прошел на ура

Наелись — ✔️
Напились — ✔️
Отдохнули — ✔️
Выиграли в конкурсе — ✔️
И заплатили за это — 0 ₽ 💸

Редкий случай, когда все по плану и даже лучше!
Год можно закрывать с чистой совестью🤩

@data_driven_bogdan
❤11🔥411
Сегодня хочу порекомендовать вам канал Змеиный Анализ на который я наткнулся совсем недавно. Это канал Кямрана, он бывший бэкенд-разработчик, который осознанно свичнулся в аналитику.
И, да, это было одно из лучших карьерных решений.

Почему принял такое решение❓
Он подробно рассказал об этом в этом посте

📊 В аналитике он уже почти 3 года
Недавно сменил компанию, прошёл весь путь собеседований и онбординга заново, со свежей головой и актуальным рынком.

Сейчас он:

➖работает аналитиком в коммерческом продукте

➖консультирует и менторит ребят, которые только вкатываются в аналитику

➖помогает понять, куда идти, что учить и как не слить год впустую

В этом канале вы найдете:

Весь его путь и как пришел в IT

Почему решил свичнуться из BACKEND разработки в АНАЛИТИКУ.

Топ пять инструментов для анализа данных

Советы для аналитика данных. Как стать лучше?

Как нашел новую работу с оффером 180к, спустя два месяца собесов

Если ты:

➖думаешь о свиче в аналитику

➖уже учишься, но не понимаешь, что делать дальше

➖или хочешь аналитику с мозгами разработчика, а не «таблички ради табличек»

👉 Подписывайся. У него полезно.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤7👍7🍌11
Обзор собеседования (Ч. 1)

Компания: USETECH (аутстафф)
Вилка: +-250к net
Должность: Дата аналитик
Формат: Удаленный
Этапы собеседования:
HR – Тех. собес 1 (внутренний) – Тех. собес 2 (у заказчика) – Offer
Грейд: Middle / Middle +
Дата собеседования: декабрь 2025

Давно не было обзоров и вот опять! Тех. собес был оч длинный - около 1.5-2х часов
Cначала сама галера собесит, дальше уже напрямую заказчик. Как сказала HR, иногда могут сразу напрямую к заказчику направить на собес (минуя внутренний тех. этап).
Из явных плюсов - удобно для второй работы, тк могут оформлять по ИП/ГПХ.

Сам обзор разобью на 2 части - материала много и он показался интересным. В данной части разберем техничку SQL + Python, а в след. блоке обсудим теор/практические вопросы, которые поднимались на собесе.

Технический блок: SQL + Python

1️⃣ Выручка по месяцам

Посчитать месячную выручку по таблице orders.
Решение:
SELECT
DATE_TRUNC('month', order_date) AS month_id,
SUM(amount) AS rev
FROM orders
GROUP BY 1;


2️⃣ Клиенты с повторными заказами

Найти клиентов, у которых больше одного заказа.
Решение:
SELECT customer_id
FROM orders
GROUP BY 1
HAVING COUNT(*) > 1;


3️⃣ Порядковый номер заказа клиента

Пронумеровать заказы каждого клиента по дате.
Решение:
SELECT
customer_id,
order_id,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS rn
FROM orders;


4️⃣ Доля сотрудников с зарплатой выше порога

Посчитать долю сотрудников с зарплатой выше 50 000.
employee_salaries (employee_id, salary)
Решение:
SELECT
COUNT(*) FILTER (WHERE salary > 50000) * 1.0 / COUNT(*) AS share
FROM employee_salaries;

ps проверяют знание FILTER и понимание целочисленного деления (в SQL int / int дает 0 без приведения к float, те если не умножим числитель/знаменатель на 1.0/ не переведем его в float - в выводе будет 0)

5️⃣ Корреляция зарплаты и перформанса

Оценить корреляцию между зарплатой и performance score.
employee_salaries (employee_id, salary, performance_score)
Решение:
SELECT
CORR(salary, performance_score) AS corr
FROM employee_salaries;

ps база по статистике + допом был вопрос почему корреляция не равна причинности
(показывает наличие связи, но не объясняет (не)влияния друг на друга)

6️⃣ Средняя зарплата и разброс по департаментам

Посчитать среднюю зарплату и стандартное отклонение по департаментам.
employee_salaries (employee_id, department_id, salary)
Решение:
SELECT
department_id,
AVG(salary) AS avg_sal,
STDDEV(salary) AS std_sal
FROM employee_salaries
GROUP BY 1;

ps базовая статистика в SQL

Python

7️⃣ Агрегация по категориям

Посчитать суммарные net sales по категориям.
df (category, net_sales)
Решение:
result = df.groupby("category", as_index=False).agg(
total_net=("net_sales", "sum"))

ps база по работе с пандас

8️⃣ Флаг «выше среднего»

Создать бинарный флаг: продажи выше среднего. df (sales)
Решение:
avg_sales = df["sales"].mean()
df["flag"] = (df["sales"] > avg_sales).astype(int)


9️⃣MinMaxScaler

Нормализовать продажи через MinMaxScaler
df (sales) (Написать самому, без import'a)
Решение:
df["sales_norm"] = (
(df["sales"] - df["sales"].min()) /
(df["sales"].max() - df["sales"].min()) )

ps это один из подходов к нормализации данных - приведение признаков к единому масштабу [0;1], чтобы признаки были сопоставимы между собой (часто требуется для обучения моделей). Альтернатива - стандартизация, данные приводятся к среднему 0 (от значения отнимается среднее) и стандартному отклонению 1 (делится на стандартное отклонение)

1️⃣0️⃣ NaN / None / NA

*️⃣None - объект Python (NoneType), обозначает отсутствие значения, используется без дополнительных библиотек
*️⃣NaN - специальное числовое значение типа float («не число»), применяется для пропусков в числовых данных (math / numpy / pandas)
*️⃣NA - тип pandas NA, используется в pandas как универсальное обозначение пропусков и совместим с NaN

В целом, задачки не сложные, по теор. блоку спрос был посерьезнее, но это уже во 2 части

А ты бы решил все задачки?👇

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥6
Предновогодние итоги🎄

Если честно — напиздел...

Никаких итогов года подводить не хочется. Хочется верить, что каждый и так знает, что в текущем году он сделал максимум и в предстоящий год заходит с намерением сделать еще лучше. За себя могу сказать точно - стремлюсь в значимых для меня вещах выкладываться на максимум. А значит, можно честно сказать себе: молодец. И предлагаю каждому в эти дни найти время и смелость сказать себе спасибо — за все, что получилось и за все, что было непросто.

Поэтому сегодня просто про Новый год и то, что действительно важно в эти дни.

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

И есть у нас одна семейная традиция, которой мы придерживаемся уже много лет:

31 декабря — мы идем в баню🧖‍♂️
А вечером — обязательно в кинотеатр🎬


Каждый год одно и то же, но именно в этом и кайф. Как будто Новый год без этого просто не запускается
Никакой суеты, спокойный день, ощущение завершения и перехода в праздник.

Ну и, конечно, хочу поздравить вас всех с наступающим! 🎄
Пусть праздники дадут вам отдых, тепло, время для себя и близких.
А в новом году — спокойствия, здоровья, сил и простого человеческого счастья.

А теперь вопрос вам👇

Есть ли у вас какие-то традиции в предновогодний день или на новогодних праздниках?

Очень интересно почитать в комментариях 👀👀👀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤35🔥97
Итоги от ЛЛМки👨‍💻

Увидел у коллег по цеху такую прикольную штуку с итогами года от ЛЛМки по тг каналам и решил тоже посмотреть что же она выдаст по моему
(да-да, самому писать их, как вы поняли, мне максимально впадлу...)

Вбил свой канал иии
тут я ахуел...

Вот что она написала первой строкой:

tech-savvy Gen Z фаундер вайб

Что это блядь за набор букв и какого хуя она меня обозвала, подумал я тут же — и полез разбираться😡

Коротко, что это значит:

*️⃣tech-savvy — шаришь в технологиях и используешь их по делу
*️⃣Gen Z вайб — простой язык, без пафоса и корпоративного буллшита
*️⃣фаундер — не «исполнитель по ТЗ», а человек, который сам думает, как и зачем что-то делать

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

Остальной анализ я прикреплю скрином — там она довольно прикольно расписала — что за канал, про что он и почему + немного статистики по каналу.

Ниже также выложу блок "Что она думает о канале":

1️⃣Анализ постов показал, что основной фокус — на практической аналитике: SQL, Python, ETL, архитектура данных. Темы повторяются в разных форматах — обзоры собесов, лайфхаки, теория.

2️⃣Тон канала — разговорный, без пафоса, с лёгкой самоиронией. Автор не претендует на гуру, а делится опытом как коллега, который тоже учится.

3️⃣Ключевой инсайт: канал не просто учит инструментам, а помогает понять, как они работают в реальных кейсах — от собесов до архитектуры Greenplum.

4️⃣Часто упоминаются конкретные технологии: SQL, Python, dbt, Airflow, Greenplum, Kafka, ClickHouse — это не абстракции, а реальные инструменты из жизни.

5️⃣ Автор делает акцент на деталях: например, как работает UNION ALL с NULL, почему важно выбирать distribution key в Greenplum, как писать эффективный SQL.

6️⃣Важно, что канал не только про технические навыки, но и про процесс: как писать резюме, как готовиться к собесу, как выстраивать карьеру в аналитике.

7️⃣Есть элементы мемности: «не знал, буду юзать», «все и так работает, так что оставь себе и не еби мозг», «контента на этой недели нет — всему виной мой трип».

8️⃣Канал живой, не формальный, с лёгким юмором, но без кринжа. Автор — не эксперт, а практик, который делится тем, что реально работает.

Итого:
К счастью — она меня не обзывала, диагнозов не ставила так что все нормально,
в новый год можно идти с хорошим настроением!😁

Так что всех еще раз с Наступающим!🎄🥂🎄

P.S. Исходя из статистики канала план на следующий год следующий: добавить минимум один нолик к текущему количеству подписчиков.

Услышимся в 2026🚀🚀🚀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17😁127👍5
Праздники ещё идут — и нет, я не спился😁

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

Сейчас я в Белграде🇷🇸 — гуляю, знакомлюсь с городом и страной, ловлю ощущение перезагрузки. Очень классное чувство — начинать год без суеты, без дедлайнов, без вечного «надо было ещё вчера».

Особенно это ощущалось сегодня, 7 января — здесь празднуют Рождество.
Город буквально нажал на паузу: около 95% всего закрыто — музеи, заведения, магазины. Работают только точечные кафешки (и то, они начали открываться ближе к 14-15) и, конечно же, храмы. Люди никуда не торопятся, день просто проживается.

Фотки с Сербии прикладываю в посте📸
Пока это 3 день, поэтому, вероятно, дополню после поездки и мб напишу про Сербию отдельный пост (в рамках какой-нибудь конкретной темы). Кстати, если что-то интересно — пишите в комментарии, вполне это может перерасти в пост.

А вообще, иногда лучший способ провести праздники — позволить себе тишину и неспешность, хотя я тот ещё любитель покутить.

А как вы проводите свои праздники? 👀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤30🔥21😍13