График показателя удержания пользователей (Retention) имеет схожий вид и для веб-, и для мобильных приложений, а также для интернет-магазинов и многих офлайн-продуктов:
– в первые дни (недели, месяцы) он резко падает: пользователи не успевают пройти обучающий этап (онбординг) и не остаются в проекте;
– затем те, кто все же остался, понемногу отпадают, но уже не с такой скоростью, как в самом начале;
– наконец, затем, когда база пользователей уже сформирована, график выходит на плато, которое лишь едва снижается, и чем больше прошло времени, тем больше график похож на горизонтальную линию.
Графически Retention выглядит примерно так:

Такую кривую еще называют «кривой забывания» (forgetting curve), потому что ею же описывается процесс забывания человеком полученной информации.
Иногда может возникнуть следующая ситуация: у вас есть значения удержания за какие-то фиксированные периоды (1 день, 7 дней, 30 дней), и вы хотите узнать значения показателя за промежуточные периоды (6 дней, 14 дней, 23 дня) или после них (35 дней).
Это может пригодиться, если вы хотите прогнозировать Lifetime, или LTV (Lifetime Value), а также просто планируете, сколько из ныне активных пользователей останутся таковыми в будущем.
Мы умышленно выбрали бесплатные и общедоступные инструменты для решения задачи, чтобы вы впоследствии могли сделать то же самое самостоятельно:
– Open Office, а именно его электронные таблицы и «Решатель» (Solver) во вкладке «Сервис»;
– «Нелинейный решатель», который нужно поставить отдельным бесплатным плагином.
Мы будем пользоваться механизмом аппроксимации, то есть приближением фактических значений математическими формулами. Делая аппроксимацию, важно, во‐первых, выбрать правильную функцию (которая изгибалась бы в нужных местах) и верно подобрать ее коэффициенты, чтобы разница между моделью и фактом была минимальной.
Итак, какой же из функций можно аппроксимировать Retention?
На ум (тем, кто заканчивал школьный курс математики) приходит гипербола, и это верная ассоциация.

Рассмотрим несколько гиперболических уравнений (X в уравнении означает номер периода: дня, недели или месяца). Начнем с простого уравнения гиперболы A/X, затем будем усложнять его, добавляя различные коэффициенты:
– retention = ;
– retention = ;
– retention = ;
– retention = .
A, B, C, D – коэффициенты, которые нам предстоит найти.
Наша задача – выбрать оптимальное из этих уравнений. Итогом каждого из уравнений будет отдельная кривая, мы будем сравнивать эту модельную кривую с фактическими значениями (которые, надо сказать, не всегда идеально вписываются в модель) и выберем ту из кривых, которая лучше повторяет факт.
Критерием будет минимум суммы квадратов отклонений (что означает, что мы воспользовались методом наименьших квадратов) между фактическими и модельными значениями.
В Excel это делается с помощью СУММКВРАЗН (SUMXMY2). В Open Office эта функция нами не обнаружена, но это не проблема: рассчитываем в отдельном столбце отклонения (просто как разность между модельными и фактическими значениями), возводим их в квадрат, а затем суммируем квадраты отклонений.
Для оптимизации нам пригодится Solver. Притом, учитывая и квадраты отклонений, и гиперболический вид функции, решатель нужен именно нелинейный.
Здесь и далее мы пользовались поочередно DEPS Evolutionary Algorithm и SCO Evolutionary Algorithm, за стартовые данные новой итерации брали значения коэффициентов, полученные на предыдущей итерации. Процесс заканчивался тогда, когда сумма квадратов отклонений с новой итерацией уменьшалась не более чем на 0,01.
Возьмем за исходные данные показатели удержания неназываемого проекта за 28 дней. По горизонтали – дни в игре, по вертикали – проценты Retention.

Как видно из графика, данные далеко не идеальны, и для нашей задачи это отлично подходит. Редко на практике вы получаете в руки идеальные данные, а задачу решать все равно надо.
Будем пытаться для каждой из выбранных функций подобрать такие значения коэффициентов, чтобы построить кривую, как можно более близкую к исходным данным. Подбирать будем такие значения, которые по методу наименьших квадратов дадут нам максимальное сходство нашей модели с фактическими значениями.
Вот что получается:

