Условие
Есть два города (А и Б). В обоих часть заказов доставляется нашими курьерами, часть — курьерами ресторанов. Гипотеза: доставка нашими курьерами повышает LTV пользователя.
Распишите, как бы вы исследовали гипотезу: какие методы применили бы, какие подводные камни учли. Важен ход мыслей, а не финальная цифра.
Решение
Это причинно-следственная задача в условиях наблюдательных данных (мы не присваивали тип курьера случайно). Просто сравнивать средние нельзя — будет селекшн.
Шаг 1. Сформулировать измерение
- LTV — какой? Чаще всего: GMV (или маржа) на пользователя за горизонт
T(90/180/365 дней с первого заказа). Уточнить у заказчика. - Treatment: пользователь обслужен нашими курьерами хотя бы раз? Доля заказов нашими курьерами? Только первый заказ — нашими? Лучше двусторонне: как «доля заказов нашими» (continuous), так и «когда-либо хотя бы один» (binary). Разные определения отвечают на разные вопросы.
- Когорта: новые пользователи с первого заказа в период X (например, 6 месяцев), горизонт LTV — 6 месяцев после первого заказа.
Шаг 2. Источники селекшн-байаса
Ключевые причины, почему в группах разные пользователи:
- Геопокрытие нашими курьерами: они работают только в части районов / у части ресторанов. Эти районы могут отличаться по платёжеспособности.
- Цена: наши курьеры могут быть бесплатной опцией, ресторанные — платной (или наоборот). Это смещает выбор по «type» пользователей.
- Скорость и надёжность: возможно, наших курьеров получают «правильные» заказы (ближе, дороже), что коррелирует с типом пользователя.
- Ресторанная сторона: некоторые рестораны вообще не пользуются нашими курьерами.
- Self-selection: пользователь выбирает курьера? Если да — это сильнейший байас (выбирают более премиальный сервис обеспеченные).
Без учёта этих факторов любое наблюдаемое различие в LTV не означает причины.
Шаг 3. Дизайн исследования
Лучший вариант — A/B-тест
Если есть техническая возможность: на части пользователей рандомизировать курьера (а не оставлять выбор/детерминированную логику). Балансируем по городу, периоду, типу заказа. После сбора данных сравниваем LTV-метрику между группами через двухвыборочный t-тест или bootstrap.
Если рандомизация невозможна — переходим к квази-экспериментальным методам.
Propensity score matching
- Обучаем модель
P(treatment | covariates): вероятность для пользователя получить нашего курьера, по фичам — гео, тип заведения, размер чека, время суток, день недели, частота заказов. - Для каждого «treated» подбираем пары из «control» с похожим propensity (nearest neighbour, caliper).
- На сматченных парах считаем разницу в LTV. Это даёт ATT (average treatment effect on the treated).
Инструментальная переменная (IV)
Если есть «случайная» переменная, влияющая на тип курьера, но не на LTV напрямую (например, недоступность нашего курьера в данный момент по техническим причинам), — она работает как «инструмент». 2SLS даёт оценку причинного эффекта.
Difference-in-Differences
Если в момент t0 где-то расширили зону работы наших курьеров — сравниваем динамику LTV «до/после» в этой зоне с контрольной зоной, где зону не расширяли.
Регрессия с фиксированными эффектами
LTV ~ treatment + city + month + restaurant + customer_segment + ε — простой линейный контроль. Грубее матчинга, но иногда достаточно.
Шаг 4. Метрики и тесты
- Основная метрика: LTV
T-дней (e.g. 180). - Вторичные: число повторных заказов, средний чек, частота заказов, churn (нет заказа за 60 дней).
- Гарды: жалобы, отмены, время доставки.
Тесты — двухвыборочный t-test (или Welch'а), bootstrap CI, для бинарных — chi-square. Учесть multiple testing (Bonferroni / Benjamini-Hochberg).
Шаг 5. Sanity-check и продакшн
- A/A-тест на исторических данных: разделите контрольную группу пополам и убедитесь, что LTV не отличается.
- Сегментный анализ: эффект может быть положительным в одном городе и отрицательным в другом (Simpson’s paradox). Смотрите по городу А и Б отдельно.
- Stratification: новые vs старые пользователи, тип ресторана.
- Power analysis: хватит ли наблюдений для нужной MDE? Если нет — увеличьте горизонт или собирайте дольше.
Эталонный ответ
Кратко: гипотеза проверяется или (а) рандомизированным A/B-тестом, или (б) квази-экспериментально через PSM / DiD / IV. Сравнение средних «в лоб» обманчиво из-за селекшн-байаса (геопокрытие, цена, тип ресторана, self-selection пользователей). Главные риски: Simpson’s paradox по городам, multiple testing, недостаточный horizon LTV.
Подводные камни
- «Сравнить средние LTV двух групп» — самая частая ошибка-наживка. Нужен причинный фрейм.
- LTV не успел реализоваться. Если новый пользователь сделал заказ месяц назад, мы не знаем его 180-дневный LTV. Используйте censoring / Kaplan-Meier для retention или горизонт меньше.
- Корреляция курьера с другими решениями (например, наших курьеров используют только премиум-рестораны) — это путает причину со следствием.
- Глобальный против локального эффекта. На уровне отдельного заказа эффект может быть, на уровне пользователя — нет (если он переключается между типами).
- Не путать LTV с retention. LTV учитывает и сумму, и долговечность. Если наши курьеры повышают retention, но снижают средний чек — суммарный эффект может быть нулевым.