Заметки про Machine Learning, Data Science и Analytics Engineering

Расчет Monthly Recurring Revenue (MRR) в Python

Что такое Monthly Recurring Revenue?

Monthly Recurring Revenue — регулярный месячный доход. Эта метрика применяется в основном в подписных моделях. При этом сам доход нужно привести к месяцам.

Почему это ценно?

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

Постановка задачи

Для этой задачи используйте новый датасет: https://alimbekov.com/wp-content/uploads/2021/03/mrr.csv

Структура:

  • customer_id — знакомый нам уже ID клиента
  • first_order — Дата началы подписки
  • EndDate — Дата окончания подписки
  • rate — план подписки (месячный, полугодовой, годовой)
  • Amount — оплаченная сумма
  • commission — коммисия платежный систем

Будем использовать следующую формулу для расчёта MRR: MRR = new + old + expansion + reactivation — churn — contraction

  1. new MRR — первый платеж нового клиента
  2. old MRR — повторяющийся платеж клиента
  3. expansion MRR — увелечение MRR в связи с новым тарифом
  4. contraction MRR — уменьшение MRR в связи с новым тарифом
  5. churn MRR — отток MRR в связи с прекращением платежа
  6. reactivation MRR — возврат клиента, у которого был отток MRR

Реализация расчета Monthly Recurring Revenue (MRR) в Python

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib as mpl
pd.set_option('max_columns', 50)
mpl.rcParams['lines.linewidth'] = 2
%matplotlib inline
sns.set_context(
     "notebook", 
     font_scale = 1.5,       
     rc = { 
         "figure.figsize" : (30, 30), 
         "axes.titlesize" : 18 
     }
 )
df_mrr = pd.read_csv('mrr.csv')

Импортируем все необходимые библиотеки и считаем файл.

Давайте теперь сделаем несколько необходимых расчетов для дальнейшей работы. Приведем все даты к нужному формату, вычислим длительность подписки, извлечем месяц и год из даты подписки, посчитаем сумму за вычетом комиссии (комиссия везде 5%) и узнаем сумму, которую мы получаем в месяц.

df_mrr['first_order'] = pd.to_datetime(df_mrr['first_order'])
df_mrr['EndDate'] = pd.to_datetime(df_mrr['EndDate'])
df_mrr['Period'] = (df_mrr.EndDate.dt.to_period('M').astype(int) - df_mrr.first_order.dt.to_period('M').astype(int))
df_mrr['mmr_period'] = pd.to_datetime(df_mrr['first_order']).dt.to_period('M')
df_mrr['price_after_commission'] = df_mrr['Amount']*0.95
df_mrr['Amount_per_month'] = df_mrr['price_after_commission']/df_mrr['Period']
print(df_mrr.head(2))

Таблица для расчета MMR
Таблица для расчета MMR

Следующим шагом создадим список всех уникальных периодов.

periods = df_mrr.mmr_period.sort_values(ascending=True).unique().astype(str).tolist()

Теперь мы готовы рассчитать MMR. Основная идея рассчитывать сумму с учетом даты окончания и начала подписки. Мы таким образом размажем весь платеж по периоду действия подписки.

mrr=[]
for mdate in periods:
         my_df = df_mrr[(df_mrr['EndDate'].dt.to_period('M')>mdate ) 
                      & (df_mrr['first_order'].dt.to_period('M')<= mdate)]
         mmrr = my_df['Amount_per_month'].sum()
         mrr.append({'date':mdate,'mmrr':mmrr})

Визуализируем то, что у нас получилось.

dates = [x['date'] for x in mrr]
y = [x['mmrr'] for x in mrr]
sns.set()
plt.figure(figsize=(40,10))
plt.title('MRR by month')
plt.ylabel('total')
plt.bar(dates, y)
plt.rc('font',**{'family' : 'normal',
         'weight' : 'bold',
         'size'   : 60})
plt.show()
Визуализация MMR
Визуализация MMR

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

Проверка расчёта

Давайте сделаем небольшую и наглядную проверку расчета MMR. Возьмём одного клиента customer_id = 084a0e74918bd829d509441c2504135e

test_df = df_mrr[df_mrr.customer_id=='084a0e74918bd829d509441c2504135e']
mrr = []
 for mdate in periods:
          my_df = test_df[(test_df['EndDate'].dt.to_period('M')>mdate ) 
                       & (test_df['first_order'].dt.to_period('M')<= mdate)]
          mmrr = my_df['Amount_per_month'].sum()
          mrr.append({'date':mdate,'mmrr':mmrr})
dates = [x['date'] for x in mrr]
y = [x['mmrr'] for x in mrr]
print(mrr)
sns.set()
plt.figure(figsize=(40,10))
plt.title('MRR by month')
plt.ylabel('total')
plt.bar(dates, y)
plt.rc('font',**{'family' : 'normal',
         'weight' : 'bold',
         'size'   : 60})
plt.show()
MRR по одному клиенту
MRR по одному клиенту

Как мы видим весь доход от клиента равномерно размазался по месяцам.

Заключение

Разобрали расчет MMR. Конечно этот пример не самый боевой. Так в нем, например, нет примеров изменения тарифа у клиента.

Share it

Если вам понравилась заметка - подписывайтесь на мой канал в телеграме https://t.me/renat_alimbekov или вы можете поддержать меня Patreon logo Патреон


Интересные записи в этой рубрике: