Кусочек пиццы – Telegram
Кусочек пиццы
152 subscribers
11 photos
18 links
Про аналитику и не только

Для связи: @rdshftmusic
Download Telegram
Удаленка vs неудаленка

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

Но вот че-то уже вторую неделю собираюсь в офис и никак до него не дойду. Каждый вечер думаю: “Ну вот завтра точно поеду” А потом просыпаюсь в 9:30, и понимаю - ехать уже нет смысла. Час в одну сторону, час обратно. Это ж два часа продуктивного времени.

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

И вроде понятно, почему все так топят за удаленку. НО!

После 2+ недель дома в таком режиме я начинаю себя чувствовать то ли отшельником, то ли затворником, застрявшем в вечном дне сурка: кровать -> монитор -> кровать (ну и плюс прогулки до магазина и зала в промежутках).

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

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

У вас как с этим?
👍4😁4
🔥3
Кусочек пиццы pinned «Навигатор по постам Постов в канале стало больше, поэтому собрал небольшой пост-навигатор, чтобы проще в них ориентироваться. Про карьеру - Виды аналитиков - Что учить, если решил стать аналитиком данных в 2025 г. - Как самостоятельно определять метрики…»
Как писать оптимальные SQL-запросы 🔍

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

Обычно, разница кроется не в каких-то сложных техниках оптимизации, а в базовых принципах написания запросов.

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

1. Продумывайте план запроса заранее 🗺

Перед написанием кода ответьте себе:
- Какие таблицы нужны?
- В каком порядке их джойнить?
- Какие фильтры применить?
- Какие колонки нужны в результате?

Не начинайте писать код сразу. Нарисуйте схему: берем таблицу A, фильтруем по X, джойним с B, агрегируем.

2. Прикидывайте объемы данных 🧮

Всегда держите в голове размеры таблиц:
- Сколько строк в таблице? (1000? 1 млн? 100 млн?)
- Сколько останется после фильтра?
- Сколько получится после JOIN?

Пример: таблица заказов - 10 млн строк, пользователей - 1 млн. Джойним без фильтров - база пытается соединить 10 млн х 1 млн. С фильтром по месяцу: 300 тыс х 50 тыс - уже реально.

Если ожидаете 1000 строк, а получается 10 млн - где-то ошибка.

3. Выбирайте только нужные столбцы 📋

SELECT * вытягивает все столбцы, включая тяжелые поля. Всегда указывайте конкретные:
SELECT order_id, user_id, created_at, amount FROM orders


Это особенно критично пр использовании CTE - лишние колонки тащатся через весь запрос.

4. Не дублируйте расчеты - выносите в CTE 🔄

Плохой пример:
SELECT
(SELECT COUNT(*) FROM orders WHERE user_id = u.id),
(SELECT SUM(amount) FROM orders WHERE user_id = u.id)
FROM users u


База дважды обращается к orders.

Хороший пример:
WITH user_orders AS (
SELECT user_id, COUNT(*) as cnt, SUM(amount) as total
FROM orders GROUP BY user_id
)
SELECT u.*, uo.cnt, uo.total
FROM users u JOIN user_orders uo ON u.id = uo.user_id


5. Фильтруйте данные ДО JOIN🔍

Плохой пример:
SELECT * FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.created_at >= '2024-01-01'


Хороший пример:
WITH recent_orders AS (
SELECT * FROM orders WHERE created_at >= '2024-01-01'
)
SELECT * FROM recent_orders o
JOIN users u ON o.user_id = u.id


Простое правило: сначала фильтруем, потом джойним.

6. Понимайте сложность операций:

От быстрых к медленным:
1. Фильтрация WHERE - быстро (особенно с индексом)
2. Сортировка ORDER BY - умеренно (зависит от объема)
3. JOIN - дорого на больших таблицах
4. DISTINCT - дорого (сканирует все строки)
5. GROUP BY - дорого (чем меньше групп, тем быстрее)
6. Оконные функции - самые дорогие

Оконные функции (ROW_NUMBER, RANK, LAG) удобны, но требуют сортировки. Используйте только когда нужен рейтинг или сравнение с предыдущими значениями. Если можно обойтись GROUP BY - обходитесь.

7. Минимизируйте агрегации 📊

Плохой пример: Агрегируем -> Джойним -> Снова агрегируем

Хороший пример: Джойним -> Один раз агрегируем в конце

Каждая агрегация дорогая. Одна аггрегация в конце будет быстрее трех промежуточных.

8. Не применяйте функции в WHERE 🚫

Плохой пример:
WHERE DATE(created_at) = '2024-01-01'
Хороший пример:
WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'


9. Не забывайте тестировать запрос на ограниченных выборках

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

Финальный чек-лист
Ответьте на эти вопросы
1. Продуман план запроса?
2. Прикинули объемы данных?
3. Выбраны только нужные колонки?
4. Расчеты не дублируются?
5. Фильтры используются ДО JOIN?
6. Оконные функции только там, где нужно?
7. Минимум агрегаций?
8. Протестировали запрос на маленьких выборках?

Ставьте , если этот пост оказался вам полезен
🔥753❤‍🔥1
Магия формулы Бернулли: почему важно не сдаваться 🎲

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

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

Особенно грустно становится, когда слышишь, как везде говорят: “90% стартапов проваливаются в первые три года”, “только 1% книг становятся бестселлерами”, “50% браков разрушается” и тд.

Хочется опустить руки и ничего не делать.

Но стоит ли?

Ответить на этот вопрос может помочь теория вероятности, а точнее формула Бернулли. Она описывает вероятность хотя бы одного успеха (а больше нам и не надо) и выглядит так:

P(успех) = 1 - (1 - p)^n

где p - вероятность успеха в одной попытке, n - количество попыток.


Как это работает на практике?
Представьте, что вы ищете работу аналитиком. Допустим, вы знаете, что средний шанс получить оффер после одного собеседования - около 5% (p = 0.05). Звучит уныло.

Но посмотрим на математику:
- 1 собеседование: шанс = 5%
- 5 собеседований: шанс = 23%
- 10 собеседований: шанс = 40%
- 20 собеседований: шанс = 64%

Даже, если допустить, что вы не стали лучше как специалист, а просто продолжали пытаться, ваш шанс устроиться на работу после 20 собеседований вырос в 13 раз! На самом деле с каждым следующим собесом вероятность p тоже выросла, т.к. ваши навыки прохождения собеседований тоже подросли.

Другой пример - нетворкинг. Допустим, шанс завести полезное знакомство с одним человеком на конференции - 5%. После знакомства с 50 людьми ваш шанс найти кого-то полезного = 92%. Просто ВАУ.😱

Что это значит?

Формула Бернулли показывает простую вещь: упорство - это не просто красивые слова мотивационных спикеров. Это математическая закономерность.

Когда вы слышите истории успеха, вы видите результат. Но не видите количество попыток. Человек с оффером в топовую компанию, возможно, прошел 30 собеседований. Успешный предприниматель запустил 5-10 неуспешных проектов до того единственного проекта, который взлетел.

Разница между теми, кто достигает целей, и теми, кто нет - часто просто в количестве попыток. Не в таланте. Не в удаче. В попытках.

Важный нюанс

Формула работает, если вероятность успеха p больше нуля. Если вы делаете что-то с нулевым шансом - количество попыток не поможет.

Поэтому важно:
- Убедиться, что движетесь в правильном направлении (p > 0)
- Извлекать уроки из неудач (увеличивать p с каждой попыткой)
- Не сдаваться (увеличивать n)

Если ваш шанс успеха хотя бы 5%, то после 50 попыток вы достигнете результата с вероятностью 92%. Математика на вашей стороне.

Применимо ли это в аналитике?

Еще как. В нашей профессии это работает постоянно:

Ищете инсайт в данных? Чем больше гипотез проверите, тем выше шанс найти значимое. Пытаетесь объяснить аномалию? Перебор версий приведет к ответу. Учите новый инструмент? Количество практики решает.

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

Итого

В следующий раз, когда столкнетесь с неудачей, вспомните формулу Бернулли. Вы не провалились - вы просто уменьшили (1-p)^n еще на один шаг.

Главное - не останавливаться. Математика докажет, что вы были правы.

P.S. Это не призыв биться головой об стену. Если после 20 попыток ничего не меняется - возможно, стоит пересмотреть подход и увеличить p, а не только n😁
🔥7👍62❤‍🔥1
Сори, не могу не выложить.

Купили зеркало.
Кошка в шоке
😁12
Propensity Score Matching: когда A/B тест невозможен

Давненько не было постов про Causal Inference методы. Напомню, что ранее я уже писал про DiD и ITS.

Сегодня поговорим про один метод, который на первый взгляд может показаться ультимативным, но на самом деле он, как и прочие методы, применим не везде - Propensity Score Matching.

В чем суть метода?

Представьте ситуацию: вы запустили новую фичу, но не для всех пользователей случайно, а только для тех, кто сам ее активировал. Классический A/B тест не сработает - группы изначально разные. Активные пользователи включили фичу, пассивные - нет.

Вопрос: как понять, влияет ли фича на метрики, или разница только из-за того, что группы изначально были разными?

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

Вот краткий алгоритм:

- Шаг 1: Строим модель, которая предсказывает вероятность попадания в тестовую группу

Берем характеристики пользователей (возраст, город, количество заказов, средний чек) и строим логистическую регрессию. Она предсказывает вероятность попадания в тестовую группу - это и есть Propensity Score.

- Шаг 2: Матчим пользователей по Propensity Score

Для каждого пользователя из тестовой группы ищем пользователя из контрольной с максимально близким Propensity Score.

- Шаг 3: Сравниваем метрики

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

Когда PSM работает хорошо?

1. Есть много признаков, которыми можно описать пользователей
Больше данных -> точнее модель -> лучше матчинг.

