В этой заметке хочу разобрать как вручную посчитать 3 вида метрики Retention с помощью Python и Pandas и нарисовать кривую Retention с помощью Matplotlib. Чаще всего для анализа данных и метрик любой продакт будет использовать аналитическую систему, но предположим, что наш продакт попал на необитаемый остров и под рукой у него оказались только интерпретатор Python-скриптов и несколько дополнительных библиотек; этим и воспользуемся.
Для начала, в двух словах напомню про метрику и ее виды; как они считаются.
✹ Classic Retention Rate (удержание) — это метрика, которая показывает процент пользователей, вернувшихся в продукт в конкретный день N (неделю N, месяц N, квартал N, etc.) с момента первого посещения. Например, если в день 0 пришло 100 новых пользователей, а в 1-й день вернулось 15, то Retention 1-го дня — 15 / 100 = 15%.
✹ Rolling Retention Rate (повторяющееся удержание) — показывает процент пользователей, вернувшихся в продукт в день N или позже с момента первого посещения. Например, два пользователя впервые посетили продукт в один и тот же день (день 0). Один из них вернулся в 1-й день, второй — на 5-й день. Они оба будут считаться вернувшимися в 1-й день.
✹ Full Retention Rate (полное удержание) — показывает процент пользователей, заходивших в приложение каждый день до дня N с момента первого посещения. Например, Full Retention Rate 3-го дня — это процент пользователей, которые заходили в продукт в 1-й, 2-й и 3-й дни с момента первого посещения.
Retention можно считать в окнах разного размера: по дням; по неделям; по месяцам; по кварталам. Далее в заметке будем работать с дневным Retention.
На GoPractice есть замечательные подробные статьи по метрикам Retention и деже референсным значениям: [раз], [два] и [три]. Я далее сосредоточусь на том, как эти метрики считать вручную.
Данные для исследования
Для расчетов будем использовать синтетический dataset состоящий из двух полей (столбцов): «user_id» — уникальный ID пользователя; «date» — дата посещения продукта. Исходный dataset можно найти по ссылке, вот так выглядят его первые 10 строк:
Подключаем необходимые библиотеки и загружаем его в Pandas Dataframe.
Считаем Classic Retention
Теперь напишем функцию calculate_classic_retention, которая по переданному DataFrame будет расчитывать Classic Retention для нужных нам дней. DataFrame и список нужных дней будем передавать на вход функции.
Для вычислений понадобится создать две дополнительные колонки в таблице (DataFrame): start_date — дата первого посещения продукта пользователем; day — кол-во дней от даты первого посещения до даты текущего посещения.
Тогда для вычисления Retention N-дня нам понадобится просто посчитать кол-во строк в колонке day (с уникальными user_id) и разделить его на кол-во всех пользователей когорты.
Для визуализации кривой Retention я написал функцию plt_show, на вход которой нужно передать days — список номеров дней; retention — список вычисленных значений Retention для дней days; xs — список номеров дней, которые нужно подсветить на графике.
Посчитаем Classic Retention и постоим его кривую, отметим значения для 1-го, 7-го, 28-го и 56-го дней. И увидим, что на нашем синтетическом датасете синтетически-замечатльные значения метрики — значительно превосходящие правило «40 — 20 — 10».

Видим, что на следующий день после первого захода в продукт — вернулось 70% пользователей, на 7 день — 36%, на 28 день — 20%. Примерно через 30 дней кривая выходит на плато, т. е. для продукта найдет Product/Market Fit.
Считаем Rolling Retention
Напишем функцию calculate_rolling_retention, которая по своей логике будет практически полностью совпадать с предыдущей функцией. За исключением одного условия — теперь выберем записи, в которых порядковый номер дня более или равен дню, за который мы считаем значение метрики.
Вот это условие:
А вот весь код функции:
И результат вычислений:

Видим, что со следующего дня после первого захода в продукт — вернулось 93% пользователей, с 7 дня — 69%, с 28 день — 46%.
Считаем Full Retention
И наконец напишем функцию для расчета Full Retention.

Видим, что 70% пользователей вернулись в продукт на следующий день после первого знакомства с ним. И поскольку это значение метрики совпадает со значением Classic Retention, вероятно в вычислениях я не ошибся:). 22% пользователей заходили в продукт ежедневно на протяжении 3 дней; и только 2% пользователей заходили в продукт ежедневно на протяжении 6 дней.
Выводы виде коротких тезисов
- Исходные коды в [Google Colab] и на [GitHub], во-первых.
- Не существует универсальных параметров для расчета Retention для любого продукта. От специфики продукта или текущих целей продукта зависит подходящий вид метрики, окно, референсные значения.
- Тем не менее, Classic Retention более популярный показатель, чем Rolling или Full Retention.
- Посчитать метрики вручную достаточно просто, но нужна небольшая практика в инструментах продуктовой аналитики.