Что такое 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
- new MRR — первый платеж нового клиента
- old MRR — повторяющийся платеж клиента
- expansion MRR — увелечение MRR в связи с новым тарифом
- contraction MRR — уменьшение MRR в связи с новым тарифом
- churn MRR — отток MRR в связи с прекращением платежа
- 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))
Следующим шагом создадим список всех уникальных периодов.
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. Возьмём одного клиента 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()
Как мы видим весь доход от клиента равномерно размазался по месяцам.
Заключение
Разобрали расчет MMR. Конечно этот пример не самый боевой. Так в нем, например, нет примеров изменения тарифа у клиента.
Разговоры о Data Science – закрытый канал для общения на тему карьеры, развития профессиональных навыков и применения навыков на работе.