Каннибализация продаж: что это и как её посчитать
Каннибализация — когда новый товар, тариф, канал или акция забирают продажи у уже существующих. Виды, формула доли каннибализации и чистого прироста, как измерять с контролем и разностью разностей, пример на учебных данных.
Содержание статьи
Команда запустила новый тариф, и через месяц в отчёте красивая строка: на нём уже 300 платящих клиентов. Финансовый директор задаёт неудобный вопрос: сколько из этих трёхсот раньше платили за старый тариф и просто переехали? Если половина, то новый тариф принёс не 300 клиентов, а 150, и выручка могла даже упасть, если он дешевле. Это и есть каннибализация: новое забирает продажи у своего же старого. Ниже — какие бывают виды каннибализации, как посчитать её долю и чистый прирост, почему сравнение «до и после» почти всегда врёт и как выглядит такой разбор на учебной базе.
Коротко
Каннибализация продаж — ситуация, когда новый продукт, тариф, канал, акция или функция получают часть результата за счёт того, что уже было у компании, а не за счёт новых клиентов или новых покупок.
- Доля каннибализации = потерянные продажи старого ÷ продажи нового. 60% значит, что из каждых десяти продаж новинки шесть забраны у своего же товара.
- Чистый прирост = продажи нового − потерянные продажи старого. Считать его нужно и в штуках, и в марже: дешёвая новинка может давать плюс в штуках и минус в деньгах.
- «Потерянные продажи» — это разница с тем, что было бы без запуска, а не с прошлым месяцем. Без контрольной группы, контрольного региона или прогноза эту разницу не узнать.
- Виды: новый товар против старого, акция против будущих покупок, платный канал против органики, новая функция против старой.
- Каннибализация не всегда плоха. Переход клиентов на более дорогой тариф — тоже каннибализация, но выгодная.
Что такое каннибализация простыми словами
Название — метафора: компания «поедает» собственные продажи. Магазин вводит молоко под своей маркой — часть покупателей перестаёт брать привычный бренд с той же полки. Сервис запускает годовую подписку со скидкой — её оформляют те, кто и так платил бы помесячно. Компания покупает рекламу по своему названию — по ней кликают люди, которые уже искали именно её и нашли бы сайт в обычной выдаче.
Во всех случаях новый источник выглядит успешным в собственном отчёте. Вопрос аналитика другой: насколько вырос общий результат компании. Его разность с результатом нового источника и есть каннибализация.
У слова есть второе значение — SEO-каннибализация, или каннибализация ключевых запросов. Так называют ситуацию, когда несколько страниц одного сайта отвечают на один и тот же поисковый запрос и конкурируют друг с другом в выдаче. Лечится это редакторски: страницы объединяют, разводят по разным запросам или ставят ссылки на основную. Дальше речь о каннибализации продаж, каналов и функций — той, что приходится считать в данных.
Какие бывают виды каннибализации
Механика у всех видов одна, а данные для измерения — разные. Таблица помогает понять, что именно считать и с чем сравнивать.
| Вид | Пример | Как измерять |
|---|---|---|
| Новый товар или тариф забирает продажи старого | дешёвый тариф «Лайт» рядом с основным; товар собственной марки на одной полке с брендом | продажи старого против прогноза или против магазинов/регионов без новинки; переходы конкретных клиентов со старого на новое |
| Промо забирает будущие покупки (pull-forward) | скидка 30% на неделю: клиенты закупаются впрок и следующие недели не покупают | продажи за несколько недель после акции против базового уровня; всплеск минус последующий провал |
| Платный канал забирает органику | реклама по брендовым запросам; ретаргетинг тех, кто и так вернулся бы | отключение рекламы в части регионов или на части аудитории; разность разностей по органике |
| Новая функция забирает использование старой | быстрый экспорт отчёта вместо полного конструктора | A/B-тест: в тестовой группе считаем обе функции и целевое действие продукта целиком |
Как посчитать каннибализацию: формула
Доля каннибализации показывает, какая часть продаж нового на самом деле переехала со старого. В числителе — сколько продаж старый товар потерял из-за запуска, в знаменателе — сколько продал новый за тот же период.
Пример условный, числа подобраны для наглядности. Сеть магазинов ввела молоко собственной марки. До запуска привычный бренд продавал 3000 упаковок в неделю. По прогнозу с учётом сезона без новинки он продавал бы 3100. После запуска бренд продаёт 2500, новинка — 1000 упаковок в неделю.
Потерянные продажи бренда — 3100 − 2500 = 600 упаковок. Доля каннибализации — 600 / 1000 = 60%. Чистый прирост — 1000 − 600 = 400 упаковок в неделю: только столько молока сеть продаёт сверх того, что продала бы без новинки.
Если сравнить просто «до и после», потери будут 3000 − 2500 = 500, а доля — 50%. Сезонный рост спрятал сто упаковок каннибализации. В обратную сторону ошибка тоже работает: если спрос падал бы и без запуска, «до и после» припишет новинке чужое падение.
Доля = (ожидаемые продажи старого без запуска − фактические продажи старого) ÷ продажи новогоОжидаемые продажи берут из контрольной группы, контрольного региона или прогноза, а не из прошлого периода. Доля 0% — новинка полностью дополнительная, 100% — она только перераспределила старые продажи.
Чистый прирост в деньгах: штуки обманывают
Каннибализация в штуках — полдела. У нового и старого товара разные цены и маржа, поэтому итог считают в деньгах. Продолжим условный пример: бренд стоит 100 ₽ и даёт 30 ₽ маржи с упаковки, собственная марка — 80 ₽ и 28 ₽.
Наивный отчёт о запуске: новинка принесла 1000 × 80 = 80 000 ₽ выручки в неделю. С учётом каннибализации выручка выросла на 80 000 − 600 × 100 = 20 000 ₽. Маржа выросла на 1000 × 28 − 600 × 30 = 28 000 − 18 000 = 10 000 ₽. Запуск выгоден, но по выручке вчетверо скромнее, чем в первой строке отчёта, а в марже приносит 10 000 ₽, а не 80 000. При доле каннибализации выше 93% маржа ушла бы в минус: 28 000 ₽ маржи новинки покрывают потерю не больше 933 упаковок бренда.
Та же логика работает для каналов. Допустим, на рекламу потратили 400 000 ₽ и получили 800 регистраций: CAC — 500 ₽. Если 300 из этих людей пришли бы сами через поиск или по рекомендации, рекламе принадлежат только 500 регистраций, и стоимость дополнительного клиента — 800 ₽. Канал, который окупался при 500 ₽, при 800 ₽ может оказаться убыточным.
Чистый прирост = продажи нового × маржа нового − потерянные продажи старого × маржа старогоВ штуках: продажи нового × (1 − доля каннибализации). Для канала: дополнительные клиенты = клиенты канала − клиенты, которые пришли бы сами; стоимость дополнительного клиента = расходы ÷ дополнительные клиенты.
Промо и pull-forward: покупки, взятые взаймы у будущего
Акция почти всегда даёт всплеск. Часть всплеска — новые покупки, часть — покупки, которые клиенты сделали бы позже по полной цене. Второе называют pull-forward: акция «вытягивает» спрос из будущих недель. Для товаров с запасом — бытовая химия, корм, кофе — эффект особенно заметен: покупатель берёт три упаковки и месяц не возвращается.
Условный пример. Обычно товар продаётся 1000 штук в неделю. В неделю скидки — 1800, в две следующие — 850 и 920. Всплеск 800 штук, провал после акции 150 + 80 = 230. Доля «взятых взаймы» продаж — 230 / 800 ≈ 29%, чистый прирост — 570. И это ещё без учёта того, что скидку получили все 1800 покупателей, включая тысячу, которые купили бы и по полной цене.
Провал после акции не всегда виден на общем графике. Игал Хендел и Авив Нево в работе 2003 года разбирали этот парадокс: в данных отдельных домохозяйств запасание впрок видно, а в агрегированных продажах магазина провал часто маскируют другие промоактивности — листовки и выкладки. Поэтому окно оценки берут шире недели акции и смотрят на сумму за несколько недель до и после, а не только на пик.
Как измерять каннибализацию без самообмана
Вся сложность — в «ожидаемых продажах без запуска». Это контрфактический сценарий: его нельзя наблюдать, его можно только оценить. Способов три, от надёжного к шаткому.
Контрольная группа. Новинку, тариф или функцию показывают случайной части клиентов, остальные живут как раньше. Разница между группами в продажах старого продукта и есть каннибализация, а разница в общем результате — чистый прирост. Для функций и тарифов в цифровом продукте это обычный A/B-тест; главное — выбрать метрикой итог продукта целиком, а не использование новой функции.
Контрольный регион или holdout. Когда рандомизировать людей нельзя — реклама в поиске, товар на полке, — меняют условия в части регионов или магазинов. Так поступил eBay: в 2012 году компания перестала покупать рекламу по запросам со своим названием в поисковиках Yahoo! и MSN, и 99,5% кликов, которые шли через рекламу, перешли в обычную выдачу. По небрендовым запросам рекламу отключили примерно в 30% медиарегионов США и сравнили продажи с остальными; результаты опубликованы в Econometrica в 2015 году. Противоположный ориентир дают исследования самого Google 2011 года: в 400 с лишним случаях паузы рекламы в среднем 89% рекламных кликов не замещались обычными. Это исследование продавца рекламы, и это среднее по многим рекламодателям. Вывод не «правы одни или другие», а что доля каннибализации зависит от запросов и аудитории, и измерять её нужно на своих данных.
Разность разностей (difference-in-differences). Если есть регион или сегмент, куда изменение не дошло, сравнивают изменение метрики в обеих группах: эффект = (после − до в тестовой) − (после − до в контрольной). Метод держится на допущении параллельных трендов — без запуска обе группы менялись бы одинаково. Его проверяют на периоде до запуска, и ниже на учебных данных видно, что бывает, когда оно не выполняется.
Сравнение с прогнозом. Строят прогноз продаж старого продукта по истории — с трендом и сезонностью — и сравнивают с фактом. Это самый доступный способ и самый уязвимый: результат целиком зависит от того, как построен прогноз.
Эффект = (Тест после − Тест до) − (Контроль после − Контроль до)Работает, только если до запуска тестовая и контрольная группы двигались параллельно. Проверьте это на нескольких периодах до изменения.
Пример на учебной базе: забрал ли платный поиск органику
Посмотрим, как выглядит разбор каннибализации каналов на учебной базе «Маяк» — данных SaaS-сервиса отчётов: регистрации с 1 июня по 29 августа 2026 года, выгрузка закрыта 30 августа в 13:00. Рекламных расходов в базе нет, поэтому считаем только регистрации. Сначала проверим, когда появился каждый канал.
| channel | first_signup | last_signup | signups |
|---|---|---|---|
| organic | 2026-06-01 | 2026-08-29 | 1747 |
| partner | 2026-06-01 | 2026-08-29 | 814 |
| referral | 2026-06-01 | 2026-08-29 | 1037 |
| paid_search | 2026-07-01 | 2026-08-29 | 1015 |
SELECT
channel,
MIN(signup_date) AS first_signup,
MAX(signup_date) AS last_signup,
COUNT(*) AS signups
FROM users
GROUP BY channel
ORDER BY first_signup, channel;Регистрации по каналам и неделям
Платный поиск начинается 1 июля, остальные каналы работают с первого дня. Получается естественный эксперимент без контрольной группы: был июнь без рекламы, потом июль и август с ней. Гипотеза каннибализации такая: часть людей, которые пришли бы через поиск или по рекомендации, теперь кликают по рекламе. Если это так, рост органики и рекомендаций должен замедлиться с июля.
Считаем по неделям с понедельника: так у каждой точки одинаковый набор дней недели. Последняя неделя, с 24 августа, неполная — шесть дней, — и в сравнение не войдёт.
Учебные данные, 12 полных недель с 1 июня. Неделя 29 июня наполовину июньская: платный поиск в ней — с 1 июля.
SELECT
CAST(date_trunc('week', signup_date) AS date) AS week_start,
COUNT(DISTINCT signup_date) AS days_in_data,
SUM(CASE WHEN channel = 'organic' THEN 1 ELSE 0 END) AS organic,
SUM(CASE WHEN channel = 'referral' THEN 1 ELSE 0 END) AS referral,
SUM(CASE WHEN channel = 'partner' THEN 1 ELSE 0 END) AS partner,
SUM(CASE WHEN channel = 'paid_search' THEN 1 ELSE 0 END) AS paid_search,
COUNT(*) AS total
FROM users
GROUP BY 1
ORDER BY 1;Три базовые линии — три разных ответа
Органика и рекомендации после запуска рекламы выросли. Но каннибализация — это не «упало ли», а «меньше ли, чем было бы». Возьмём бесплатные каналы вместе (organic + referral) и семь полных недель с рекламой, с 6 июля по 23 августа, и сравним факт с тремя вариантами ожидания: средняя неделя июня; линейный тренд июня, продолженный вперёд; разность разностей, где контролем служит партнёрский канал.
Столбец lost_pct — доля каннибализации: насколько бесплатные каналы недобрали до ожидания, в процентах от регистраций платного поиска за те же недели. Отрицательное значение значит, что факт выше ожидания и потерь не видно.
| baseline | actual | expected | gap | paid_search | lost_pct |
|---|---|---|---|---|---|
| разность разностей с partner | 1663 | 1211.3 | 451.8 | 816 | -55.4 |
| средняя неделя июня | 1663 | 1218.0 | 445.0 | 816 | -54.5 |
| линейный тренд июня | 1663 | 2337.3 | -674.3 | 816 | 82.6 |
Учебные данные. Тренд построен по четырём неделям июня (наклон +24,6 регистрации в неделю) и продолжен вперёд; средняя неделя июня — 174.
WITH weekly AS (
SELECT
CAST((CAST(date_trunc('week', signup_date) AS date) - DATE '2026-06-01') / 7 AS integer) AS week_n,
SUM(CASE WHEN channel IN ('organic', 'referral') THEN 1 ELSE 0 END) AS free_signups,
SUM(CASE WHEN channel = 'partner' THEN 1 ELSE 0 END) AS partner,
SUM(CASE WHEN channel = 'paid_search' THEN 1 ELSE 0 END) AS paid_search
FROM users
GROUP BY 1
),
pre AS (
-- четыре полные недели до рекламы: 1–28 июня
SELECT
AVG(free_signups) AS free_avg,
AVG(partner) AS partner_avg,
REGR_SLOPE(free_signups, week_n) AS slope,
REGR_INTERCEPT(free_signups, week_n) AS intercept
FROM weekly
WHERE week_n BETWEEN 0 AND 3
),
post AS (
-- семь полных недель с рекламой: 6 июля – 23 августа
SELECT w.week_n, w.free_signups, w.partner, w.paid_search,
p.free_avg, p.partner_avg, p.slope, p.intercept
FROM weekly AS w
CROSS JOIN pre AS p
WHERE w.week_n BETWEEN 5 AND 11
),
baselines AS (
SELECT 'средняя неделя июня' AS baseline, SUM(free_signups) AS actual,
SUM(free_avg) AS expected, SUM(paid_search) AS paid_search
FROM post
UNION ALL
SELECT 'линейный тренд июня', SUM(free_signups),
SUM(intercept + slope * week_n), SUM(paid_search)
FROM post
UNION ALL
SELECT 'разность разностей с partner', SUM(free_signups),
SUM(free_avg + partner - partner_avg), SUM(paid_search)
FROM post
)
SELECT
baseline,
actual,
ROUND(CAST(expected AS numeric(18, 6)), 1) AS expected,
ROUND(CAST(actual - expected AS numeric(18, 6)), 1) AS gap,
paid_search,
ROUND(CAST(100 * (expected - actual) / paid_search AS numeric(18, 6)), 1) AS lost_pct
FROM baselines
ORDER BY expected;Что можно сказать по этим данным, а что нельзя
Одни и те же 1663 регистрации дают противоположные выводы. Против средней недели июня бесплатные каналы выросли на 445 регистраций — каннибализации не видно. Против линейного тренда они недобрали 674 регистрации, и выходит, что 82,6% «рекламных» регистраций реклама забрала у органики. Разница между выводами — не в данных, а в базовой линии.
Какая из линий честнее? Ни одна не надёжна. Средняя неделя июня игнорирует то, что органика в июне росла: со 139 до 212 регистраций за три недели. Линейный тренд, наоборот, продолжает этот рост бесконечно, хотя рост в первые недели после запуска продукта почти всегда замедляется сам. Четыре точки не говорят, какой формы кривая на самом деле.
Разность разностей с партнёрским каналом выглядит научнее, но ломается на допущении. В июне бесплатные каналы росли, а партнёрский стоял на месте (57, 64, 63, 61). Тренды до запуска не параллельны, значит, partner — плохой контроль, и плюс 452 регистрации от рекламы метод «нашёл» только потому, что сравнил растущий ряд с ровным. К тому же реклама в поиске могла задеть и партнёрский канал, а контроль не должен зависеть от изменения.
Честный вывод для отчёта: «С появлением платного поиска органика и рекомендации продолжили расти в абсолютных числах. Медленнее ли, чем росли бы без рекламы, по этим данным определить нельзя: результат зависит от выбранного прогноза в диапазоне от нуля до 83% каннибализации. Чтобы ответить, нужен контроль — регионы или аудитории, где реклама выключена». Обратите внимание и на неделю 29 июня: бесплатные каналы упали с 212 до 183 ровно в неделю запуска рекламы. Одна точка — не доказательство: следом пошёл рост, а партнёрский канал через неделю провалился до 32 без всякой причины в данных.
База «Маяк» сгенерирована для обучения, и как именно реклама влияла на органику, в ней не заложено намеренно. Пример показывает метод и его ловушки, а не реальную долю каннибализации платного поиска.
Переток между тарифами: доли в первых оплатах
Второй частый вопрос — не забирает ли один тариф клиентов у другого. В «Маяке» три тарифа: basic за 19, pro за 29 и team за 39 долларов в месяц. Новых тарифов в базе за лето не появлялось, поэтому разберём, как выглядел бы анализ, если бы 1 июля что-то поменялось — например, в pro добавили функцию. Начинают со структуры первых оплат по месяцам.
| pay_month | first_payments | basic | pro | team | basic_pct | pro_pct | team_pct | avg_amount |
|---|---|---|---|---|---|---|---|---|
| 2026-06-01 | 167 | 104 | 45 | 18 | 62.3 | 26.9 | 10.8 | 23.85 |
| 2026-07-01 | 335 | 184 | 113 | 38 | 54.9 | 33.7 | 11.3 | 24.64 |
| 2026-08-01 | 410 | 226 | 138 | 46 | 55.1 | 33.7 | 11.2 | 24.61 |
SELECT
CAST(date_trunc('month', paid_at) AS date) AS pay_month,
COUNT(*) AS first_payments,
SUM(CASE WHEN plan = 'basic' THEN 1 ELSE 0 END) AS basic,
SUM(CASE WHEN plan = 'pro' THEN 1 ELSE 0 END) AS pro,
SUM(CASE WHEN plan = 'team' THEN 1 ELSE 0 END) AS team,
ROUND(CAST(100.0 * SUM(CASE WHEN plan = 'basic' THEN 1 ELSE 0 END) / COUNT(*) AS numeric(18, 6)), 1) AS basic_pct,
ROUND(CAST(100.0 * SUM(CASE WHEN plan = 'pro' THEN 1 ELSE 0 END) / COUNT(*) AS numeric(18, 6)), 1) AS pro_pct,
ROUND(CAST(100.0 * SUM(CASE WHEN plan = 'team' THEN 1 ELSE 0 END) / COUNT(*) AS numeric(18, 6)), 1) AS team_pct,
ROUND(CAST(AVG(amount) AS numeric(18, 6)), 2) AS avg_amount
FROM payments
WHERE payment_type = 'first'
GROUP BY 1
ORDER BY 1;Как читать сдвиг структуры тарифов
Доля basic упала с 62,3% до 54,9%, доля pro выросла с 26,9% до 33,7%. Если бы в июле сохранилась июньская структура, из 335 первых оплат на basic пришлось бы около 208,6, а пришлось 184; на pro — около 90,3, а пришлось 113. Похоже, около 25 человек выбрали pro вместо basic. Это каннибализация вверх: каждый такой клиент платит на 10 долларов больше. При июньском среднем чеке 23,85 доллара 335 оплат принесли бы 7989,9 доллара, фактически — 8255, на 265 больше.
Теперь проверки, без которых этот вывод нельзя показывать. Первая — шум. В июне всего 167 первых оплат, и 95%-я погрешность разницы долей basic между июнем и июлем — около ±9,1 процентного пункта. Разница 7,4 пункта в неё укладывается. Вторая — состав: 120 из 167 июньских первых оплат сделали те, кто зарегистрировался в первой половине месяца, а в июле добавился платный поиск. Структура могла сдвинуться из-за того, кто платит, а не из-за тарифа; такие сдвиги разбирают по сегментам, иначе легко попасть в парадокс Симпсона. Третья — что вообще видно в данных. Ни один пользователь «Маяка» не платил за два разных тарифа, то есть прямых переходов basic → pro нет. В настоящем разборе первым делом ищут именно их: клиент, который сменил тариф, — прямое наблюдение каннибализации, а сдвиг долей — только косвенное.
Схема для реального запуска: зафиксировать структуру тарифов до изменения по нескольким месяцам, посчитать её по сегментам, выбрать контроль — регионы, когорты или A/B-группу без изменения, — и считать эффект в выручке и марже, а не в числе оплат нового тарифа.
Ошибки при оценке каннибализации
Почти все эти ошибки завышают успех нового.
- Считать весь прирост нового продукта чистым. Продажи новинки, регистрации из рекламы, оплаты нового тарифа — это валовой результат. Без вычета потерь старого он отвечает на вопрос «сколько продал новый», а не «сколько заработала компания».
- Сравнивать «до и после» без контроля. Сезонность, тренд, параллельные акции и изменения у конкурентов попадают в оценку целиком. На примере «Маяка» видно, что выбор базовой линии меняет ответ с нуля до 83%.
- Брать контроль с другим трендом. Разность разностей с группой, которая и до запуска двигалась иначе, даёт уверенный и неверный ответ.
- Игнорировать отложенный эффект промо. Оценка по неделе акции не видит провала в следующие недели и скидки, отданной тем, кто купил бы и так.
- Считать каннибализацию в штуках, а решение принимать в деньгах. Дешёвая новинка с долей каннибализации 70% может давать плюс в штуках и минус в марже.
- Измерять новую функцию по её собственному использованию. Рост использования быстрого экспорта ничего не говорит, если столько же людей перестали собирать полные отчёты.
- Не смотреть на каннибализацию у конкурентов. Если новинка не заберёт продажи старого товара, их может забрать чужой продукт. Иногда каннибализировать себя выгоднее, чем отдать долю рынка.
Частые вопросы
Что такое каннибализация в маркетинге?
Это ситуация, когда новый продукт, канал или акция компании получают продажи за счёт её же существующих продуктов и каналов, а не за счёт новых клиентов. Например, реклама по брендовому запросу приводит людей, которые и так нашли бы сайт в обычной выдаче.
Как посчитать каннибализацию?
Оцените, сколько продал бы старый продукт без запуска нового, — по контрольной группе, контрольному региону или прогнозу. Разница между ожиданием и фактом — потерянные продажи. Разделите их на продажи нового: это доля каннибализации. Чистый прирост — продажи нового минус потерянные продажи старого.
Какая доля каннибализации нормальная?
Универсальной нормы нет. Допустимая доля зависит от маржи: если новинка маржинальнее старого товара, можно позволить себе высокую каннибализацию, если дешевле — даже 50% могут сделать запуск убыточным. Считайте порог из маржи, как в примере выше.
Что такое каннибализация трафика?
Так называют ситуацию, когда платный канал получает визиты или конверсии, которые пришли бы бесплатно: через органическую выдачу, прямые заходы или рекомендации. Измеряют её отключением рекламы на части регионов или аудитории и сравнением с контролем.
Чем каннибализация продаж отличается от SEO-каннибализации?
Каннибализация продаж — про деньги и клиентов: новый продукт забирает продажи старого. SEO-каннибализация — про поисковую выдачу: несколько страниц одного сайта конкурируют за один запрос.
Итог
Каннибализация — разница между тем, что принёс новый товар, тариф, канал или акция, и тем, на сколько вырос общий результат. Считают её долю как потерянные продажи старого, делённые на продажи нового, а решение принимают по чистому приросту в марже. Самая трудная часть — оценить, что было бы без запуска, и здесь нет замены контролю: случайной группе, региону без изменения или хотя бы проверенной разности разностей. На учебных данных «Маяка» один и тот же рост органики после запуска рекламы читается и как отсутствие каннибализации, и как 83% — в зависимости от базовой линии. Это главный урок темы: прежде чем считать долю, договоритесь, с чем сравниваете.
Все запросы из статьи выполняются на учебной базе: попробуйте другую базовую линию — например, тренд по двум последним неделям июня — и посмотрите, как меняется ответ. В Симуляторе SQL-аналитика каналы, когорты и выручку разбирают на этой же базе продукта.
Материалы по теме

Когда A/B-тест невозможен: квазиэксперименты и разность разностей
Разность разностей на учебном магазине Wave: mobile против desktop до и после редизайна, проверка предтрендов, расчёт −2,79 п.п. и границы вывода.

HADI-циклы: что это, как формулировать гипотезы и пример на данных
HADI-цикл — способ проверять гипотезы по шагам: Hypothesis, Action, Data, Insight. Шаблон формулировки, пример цикла с числами на учебной базе, журнал гипотез, отличие от A/B-теста и PDCA.

RICE и ICE: приоритизация гипотез с Reach из данных, а не из головы
Формулы RICE и ICE со шкалами из первоисточников, расчёт Reach запросами на учебной базе, таблица RICE для пяти инициатив, проверка чувствительности и сравнение с MoSCoW и моделью Кано.