Оффтоп Лена Очкова
6 965

Наглядная математика: как рассчитать ценность пользователя с помощью интегралов

Младший геймдизайнер Nevosoft Руслан Герасим в своем коллективном блоге геймдизайнеров на Medium рассказал, как рассчитать среднее время жизни пользователя в проекте и доход от него за это время.

Часто люди, имея в наличии инструмент для расчета какого-либо показателя, используют его «на веру». Если известна его функция, то зачем углубляться в происхождение? Я считаю такой подход в корне неправильным. Специалист должен стремиться улучшать свои профессиональные навыки и разбираться в базовых и основополагающих моментах, ведь с этими знаниями придет возможность модифицировать и улучшать используемые методы.

Итак, напомню, что такое LTV (англ. Lifetime Value). Фактически это доход с одного пользователя за время его существования в проекте. Знание LTV позволит оценить окупаемость инвестиций (ROI), определить лучшие каналы трафика и так далее.

Безусловно, время «жизни» в игре у каждого пользователя разное, как и количество внесенных средств, поэтому целесообразно взять среднее время жизни игрока (LT) и средний доход в день (ARPDAU).

Из всего вышесказанного вытекает метод прогнозирования LTV, основанный на знании среднего времени жизни LT и дохода с одного пользователя в день.

Интегральные функции распределения
(функции ухода и удержания)

Рассмотрим некоторую неотрицательную непрерывную случайную величину t, которая является временем до возникновения интересующего нас события, а именно до «смерти»  — ухода пользователя. Плотность вероятности этой величины обозначим f(t). Как будет показано позднее, вид этой функции нас не интересует.

Возьмем интегральный закон распределения величины F(t). Данная функция говорит нам о вероятности того, что событие произойдет на промежутке времени [0, T):

Таким образом, F(t) — функция ухода пользователя. Очевидно, значения этой функции лежат на промежутке от 0 до 1. Чтобы не было сомнений, рассмотрим пример. Будем отсчитывать время жизни проекта с нуля (то есть нулевой день — первый день жизни проекта). Пусть в нулевой день в игру пришло N человек — вероятность ухода пользователя равна 0 (в нулевой день уходов не происходит). В следующий день вероятность пользователя уйти составляет, например, 0,5. Умножая эту вероятность на N, мы получим количество ушедших человек.

Нетрудно догадаться, что функция удержания описывает вероятность события, обратного уходу:

S(t) — функция удержания, которая получается путем аппроксимации (приближения — прим. ред.) наблюдательных данных Retention — Days степенной функцией (ax^b). В общем случае данная функция называется Survival function (функция выживаемости). Она применяется для прогнозирования исходов в медицине, социологии и так далее.

S(t) — вероятность того, что событие произойдет на промежутке времени [T, +∞), то есть не произойдет на [0, T):

Расчет lifetime

Перейдем непосредственно к расчету среднего времени, на котором произойдет уход пользователя — математическое ожидание величины t:

Заметим, что

Таким образом,

Интегрируем по частям:

Вспомним, что вероятность ухода в нулевой день равна F(0) = 0, а в последний день промежутка F(T) = 1 (все пользователи уйдут из проекта):

Следовательно,

В принципе, этого уже достаточно, чтобы посчитать среднее время жизни пользователя. Но мы привыкли работать не с уходом, а с удержанием (retention):

То есть среднее время жизни пользователя в проекте равно площади под функцией удержания:

Заключение

Остался последний шаг:

Теперь мы знаем, откуда берутся эти функции.

Используя инструмент, понимайте не только то, какой результат он выдаст, но и как он работает.

#Рынок_игр #метрика_LTV #Life_Time_Value #игровая_разработка

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Лена Очкова", "author_type": "self", "tags": ["\u0440\u044b\u043d\u043e\u043a_\u0438\u0433\u0440","\u043c\u0435\u0442\u0440\u0438\u043a\u0430_ltv","\u0438\u0433\u0440\u043e\u0432\u0430\u044f_\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430","life_time_value","gamedev"], "comments": 17, "likes": 15, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 15393, "is_wide": true }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15395' + '50799') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 15393, "author_id": 32927, "diff_limit": 1000, "urls": {"diff":"\/comments\/15393\/get","add":"\/comments\/15393\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/15393"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

17 комментариев 17 комм.

Популярные

По порядку

Написать комментарий...

Комментарий удален

8

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

Ответить

Комментарий удален

1

Считаете лучше использовать линейный интеграл векторного поля? Ну, результаты возможно будут чуть точнее, только стоит ли этот мизерный выигрыш усложнения вычислений?

Ответить
0

помню как работая маркетологом (зарплата 18 т.р.) в одной строительной компании в Татарстане (типа лидер рынка), спрогнозировал спрос через К-Р анализ, ну так чисто ради интереса. Директора, которые мнили из себя божками местного значения подумали что я просто гений эконометрики и маркетинга.
Вот тогда я офигел. Ведь лично в моем ВУЗе знания получается были сильнее, чем применяющиеся на практике методики в РТ

Ответить
0

Обычная ситуация, бизнесмены ведь не из аналитиков получаются.

Ответить
2

Что, кстати, не исключает, их божественности местного значения: у них ведь строительная компания, а у гения аналитики 18 тыр :)

Ответить
1

Только некоторые формулы написаны не совсем корректно. Так например, в первой формуле должно быть F(T) вместо F(t). Т е функция зависит от верхнего предела интеграла (от прожитого времени), а не от переменной функции плотности, по которой берется сам интеграл.

Ответить
0

Вы правы, но не до конца. В таком случае, необходимо записать переменную принадлежащую интервалу интегрирования, либо оставить t но с указанием знака двойной подстановки. Также t допустимо в случае, если в подинтегральном выражении использовать другое обозначение (например, x).

Ответить
0

В любом случае, хочу извиниться перед читателями за эту оплошность. Пытаясь донести основную мысль, слишком погрузился в поток.

Ответить
0

Не лучше NPV считать?

Ответить
1

NPV - это из другой оперы. Net Present Value - то, насколько больше можно получить при инвестировании в исследуемый проект по сравнению с другой общедоступной альтернативой, сопоставимой по срокам и рискам. NPV рассчитывают для оценки привлекательности проекта в целом для потенциального инвестора.

Ответить
0

LTV нужен не для оценки эффективности инвестиций (для этого, кстати, в геймдеве принято использовать ROI), а для определения характеристик проекта и рынка, на которые можно повлиять при оперировании.
В этом смысле LTV ближе к ARPDAU или K-factor'у, чем к ROI или NPV.

Ответить
0

Мне кажется, что тут есть некоторая ошибка. Если мы говорим чисто абстрактным языком функций, то и функция ухода и функция удержания определены на промежутке 0 - бесконечность. Поэтому интеграл должен быть определен на том же промежутке.

Ответить
1

Мы говорим языком теории вероятности. Пределы интегрирования следуют из интересующих нас событий.

Ответить
0

Достаточно вызывать окно при нажатии на кнопку закрыть: "Вы точно хотите покинуть этот сайт?"

Ответить
0

Спасибо вам за статью, полез вспоминать мат. анализ.
Но вот при прочтении никак не покидало ощущение, что что-то не так.
1. Сначала вы пишите "Плотность вероятности этой величины обозначим F(t).", дальше "F(t) - функция ухода пользователя." Может все-таки в формуле плотность вероятности - f(x)?

Ответить
0

Спасибо! В первоисточнике f малое. Безусловно, F(x) это интегральный закон. А f(x) - плотность вероятности.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Приложение-плацебо скачали
больше миллиона раз
Подписаться на push-уведомления