MiddlePerformance Marketer > Google Ads > Сквозная аналитика и отчётность
Короткий ответ Нужна таблица на уровне отдельного пользователя или заказа с датой первого события (когорта) и датами последующих событий, чтобы сгруппировать пользователей по когорте и посчитать метрику по «возрасту» после входа. Как это работает подробнее Базовая структура — таблица user_id, cohort_date (дата первого визита или покупки), event_date, event_type, value; далее для каждого пользователя считается «неделя/месяц от входа» (event_date минус cohort_date), и метрика агрегируется по когорте и этому возрасту. Для продуктов с длинным циклом покупки горизонт когортного анализа стоит продлевать до нескольких месяцев, иначе ранние выводы о retention могут быть преждевременными и неточными. Пример кода Что использовать на практике Практика. На практике важно решить, что считать «входом в когорту» (первый визит, первая покупка, регистрация) — выбор влияет на интерпретацию и должен быть явно задокументирован в отчёте. Полезно визуализировать когортную таблицу как тепловую карту и дополнительно считать средний
bicohort-analysis
MiddlePython Developer > Основы Python > Миграции базы данных
Короткий ответ Нужно заранее спроектировать миграцию так, чтобы она была обратно совместима со старой версией кода хотя бы некоторое время, и подготовить проверенный план отката кода отдельно от отката данных, поскольку откатить миграцию БД обычно сложнее, чем откатить деплой кода. Как это работает подробнее Откат кода (деплой предыдущей версии) обычно быстрый и безопасный сам по себе, но если новая версия уже выполнила несовместимую миграцию (например, удалила колонку), старая версия кода может перестать работать после отката. Поэтому миграции проектируют так, чтобы можно было откатить код, оставив схему БД в состоянии, совместимом со старой версией (подход expand/contract из предыдущих вопросов). Пример кода Что использовать на практике Практика. Перед релизом стоит явно проверить план отката: что произойдёт, если откатить только код (сработает ли он со свежей схемой), и что делать, если проблема обнаружена уже после того, как контрактный шаг миграции (удаление старых полей) выполнен. Для рискованных релизо
databasefeature-flags
MiddleData Analyst > SQL и данные > SQL
Короткий ответ Нужно использовать LAG(revenue, 12) OVER (ORDER BY month) вместо LAG(revenue, 1, ...), чтобы сравнивать каждый месяц не с предыдущим, а с тем же месяцем год назад — это сравнение год-к-году (YoY) корректно учитывает сезонность. Как это работает подробнее параметр n в LAG(column, n) задаёт, на сколько строк назад по заданному порядку смотреть; если ряд строго помесячный без пропусков, n = 12 сдвигает на 12 месяцев назад, то есть на тот же календарный месяц предыдущего года. Пример кода Что использовать на практике Практика. сравнение месяц-к-месяцу (MoM) часто вводит в заблуждение для сезонных продуктов (например, продажи ёлочных игрушек в январе логично падают относительно декабря — это не признак проблем с продуктом), поэтому для таких бизнесов сравнение YoY даёт более содержательную картину. Важно убедиться, что ряд действительно непрерывен (нет пропущенных месяцев), иначе LAG(..., 12) «сдвинется» не на 12 календарных месяцев, а на 12 существующих строк, что не одно и то же при пропусках. Про
date-trunclag
JuniorData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Day 1 retention — доля пользователей, зарегистрировавшихся в день D, которые совершили целевое действие ровно на следующий календарный день D+1. Как это работает подробнее берём когорту пользователей по дате первой регистрации, затем проверяем, есть ли у каждого из них событие активности с датой ровно D+1, и делим число "вернувшихся" на размер всей когорты D. Пример кода Что использовать на практике Применение. нужно явно выбрать таймзону, в которой считаются календарные дни (пользователя или сервера) — расхождение в несколько часов меняет, в какой день попадёт событие; также важно договориться, что считается "целевым действием". Проверка или пример. Проверка: d1_retention должен быть в [0;1]; sanity check — сравнить cohort_size с числом регистраций за день в отдельном запросе. Подводные камни Частая ошибка. путают "через 24–48 часов от момента регистрации" (скользящее окно) с "календарным днём D+1" — это разные подходы и дают разные числа; не исключают из когорты пользователей, зарегистрирован
cohort-analysisday-1-retention
JuniorData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Простая оценка: LTV ≈ ARPU × средний срок жизни пользователя (lifetime); при постоянном месячном churn средний lifetime можно приближённо оценить как 1 / churn rate. Как это работает подробнее ARPU — средняя выручка на пользователя за период (например, месяц), lifetime — сколько периодов в среднем пользователь остаётся активным; перемножая, получаем ожидаемую суммарную выручку с одного пользователя за весь срок использования. Что использовать на практике Применение. формула 1/churn работает только как грубое приближение при допущении, что churn постоянен во времени (геометрическое распределение) — в реальности churn обычно выше в первые месяцы и снижается для "выживших" пользователей, поэтому такая оценка завышает LTV для новых продуктов. Проверка или пример. Проверка: сравнить эту оценку с фактической суммарной выручкой старых когорт (тех, кто уже прошёл 20+ месяцев) — если реальная выручка сильно ниже, значит допущение о постоянном churn не выполняется. Подводные камни Частая ошибка. использу
arpuchurn
JuniorPython Developer > Основы Python > Типы данных
Короткий ответ Для проверки на None используют is None / is not None, потому что None — синглтон, а не значение, которое сравнивают по равенству; if x: проверяет "истинность" объекта и даст одинаковый результат для None, 0, пустой строки, пустого списка и False, что обычно не то же самое, что отсутствие значения. Как это работает подробнее is None сравнивает идентичность с единственным объектом NoneType в системе, что быстро и однозначно. if x: вызывает bool(x), который для многих объектов определён через __bool__ или __len__ (пустые контейнеры — False), поэтому 0, "", [], {}, False и None все проходят как "ложные" в условии. Пример кода Что использовать на практике Практика. Если функция должна различать "значение не передано" (None) и "передано пустое значение" (например, пустая строка или 0), нужно явно писать if x is None:. Если же любое "пустое" значение должно обрабатываться одинаково, if x: — осознанный и уместный выбор. Подводные камни Риски. Пишут if value: для параметра, который может легитимно быть
data-typesnone
JuniorPerformance Marketer > Google Ads > Рекламные платформы и форматы
Короткий ответ UTM-параметры добавляют к ссылке, чтобы аналитика определяла источник, канал, кампанию и при необходимости креатив или ключевое слово. Единые имена и регистр предотвращают дробление отчётов и помогают сравнивать кампании вне рекламных кабинетов. Как это работает подробнее utm_source указывает площадку, utm_medium — тип канала, utm_campaign — кампанию, а utm_content и utm_term могут различать креативы и поисковые термины. Единая схема нужна для чистых отчётов. Согласованность. Используй единый регистр и словарь значений. Автоматизация. Динамические параметры применяй только после проверки подстановки. Пример кода Что использовать на практике Согласуй справочник значений, размечай ссылки до запуска и проверь тестовый визит в аналитике. Подводные камни Не смешивай fb, Facebook и facebook: система может отобразить их как разные источники.
analyticscampaign-tracking
JuniorSMM Manager > Общее > Репутация и кризис-коммуникации
Короткий ответ Нужно быстро (конкретный SLA задаёт бренд) ответить спокойно, по-человечески, без шаблонных отписок, признать проблему и предложить решение в приватном канале, если нужны детали заказа. Как это работает подробнее первая публичная реакция бренда формирует тон всей последующей дискуссии под постом — она либо снимает напряжение, либо провоцирует эскалацию. Под постом вымышленного бренда «СтудияКофе» пользователь пишет: «Заказал кофемашину, пришла с трещиной на корпусе, жду обмена уже неделю». Нежелательный ответ: «Спасибо за обращение, передали информацию». Рабочий вариант: «Ольга, очень жаль, что так получилось — пришлите, пожалуйста, номер заказа в директ, разберёмся сегодня». Проверка результата: пользователь переходит в директ, публичная ветка не получает новых негативных комментариев в течение суток. Что использовать на практике Практический подход. нужно прочитать комментарий полностью, не отвечать автоматическим шаблоном «Спасибо, передали коллегам», если ситуация конкретная; при необходимо
comment-moderationcommunity-management
MiddleSMM Manager > Общее > Публикация и кампании
Короткий ответ Нужно заранее определить метрику успеха и минимальный размер выборки (количество показов/кликов), менять только один элемент между вариантами, равномерно сплитовать аудиторию и бюджет, и не останавливать тест раньше достижения нужного объёма данных, даже если один вариант выглядит лучше на старте. Как это работает подробнее перед запуском оценивается ожидаемый CTR или конверсия и рассчитывается, сколько показов нужно каждому варианту для статистически значимой разницы (можно использовать калькуляторы A/B-тестов); кампания настраивается так, чтобы варианты показывались сопоставимой аудитории без пересечения (например, через функцию A/B-теста рекламного кабинета, а не вручную разделяя бюджет). Что использовать на практике На практике. ранняя остановка теста по первым часам показа — частая причина ошибочных выводов, так как на старте показы идут небольшой части аудитории и результат нестабилен; также важно учитывать, что алгоритмы некоторых кабинетов сами перераспределяют бюджет в пользу «лидирующ
ab-testingcampaign-management
MiddlePerformance Marketer > Google Ads > Юнит-экономика
Короткий ответ LTV смотрит на весь горизонт клиента, тогда как payback учитывает время возврата денег. Предоплата и помесячная оплата могут дать одинаковый LTV, но разную потребность в оборотном капитале. Как это работает подробнее LTV считается на горизонте всей «жизни» клиента, который может составлять один-три года и больше, а payback period — на горизонте нескольких месяцев после привлечения; при одинаковом LTV:CAC компании с коротким payback, например 2 месяца, и с длинным, например 18 месяцев, имеют совершенно разную потребность в оборотном капитале для масштабирования. Срок окупаемости также существенно зависит от способа оплаты клиента: предоплата за год вперёд и помесячная подписка дают одинаковый LTV, но совершенно разный payback period и разную потребность в оборотном капитале. Пример кода Что использовать на практике Рассчитывайте оба показателя на одинаковой маржинальной основе и по когортам; согласуйте допустимый срок возврата с финансовыми ограничениями бизнеса. Подводные камни Не используйте о
cash-flowcustomer-retention