2. Группы пересекаются по характеристикам
Если в тестовой группе только VIP-клиенты, а в контроле их нет - матчинг не сработает. Нужно, чтобы для каждого пользователя из теста нашелся похожий в контроле.

3. Решение о попадании в группу зависит от наблюдаемых факторов
Если пользователь активировал фичу из-за факторов, которые мы можем измерить (активность, возраст, город) - отлично. Если из-за чего-то скрытого (настроение, рекомендация друга) - PSM это не учтет и возникнет смещение.

Как проверить, что матчинг работает?

Недостаточно просто проверить баланс групп по характеристикам. Нужна валидация на историческом периоде.

Примените PSM к данным ДО воздействия. Например, фичу запустили 1 июня - сделайте PSM на данных за май. Если хорошо подобранные фичи показывают "эффект" там, где его быть не может - проблема в скрытых факторах, плохом матчинге или в сверхвысокой чувствительности.

Так, на выборках 100k+ пользователей возникает проблема: любая мизерная разница становится статистически значимой. P-value < 0.05 при разнице в 0.01% - технически значимо, но практически шум.

Решение: не использовать всю выборку.
Можно определить MDE (минимальный детектируемый эффект, например +2%), расчитать нужный размер выборки под этот MDE и ограничить выборку до этого размера - т.е. взять случайные 50k вместо всех 500k.

Так вы не будете детектить шум как значимый эффект.

На что еще стоит обратить внимание

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

2. Работайте с выбросами
Перед построением модели сглаживайте или убирайте выбросы. Экстремальные значения могут исказить Propensity Score и ухудшить матчинг.

3. Используйте Caliper Matching
Не матчите пользователей, если разница в Propensity Score больше порога (например, 0.01). Лучше потерять часть данных, чем получить плохие пары.

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

PSM - мощный инструмент, когда рандомизация невозможна. Однако не стоит бездумно пихать его в любой эксперимент. Рассматривайте каждый кейс индивидуально: начиная с методов оценки, заканчивая метриками и фичами.

Ставьте реакции, если пост оказался полезным.
Будет много реакций - будет больше постов про Causal Inference)
🔥5
У NewHR вышел интересный пост про текущий рынок труда.

В целом их результаты опроса подтверждают выводы, о которых сейчас многие говорят: спрос на «фуллстек» аналитиков растет. Стека SQL + BI уже не хватает. Работодатели ждут более продвинутого набора
навыков вроде продвинутого a/b, ML и тд.

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

P.s. (это не реклама)
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Нужна ли профильная вышка для работы в аналитике данных?

Возможно, если вы только вкатываетесь в аналитику данных, вы размышляете на тему: “А стоит ли идти получать высшее образование или достаточно курсов?”

Отвечу кратко - профильное образование не обязательно, но оно дает преимущества.

Согласно исследованию NEWHR 2024 года, половина специалистов (51%) приходят в аналитику из других специальностей. Мой личный опыт тоже подтверждает эту идею.
Работодатели (по крайней мере в РФ) смотрят в первую очередь на опыт и навыки, а не на диплом.

Поэтому, можно спокойно войти в профессию без технического образования.

НО! У профильного образования есть огромное преимущество: Вам не надо тратить дополнительное время на переобучение в таком масштабе, как другим.

Все базовые знания вы уже получили в универе:
- Языки программирования
- Математическая статистика и теория вероятностей
- Линейная алгебра
- Основы машинного обучения
- Эконометрика

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

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

Кроме того, я заметил еще одно интересное преимущество

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

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

Стоит ли бросать все и идти учиться?

Если вы уже работаете в аналитике - каждый решает индивидуально.

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

Кому-то не хочется тратить 4-5 лет на учебу, особенно если уже есть опыт. Можно прокачиваться через курсы, книги, практику.

Мне лично проще усваивать знания на практическом опыте, поэтому я учусь и работаю параллельно.

В итоге

Профильное образование - не обязательное требование, но сильное конкурентное преимущество. Оно экономит много времени на освоение базы.

Если вы только думаете о входе в профессию и есть возможность получить профильное образование - это отличный путь.

Если уже работаете без него - не обязательно бросать все и идти в универ. Фокусируйтесь на практике, углубляйте знания, работайте над проектами.

В любом случае для работодателя всегда важнее не диплом, а что вы умеете делать с данными.
3🔥2
Меры разброса данных: почему среднее врет

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

Но среднее часто врет.

Представьте две компании. В обеих средняя зарплата 100 000 рублей. В первой все получают от 90 до 110 тысяч. Во второй - половина по 50 тысяч, а половина по 150. Среднее одинаковое, но ситуации совершенно разные.

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

Что такое меры разброса?

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

Основные меры разброса: дисперсия, стандартное отклонение, коэффициент вариации. Пройдемся по каждой из них

Дисперсия

Дисперсия показывает среднее квадратичное отклонение от среднего значения.
Формула: Дисперсия = Сумма((X - Среднее)^2) / N


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

