Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. Сколько денег приносят? (LTV)
  2.  
  3. LTV удобно считать по когортам. Что для этого нужно:
  4.  
  5. найти дату первой покупки каждого покупателя;
  6. вычислить число новых покупателей за каждую дату;
  7. добавить дату первой покупки в таблицу с заказами;
  8. сгруппировать таблицу и посчитать выручку.
  9. Дата первой покупки first_order_month мы уже высчитали отвечая на предыдущие вопросы
  10.  
  11. orders.head()
  12. order_date Revenue Uid first_order_date first_session_date delta_time first_order_month order_month
  13. 0 2017-06-01 00:10:00 17.00 10329302124590727494 2017-06-01 00:10:00 2017-06-01 00:09:00 00:01:00 2017-06-01 2017-06-01
  14. 1 2017-06-01 00:25:00 0.55 11627257723692907447 2017-06-01 00:25:00 2017-06-01 00:14:00 00:11:00 2017-06-01 2017-06-01
  15. 2 2017-06-01 00:27:00 0.37 17903680561304213844 2017-06-01 00:27:00 2017-06-01 00:25:00 00:02:00 2017-06-01 2017-06-01
  16. 3 2017-06-01 00:29:00 0.55 16109239769442553005 2017-06-01 00:29:00 2017-06-01 00:14:00 00:15:00 2017-06-01 2017-06-01
  17. 4 2017-06-01 07:58:00 0.37 14200605875248379450 2017-06-01 07:58:00 2017-06-01 07:31:00 00:27:00 2017-06-01 2017-06-01
  18. Посчитаем количество новых покупателей (n_buyers) за каждый месяц
  19.  
  20. cohort_sizes = orders.groupby('first_order_month').agg({'Uid': 'nunique'}).reset_index()
  21. cohort_sizes.columns = ['first_order_month', 'n_buyers']
  22. Сгруппируем таблицу заказов по месяцу первой покупки и месяцу каждого заказа и сложим выручку. Сбросим индекс методом reset_index()
  23.  
  24. cohorts = orders.groupby(['first_order_month','order_month']).agg({'Revenue': 'sum'}).reset_index()
  25. Строка таблицы cohorts показывает, какую выручку принесла когорта. Например, строка 0 сообщает, что покупатели, сделавшие свой первый заказ в июне 2017 года, в этом же месяце принесли суммарно 9557.49 рублей выручки.
  26.  
  27. cohorts.Revenue.describe()
  28. count 79.000000
  29. mean 3190.597468
  30. std 5392.641642
  31. min 3.420000
  32. 25% 491.365000
  33. 50% 1015.980000
  34. 75% 1866.795000
  35. max 21716.200000
  36. Name: Revenue, dtype: float64
  37. Для дальнейшего анализа воспользуемся инструкцией из тренажера в теме:"Юнит-экономика" урок: "Считаем экономику одного покупателя в интернет-магазине"
  38.  
  39. С точки зрения когортного анализа LTV — накопительная выручка когорты в пересчёте на количество людей. Добавим в таблицу cohorts данные о том, сколько людей первый раз совершили покупку в каждый месяц
  40.  
  41. report = pd.merge(cohort_sizes, cohorts, on='first_order_month')
  42. print(report.head())
  43. first_order_month n_buyers order_month Revenue
  44. 0 2017-06-01 2023 2017-06-01 9557.49
  45. 1 2017-06-01 2023 2017-07-01 981.82
  46. 2 2017-06-01 2023 2017-08-01 885.34
  47. 3 2017-06-01 2023 2017-09-01 1931.30
  48. 4 2017-06-01 2023 2017-10-01 2068.58
  49. Так как средняя маржинальность нам не известна предположим, что онас равна 50%
  50.  
  51. margin_rate = 0.5
  52. report['gp'] = report['Revenue'] * margin_rate
  53. report['age'] = (report['order_month'] - report['first_order_month']) / np.timedelta64(1, 'M')
  54. report['age'] = report['age'].round().astype('int')
  55. print(report.head())
  56. first_order_month n_buyers order_month Revenue gp age
  57. 0 2017-06-01 2023 2017-06-01 9557.49 4778.745 0
  58. 1 2017-06-01 2023 2017-07-01 981.82 490.910 1
  59. 2 2017-06-01 2023 2017-08-01 885.34 442.670 2
  60. 3 2017-06-01 2023 2017-09-01 1931.30 965.650 3
  61. 4 2017-06-01 2023 2017-10-01 2068.58 1034.290 4
  62. Наконец, найдём LTV. Разделим валовую прибыль когорт за каждый месяц на общее число пользователей в каждой когорте. Для наглядности визуализируем когорты в виде сводной таблицы
  63.  
  64. report['ltv'] = report['gp'] / report['n_buyers']
  65.  
  66. output = report.pivot_table(
  67. index='first_order_month',
  68. columns='age',
  69. values='ltv',
  70. aggfunc='mean').round()
  71.  
  72. output.fillna('')
  73. age 0 1 2 3 4 5 6 7 8 9 10 11
  74. first_order_month
  75. 2017-06-01 2.0 0 0 0 1 0 0 0 0 0 0 0
  76. 2017-07-01 3.0 0 0 0 0 0 0 0 0 0 0
  77. 2017-08-01 3.0 0 0 0 0 0 0 0 0 0
  78. 2017-09-01 3.0 1 0 2 0 0 0 0 0
  79. 2017-10-01 3.0 0 0 0 0 0 0 0
  80. 2017-11-01 3.0 0 0 0 0 0 0
  81. 2017-12-01 2.0 0 0 1 0 0
  82. 2018-01-01 2.0 0 0 0 0
  83. 2018-02-01 2.0 0 0 0
  84. 2018-03-01 2.0 0 0
  85. 2018-04-01 2.0 0
  86. 2018-05-01 2.0
  87. 2018-06-01 2.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement