MiddleData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Скользящее среднее считается оконной функцией AVG() OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW); для первых дней окно неполное, и нужно явно решить — показывать частичное среднее или скрывать точку до набора полного окна. Как это работает подробнее Оконная функция вычисляет среднее в «скользящем» фрейме относительно текущей строки, упорядоченной по дате, не схлопывая строки, как это делает GROUP BY. Пример кода Что использовать на практике Рекомендация. По умолчанию PostgreSQL включит неполные фреймы в начале ряда, что может визуально выглядеть как заниженное/завышенное сглаживание. Рекомендация. Если нужны только полноценные 7-дневные средние, отфильтруйте первые дни. Рекомендация. При пропусках в датах (нет данных за день) фрейм по ROWS сдвинется некорректно относительно календарных дней — нужен RANGE по дате или предварительная генерация полного ряда дат. Подводные камни Риск. Путаница между фреймом ROWS и RANGE при наличии пропусков в датах. Риск. Игнорирование часового по
moving-averagepostgresql
MiddleData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ Нужно посчитать кумулятивное число пользователей и конверсий по каждой группе на каждый день теста с помощью оконной функции с накоплением (running total), а затем вычислить кумулятивную конверсию на каждую дату. Как это работает подробнее Как это работает: оконная функция SUM(...) OVER (PARTITION BY group ORDER BY event_date) накапливает значения по датам внутри группы, что позволяет на каждый день теста видеть, как менялась бы итоговая конверсия, если бы тест остановили именно на этот день. Ожидаемый результат: по строке на группу и дату с растущими cum_users и плавно меняющейся cum_cr; sanity check — cum_users должен монотонно не убывать по датам внутри группы. Пример кода Что использовать на практике На практике: такой график полезен для диагностики (например, видно ли затухание эффекта или нестабильность в начале теста), но не должен использоваться для принятия финального решения на промежуточной точке — это тот же риск peeking, если не контролировать его отдельно. Подводные камни Частые о
ab-testingexperiment-design
JuniorData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Нужен GROUP BY по категории с фильтром по диапазону дат последнего полного месяца; пример приведён для PostgreSQL с date_trunc. Как это работает подробнее Запрос агрегирует суммы по категории, а условие WHERE отсекает только полностью завершённый предыдущий календарный месяц. Пример кода Что использовать на практике Рекомендация. Определяйте границы месяца динамически относительно текущей даты, учитывайте часовой пояс временных меток заказов и обрабатывайте NULL в категории отдельным значением. Подводные камни Риск. Случайное включение текущего неполного месяца в выборку. Риск. Игнорирование NULL-категорий (пропавший столбец на графике). Риск. Задвоение сумм из-за JOIN с «размножающей» таблицей.
bar-chartdate-trunc
JuniorData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Нужно найти для каждого пользователя дату первого события (или регистрации), сгруппировать эти даты по месяцу и посчитать число уникальных пользователей в каждом месяце. Как это работает подробнее "новый пользователь" — тот, для кого текущий месяц совпадает с месяцем его самой первой активности; это требует предварительного вычисления MIN(date) по каждому user_id, а не просто фильтрации событий по месяцу. Пример кода Что использовать на практике Применение. если в таблице уже есть отдельное поле registration_date, можно обойтись без вычисления минимума по событиям — но важно убедиться, что registration_date действительно отражает первый визит, а не, например, дату подтверждения email. Проверка или пример. Проверка: сумма new_users по всем месяцам должна равняться общему числу уникальных пользователей в таблице events. Подводные камни Частая ошибка. считают число новых пользователей просто как число уникальных user_id с любой активностью в месяце (это посчитает и старых, вернувшихся пользователе
date-truncnew-users
JuniorData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Нужно посчитать число уникальных пользователей с событием "просмотр" и число уникальных пользователей с событием "покупка" среди тех же пользователей (обычно с ограничением по времени от просмотра до покупки), затем разделить второе на первое. Как это работает подробнее используем условное агрегирование или EXISTS/JOIN, чтобы связать пользователей, совершивших оба события, и ограничить окно (например, покупка в течение 7 дней после просмотра), иначе в конверсию попадут случайные совпадения, не связанные причинно. Пример кода Что использовать на практике Применение. важно договориться, обязательна ли покупка именно того товара, который просматривали, или любая покупка в принципе — это сильно разные по смыслу метрики. Проверка или пример. Проверка: conversion_rate должен быть в (0;1]. Подводные камни Частая ошибка. считают конверсию по количеству событий вместо уникальных пользователей; не ограничивают временное окно, из-за чего в конверсию попадают покупки, произошедшие задолго до просмотра и не
conversion-ratefunnel
MiddleData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Rolling N-day retention для пользователя — это признак "была ли хотя бы одна активность в день N или позже"; его удобно получить через оконную функцию, находящую минимальную разницу в днях между регистрацией и каждым последующим событием, и сравнивающую её с порогом N. Как это работает подробнее для каждого пользователя вычисляем MAX(event_date) (или проверяем EXISTS событие с day_diff >= N) — если последняя активность наступила не раньше дня N, пользователь считается "rolling retained" на день N. Пример кода Что использовать на практике Практика. в ClickHouse для больших объёмов эффективнее использовать maxIf/minIf агрегатные функции с условием вместо JOIN; в PostgreSQL можно использовать оконную функцию MAX(event_date) OVER (PARTITION BY user_id) для избежания повторного сканирования таблицы. Подводные камни Частые ошибки. вычисляют rolling retention как "была ли активность именно в день N или позже" только для одной конкретной даты в прошлом, забывая, что для свежих когорт день N+ ещё не нас
cohortspostgresql
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Контроллер прогрессивной доставки (например, Argo Rollouts с AnalysisTemplate на основе Prometheus-запроса error rate) на каждом шаге сравнивает метрику canary-версии с порогом, и при нескольких подряд нарушениях автоматически устанавливает вес canary в 0% и помечает Rollout как Degraded, без ожидания человека; риски — ложные срабатывания из-за шумных метрик или недостаточного объёма трафика, а также отсутствие отката побочных эффектов вне кода (например, уже отправленных внешних вызовов или записанных в БД данных). Как это работает подробнее AnalysisTemplate выполняет PromQL-запрос с заданным интервалом, сравнивает результат с `successCondition`, и при накоплении заданного числа неудачных проверок (`failureLimit`) Rollout-контроллер автоматически откатывает трафик на стабильную версию, останавливая дальнейшее продвижение. Пример кода Что использовать на практике На практике. автоматический откат эффективен для метрик с чётким и быстрым сигналом (HTTP 5xx rate, задержка), но рискован для метрик
canary-deploymentcicd-and-release-management
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Через Ingress-контроллер или service mesh (например, Istio VirtualService с weighted-роутингом) трафик делят между стабильной и canary-версией с постепенным шагом (5% → 25% → 50% → 100%); решение о продолжении принимают по сравнению error rate, latency (p95/p99) и бизнес-метрик canary-версии со стабильной на каждом шаге, с автоматическим или ручным откатом при превышении порогов. Как это работает подробнее оба набора подов (stable и canary) работают одновременно за одним сервисом/VirtualService, и правило маршрутизации определяет пропорцию запросов на каждую версию. На каждом шаге пайплайн делает паузу (bake time), собирает метрики из Prometheus (или аналога) отдельно по версии (через label `version=canary`/`version=stable`) и сравнивает их. Пример кода Что использовать на практике На практике. критично использовать относительные метрики (разница между canary и stable), а не абсолютные пороги — это учитывает текущую нагрузку и внешние факторы. Автоматизировать анализ удобно инструментами прогре
canary-deploymentcicd-and-release-management
MiddleSMM Manager > Общее > Площадки и основы SMM
Короткий ответ Нужно проверить, одинаково ли оба источника определяют метрику «охват» (уникальные пользователи за какой период, включая или не включая платный охват), одинаковый ли временной интервал и часовой пояс учитываются, и не использует ли сторонний сервис собственную методику оценки через API с задержкой или выборку данных — расхождение почти всегда объясняется разной методологией подсчёта, а не ошибкой одного из инструментов. Как это работает подробнее платформы обычно считают охват напрямую по внутренним логам показов, а сторонние сервисы часто получают данные через публичный API с собственными допущениями или задержкой обновления, из-за чего цифры по определению могут не совпадать один к одному. Что использовать на практике Рекомендация. перед тем как объявлять один из источников «неверным», стоит сверить точные определения метрик в документации обоих инструментов и сопоставить данные за один и тот же точный период (включая часовой пояс), а в отчёте клиенту явно указать, какой источник и почему выб
analyticsimpressions
SeniorSMM Manager > Общее > Площадки и основы SMM
Короткий ответ Готового ответа "какой источник верный" нет: прежде чем принимать решение о бюджете на основе любого из источников, нужно понять методологические различия в их моделях атрибуции (например, учёт мультиканальных касаний, окно атрибуции, обработка кликов против показов), и для значимых решений о бюджете разумно не полагаться полностью ни на один источник, а строить решение на нескольких независимых сигналах и постепенном тестировании, а не на разовом сравнении цифр. Как это работает подробнее нативная статистика каждой платформы обычно засчитывает себе конверсию по собственной модели атрибуции (которая может переоценивать её вклад, так как не видит путь пользователя на других платформах), а сторонний сервис использует иную модель (часто основанную на отслеживании через собственные метки или cookie), которая может недооценивать вклад платформ с ограничениями на трекинг — обе модели по-своему неполны. полное доверие нативной статистике платформы упрощает принятие решений и соответствует тому, как са
budget-allocationimpressions