Пример:
Зарплаты в первой компании: 90, 95, 100, 105, 110 тысяч. Среднее = 100.
Дисперсия = ((90-100)^2 + (95-100)^2 + ... + (110-100)^2) / 5 = 50

Зарплаты во второй компании: 50, 50, 50, 150, 150 тысяч. Среднее = 100.
Дисперсия = ((50-100)^2 + ... + (150-100)^2) / 5 = 2500

Чем больше дисперсия - тем сильнее разброс данных.

Проблема дисперсии - в квадратах исходных единиц. Если измеряем зарплату в рублях, дисперсия будет в рублях в квадрате. Поэтому обычно используют стандартное отклонение.
Стандартное отклонение = Квадратный корень(Дисперсия)


Так, мы можем увидеть, что в первой компании зарплаты отклоняются от среднего в среднем на 7 тысяч (корень из 50), а во второй - на 50 тысяч (корень из 2500).

В большинстве случаев при работе со стандартным отклонением руководствуются правилом двух и трех сигм: в нормальном распределении 95% значений лежат в пределах двух стандартных отклонений от среднего, а 99% значений лежат в пределах трех стандартных отклонений от среднего. Это помогает находить и отфильтровывать выбросы.

Однако у стандартного отклонения есть проблема - его сложно сравнивать между разными показателями.

Допустим, стандартное отклонение зарплаты = 50 000 рублей, а стандартное отклонение возраста = 5 лет. Что больше?

Коэффициент вариации решает эту проблему.
Он показывает относительный разброс в процентах.
Коэффициент вариации = (Стандартное отклонение / Среднее) х 100%


Теперь можно сравнивать разные показатели. Например:
- Зарплата: среднее 100к, стандартное отклонение 50к, CV = 50%
- Возраст: среднее 30 лет, стандартное отклонение 5 лет, CV = 17%

Коэффициент вариации показывает, что зарплата варьируется сильнее, чем возраст.

Для интепритации разброса обычно руководствуются правилами:
- CV < 10% - слабый разброс, данные однородны
- CV 10-20% - средний разброс
- CV > 20% - сильный разброс, данные неоднородны

Когда это важно в аналитике?

1. Оценка сегментов пользователей
У вас два сегмента с одинаковым средним чеком 5000 рублей. Но в первом стандартное отклонение 500 рублей, во втором - 3000. Первый сегмент предсказуем, второй - нет.

2. Выбор метрик для экспериментов
Метрика с высоким разбросом требует большую выборку для A/B теста. Если стандартное отклонение конверсии большое - нужно больше пользователей для детекции эффекта.

3. Поиск аномалий
Значение, которое отличается от среднего больше чем на 3 стандартных отклонения - скорее всего выброс или ошибка в данных.

4. Сравнение показателей
Коэффициент вариации позволяет понять, какие показатели более стабильны. Например, количество заказов может быть более стабильным показателем, чем выручка.

Ставьте , если узнали что-то новое или 😎, если уже это знали
53😎1
Обратная сторона прогресса

Всю эту неделю я болею - температура, слабость, никакой продуктивности. Единственное, что могу - лежать и читать что-то легкое. Казалось бы, идеальное время для отдыха. Но мозг взбунтовался: «Поработай! Пройди модуль курса! Посмотри хоть что-нибудь на YouTube!»

И тут я понял: я разучился скучать.

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

Хорошая новость: за неделю-две без цифрового шума организм перестраивается. Плохая: ритм города мгновенно возвращает тебя обратно.

Мы живем в эпоху, когда самый ценный ресурс - не нефть и не золото, а наше внимание. Чем меньше мы думаем, тем легче на нас заработать.

Социальные сети зарабатывают миллиарды на рекламе, удерживая нас бесконечными лентами. Алгоритмы анализируют нас и рекомендуют персонализированный контент, формируя аддиктивное поведение. Маркетплейсы подталкивают к импульсивным покупкам. Корпорации внедряют омниканальность - ты окружен их присутствием везде. Тебе просто не дают заскучать. Никогда.

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

Не совсем. Человек быстро привыкает перекладывать ответственность за выбор на алгоритмы, теряя способность принимать решения самостоятельно.

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

Возникает парадокс: технологии персонализации обещают понимать наши желания, но подменяют наше «Я» на паттерны потребления.

Алгоритм формирует твои предпочтения на основе того, что принесет компании прибыль.

В итоге не человек управляет своей жизнью. Компании управляют его желаниями через персонализацию и омниканальность. Собственное «Я» растворяется в погоне за легким дофамином - лайками, покупками, следующим видео.

Возможно, те, кто двигает эти концепции, руководствуются принципом «не можешь победить — возглавь». А возможно, сама система так выстроилась и теперь независимо от своего социального положения мы все пытаемся в нее встроиться. Этого я не знаю.

Но что я знаю - можно выйти из системы и найти баланс.

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

Чтобы этого добиться, необходимо заново научиться слышать себя. Разбудить внутреннего ребенка.

Мне в этом помогают различные практики осознанности, вроде медитации, холодного душа и пр. Они помогают очистить голову и сфокусироваться на настоящем моменте.

Также, я не давно открыл для себя - терапия внутренних семейных систем (IFS) Ричарда Шварца. IFS рассматривает психику как систему различных «частей» - внутренних голосов и импульсов. Тот самый голос, который кричит «проверь телефон!» - это всего лишь одна из частей, часто защитная, которая пытается оградить нас от дискомфорта скуки или тревоги. Через практику IFS можно научиться различать эти части, понимать их мотивы и взаимодействовать с ними осознанно.

Вместо резюме

В тишине, когда алгоритмы молчат, мы наконец слышим себя.
Это единственный путь вернуть жизнь, где решения принимаешь ты, а не компании, зарабатывающие на твоем внимании.
6🔥3
📉Как дизайнить эксперименты с “длинными” метриками

В классических A/B тестах мы привыкли оценивать быстрые метрики: конверсию, ARPU, средний чек и им подобные.
Однако иногда нам может потребоваться оценить долгосрочную метрику, вроде Retention или LTV.

В стандартном дизайне мы работаем так:
- посчитали требуемый размер выборки и длительность эксперимента
- запустили эксперимент
- набрали нужную выборку за срок эксперимента
- на следующий день подвели итоги

Проблема в том, что с “длинными” метриками математика работает иначе, чем с метриками в моменте.
Почему так?

Давайте разбираться на примере.👀

Представьте: вы посчитали размер выборки и он оказался равным 10,000 пользователей на группу.
Допустим, вы набираете их за 14 дней и хотите посчитать возвращаемость на 7й день (Retention D7).

Если вы начнете считать Retention D7 на 15й день, возникнет проблема: пользователи из первого дня теста уже “созрели”, а пользователи, пришедшие в последние дни эксперимента еще нет, т.к. их 7-й день еще не наступил.

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

Что делать? 🤔

Теоретически мы можем забить на срок “созревания” и засчитать таким пользователям вовзвращаемость как 0.
В итоге вы получите искусственный обвал метрики в последние дни теста.
"Люди приходят и уходят, как тени".
(с. Оскар Уайлд)

Также можно исключить их из анализа.
В результате вместо выборки в 10,000 остается 5,000-6,000.

Мощность теста падает, следовательно вы можете пропустить реальный эффект или поймать ложноположительный.

Очевидно оба варианта не подойдут.
Возможен только один вариант: добавлять лаг для оценки эксперимента.

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

1️⃣ Считаем размер выборки.
Так как он рассчитывается на завершенные наблюдения, то здесь отличий от обычного дизайна нет.

2️⃣ Определяем сроки эксперимента

Здесь ужедругая формула
Срок теста = Период набора + Окно метрики


Период набора - это время, за которое набирается необходимый для теста размер выборки.
Окно метрики - время, за которое считается наша метрика. (В нашем случае это 7 дней)

В нашем примере срок теста = 14 + 7 = 21 день

3️⃣ Запускаем тест и держим его определенное периодом набора время (т.е. 14 дней)

4️⃣ Останавливаем эксперимент по окончании периода набора (14 дней) и…

5️⃣ Ждем (в пределах окна метрики - 7 дней)

6️⃣ Подводим результаты эксперимента

Например,
Запустили 1 марта -> Выключили сплит 15 марта -> Подвели результаты 21 марта.

Конечно, бизнес-заказчики могут просить завершить эксперимент быстрее, но вы не сдавайтесь и стойте на своем.
При работе с такими метриками спешка только навредит.
Please open Telegram to view this post
VIEW IN TELEGRAM
33👾2
ГКГ/ ГЦГ и прочие Г..

У аналитиков время-от-времени просят оценить эффект всех запущенных фич за год. Может показаться, что если сложить аплифты всех успешных A/B тестов, то мы как раз и получим искомый результат.

На самом деле нет.🙅‍♂️🙅‍♀️

Проблема в том, что мы привыкли оценивать эффекты изолированно - для каждой отдельной фичи в рамках каждого конкретного эксперимента. Но мы забываем про совокупный эффект (Cumulative Effect) и взаимодействие изменений.

Возможно, новые пуши раздражают пользователей🤬, пришедших к нам из-за новой фичи, и увеличивают отток. В изолированных тестах оба изменения зеленые🟢. Вместе - они могут гасить друг друга и не давать прокрась или, что хуже, убивать LTV.

Чтобы понять, как все наши изменения в сумме влияют на пользователя на длинной дистанции, обычного A/B теста недостаточно. Нам нужна Глобальная контрольная группа (ГКГ/ГЦГ).

Что это такое?

ГКГ (Universal Control Group)
— это сегмент пользователей, который изолируется от всех (или большинства) изменений и маркетинговых коммуникаций на длительный срок.