Как видно, желтая () и красная () линии совпали, но от исходной кривой они очень далеки.
А вот зеленая () и бордовая () линии довольно точно повторили исходную кривую.
При этом бордовая линия, если судить по сумме квадратов отклонений, повторяет стартовые данные точнее всего:
Мы смотрим на то из уравнений, где сумма квадратов отклонений минимальна.
Таким образом, мы прощаемся с уравнениями и и идем дальше.
Если обратить внимание на кривую, то видно, что с каждым днем она меняется все меньше. Нам это напомнило логарифмическую кривую, и мы подумали: «А что если вместо X в уравнение подставить LN(X), не улучшит ли это наши результаты?»
Поэтому следующим шагом давайте сравним результаты лучшей функции с X и LN(X). Единственное, в одном из случаев добавим под логарифм коэффициент E:
– retention = ;
– retention = ;
– retention = ;
– retention = .
Визуально все четыре кривые справились достаточно неплохо, однако давайте все же рассмотрим квадраты отклонений:

Какие выводы можно сделать?
– Лучше всего аппроксимируют кривые с четырьмя и пятью переменными.
– Замена X на LN(X) пусть и немного, но улучшает аппроксимацию.
На этом этапе мы прощаемся с кривой . Она не выдержала конкуренции.
Остались три кривые, однако неизвестно, как они работают на длинных дистанциях. Мы тестировали их лишь на первых 28 днях. Вполне вероятен случай, что если вместо X подставить большое значение (скажем, 365), то они уйдут в минус, что невозможно по определению Retention.
Поэтому, раз уж мы определили трех финалистов, давайте следующим этапом протестируем, как они могут справляться с более долгосрочным Retention.
Мы просто взяли несколько примеров долгосрочного Retention из интернета и протестировали наши кривые на каждом из них:
– за 90 дней;
– за 540 дней (18 месяцев);
– за 720 дней.
Пример про 720 дней рассмотрим графически.
Данные взяты из статьи How to measure the success of your app, и в данном случае мы пытались повторить приведенную статистику по удержанию в социальной сети.


Видно, что все три кривые хорошо справились с аппроксимацией, однако красная линия более выдается на фоне синей – отклонение у нее максимальное.
Теперь делимся результатами по всем трем примерам (напомним, чем меньше сумма квадратов отклонений, тем лучше):

Если бы это был чемпионат, то победила бы последняя кривая. Однако, согласитесь, ее преимущество не так явно, особенно учитывая, как мало отличаются друг от друга значения суммы квадратов отклонений. Поэтому победителями (как на детском празднике) мы признаем все три кривые, и все три кривые мы можем рекомендовать для аппроксимации Retention.
Также хотелось бы рассказать про значение каждого из коэффициентов на примере функции .

Вывод:
для аппроксимации Retention хорошо подходят три вида кривых:
– retention = ;
– retention = ;
– retention = .
Победителей мы огласили, теперь хотим отметить несколько важных моментов, которые нужно иметь в виду при аппроксимации Retention.
1. Если у вас мало исходных точек, то лучше использовать ту кривую, в которой меньше коэффициентов. И запомните: никогда не используйте кривую, у которой неизвестных коэффициентов больше, чем точек! Скажем, если у вас есть лишь три точки Retention (допустим, 1, 7 и 28-го дня), то максимальное количество коэффицентов, которые вы можете использовать, – это три, и в этом случае лучше всего подойдет функция .
2. Вы всегда вольны менять оптимизационную функцию как вздумается (мы воспользовались стандартным МНК и применили простую сумму квадратов отклонений). Допустим, вам не так важно поведение Retention в другие периоды, но вы хотите, чтобы модельное и фактические значения Retention точь-в-точь совпали на 180 днях. Поэтому для оптимизационной функции отклонение на 180 днях можно взять с большим коэффициентом или в большой степени.
3. Мы даем вам не универсальную рекомендацию, а просто наш опыт решения нескольких разовых задач. Не исключено, что есть и другие функции, более точно аппроксимирующие показатели удержания. Но функции, которые мы использовали, дали хороший результат. Они сложны, и, вероятно, для некоторых задач подойдут и более простые функции типа того же логарифма. Но для моих задач эти сложные функции сработали отлично.
Кейс из практики: как BlackTemple улучшили конверсию туториала с 29 до 65 %
EpicMine – казуальная игра от питерской студии BlackTemple, команда состоит из четырех человек. Небольшая, но важная деталь: у двух разработчиков есть свои игровые каналы на YouTube (300 тыс. подписчиков, 2,6 млн подписчиков), и это в некоторой мере повлияло на игру и решения по ней (об этом позже).
Игра рассчитана на фанатов Minecraft, то есть молодых игроков до 16 лет. Геймплей разделен на две основные составляющие.
– Шахта: туда-сюда движется полоса прицела, во время движения надо попадать по разноцветным точкам и рушить стены. Рушим стены – добываем ресурсы, находим сундуки, докапываемся до новых шахт.
– Деревня: в деревне переплавляем добытые ресурсы в слитки, взламываем сундуки, создаем новые кирки. Без взлома сундуков не достать ключики, а без ключиков не открыть новые ярусы с шахтами.
Шахты сгруппированы по ярусам, в одном ярусе шесть шахт. Чтобы перейти на следующий, надо победить босса в конце яруса и открыть каменную дверь, для которой нужны ключики из сундуков.
В процессе обучения игрок полностью проходит один ярус, то есть шесть шахт.
Между делом игрок обучается созданию кирок, переплавке ресурсов, прокачке навыков и взлому сундуков.
Сейчас игра выпущена в странах СНГ, а первый запуск был в Беларуси.
В первой версии игры воронка прохождения туториала была вот такой:

