📌 Грейды в аналитике
Давайте разберёмся с грейдами. Что это вообще такое и какие у них требования.
Тут мы опустим грейдирование разработки, т.к. у них там своя атмосфера, у нас своя.
Много раз сталкивался с мнением, что грейд можно вычислить по количеству лет опыта. И в целом так оно и есть. Но, как говорят в твиттере, есть нюанс.
Для любого грейда нужно знать и уметь ряд вещей, это понятно, но в большей степени он зависит от уровня уверенности в задачах с минимальными вводными. А этот скилл приходит с опытом.
Вот допустим, джун. Ему нужно уметь пользоваться базовым инструментарием, иначе он просто ничего не сможет сделать (а это уже стажёр или что-то из этой серии). Вот джун получает таску (обычно это какие-то не сложные вещи, типа выгрузки и очистки данных). Т.к. у джуна мало опыта, он может неосознанно наделать ошибок, считая свою логику верной. И она, конечно, может быть верной, но в аналитике можно легко изменить выводы, если упустить какую-то неочевидную деталь, например, из-за недостаточного погружения в данные. Поэтому обычным флоу работы джуна будет отправка работы на ревью более опытному коллеге.
Чем больше ты погружаешься в нюансы, тем чаще твои ревью проходят быстро с комментариями “всё ок”. Ты начинаешь брать задачки более неоднозначные, например, исследования. Когда ты точно не знаешь что нужно сделать, но имеешь вектор, например, разобраться с какой-то фичей. Ты изучаешь её, прикидываешь как она влияет на продукт, общаешься с заказчиками, формируешь представление. И вот уже вырисовывается план действий. Незаметно джун стал миддлом.
Ключевое отличие сеньора, в этой иерархии, это не только и не столько хард скиллы, сколько умение работать по абстрактным задачам, когда ты понимаешь что нужно бизнесу и как этого добиться.
На картинке пример как обычно ставят одну и ту же простую задачу разным грейдам 🙂
Давайте разберёмся с грейдами. Что это вообще такое и какие у них требования.
Тут мы опустим грейдирование разработки, т.к. у них там своя атмосфера, у нас своя.
Много раз сталкивался с мнением, что грейд можно вычислить по количеству лет опыта. И в целом так оно и есть. Но, как говорят в твиттере, есть нюанс.
Для любого грейда нужно знать и уметь ряд вещей, это понятно, но в большей степени он зависит от уровня уверенности в задачах с минимальными вводными. А этот скилл приходит с опытом.
Вот допустим, джун. Ему нужно уметь пользоваться базовым инструментарием, иначе он просто ничего не сможет сделать (а это уже стажёр или что-то из этой серии). Вот джун получает таску (обычно это какие-то не сложные вещи, типа выгрузки и очистки данных). Т.к. у джуна мало опыта, он может неосознанно наделать ошибок, считая свою логику верной. И она, конечно, может быть верной, но в аналитике можно легко изменить выводы, если упустить какую-то неочевидную деталь, например, из-за недостаточного погружения в данные. Поэтому обычным флоу работы джуна будет отправка работы на ревью более опытному коллеге.
Чем больше ты погружаешься в нюансы, тем чаще твои ревью проходят быстро с комментариями “всё ок”. Ты начинаешь брать задачки более неоднозначные, например, исследования. Когда ты точно не знаешь что нужно сделать, но имеешь вектор, например, разобраться с какой-то фичей. Ты изучаешь её, прикидываешь как она влияет на продукт, общаешься с заказчиками, формируешь представление. И вот уже вырисовывается план действий. Незаметно джун стал миддлом.
Ключевое отличие сеньора, в этой иерархии, это не только и не столько хард скиллы, сколько умение работать по абстрактным задачам, когда ты понимаешь что нужно бизнесу и как этого добиться.
На картинке пример как обычно ставят одну и ту же простую задачу разным грейдам 🙂
👍8😁6🔥3
📌 Нейросети заменят аналитиков?
Обсудим холиварную тему? 😈
Я в работе часто использую нейронки, в основном это GPT и Copilot, а иногда под узкую задачу можно и свою написать. Они, в большинстве случаев, хорошо справляются с генерированием несложного кода, а иногда даже и сложного.
Удобно закинуть им образец датасета и провести какую-то базовую обработку — поменять типы данных, трансформировать в long-формат, или накидать функцию для очистки выбросов. С этим они, как правило, справляются быстро и почти без косяков.
Ещё использую как их как взгляд со стороны, иногда задача бывает настолько унылая, что мозг блокирует возможность включиться в неё. Тут тоже удобно скормить её сетке и построить план анализа. С этой задачей они справляются хуже кода, так как не в курсе контекста и ограничений. Но иногда их поток бредовых рассуждений может натолкнуть тебя на какие-то мысли, а это уже победа.
Но самое больное, это их попытки тебе угодить, когда ты спрашиваешь про теорию. И это прям опасно:
Да, это просто стадия развития пока такая, и когда-нибудь они начнут отрабатывать верно с первого раза (но это не точно). Кроме того, нейронки пока не умеют выполнять код, а значит и понимать результаты.
Но у аналитиков есть козырь, который вообще не перекрывается — понимание контекста анализа. Написание кода — это малая часть полноценного анализа. Чтобы сетка сделала то что нужно, ей нужен грамотный пилот, который сам понимает чего хочет. Без пилота вся эта мощь бесполезна, а с ней она не закрывает и половины работы.
К сожалению или к счастью, кроме аналитика, мало кто может взять на себя эту роль.
Обсудим холиварную тему? 😈
Я в работе часто использую нейронки, в основном это GPT и Copilot, а иногда под узкую задачу можно и свою написать. Они, в большинстве случаев, хорошо справляются с генерированием несложного кода, а иногда даже и сложного.
Удобно закинуть им образец датасета и провести какую-то базовую обработку — поменять типы данных, трансформировать в long-формат, или накидать функцию для очистки выбросов. С этим они, как правило, справляются быстро и почти без косяков.
Ещё использую как их как взгляд со стороны, иногда задача бывает настолько унылая, что мозг блокирует возможность включиться в неё. Тут тоже удобно скормить её сетке и построить план анализа. С этой задачей они справляются хуже кода, так как не в курсе контекста и ограничений. Но иногда их поток бредовых рассуждений может натолкнуть тебя на какие-то мысли, а это уже победа.
Но самое больное, это их попытки тебе угодить, когда ты спрашиваешь про теорию. И это прям опасно:
— Эй, GPT, для t-критерия нужно равномерное распределение?
— Да, всё верно, нужно.
— Но ведь не нужно, это миф из-за косяка перевода источника.
— Да, вы правы, оно не нужно.
— Но ведь нужно равномерное распределение выборочных средних!
— Да, простите за ошибку, оно всё же нужно.
Да, это просто стадия развития пока такая, и когда-нибудь они начнут отрабатывать верно с первого раза (но это не точно). Кроме того, нейронки пока не умеют выполнять код, а значит и понимать результаты.
Но у аналитиков есть козырь, который вообще не перекрывается — понимание контекста анализа. Написание кода — это малая часть полноценного анализа. Чтобы сетка сделала то что нужно, ей нужен грамотный пилот, который сам понимает чего хочет. Без пилота вся эта мощь бесполезна, а с ней она не закрывает и половины работы.
К сожалению или к счастью, кроме аналитика, мало кто может взять на себя эту роль.
👍11😎4🔥3👎1😁1
📌 Взаимодействия внутри команды
Итак, мы потихоньку строим портрет продуктового аналитика.
Мы уже понимаем что он умеет и какие задачи выполняет. Давай поговорим про его интеграцию в команду.
Есть две популярные структуры внутри IT-компаний:
1️⃣ Горизонтальная — когда у вас есть обособленный отдел аналитики, который обслуживает интересы остальных команд. Плюсы такой структуры в том, что каждый аналитик может взять разные задачи и быть в контексте всей работы всех департаментов. Минусы — экспертиза не глубокая.
2️⃣ Вертикальная — более популярная, и как по мне, более оптимальная — когда у вас есть отдел аналитики, но он номинальный, в основном юниты раскиданы по своим командам. Т.е. продуктовый аналитик состоит в команде разработки продукта, маркетинговый в маркетинге и т.д. Из плюсов — глубокая экспертиза, из минусов — такой чел становится единственным источником знаний своего куска продукта (документация ахахаха, не слышал).
В вертикальной структуре аналитик полностью сосредоточен на своей части продукта, исследует её, улучшает и тестирует. Его главные союзники тут — продакт менеджер команды, проджекты, дизайнер и лиды разработки.
Почти всё общение сводится к продакту. Он генерит идеи, ставит таски и рассказывает о грядущих планах. С ним ты обсуждаешь свои идеи и планируешь всю работу. Хороший продакт всегда будет за тебя топить, ты его прикрытие для защиты задницы перед оунерами. Обсуждение идей продакта, подкрепленных твоими цифрами редко вызывает долгие дискуссии.
Дизайнер и лиды разработки для тебя больше консультанты. В любом исследовании тебе сначала нужно собрать как можно больше контекста задачи, а у этих ребят он самый полный.
А ещё хорошие отношения с разработкой гарантируют тебе приоритеты в задачах на разметку, а как мы раньше обсуждали, это никому, кроме тебя, не нужно.
Итак, мы потихоньку строим портрет продуктового аналитика.
Мы уже понимаем что он умеет и какие задачи выполняет. Давай поговорим про его интеграцию в команду.
Есть две популярные структуры внутри IT-компаний:
1️⃣ Горизонтальная — когда у вас есть обособленный отдел аналитики, который обслуживает интересы остальных команд. Плюсы такой структуры в том, что каждый аналитик может взять разные задачи и быть в контексте всей работы всех департаментов. Минусы — экспертиза не глубокая.
2️⃣ Вертикальная — более популярная, и как по мне, более оптимальная — когда у вас есть отдел аналитики, но он номинальный, в основном юниты раскиданы по своим командам. Т.е. продуктовый аналитик состоит в команде разработки продукта, маркетинговый в маркетинге и т.д. Из плюсов — глубокая экспертиза, из минусов — такой чел становится единственным источником знаний своего куска продукта (документация ахахаха, не слышал).
В вертикальной структуре аналитик полностью сосредоточен на своей части продукта, исследует её, улучшает и тестирует. Его главные союзники тут — продакт менеджер команды, проджекты, дизайнер и лиды разработки.
Почти всё общение сводится к продакту. Он генерит идеи, ставит таски и рассказывает о грядущих планах. С ним ты обсуждаешь свои идеи и планируешь всю работу. Хороший продакт всегда будет за тебя топить, ты его прикрытие для защиты задницы перед оунерами. Обсуждение идей продакта, подкрепленных твоими цифрами редко вызывает долгие дискуссии.
Дизайнер и лиды разработки для тебя больше консультанты. В любом исследовании тебе сначала нужно собрать как можно больше контекста задачи, а у этих ребят он самый полный.
А ещё хорошие отношения с разработкой гарантируют тебе приоритеты в задачах на разметку, а как мы раньше обсуждали, это никому, кроме тебя, не нужно.
👍10❤1
This media is not supported in your browser
VIEW IN TELEGRAM
В который раз натыкаюсь, но всегда смешно)
😁12😢3😐1
Предлагаю на следующей неделе плотно пройтись по типам задач продуктового аналитика. Что было бы интереснее разобрать в первую очередь? (можно несколько выбрать)
Final Results
49%
Продуктовые рисерчи
36%
Разметка
54%
АБ-тесты
26%
Юнит-экономика
28%
BI, графики, дашборды
3%
Меня вообще другое интересует, ща напишу!
📌 Корреляция и причинно-следственная связь
Перед тем, как мы нырнём в долгий разговор про АБ, закину небольшую мысль, которую всегда нужно помнить.
В исследованиях, датамайнинге и анализе тестов часто применяется метод поиска корреляций (это взаимоотношение переменных, когда изменение одной ведёт к изменению другой).
Продакты и не очень опытные аналитики любят интерпретировать корреляцию как причинно-следственную связь. Иногда это, скорее всего, так и есть — мы увеличили цену товара и его стали реже покупать. Звучит логично.
Но так бывает не всегда. Чаще как раз причинно-следственные связи не очевидны. Статистика и аналитика в целом не так уверенно справляется с поиском причинности, как бы это сделал, например, твой астролог.
Если твой банк никогда не грабили, вряд ли хорошей идеей будет уволить охранников ради экономии бюджета 🧐.
В контексте АБ это стоит помнить при выборе метрик оценки (про дизайн теста и выбор метрик мы отдельно поговорим дальше) — нельзя просто взять точку на корреляционной кривой и менять одну её составляющую, в надежде поменять вторую. А вот сформировать гипотезу на её основе можно, и даже рекомендуется.
В аналитике “официально” эта идея закреплена в законе Гудхарта:
И замечании Лукаса:
Да, существуют специальные методы, направленные на решение этой задачи, например, мой любимый вектор Шепли, но когда твой продакт пытается вынести причинность из корреляции, всегда добавляй “но это не точно”.
И сам так никогда не делай, а то можно очень далеко уйти по ложному следу.
Перед тем, как мы нырнём в долгий разговор про АБ, закину небольшую мысль, которую всегда нужно помнить.
В исследованиях, датамайнинге и анализе тестов часто применяется метод поиска корреляций (это взаимоотношение переменных, когда изменение одной ведёт к изменению другой).
Продакты и не очень опытные аналитики любят интерпретировать корреляцию как причинно-следственную связь. Иногда это, скорее всего, так и есть — мы увеличили цену товара и его стали реже покупать. Звучит логично.
Но так бывает не всегда. Чаще как раз причинно-следственные связи не очевидны. Статистика и аналитика в целом не так уверенно справляется с поиском причинности, как бы это сделал, например, твой астролог.
Если твой банк никогда не грабили, вряд ли хорошей идеей будет уволить охранников ради экономии бюджета 🧐.
В контексте АБ это стоит помнить при выборе метрик оценки (про дизайн теста и выбор метрик мы отдельно поговорим дальше) — нельзя просто взять точку на корреляционной кривой и менять одну её составляющую, в надежде поменять вторую. А вот сформировать гипотезу на её основе можно, и даже рекомендуется.
В аналитике “официально” эта идея закреплена в законе Гудхарта:
Когда мера становится целью, она перестаёт быть хорошей мерой.
И замечании Лукаса:
Взаимосвязи, наблюдаемые в исторических данных, не могут считаться структурными или причинными.
Да, существуют специальные методы, направленные на решение этой задачи, например, мой любимый вектор Шепли, но когда твой продакт пытается вынести причинность из корреляции, всегда добавляй “но это не точно”.
И сам так никогда не делай, а то можно очень далеко уйти по ложному следу.
👍9🤯2🔥1
Фан-факт:
Это тебе мотивашка на будущее, когда ты будешь проводить тесты и переживать что они какие-то не правильные. Это нормально, у всех так, с тобой тоже всё ок.
И помни: не найти полезной информации в данных — это найти полезную информацию о её отсутствии.
#funfact
8 из 10 АБ-тестов не показывают статистической значимости.
Это тебе мотивашка на будущее, когда ты будешь проводить тесты и переживать что они какие-то не правильные. Это нормально, у всех так, с тобой тоже всё ок.
И помни: не найти полезной информации в данных — это найти полезную информацию о её отсутствии.
#funfact
❤8👍5
📌 1. Интро
По результатам опроса, в ближайшие 2 недели мы поговорим про АБ-тесты:
- обсудим как к ним готовиться,
- откуда брать идеи,
- как документировать дизайн эксперимента,
- затронем основные статистические понятия по теме,
- рассмотрим реализации самых популярных тестов,
- и в теории пробежимся по менее используемым, про которые тоже хорошо бы знать.
⚡️ В конце, при желании, порешаем реальный тест.
И в качестве введения в тему, немного теории — что это вообще такое и зачем оно надо⬇️
Смысл АБ довольно прост: мы делим юзеров на несколько групп (этот процесс называется сплитование), в одной ничего не трогаем — это наш контроль, в других что-то меняем. Сравниваем, и принимаем решение как лучше.
АБ-тесты пока являются лучшим и самым популярным решением для проверки гипотез. Каждая, уважающая себя, продуктовая команда использует тесты.
Доставай тетрадочку, на курсах тебе такого не расскажут 🙂
#ABtest
По результатам опроса, в ближайшие 2 недели мы поговорим про АБ-тесты:
- обсудим как к ним готовиться,
- откуда брать идеи,
- как документировать дизайн эксперимента,
- затронем основные статистические понятия по теме,
- рассмотрим реализации самых популярных тестов,
- и в теории пробежимся по менее используемым, про которые тоже хорошо бы знать.
И в качестве введения в тему, немного теории — что это вообще такое и зачем оно надо
Смысл АБ довольно прост: мы делим юзеров на несколько групп (этот процесс называется сплитование), в одной ничего не трогаем — это наш контроль, в других что-то меняем. Сравниваем, и принимаем решение как лучше.
АБ-тесты пока являются лучшим и самым популярным решением для проверки гипотез. Каждая, уважающая себя, продуктовая команда использует тесты.
В этой серии постов мы опустим нюансы разработки платформы для тестирований, т.к. обычно этим занимаются дата-инженеры или команда разработки продукта. Обсудим только нашу часть.
Доставай тетрадочку, на курсах тебе такого не расскажут 🙂
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉9👍7🔥3
📌 2. Дизайн теста, ч.1
Тест, по определению, проверяет какую-то идею. По умному эта идея называется гипотезой.
📎 Гипотезы могут появляться просто как идеи или их может приносить команда (продакты, проджекты или дизайнеры), но чаще гипотезы вытекают из твоих рисёрчей. Когда ты исследуешь какую-то проблему или анализируешь фичу, хорошим тоном считается в выводах описать идеи по решению проблемы или улучшению фичи. Вот эти идеи — уже гипотезы.
Когда гипотеза ясна, первым шагом в подготовке теста является документирование. В аналитическом сообществе мы называем этот артефакт дизайном теста (ДТ).
ДТ должен включать в себя несколько важных пунктов. Обычно, в новой компании я приучаю заказчиков заполнять свою часть ДТ, если гипотеза от них.
Эту часть заполняет заказчик гипотезы⬇️
1️⃣ Гипотеза.
Тут мы описываем суть идеи, что хотим поменять и зачем.
2️⃣ Описание вариантов.
Что меняем в тестовом варианте. Иногда, в зависимости от твоей системы, нужно проставить id вариантов перед стартом, это ты уже потом в доку добавишь.
3️⃣ Чего ожидаем от теста.
Ожидаем больше заказов или хотим увеличить возвращаемость, повысить средний чек и т.д. Эта инфа тебе понадобится чуть дальше, при выборе метрик.
4️⃣ Ограничения.
Если есть, тут стоит указать. Проводим только на определённом гео или платформе и т.д.
#ABtest
Тест, по определению, проверяет какую-то идею. По умному эта идея называется гипотезой.
Кстати, генерирование гипотез по итогам рисёрча отличает хорошего аналитика от не. Новички, как правило, вообще не заморачиваются с выводами. Итак таблицы есть — заказчик разберётся (спойлер — не разберётся).
Когда гипотеза ясна, первым шагом в подготовке теста является документирование. В аналитическом сообществе мы называем этот артефакт дизайном теста (ДТ).
ДТ должен включать в себя несколько важных пунктов. Обычно, в новой компании я приучаю заказчиков заполнять свою часть ДТ, если гипотеза от них.
ДТ все заполняют по разному, кто как. Структура, которую я покажу здесь, моя авторская, я начинал её делать года 4 назад, она постепенно эволюционировала, и вот финальная версия на сегодня. Моим командам нравится, пользуйтесь и в своих 🙂
Эту часть заполняет заказчик гипотезы
Тут мы описываем суть идеи, что хотим поменять и зачем.
Что меняем в тестовом варианте. Иногда, в зависимости от твоей системы, нужно проставить id вариантов перед стартом, это ты уже потом в доку добавишь.
Ожидаем больше заказов или хотим увеличить возвращаемость, повысить средний чек и т.д. Эта инфа тебе понадобится чуть дальше, при выборе метрик.
Если есть, тут стоит указать. Проводим только на определённом гео или платформе и т.д.
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
📌 2. Дизайн теста, ч.2
Дальше ты берёшь наработки заказчика и напильник, и начинаешь детализировать:
5️⃣ Ключевая метрика / ОЕС.
По началу будет достаточно просто выбрать метрику, на которую тест должен повлиять сильнее всего. Конверсия в регу, в покупку, средний чек, общий доход и т.д. Выбирай вдумчиво, это важный шаг. Со временем, вместо одной ключевой метрики ты придёшь к ОЕС (overall evaluation criterion), это такая штука, которая получается при взвешивании переменных. Об этом потом поговорим, тема немного сложнее чем кажется.
6️⃣ Дополнительные метрики.
Укажи пару-тройку дополнительных метрик, которые тоже нужно мониторить, но они чуть менее важны чем ключевая. Не перебарщивай с набором метрик, бери только важное, иначе утонешь в интерпретации ☝️
7️⃣ Базовое значение ключевой метрики и её вариативность.
Как базу обычно берут среднее, а вариативность это стандартное отклонение. Не бери большой период, 2-4 недели истории будет достаточно. Нужно чтобы значения были свежими.
8️⃣ MDE (minimum detectable effect).
Наши ожидаемые изменения ключевой метрики по итогам теста. Это никак не вычисляется, обычно на опыте просто 🙂
Например, мы хотим провести тест на конверсию, мы верим в гипотезу, она разрывная. Наша конверсия обычно 5%, мы хотим поднять её тестом до 7%. Вот эта разница и есть MDE. Указывать можно как в % так и в п.п. (проц. пунктах). Чем ниже MDE, тем дольше проводить тест, но тем выше вероятность получить стат. значимый результат. Если мы слишком завысим MDE, то тест будет быстрым, но скорее всего, не значимым.
9️⃣ Валидация MDE.
Так как понять какой MDE брать? Обычно эффект никто не валидирует (потому что далеко не во всех компаниях развита культура тестов), но я поклонник метода через сигмы — MDE не должен быть выше 2-3 стандартных отклонений, это снижает реалистичность, MDE ниже одного отклонения, возможно, слишком мал и тест может затянуться. Тут надо балансировать. Вернемся к этому в п.11
1️⃣ 0️⃣ Рассчитываем выборку.
У нас есть всё что нужно для расчёта размеров теста: базовая метрика и MDE. Ещё в настройках указывают доверительный уровень (0.05), мощность (0.8) и направление (”two.sided”). Обычно их редко меняют без серьезных оснований, чаще ставят дефолтные. В R выборка считается функцией
1️⃣ 1️⃣ Расчёт сроков теста.
На основании рассчитанных объёмов выборки и средних показателей трафика можно прикинуть сроки проведения теста. Есть нюансы — тест не должен быть короче 1 полной недели, чтобы включить выходные. Если тест слишком долгий, попробуй увеличить MDE.
1️⃣ 2️⃣ Добавление в трекинг.
Если нужно, можно добавить новые ивенты в разметку, особенно когда тестируем новую фичу. Как минимум нужна индикация, что юзер увидел фичу. Ивенты на новой фиче ещё могут помочь понять воронку и прибавить ещё гипотез, даже если тест не даст положительных результатов. Например, можно будет понять ошибки в дизайне фичи, и перезапустить тест после их исправления.
Вот здесь можно посмотреть пример заполненного дизайна: ПРИМЕР ДИЗАЙНА ТЕСТА
#ABtest
Дальше ты берёшь наработки заказчика и напильник, и начинаешь детализировать:
По началу будет достаточно просто выбрать метрику, на которую тест должен повлиять сильнее всего. Конверсия в регу, в покупку, средний чек, общий доход и т.д. Выбирай вдумчиво, это важный шаг. Со временем, вместо одной ключевой метрики ты придёшь к ОЕС (overall evaluation criterion), это такая штука, которая получается при взвешивании переменных. Об этом потом поговорим, тема немного сложнее чем кажется.
Укажи пару-тройку дополнительных метрик, которые тоже нужно мониторить, но они чуть менее важны чем ключевая. Не перебарщивай с набором метрик, бери только важное, иначе утонешь в интерпретации ☝️
Как базу обычно берут среднее, а вариативность это стандартное отклонение. Не бери большой период, 2-4 недели истории будет достаточно. Нужно чтобы значения были свежими.
Наши ожидаемые изменения ключевой метрики по итогам теста. Это никак не вычисляется, обычно на опыте просто 🙂
Например, мы хотим провести тест на конверсию, мы верим в гипотезу, она разрывная. Наша конверсия обычно 5%, мы хотим поднять её тестом до 7%. Вот эта разница и есть MDE. Указывать можно как в % так и в п.п. (проц. пунктах). Чем ниже MDE, тем дольше проводить тест, но тем выше вероятность получить стат. значимый результат. Если мы слишком завысим MDE, то тест будет быстрым, но скорее всего, не значимым.
Так как понять какой MDE брать? Обычно эффект никто не валидирует (потому что далеко не во всех компаниях развита культура тестов), но я поклонник метода через сигмы — MDE не должен быть выше 2-3 стандартных отклонений, это снижает реалистичность, MDE ниже одного отклонения, возможно, слишком мал и тест может затянуться. Тут надо балансировать. Вернемся к этому в п.11
У нас есть всё что нужно для расчёта размеров теста: базовая метрика и MDE. Ещё в настройках указывают доверительный уровень (0.05), мощность (0.8) и направление (”two.sided”). Обычно их редко меняют без серьезных оснований, чаще ставят дефолтные. В R выборка считается функцией
power.prop.test(), в Python statsmodels.NormalIndPower(). В конце поста ссылка на пример.На основании рассчитанных объёмов выборки и средних показателей трафика можно прикинуть сроки проведения теста. Есть нюансы — тест не должен быть короче 1 полной недели, чтобы включить выходные. Если тест слишком долгий, попробуй увеличить MDE.
Если нужно, можно добавить новые ивенты в разметку, особенно когда тестируем новую фичу. Как минимум нужна индикация, что юзер увидел фичу. Ивенты на новой фиче ещё могут помочь понять воронку и прибавить ещё гипотез, даже если тест не даст положительных результатов. Например, можно будет понять ошибки в дизайне фичи, и перезапустить тест после их исправления.
Вот здесь можно посмотреть пример заполненного дизайна: ПРИМЕР ДИЗАЙНА ТЕСТА
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍7
📌 3. Экспресс-курс статистики для АБ
Классическая механика расчёта АБ-тестов основывается на стат. критериях.
Я почти уверен, что ты в курсе базовых понятий, но давай освежим некоторые вещи, чтобы лучше понимать что мы будем делать в расчётах.
✅ Распределение — способ описания того, как разбросаны значения в наборе данных. Распределение бывает разных видов, но нас пока интересует только нормальное.
✅ Дисперсия — мера разброса значений вокруг среднего значения в данных. Она показывает, насколько данные отличаются друг от друга. Например дисперсия в измерении размеров мышей не высокая, а в наборе из мышей и слонов очень даже.
✅ Выбросы — это экстремально большие или маленькие значения в наборе данных, которые могут искажать общие результаты. В АБ с выбросами осторожно.
✅ Статистические тесты — не путать с АБ-тестами. Стат. тесты это инструменты, с помощью которых мы проверяем заранее заданные статистические гипотезы. Их много разных. У каждого стат. теста есть нулевая гипотеза, и задача теста её отклонить или не. Т.е. по простому, стат. тесты позволяют нам делать различные проверки наших данных, например, проверку на нормальность распределения, или гомогенность дисперсий.
✅ ЦПТ (Центральная предельная теорема) — фундамент статистики: “при достаточно большом размере выборки, распределение средних значений выборочных данных будет приближаться к нормальному распределению, независимо от формы распределения исходной популяции.”
✅ P-value — главный термин в контексте АБ, это вероятность получить такие же, или ещё более выраженные отличия, при условии, что верна нулевая гипотеза.
✅ Ошибка первого рода — ситуация, когда мы отклоняем нулевую гипотезу, хотя на самом деле она верна. В АБ это значит что мы радуемся победе тестового варианта, но на самом деле он не выиграл.
✅ Ошибка второго рода — противоположность ошибке первого рода. Мы не отклоняем нулевую гипотезу, хотя на самом деле должны.
P.S. эту базу, кстати, часто спрашивают на собесах, сохрани и не теряй 🙂
#ABtest #собесы
Классическая механика расчёта АБ-тестов основывается на стат. критериях.
Я почти уверен, что ты в курсе базовых понятий, но давай освежим некоторые вещи, чтобы лучше понимать что мы будем делать в расчётах.
P.S. эту базу, кстати, часто спрашивают на собесах, сохрани и не теряй 🙂
#ABtest #собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
📌 Созвоны
Пока ты перевариваешь базовую теорию АБ, давай немного отдохнём и обсудим действительно важные вещи 🙂
Вот ты прошёл свои первые собесы, получил оффер и вышел на работу. Сидишь такой с утра, пьёшь кофе и заглядываешь в рабочий календарь…
Созвоны — любимая часть работы 😅.
Их плотность может варьироваться от ежедневных до раза в неделю.
✅ Самый популярный у аналитиков это планинг. Его ставят раз в неделю, в понедельник-вторник, чтобы раскидать задачки на спринт (интервал в 1-2 недели, в который ты планируешь свою работу).
Чаще ты просто рассказываешь чем планируешь заниматься. Иногда более официально, с оценками или стори-поинтами (есть в IT такое развлечение — пленнинг покер — когда ты рассказываешь суть задачи, а остальные участники в закрытую оценивают её сложность).
В зависимости от структуры, ты планируешься с продактом или в команде аналитики.
✅ Не самый частый у аналитиков — дейли. Короткий созвон, на 15-30 минут, обычно каждый день утром. Задача — свериться с планами и сообщить о каких-то, блокирующих задачу, факторах.
✅ Синхро — не самый популярный созвон, по сути похож на дейли, только подольше и раз в неделю. Они взаимозаменяемые.
✅ Груминг — чистка бэклога (общего списка задач), груминг тоже довольно редкий созвон у аналитиков, но как по мне зря. Иногда очень полезен, т.к. часто бывает что задачи просто зависают — они уже не так нужны как казалось, но смотрят на тебя и бесят.
✅ И мой фаворит — ретро. Это созвон по итогам пары спринтов. Психо-разгрузочный, где команда обсуждает что им понравилось, а что нет. Тут ты можешь ныть сколько угодно, бомбить что бесит отсутствие документации, или что ты ничего не сделал за спринт потому что было лень. Или наоборот порадоваться своей продуктивности или похвастаться новым девайсом. Или успехами в Доте. Или просто постить фотки своего кота.
Ретро это сейв-спейс, где никто никого не осуждает, а команда вместе думает как делать так, чтобы от работы больше кайфовали и она была лучше.
Пока ты перевариваешь базовую теорию АБ, давай немного отдохнём и обсудим действительно важные вещи 🙂
Вот ты прошёл свои первые собесы, получил оффер и вышел на работу. Сидишь такой с утра, пьёшь кофе и заглядываешь в рабочий календарь…
Созвоны — любимая часть работы 😅.
Их плотность может варьироваться от ежедневных до раза в неделю.
Чаще ты просто рассказываешь чем планируешь заниматься. Иногда более официально, с оценками или стори-поинтами (есть в IT такое развлечение — пленнинг покер — когда ты рассказываешь суть задачи, а остальные участники в закрытую оценивают её сложность).
В зависимости от структуры, ты планируешься с продактом или в команде аналитики.
Ретро это сейв-спейс, где никто никого не осуждает, а команда вместе думает как делать так, чтобы от работы больше кайфовали и она была лучше.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3
📌 4. T-тест. Проверка дисперсий
С теорией разобрались, едем дальше.
Для расчёта АБ существует много методов. Мы рассмотрим самые популярные, которые чаще других применяются на практике. И начнём, конечно, с T-теста Стьюдента / Уэлча.
‼️ Кстати, тоже частая тема на собесах.
Я часто подхожу к расчётам через T-тест. Он простой и довольно точный. Из минусов — имеет пару ограничений (но и инструменты для их обхода).
Первое ограничение подразумевает, что дисперсии в выборках должны быть гомогенны, т.е. равны.
Для проверки дисперсий обычно используют какой-то из критериев:
✅ Бартлетта. Он чувствителен к нормальности распределения;
✅ Левена. Менее чувствителен к нормальности, самый популярный тест;
✅ Флигнера-Килина. Не чувствителен к отклонениям от нормальности и выбросам, подходит для ненормального распределения;
Но вне зависимости от результатов, мы можем обойти это ограничение. Оно присутствует у Стьюдента, но его нет у Уэлча. Т.е. технически, нам всё равно какая там дисперсия получится 🙂
В коде далее df — датасет, metric — метрика, столбец который проверяем, var — категория варианта.
Проверка дисперсий в R и Python:
#ABtest
С теорией разобрались, едем дальше.
Для расчёта АБ существует много методов. Мы рассмотрим самые популярные, которые чаще других применяются на практике. И начнём, конечно, с T-теста Стьюдента / Уэлча.
Нулевая гипотеза Т-теста предполагает, что средние значения переменной в выборках равны. Отклонение гипотезы (p-value < 0.05) это наша желаемая цель.
Я часто подхожу к расчётам через T-тест. Он простой и довольно точный. Из минусов — имеет пару ограничений (но и инструменты для их обхода).
Первое ограничение подразумевает, что дисперсии в выборках должны быть гомогенны, т.е. равны.
Для проверки дисперсий обычно используют какой-то из критериев:
Нулевые гипотезы всех критериев похожи, они предполагают, что дисперсии в выборках равны. Т.е. нам эту гипотезу отклонять не хочется (цель p-value > 0.05).
Но вне зависимости от результатов, мы можем обойти это ограничение. Оно присутствует у Стьюдента, но его нет у Уэлча. Т.е. технически, нам всё равно какая там дисперсия получится 🙂
В коде далее df — датасет, metric — метрика, столбец который проверяем, var — категория варианта.
Проверка дисперсий в R и Python:
library(car) # библиотека с тестом Левена
bartlett.test(metric ~ var, df) # тест Бартлетта
leveneTest(metric ~ var, df) # тест Левена
fligner.test(metric ~ var, df) # тест Флигнера-Килина
from scipy.stats import bartlett, fligner, levene
# тест Бартлетта
bartlett_result = bartlett(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
# тест Левена
levene_result = levene(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
# тест Флигнера-Килина
fligner_result = fligner(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤4
Гайз, возник вопрос. Вы тут все наверное разного уровня, мне бы как-то регулировать сложность постов и тем. Давайте ткнём в вариант, который вам ближе :)
Anonymous Poll
48%
Я только учусь, жду первую работу
26%
Я уже работаю, но пока в начале пути
14%
Я крепкий миддл)
3%
Я сеньор, сервеза, пор фавор!
8%
Я вообще не аналитик, посмотрю ответы
📌 Подготовка данных к анализу
Этот пост логично бы смотрелся в цикле про АБ перед проверками, но я чёт упустил 🙂 поэтому пусть будет не номерной, а просто как памятка.
Этот процесс включает в себя несколько шагов:
1️⃣ Трансформируй типы данных. В первую очередь проверь все ли данные соответствуют своим типам: целочисленные — интеджерам, с плавающей точкой — флоатам, категориальные — факторам, даты — датам.
2️⃣ Преобразуй потери и пропуски. Все NA’s стоит обработать. Тут есть несколько подходов. Если в масштабах датасета их не много, возможно проще их будет удалить. Если удалять не хочется, замени NA’s средними или медианными значениями столбца (этот процесс называется импутацией). С NULL'ами по ситуации, иногда их не надо трогать, иногда можно импутировать.
3️⃣ Почисти выбросы. Чистить выбросы или нет — зависит от данных. Чаще всего чистить придётся, но ориентируйся на цели анализа. Если ты анализируешь деньги, то дважды подумай можешь ли выкидывать экстремально высокие чеки, или это сломает тебе картину. Возможно, лучше будет их импутировать.
Если решишь срезать, то тут есть несколько популярных методов. Я чаще всего срезаю выбросы по порогу 1.5*IQR, но можно использовать и ±2 или ±3 SD, а R вообще умеет идентифицировать выбросы напрямую из боксплота
Для подготовки данных к ML список действий намного шире, но для базового анализа хватает и этих шагов.
Этот пост логично бы смотрелся в цикле про АБ перед проверками, но я чёт упустил 🙂 поэтому пусть будет не номерной, а просто как памятка.
Для любого анализа, включая анализ экспериментов, данные нужно сначала почистить и подготовить.
Этот процесс включает в себя несколько шагов:
Если решишь срезать, то тут есть несколько популярных методов. Я чаще всего срезаю выбросы по порогу 1.5*IQR, но можно использовать и ±2 или ±3 SD, а R вообще умеет идентифицировать выбросы напрямую из боксплота
boxplot.stats(df$metric)$out (в Python такого аналога не завезли).Для подготовки данных к ML список действий намного шире, но для базового анализа хватает и этих шагов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4
📌 5. T-тест. Проверка распределения
Второе ограничение T-теста подразумевает, что выборочные средние должны быть нормально распределены.
Для того, чтобы проверить ограничение по распределению, нам сначала нужно это распределение создать. Для этого мы достанем с возвращением из нашей метрики X выборок по Y наблюдений, рассчитаем среднее для каждой выборки, а потом проверим как распределились эти X средних.
Функция для генерации средних:
Теперь это распределение можно тестировать. Для этой цели используют два популярных критерия:
✅ Шапиро-Уилка. Проверяет соответствие выборки нормальному распределению.
✅ Колмогорова-Смирнова. Проверяет соответствие выборки заданному распределению, в том числе нормальному.
Тесты:
Но даже если выборочные средние не распределены нормально, мы можем попробовать обойти это ограничение методами выравнивания. Об этом поговорим дальше.
Хотя, если только между нами, на больших данных это ограничение можно и проигнорировать 🙂
#ABtest
Второе ограничение T-теста подразумевает, что выборочные средние должны быть нормально распределены.
Долгое время (да и сейчас не редкость) в интернетах активно форсилась позиция, что T-тест ограничивается нормальным распределением выборки. Это не так. В основе этого ограничения лежит та самая ЦПТ.
Для того, чтобы проверить ограничение по распределению, нам сначала нужно это распределение создать. Для этого мы достанем с возвращением из нашей метрики X выборок по Y наблюдений, рассчитаем среднее для каждой выборки, а потом проверим как распределились эти X средних.
Функция для генерации средних:
generate_sample_means <- function(data, sample_size, n_samples) {
sample_means <- numeric(n_samples)
for (i in 1:n_samples) {
sample <- sample(data, size = sample_size, replace = TRUE)
sample_means[i] <- mean(sample)
}
return(sample_means)
}def generate_sample_means(data, sample_size, n_samples):
sample_means = []
for _ in range(n_samples):
sample = np.random.choice(data, size = sample_size, replace = True)
sample_means.append(np.mean(sample))
return sample_means
Теперь это распределение можно тестировать. Для этой цели используют два популярных критерия:
Тесты:
# тест Шапиро-Уилка
shapiro.test(df)
# тест Колмогорова-Смирнова на нормальность
ks.test(df, "pnorm", mean = mean(df), sd = sd(df))
import numpy as np
from scipy import stats
# тест Шапиро-Уилка
shapiro_test = stats.shapiro(df)
# тест Колмогорова-Смирнова на нормальность
ks_test = stats.kstest(df, 'norm', args=(np.mean(df), np.std(df)))
Но даже если выборочные средние не распределены нормально, мы можем попробовать обойти это ограничение методами выравнивания. Об этом поговорим дальше.
Хотя, если только между нами, на больших данных это ограничение можно и проигнорировать 🙂
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
📌 6. T-тест. Выравниваем распределение
Иногда выборочные средние могут распределиться не нормально, а нам прям очень надо. Эту проблему можно пофиксить
Сразу оговорюсь, что на практике в АБ с выравниванием заморачиваются не часто (можешь щегольнуть скиллом на работе), поэтому я не буду слишком углубляться в описание всех методов, а разберу мой любимый — степенную трансформацию Бокса-Кокса.
☝️ Главный нюанс, который стоит знать про BCT (Box-Cox transformation) — он не работает с отрицательными значениями. В коде последней строкой фикс для таких случаев.
🧐 Суть метода, под капотом, заключается в поиске идеального значения суперпараметра лямбда, который определяет как именно трансформировать данные. Лямбда подставляется в формулу к каждому значению в данных. Если лямбда нулевая, то формула логарифмирует значения, если не нулевая — возводит данные в степень лямбды.
Если по простому, то мы видоизменяем значения таким образом, чтобы они были больше похоже друг на друга и с ними было удобнее работать, но при этом не терялся их смысл.
Вот так это выглядит в R (версия для Python в комменте):
📎 У меня на гитхабе есть демка такого преобразования (R).
#ABtest
Иногда выборочные средние могут распределиться не нормально, а нам прям очень надо. Эту проблему можно пофиксить
Чтобы попытаться выровнять распределение, мы можем использовать много методов — от простого логарифмирования и стандартизации, до рангового преобразования и трансформации Йео-Джонсона.
Сразу оговорюсь, что на практике в АБ с выравниванием заморачиваются не часто (можешь щегольнуть скиллом на работе), поэтому я не буду слишком углубляться в описание всех методов, а разберу мой любимый — степенную трансформацию Бокса-Кокса.
☝️ Главный нюанс, который стоит знать про BCT (Box-Cox transformation) — он не работает с отрицательными значениями. В коде последней строкой фикс для таких случаев.
🧐 Суть метода, под капотом, заключается в поиске идеального значения суперпараметра лямбда, который определяет как именно трансформировать данные. Лямбда подставляется в формулу к каждому значению в данных. Если лямбда нулевая, то формула логарифмирует значения, если не нулевая — возводит данные в степень лямбды.
Если по простому, то мы видоизменяем значения таким образом, чтобы они были больше похоже друг на друга и с ними было удобнее работать, но при этом не терялся их смысл.
Вот так это выглядит в R (версия для Python в комменте):
library(MASS)
library(car)
# Вычисляем лучшее значение лямбды
par(mfrow = c(1, 1))
boxcox_result <- boxcox(df$metric ~ 1, lambda = seq(-3,3,0.1))
# Сохраняем его
best_lambda <- boxcox_result$x[which.max(boxcox_result$y)]
# Применяем преобразование
df$metric_transformed <- car::bcPower(df$metric, best_lambda)
# При наличии отрицательных значений, смещаем нашу метрику на минимальную величину +1
df$metric <- df$metric+ abs(min(df$metric)) + 1
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Знакомтесь, это Остин и Тимон - мои помощники)
Пятница всё-таки, давайте разбавим ленту своими бандитами⬇️ 🙂
Пятница всё-таки, давайте разбавим ленту своими бандитами
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍5
📌 7. T-тест
Вот мы и добрались до самого теста✨
Он довольно простой. Нулевая гипотеза в обоих вариантах одинаковая: средние значения в двух группах равны. Т.е. нам бы хотелось эту гипотезу отклонить (p-value < 0.05) и показать всем что наш тестовый вариант статистически значимо отличается от контрольного.
Чтобы сделать твой отчёт более важным и профессиональным, можно добавить визуализации и дельты.
Дельты это разницы метрик по итогам теста. Например ты тестировал вырос ли средний чек. Посчитай его на варианте A и на B, разница тут и будет дельтой. А лучше в проценты переведи, продактам такое нравится 🙂
А то потом придёт продакт через месяц и будет спрашивать, как так, 30% же было, где они?
Для визуализаций вариантов подходят чарты, которые хорошо показывают разбросы данных, например:
✅ Боксплоты
✅ Диаграмма плотностей
✅ Наложенная гистограмма
✅ График доверительных интервалов
Что они из себя представляют можно посмотреть в картинках к посту.
#ABtest
Вот мы и добрались до самого теста
Он довольно простой. Нулевая гипотеза в обоих вариантах одинаковая: средние значения в двух группах равны. Т.е. нам бы хотелось эту гипотезу отклонить (p-value < 0.05) и показать всем что наш тестовый вариант статистически значимо отличается от контрольного.
# Расчет t-теста Стьюдента
t.test(metric ~ var, data = df, var.equal = T)
# чтобы переключиться на Уэлча, замени в var.equal T на F
from scipy.stats import ttest_ind
# Расчет t-теста Стьюдента
group1 = df[df['var'] == 'A']['metric']
group2 = df[df['var'] == 'B']['metric']
t_stat, p_value = ttest_ind(group1, group2, equal_var = True)
# чтобы переключиться на Уэлча, замени в equal_var True на False
Чтобы сделать твой отчёт более важным и профессиональным, можно добавить визуализации и дельты.
Дельты это разницы метрик по итогам теста. Например ты тестировал вырос ли средний чек. Посчитай его на варианте A и на B, разница тут и будет дельтой. А лучше в проценты переведи, продактам такое нравится 🙂
Главное самому не обмануться — дельты, полученные по итогам теста вообще ничего не прогнозируют. Если ты получаешь стат. значимый рост метрики в +30%, это не значит что раскатив вариант, у вас бизнес вырастет на 30%. Это просто саммари по итогам конкретного теста, в конкретный период, на конкретных юзерах.
А то потом придёт продакт через месяц и будет спрашивать, как так, 30% же было, где они?
Для визуализаций вариантов подходят чарты, которые хорошо показывают разбросы данных, например:
Что они из себя представляют можно посмотреть в картинках к посту.
#ABtest
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1