Если в классическом тесте мы держим контроль 2 недели, то ГКГ живет 3, 6 или 12 месяцев.

Это наша «тихая гавань» в шторме релизов. (с)
Как это работает на практике?


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

>Тип 1. Статическая ГКГ (Static Holdout) 🏘
Вы просто отрезаете кусок аудитории (например, 5% по User ID) и «замораживаете» их навсегда.

Плюс: Идеально чистые данные для расчета LTV. Вы точно знаете историю каждого пользователя.

Минус: Со временем эта группа «протухает». Пользователи, живущие в продукте год (а то и больше), отличаются от новичков. Группа перестает быть репрезентативной. Оценка эффектов становится нечестной.

>Тип 2. Ротируемая ГКГ (Rolling Holdout) 🎢
Пользователи попадают в контроль на фиксированное время (например, на 90 дней), а затем возвращаются в общую массу, заменяясь новыми.

Плюс: Выборка всегда свежая, нет смещения (bias).

Минус: Сложнее математика. Вы не можете оценить эффекты длиннее окна ротации.

Главный ограничение использования ГКГ: «Мы теряем деньги!»🪙

Внедрение ГКГ - это всегда битва с заказчиками.


Маркетинг кричит:
«Если мы не отправим промокоды этим 5% людей, мы недополучим миллионы выручки!»
.
Здесь важно объяснить два момента:


Мы не теряем, мы инвестируем в знание.
Без ГКГ мы летим вслепую. Мы можем тратить бюджет на SMS, которые не приносят инкрементальной выручки. Стоимость ГКГ - это плата за то, чтобы не сжигать бюджет впустую на остальной базе.

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

Резюме🚏
Если ваш продукт предполагает длительные отношения с клиентом (подписка, банкинг, e-commerce, телеком) - локальных тестов мало.

Локальный тест отвечает на вопрос: «Как эта кнопка влияет на клики сегодня?»

ГКГ отвечает на вопрос: «Становится ли наш бизнес здоровее от всего, что мы делаем?»

Ставьте 🐳, если уже считаете инкрементальность, или 🗿, если пока живете только локальными тестами.
Please open Telegram to view this post
VIEW IN TELEGRAM
2🐳2👍1🗿1
Когда вносишь изменения в прод в процессе A/B
😁4
Разбор классического кейса с собеседования: "Упала метрика"

Один из самых частых кейсов на собеседованиях в аналитике - кейсы про падение какой-либо метрики.📉

Разберем как правильно подходить к решению.

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

В итоге общая прибыль компании упала. Ваша задача - разобраться что произошло и что делать дальше.
Что проверяет интервьюер?
Этот кейс проверяет несколько ключевых навыков:

1. Умение декомпозировать проблему
2. Генерация гипотез
3. Понимание бизнес-метрик
4. Структурное мышление
5. Способность задавать правильные вопросы

Типичная ошибка - сразу бросаться предлагать решения.

Правильный подход - идти к решению поэтапно.

Шаг 1: Уточняем контекст

Первое что нужно сделать - задать вопросы:

> Какую конкретно метрику смотрим?
Общая прибыль - это выручка минус затраты.
Возможно выручка выросла, но затраты на рекламу выросли еще больше?

>На сколько упала метрика?
Падение на 5% и на 50% - совершенно разные ситуации, требующие разного подхода.

> Когда именно она упала?
Во время акции или после? Это важно для понимания причин.

> Как выглядит ее динамика?
Постепенное снижение или резкий провал? Возможно это просто шум в данных?

Интервьюер оценивает: понимаете ли вы, что прибыль - составная метрика. Умеете ли задавать правильные вопросы перед анализом.

Шаг 2: Декомпозируем метрику🧮

Прибыль = Выручка - Затраты
-> Выручка = Количество заказов х Средний чек

-> Количество заказов = Трафик х Конверсия
- >Затраты = Затраты на рекламу + Операционные затраты + Скидки


Теперь можно генерировать гипотезы по каждому элементу.

Шаг 3: Генерируем гипотезы🤔

Гипотеза 1: Выручка упала
- Упал трафик после окончания рекламной кампании
- Упала конверсия (промокоды привлекли нецелевую аудиторию)
- Снизился средний чек (все покупали только красные самокаты со скидкой)

Гипотеза 2: Затраты выросли
- Затраты на рекламу оказались слишком высокими
- Скидки по промокодам съели маржу
- Операционные затраты выросли из-за увеличения объема

Гипотеза 3: Изменилась структура продаж
- Продавали больше красных самокатов (с низкой маржой) вместо других моделей
- Промокоды использовали существующие клиенты, которые купили бы и так

Интервьюер оценивает: логику декомпозиции, полноту гипотез, понимание бизнеса.

Шаг 4: Приоритизируем проверку гипотез
Не нужно пытаться проверить все сразу. Приоритизируем:

Первое - смотрим на структуру.
Что изменилось сильнее - выручка или затраты?

Второе - если выручка упала, смотрим: трафик, конверсию, средний чек. Находим главного "виновника".

Третье - сегментируем. Смотрим отдельно красные самокаты vs остальные. Новые клиенты vs существующие.

Интервьюер оценивает: умение расставлять приоритеты, понимание что важно проверить в первую очередь.

Шаг 5: Предлагаем решения💡

Тол
ько после анализа предлагаем действия:

-> Если проблема в каннибализации других товаров:
- Ограничить промокоды только для новых клиентов
- Сделать скидки на весь ассортимент, а не только на красные

-> Если проблема в высоких затратах на рекламу:
-
Пересмотреть каналы привлечения
- Оптимизировать стоимость клика

-> Если проблема в низкой марже:
- У
величить цену на красные самокаты
- Ограничить размер скидки

Вместо резюме

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

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

Проходите кейс поэтапно: сначала уточняющие вопросы -> затем декомпозиция метрики и генерация гипотез -> после приоритизация и решения.

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

И не забыть про понимание бизнеса.
5🔥2
Всех с Новым годом!
Успехов во всех начинаниях😏
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Pandas.Period🕰

В первую рабочую неделю мне вдруг понадобилось немного поработать с временными данными: создать определенный диапазон дат и поверх него построить витрину с метриками.

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


В чем его суть?

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

period_month = pd.Period('2025-03', freq='M')



Тоже самое можно сделать за квартал или день
period_quarter = pd.Period('2023Q1', freq='Q')
print(period_quarter) # 2023Q1

#День
period_day = pd.Period('2023-03-15', freq='D')

Главный параметр - freq (частота): M для месяца, Q для квартала, Y для года, D для дня, W для недели.

У класса достаточно много применений.
Детально с ним можно ознакомиться в официальной доке.

Я расскажу про некоторые из них.

PeriodIndex


Например, когда вы анализируете данные по месяцам, можно создать PeriodIndex.

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

Например:

dates = pd.period_range(start='2023-01', periods=6, freq='M')
df = pd.DataFrame({'Sales': [100, 150, 200, 250, 300, 350]}, index=dates)

Результат:
Sales
2023-01 100
2023-02 150
2023-03 200
2023-04 250
2023-05 300
2023-06 350

Каждая строка теперь представляет целый месяц, а не конкретную дату. Это упрощает агрегацию и анализ периодических данных.

Конвертация между Period и Timestamp


Иногда нужно превратить Period в конкретную дату.
В этом тоже нет ничего сложного:

period = pd.Period('2023-03', freq='M')

# Начало периода
period.to_timestamp() # 2023-03-01 00:00:00

# Конец периода
period.to_timestamp(how='end') # 2023-03-31 23:59:59

# Обратная конвертация - из Timestamp в Period:

timestamp = pd.Timestamp('2023-03-15')
period = timestamp.to_period('M')
print(period) # 2023-03

Арифметика с Period

Можно двигаться между периодами:

period = pd.Period('2023-03', freq='M')
print(period + 1) # 2023-04
print(period - 1) # 2023-02

Для недели:
week_period = pd.Period('2023-07-10', freq='W')
print(week_period + 1) # Следующая неделя

Начало и конец периода:
period.start_time # 2023-03-01 00:00:00
period.end_time # 2023-03-31 23:59:59


Итого

-> Period - это абстракция для работы с временными интервалами. Вместо точных дат вы работаете с целыми периодами.

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


p.s. сейчас я делаю достаточно интересную работу, результатами которой поделюсь в ближайшее время. Она не связана напрямую с аналитикой данных, но думаю, многим она будет полезна. Ждите апдейтов😉
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥21
Семейная стратегия 2026

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

Я не являюсь ярым адептом целеполагания и планов, но все-таки понимаю, что этот процесс:

А) Помогает посмотреть на свой путь с высоты, порефлексировать и скорректировать свое дальнейшее движение

Б) Помогает не потеряться в бесконечном потоке задач и проблем, которые валятся на тебя каждый день (например, на прошлой неделе нас затопили соседи)


В) Помогает принимать решения в моменте

Поэтому его и практикую.

В этом году решил расширить эту практику на семью и сформировать семейную стратегию на год.

Что это такое?
Я не коуч, поэтому правильного определения этого термина у меня нет. Сам себе объясняю семейную стратегию так:
Семейная стратегия - это общая договоренность на уровне семьи о том, куда вы двигаетесь и кто за что отвечает в пути.


Можно представить, что семья - это корабль

Без стратегии плавание на нем хаотично:
- Один гребет влево, другой вправо
- Или один гребет изо всех сил, а другой просто загорает.
- Или вы просто дрейфуете по течению.

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

С семейной стратегией:

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

-> Вы понимаете ваши роли на корабле🫡
Например, «Я смотрю за парусами (зарабатываю), ты - за картой и провизией (быт/уют)».

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

