Ключевая проблема оценки реферальных программ — эндогенность самоотбора: пользователи с высокой вовлечённостью и без того имеют больший LTV и чаще приглашают друзей, создавая иллюзию высокой эффективности канала. Для корректной оценки применяем методы казуальной инференции: Propensity Score Matching (PSM) для устранения смещения по наблюдаемым признакам, или Instrumental Variables (IV), если есть рандомизированный инструмент (например, случайный показ баннера).
Для учёта временных лагов между отправкой приглашения и конверсией реферала используем Survival Analysis (модель Каплана-Майера или Cox Proportional Hazards) вместо простого когортного анализа. Это позволяет корректно обрабатывать цензурированные данные (right-censoring), когда часть пользователей ещё не завершила жизненный цикл. LTV рассчитываем через интегрирование кривой удержания с дисконтированием или методом BTYD (Pareto/NBD) для предсказания будущих транзакций.
Контекст: В мобильном приложении доставки еды запустили реферальную программу с двусторонними бонусами. Через квартал отчётность в Tableau показала, что пользователи, активировавшие реферальную ссылку, имеют LTV на 40% выше среднего по платформе. Product Manager требовал масштабирования бюджета, но команда аналитики подозревала, что разница вызвана не программой, а базовыми характеристиками супер-пользователей.
Проблема: Невозможно было отделить истинный инкрементальный эффект от корреляции с вовлечённостью. Применение простых SQL-запросов для сравнения групп давало смещённую оценку из-за конфаундеров (частота заказов, время в продукте). Без корректной оценки бизнес рисковал переплатить за канал с отрицательной или близкой к нулю маржинальностью.
Решение 1: Прямое сравнение когорт через SQL
Сравнили когорту "Пригласившие" (treatment) и "Не пригласившие" (control) с помощью агрегации в BigQuery, рассчитав ARPU и retention на 90-й день.
Плюсы: Мгновенная реализация, понятная визуализация для стейкхолдеров, низкие требования к ресурсам.
Минусы: Критическая ошибка самоотбора (self-selection bias) и ошибка выжившего. Пользователи, которые и так планировали остаться в продукте, чаще используют рефералки. Результат завышен и непригоден для принятия решений.
Решение 2: Propensity Score Matching на исторических данных
В Python (scikit-learn) построили модель логистической регрессии для оценки propensity score — вероятности участия в программе на основе pre-treatment признаков (возраст аккаунта, история заказов, средний чек). Затем применили Nearest Neighbors для матчинга пар 1:1 и сравнили LTV только в сопоставимых подгруппах.
Плюсы: Устраняет смещение по наблюдаемым переменным (observable confounders), работает на ретроспективных данных без необходимости эксперимента. Позволяет быстро получить оценку ATT (Average Treatment Effect on the Treated).
Минусы: Не устраняет ненаблюдаемые характеристики (unobserved confounders), такие как экстраверсия или социальный капитал. При несбалансированных данных (мало пригласивших) возникают проблемы с общей поддержкой (common support), и часть выборки отбрасывается, снижая мощность.
Решение 3: Инструментальные переменные и Survival Analysis
Нашли естественный эксперимент: 50% пользователей случайно видели баннер реферальной программы на главном экране (инструмент Z), что влияло на вероятность участия (X), но не на LTV напрямую (Y). Оценили эффект через 2SLS (Two-Stage Least Squares) в библиотеке linearmodels для Python, получив LATE (Local Average Treatment Effect). Для учёта лагов применили Survival Analysis: построили модель рисков (hazard function) времени до первого заказа реферала и скорректировали LTV на вероятность конверсии в каждый момент времени.
Плюсы: IV-метод устраняет и наблюдаемые, и ненаблюдаемые конфаундеры, давая причинно-следственную оценку. Survival-анализ корректно обрабатывает неполные данные и позволяет моделировать временную динамику.
Минусы: Требует валидного инструмента (релевантность и экзогенность), что сложно доказать. Пониженная статистическая мощность IV-оценок (широкие доверительные интервалы). Интерпретация LATE отличается от ATE (средний эффект только для "compliers").
Выбранное решение:
Выбрали гибридный подход: использовали рандомизацию баннера для IV-оценки чистого эффекта участия, затем применили нелинейную модель Survival Analysis (Cox с time-varying covariates) для расчёта expected LTV с учётом времени конверсии рефералов. Это позволило разделить эффект программы от эффекта самоотбора.
Результат:
Истинный инкрементальный эффект составил +12% к LTV для группы compliers, а не +40% как в исходном отчёте. Анализ лагов показал, что 85% конверсий рефералов происходит в первые 14 дней после клика, что позволило сократить горизонт оценки эффективности с 90 до 30 дней. Бизнес пересмотрел unit-экономику, снизив стоимость привлечения (CAC) на 18% за счёт отказа от долгих ожиданий ретеншена.
Вопрос 1: Как проверить предположение SUTVA (отсутствие вмешательства между юнитами) в реферальной программе, где существуют сетевые эффекты между пригласившими?
SUTVA нарушается, если плотность приглашений в социальном круге влияет на вероятность конверсии (например, перенасыщение или вирусный эффект). Для проверки используем кластеризацию: разбиваем пользователей на географические кластеры или сегменты по социальным графам через Graph Analysis (NetworkX).
Затем применяем Difference-in-Differences, сравнивая кластеры с высокой и низкой пенетрацией реферальных ссылок. Если эффект в плотных кластерах значимо отличается (ниже из-за перенасыщения или выше из-за социального доказательства), SUTVA нарушено, и нужно использовать модели с межгрупповыми взаимодействиями (spatial models) или ограничить анализ изолированными сегментами.
Вопрос 2: Почему нельзя использовать обычную линейную регрессию (OLS) для прогнозирования LTV в условиях цензурированных данных, когда часть пользователей ещё не совершила churn?
OLS игнорирует факт цензурирования (right-censoring), трактуя текущий LTV как финальный, что приводит к систематическому занижению оценок для "молодых" пользователей. Вместо этого применяем Survival Analysis для оценки кривой удержания ( S(t) ), затем интегрируем её для получения expected lifetime.
Альтернативно используем вероятностные модели повторных покупок (BTYD), такие как Pareto/NBD или Gamma-Gamma, реализованные в библиотеке lifetimes для Python. Эти модели учитывают невидимые ещё транзакции через вероятностные распределения частоты и времени между покупками, давая несмещённую оценку будущего LTV даже для активных пользователей.
Вопрос 3: Как отличить incremental invites (приглашения, которые произошли только благодаря программе) от organic invites (которые бы произошли и без стимулирования) при оценке эффекта?
Используем фреймворк Principal Stratification, разделяя популяцию на четыре группы (strata): Always-takers (пригласили бы всегда), Compliers (пригласили только из-за программы), Never-takers и Defiers. Через IV-анализ с бинарным инструментом (например, видел/не видел баннер) оцениваем LATE — эффект именно для Compliers.
Для более детальной сегментации применяем методы Causal Machine Learning (EconML, CausalML в Python), такие как Causal Forest или Meta-learners (S-Learner, T-Learner), чтобы оценить Conditional Average Treatment Effect (CATE) для разных сегментов. Это позволяет понять, для каких пользователей (например, низкий/высокий чек) программа генерирует именно инкрементальные инвайты, а для каких просто фиксирует органический шеринг.