Инкрементальность affiliate-трафика: holdout-тест, формулы и SQL-расчёт

Как отделить атрибуцию от реального прироста: дизайн holdout-эксперимента, формулы absolute и relative lift, доверительный интервал, SQL и полный пример.

Оглавление10 разделов

Affiliate-отчёт отвечает, кому атрибутировали конверсию, но не доказывает, что реклама её создала. Пользователь мог уже знать бренд, перейти по партнёрской ссылке перед покупкой или попасть одновременно под несколько кампаний. Holdout-эксперимент отвечает на другой вопрос: насколько изменилась частота конверсий у сопоставимых пользователей, получивших воздействие, относительно группы без него.

Минимальный расчёт

Absolute lift = p_treatment − p_control. Дополнительные конверсии = lift × размер treatment. Incremental CPA = рекламные расходы / дополнительные конверсии. Результат публикуют вместе с интервалом неопределённости и описанием загрязнения групп.

Паспорт эксперимента

Поля до запуска
ПолеЧто записать
Единица рандомизацииuser_id, cookie или GEO-кластер
Treatmentкакое именно воздействие разрешено
Controlчто именно удерживается
Primary metricapproved FTD на пользователя
Guardrailsошибки, жалобы, качество
Окноэкспозиция + полный conversion lag
MDEминимально полезный абсолютный эффект
Stopping ruleфиксированная дата/выборка
Contaminationкак искать пересечение групп

Схема данных

PostgreSQL: назначение и исход
CREATE TABLE lift_assignment (
  experiment_id text NOT NULL,
  unit_id_hash text NOT NULL,
  arm text NOT NULL CHECK (arm IN ('treatment','control')),
  assigned_at timestamptz NOT NULL,
  PRIMARY KEY (experiment_id,unit_id_hash)
);
CREATE TABLE lift_outcome (
  experiment_id text NOT NULL,
  unit_id_hash text NOT NULL,
  converted boolean NOT NULL,
  conversion_value_minor bigint,
  matured_at timestamptz NOT NULL,
  PRIMARY KEY (experiment_id,unit_id_hash)
);

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

SQL: абсолютный lift

Агрегация по группам
WITH arm AS (
  SELECT a.arm, count(*) AS n,
         count(*) FILTER (WHERE o.converted) AS conversions
  FROM lift_assignment a
  JOIN lift_outcome o USING (experiment_id,unit_id_hash)
  WHERE a.experiment_id=$1
  GROUP BY a.arm
)
SELECT arm,n,conversions,
       conversions::numeric/n AS conversion_rate
FROM arm ORDER BY arm;

Формулы и рассчитанный пример

Разница долей
pT = conversionsT / nT
pC = conversionsC / nC
absolute_lift = pT - pC
SE = sqrt(pT*(1-pT)/nT + pC*(1-pC)/nC)
95% CI = absolute_lift ± 1.96*SE
incremental_conversions = absolute_lift*nT
iCPA = treatment_spend/incremental_conversions
Обезличенный результат
ГруппаПользователиApproved FTDКонверсия
Treatment50 0006501,30%
Control50 0005751,15%

Absolute lift равен 0,15 процентного пункта, relative lift — около 13,0%. Стандартная ошибка разницы приблизительно 0,0696 п.п.; 95%-й интервал эффекта — примерно от 0,014 до 0,286 п.п. Он едва остаётся выше нуля, поэтому точечная оценка 0,15 п.п. не является гарантированным будущим результатом. Для 50 000 пользователей treatment оценка дополнительных FTD равна 75. При расходе 450 000 рублей iCPA составляет 6 000 рублей. Все числа учебные.

SQL: контроль загрязнения

Пользователи с запрещённой экспозицией в control
SELECT count(DISTINCT a.unit_id_hash) AS contaminated_control
FROM lift_assignment a
JOIN ad_exposure e USING (experiment_id,unit_id_hash)
WHERE a.experiment_id=$1 AND a.arm='control';

Если control видел исследуемую рекламу через другой аккаунт или партнёра, разница групп смещается к нулю. Удаление загрязнённых пользователей после просмотра результата тоже создаёт смещение. Правило обработки contamination задают заранее: основной intention-to-treat расчёт сохраняет исходное назначение, дополнительный анализ показывают отдельно.

Кластерный holdout для GEO

Когда рандомизация пользователей недоступна, единицей может быть город или регион. Тогда нельзя считать каждого пользователя независимым: общие события внутри GEO коррелируют, а эффективный размер выборки меньше. Подберите кластеры по исторической конверсии и объёму, назначьте пары в разные группы и анализируйте эффект на уровне кластера либо специализированной моделью. Два GEO — один test и один control — почти всегда дают слишком хрупкий вывод.

Conversion lag и момент чтения

Свежая treatment-группа может выглядеть слабее, если её конверсии ещё не созрели. Окно должно покрывать ожидаемую задержку, одинаковую для обеих групп. Google в официальном описании Conversion Lift также отделяет инкрементальные конверсии от стандартной атрибуции и рекомендует ждать завершения исследования; доступность фирменного инструмента зависит от аккаунта.

Ошибки, которые ломают причинный вывод

  • Остановить тест в день, когда результат впервые стал положительным
  • Менять бюджет или креатив только в одной части treatment без фиксации
  • Сравнивать текущую кампанию с прошлым месяцем вместо одновременного control
  • Удалять неугодные сегменты после просмотра эффекта
  • Считать клики независимыми, если рандомизировали пользователя или GEO
  • Показывать relative lift без абсолютной разницы и интервала

Шаблон решения

Как интерпретировать итог
РезультатДействие
Интервал выше 0 и iCPA приемлемПроверить устойчивость сегментов и масштабировать ступенчато
Интервал включает 0Признать неопределённость; не объявлять отсутствие эффекта
Эффект есть, iCPA выше лимитаКампания причинно работает, но экономически не проходит
Сильное contaminationНе использовать основной вывод для бюджета; перепроектировать тест
Guardrail ухудшилсяНе масштабировать, даже при положительном lift

Источники и дата проверки

Материал проверен 1 августа 2026 года по официальным материалам Google Ads о различии attributed и incremental conversions (https://support.google.com/google-ads/answer/14102450?hl=en) и настройке Conversion Lift (https://support.google.com/google-ads/answer/12005564?hl=en). Формулы разницы двух независимых долей приведены явно; перед крупным экспериментом дизайн и мощность должен проверить аналитик.

Станьте партнёром и начните работать

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

СТАТЬ ПАРТНЁРОМ

Связанные материалы

Все статьи
Аналитика

Бюджет первого теста: как рассчитать сумму, которой хватит для решения

Как рассчитать бюджет теста рекламы через частоту события, MDE, power, стоимость трафика, зрелость, технический этап, лимит потерь и оборотный капитал.

Аналитика

Витрина данных для арбитражной команды: схема от клика до выплаты

Как построить аналитическую витрину арбитража: grain, факты, измерения, click ID, статусы, валюты, ревизии, late events, тесты и воспроизводимые отчёты.

Аналитика

Statistical power и MDE: как планировать тест конверсии до запуска

Подробный разбор statistical power, MDE и размера выборки для конверсии: baseline, alpha, beta, абсолютный эффект, кластеры, лаг и симуляция дизайна.