-> Вы задаете правила плавания📝
Вы вместе решаете, что для вас важно, а что нет в этом году. Вместе определяете бюджет и планируете траты. Заранее определяете важные для вас ритуалы (например, кофе с выпечкой по субботам🥐 или свидания по пятницам).

В общем,
Наличие стратегии помогает избежать лишних конфликтов и обид, вызванных недопониманием и разными ценностями партнеров.
Интро получилось довольно длинным.
Теперь к самому интересному:

Как мы работаем с семейной стратегией?

Семейная стратегия реализуется у нас в 3 этапа:

1. Проводим стратегическую сессию.

Мы рефлексируем над прошлым годом и его вызовами.

Обсуждаем наши ценности, цели и планы. Синхронизируем их и формируем важные для нас ритуалы. В конце мы формируем небольшой документ с основными тезисами.

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

2. Формируем бюджет


Я собираю годовой семейный бюджет с нашими плановыми тратами по основным статьям расходов.

Ввиду разного формата доходов (у меня - крупные поступления с зп и аванса 2 раза в месяц, у жены - ежедневные поступления с консультаций), бюджет разделен на два потока.

Семейные расходы распределены между нами: часть крупных трат закрываю я, часть - жена.

(Если интересно, то вот ссылка на наш шаблон бюджета)

3. Следуем стратегии.

Чтобы стратегия и бюджетная модель не остались артефактами, о которых мы вспоминаем только в январе, мы делаем 2 вещи:

1) Геймифицируем контроль достижения целей. 🎮

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

(Формат коллажа еще не продумали. Как будет готов - скину в канал.)

2) Следим за тратами и контролируем бюджет.

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

Далее 1ю субботу каждого месяца мы будем сверять план/факт по бюджету.

p.s. Пост получился не совсем про аналитику данных. Однако постов про A/B, SQL, Python и пр. полно в других каналах. Поэтому я решил делиться тем, что мне интересно в моменте. Надеюсь и вам будет интересно😏
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👀211
Личная стратегия как инструмент управления жизнью (и личным «продуктом»)

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

Зачем?
Я заметил, что мой жизненный «роадмап» размылся. Цели выбирались по наитию, всё шло по накатанной, и меня это не устраивало. Хотелось создать «компас» 🧭 - инструмент для принятия решений и приоритизации фокусов на год.

Как я это делал?

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

Сначала я пытался делать все по статье, но понял, что не все инструменты мне понравились. В итоге что-то я брал как есть, что-то дорабатывал сам, а что-то вообще не делал.

Что в итоге получилось?

Сам документ - вещь личная, но я подготовил шаблон 📝 в Miro со всеми фреймворками, чтобы вы могли прогнать через него свою ситуацию. Если шаблон нужен - пишите в комментариях, пришлю ссылку.

Имейте в виду, на это упражнение придется потратить много времени. Автор потратил 3 месяца, а у меня ушло 2 недели по 2–4 часа в день. Если решите повторить - закладывайте этот ресурс в свой график.

Итак, этапы:

1. Ретроспектива
На этом этапе мы вспоминаем все ключевые события и пытаемся понять, почему были приняты именно эти решения?

Пример: Почему Вы выбрали именно этот вуз?


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

2. Смыслы
На этом этапе смотрим на те же события через призму мыслей
и страхов.

Пример:
Поступление в вуз было продиктовано страхом упущенной возможности и желанием угодить родителям.
Это помогло выявить мои истинные ценности (семья, финансовая свобода), а не навязанные извне.


3. Детализация ценностей и ролей
Даем ценностям конкретную форму:

-> Описываем, что они значат для нас (например, «творческая самореализация» - это законченные треки или свой бизнес).

-> Выстраиваем иерархию приоритетов.
Формируем роли на основании этих ценностей. Тут можно решить, какие роли хочется примерять чаще, а какие - реже.

Например, у меня есть роль «я-суетолог» (деятельность ради деятельности). Я хочу, чтобы вместо нее чаще проявлялась роль «я-авантюрист».

4. Текущее состояние
Самый «честный» этап, где мы оцениваем систему As-Is:
-> Как мы себя чувствуем в моменте? 🧘
-> Как оцениваем свое место в каждой роли? 🎭
-> Какие у нас алгоритмы успеха и алгоритмы провала?🧮
(Что я делаю, когда всё получается, и как я обычно всё порчу).
-> Где мы черпаем энергию, а где бессмысленно её теряем?
-> Какие у нас есть навыки, связи и ресурсы?

Это помогает перейти от анализа к конкретным шагам.

Так, например, появились мои фокусы на год:
- Больше экспериментировать (этот пост - тоже эксперимент).
- Доводить задачи до конца.
- Искать экспертов, а не пытаться изучить вообще всё самому.
- Меньше скроллить соцсети и снижать многозадачность.


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

Надеюсь, мой опыт был вам полезен!

p.s. пост вышел компактным из-за лимита телеграма в 4000 символов. Если хотите больше подробностей по каждому этапу — маякните в комментариях, я могу запустить серию постов на эту тему.
2🔥1🤯1