Бран · продюсер «Хроник Пограничья»
Маркетинг хочет решать бюджет по LTV за полгода. Майские новички в игре только месяц. Ждать до ноября я не собираюсь. Сколько они нам принесут за 90 и за 180 дней?
В уроке про монетизацию мы считали LTV30: выручку когорты за первые 30 дней. В юнит-экономике сравнивали его с ценой игрока и честно оговорились, что у молодых игроков LTV ещё копится. Сегодня научимся заглядывать вперёд: по первому месяцу когорты предсказывать её деньги на три и шесть месяцев.
Бензин на поездку
Сколько бензина уйдёт на поездку? Две цифры: сколько километров проедешь и сколько машина ест на километр. Перемножил, получил литры.
С игроком то же самое. Сколько он принесёт, зависит от двух вещей: сколько дней он будет играть и сколько платит за день игры. Первое даёт кривая retention из урока 47: доля когорты, активная на день жизни d. Второе даёт ARPDAU, выручка на одного активного игрока в день.
LTV(H) = r(0) * ARPDAU(0) + r(1) * ARPDAU(1) + ... + r(H - 1) * ARPDAU(H - 1)
r(d) это retention на день жизни d, H горизонт в днях. Это не приближение, а точное тождество: r(d) умножить на размер когорты даёт активных в день d, а ARPDAU умножить на активных даёт выручку дня. Сумма выручки по дням, делённая на когорту, это и есть LTV.
Проверим на старых когортах, январской, февральской и мартовской: у них уже есть по три месяца истории. За первые 90 дней игрок этих когорт активен в среднем 7,02 дня, а один игрок-день приносит в среднем 24,50 ₽. 7,02 × 24,50 = 172 ₽, ровно LTV90 этих когорт.
Прогноз для молодой когорты: первые 30 слагаемых мы знаем, остальные надо угадать. Значит, нужно предсказать хвост кривой retention и ARPDAU на этом хвосте.
Сначала чистка
Данные «Хроник» те же, что в боссе блока C и уроке про ботов, и болячки те же: тестовые аккаунты студии, боты с суточными сессиями, повторные вебхуки и возвраты. Для прогноза они особенно опасны, и ниже увидим почему. Список ненастоящих игроков и чистые покупки собираем в CTE:
WITH fake AS (
SELECT id FROM players WHERE email LIKE '%@studio.dev'
UNION
SELECT player_id FROM sessions WHERE ended_at - started_at > interval '20 hours'
), clean AS (
SELECT *
FROM purchases
WHERE status = 'paid'
AND id IN (SELECT min(id) FROM purchases GROUP BY receipt_id)
AND player_id NOT IN (SELECT id FROM fake)
)
Кривая retention по дням жизни
Строим кривую на старых когортах: 1968 игроков, зарегистрированных до 1 апреля. Каждый из них прожил к концу данных не меньше 91 дня, поэтому дни 0-90 известны у всех, и знаменатель один на всю кривую. Запрос ты соберёшь в квесте ★, вот что получится:
| день жизни | 0 | 1 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| retention, % | 100 | 22,82 | 16,36 | 11,03 | 7,72 | 5,34 | 3,61 | 2,59 | 1,78 | 1,07 | 0,76 |
После резкого обрыва в первый день кривая тает плавно, и тает похоже от месяца к месяцу. Посчитаем средний дневной retention по неделям: на 28-34 день жизни он 7,54%, на 56-62 день 2,24%. За четыре недели осталось 0,297 от прежнего, это 0,738 в неделю. Выходит, после первого месяца каждую неделю в игре остаются примерно три четверти тех, кто играл неделей раньше.
Такое правило называют постоянной долей затухания. В днях это q = 0,738 ^ (1/7) = 0,9576:
r(d) = r(d0) * q ^ (d - d0)
q = (R(56..62) / R(28..34)) ^ (1 / 28)
R(a..b) здесь средний дневной retention на отрезке дней. Отношение берём между неделями, а не между двумя отдельными днями: в хвосте соседние дни отличаются в полтора раза (1,22% на 88-й день и 0,81% на 89-й), а недельное среднее спокойнее.
Есть и другая популярная форма хвоста, степенная: r(d) = r(d0) * (d / d0) ^ (-b). У неё доля уходящих со временем уменьшается, и хвост толще. Какая лучше, решают данные. На старых когортах фактическая сумма retention с 30 по 89 день 1,72 у января и 1,65 у февраля. Постоянное затухание даёт 1,66 и 1,70, степенная модель 1,49 и 1,52. Для «Хроник» берём постоянное затухание. В играх, где ядро играет годами, часто выигрывает степенная: проверяй на своих старых когортах, а не по привычке.
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.