Отчет Tutorial steps в devtodev показывает воронку перемещения игроков по шагам обучающего этапа.
Первая колонка – номер шага обучения. Вторая – число игроков, побывавших на этом шаге. Третья – то же, что и вторая, только в процентном соотношении.
Полный список шагов
1. Стартовый видеоролик просмотрен
2. Подсказки по обучению пройдены
3. Кузнец встречает нас после шахты
4. Кузнец отправляет в шахту
5. Завершение 2-й шахты
6. Подарок в 50 камней от жителей
7. Показывают, как начать переплавку
8. Забираем переплавленные ресурсы
9. Создана каменная кирка
10. Игрок нашел первый сундук
11. Начало открытия сундука
12. Открытие сундука за хард
13. Получение в подарок ключей
14. Показ скиллов
15. Показ ежедневных заданий (дейликов)
16. Встреча с боссом
17. Первая смерть на боссе
18. Вторая смерть на боссе
19. Открытие 2-го яруса
20. Получение способности кидаться огненными шарами
На графике мы отметили четыре основных места «отвала» игроков.

По итогам изучения отчета были сформированы гипотезы, что не так в игре. Гипотезы таковы.
Начало игры слишком требовательно к реакции. Хотя разработчикам казалось, что проще уже некуда.
Резкий скачок сложности между ознакомительной шахтой и той, которую надо пройти целиком самостоятельно. В первой было 5 стен, которые надо разрушить, а во второй – сразу 10.
Те, кто прошел вторую шахту, не видели смысла копаться в третьей, хотя по плану они там должны были найти первый сундук.
После третьей шахты у людей пропадал интерес и мотивация идти дальше, так как там игра уже не «вела игрока за ручку», и разработчики рассчитывали, что он сам дойдет до конца яруса.
Босс слишком сложен.
Что было дальше?
Дальше разработчики нашли в сети видео, где реальные игроки разбирались в EpicMine, и по этим роликам выделили еще несколько недостатков. В итоге, приняв все гипотезы, разработчики отправились исправлять найденное, и через несколько итераций по доработке туториала график стал выглядеть вот так:

Как видим, отвал на четырех проблемных шагах сгладился, и в результате общая конверсия увеличилась почти до 66 %.
Такой результат достигнут благодаря предпринятым изменениям.
Что именно было сделано?
Сложность стала нарастать очень плавно.
Теперь игра ведет игрока «за ручку» до самого конца обучения: добавились стрелки в те места, про которые разработчики раньше думали, что «и так нажмут»; появилась блокировка экрана, когда игрок может уйти куда-то не туда.
В «скучные» места добавлены диалоги и задания.
Босса теперь нельзя убить «с ходу»: сначала нужно реализовать прокачку, и после этого босс разносится на раз-два. Так перед игроком дополнительно закрепляется важность прокачки, которую до этого просто один раз показывали на экране деревни.
Стоит также сказать, что и наличие летсплеев играет на руку разработчику, в частности метрике конверсии туториала: посмотрев, как нужно играть и как справляться с проблемными местами, игрок приходит в игру и не испытывает проблем на этапе обучения.
Проблему оптимизации удержания, особенно краткосрочного, стоит начинать с оптимизации первой сессии, выделять наиболее проблемные места и исправлять их. Это, как правило, обходится довольно дешево, происходит быстро и имеет эффект рычага: небольшое изменение в игре приводит к заметному изменению в ее метриках.
Так и в нашем кейсе: исправление туториала прошло довольно быстро и заняло лишь несколько недель, а конверсия его выросла более чем вдвое. Важно сказать, что туториал при этом не стал короче, то есть мы нашли способ на той же продолжительности обучения увеличить конверсию. Попросту говоря, при минимальных изменениях здесь удалось увеличить долю игроков, остающихся в игре, более чем в два раза.