【问题标题】:Month-over-month Customer Retention Rate in RR中的月度客户保留率
【发布时间】:2020-05-19 14:38:44
【问题描述】:

我正在尝试使用包含 390k 行的大型数据集来计算月度客户保留率的方法。基本上,我想知道一个月内出现在上个月的客户的百分比。

因此,如果上个月,客户 a、b 和 c 购买了产品。本月,客户 b、c 和 d 进行了购买。上个月的三位客户中有两位在本月进行了购买。请注意,d 上个月没有购买,因此本月不考虑,但下个月会考虑。

我在下面有一个简单但有代表性的数据框。

year_mon = c("2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Dec", "2018 Dec", "2018 Dec", "2019 Jan", "2019 Jan", "2019 Feb", "2019 Feb", "2019 Feb")

customer_id = c(1, 2, 3, 4, 5, 2, 3, 4, 3, 4, 1, 2, 3)

data.frame(customer_id, year_mon)

无论我有多少个月,我如何计算 CRR?也就是说,我不想要这种硬编码。如果我有连续 30 个月的数据或连续 3 个月的数据,我想要一个计算 CRR 的解决方案。

来自https://www.bitrix24.com/glossary/what-is-customer-retention-rate-definition.php

客户保留率 = ((EC-NC)/SC)*100,其中:

  • EC - 一段时期结束时的客户数量
  • NC - 在此期间的新客户数量
  • SC - 期间开始时的客户数量

假设您发布了一款手机游戏。 9 月 1 日,你有 1000 名玩家。到 9 月 30 日,您有 500 名新玩家,但有 200 名玩家停止玩游戏。因此,在一个时期结束时(在我们的例子中是一个月),您有 1300 名游戏客户。我们来计算留存率:

((1300-500)/1000)*100=80 

因此,您设法留住了 80% 的客户。每个行业都有自己的“好”和“坏”保留率。不用说,每家公司都试图保留最大比例的客户。

编辑 @r2evans 这里你提供的解决方案似乎在这两年的一月都有“重置”,这很奇怪。我证实在 12 月也有客户在 1 月出现,因此 CRR 不应该为零。我想知道是否有任何解释可以解释这一点。

【问题讨论】:

  • 你的日期真的是这样格式化的吗?它们既不是一致的("%b %Y""%Y %b")也不是可排序的("2018 Dec" before "2018 Nov")。您没有将该列设为Date 类是有原因的吗?
  • 您的代表性数据框是否应该具有不同的日期格式? 2018 Dec & Dec 2018
  • 什么是客户保留率?
  • @r2evans 我更正了日期格式。
  • 我明白了。但这似乎是一个与编程无关的问题,因为这是您编写代码之前的一步。因此,我无法为您提供正确的解决方案。我能做的最多就是给你一个近似值(即我会怎么做)。

标签: r


【解决方案1】:

这是看待它的一种方式:

dat2 <- dat %>%
  mutate(
    Date = as.Date(paste0(dat$year_mon, "01"), format = "%Y %b %d")
  ) %>%
  select(-year_mon) %>%
  arrange(Date) %>%
  group_by(customer_id) %>%
  mutate(
    stayed = c(FALSE, diff(as.POSIXlt(Date)$mon) %in% c(1L, -11L)),
    notnew = c(FALSE, rep(TRUE, n() - 1))
  ) %>%
  ungroup()
dat2
# # A tibble: 13 x 4
#    customer_id Date       stayed notnew
#          <dbl> <date>     <lgl>  <lgl> 
#  1           1 2018-11-01 FALSE  FALSE 
#  2           2 2018-11-01 FALSE  FALSE 
#  3           3 2018-11-01 FALSE  FALSE 
#  4           4 2018-11-01 FALSE  FALSE 
#  5           5 2018-11-01 FALSE  FALSE 
#  6           2 2018-12-01 TRUE   TRUE  
#  7           3 2018-12-01 TRUE   TRUE  
#  8           4 2018-12-01 TRUE   TRUE  
#  9           3 2019-01-01 TRUE   TRUE  
# 10           4 2019-01-01 TRUE   TRUE  
# 11           1 2019-02-01 FALSE  TRUE  
# 12           2 2019-02-01 FALSE  TRUE  
# 13           3 2019-02-01 TRUE   TRUE  

这告诉我们:客户是否从上个月到本月继续服务,如果没有,他们是否不是新客户(即间隔 1 个月或更长时间)。

例如...

dat2 %>%
  group_by(Date) %>%
  summarize(
    n_customers = n(),
    n_stayed = sum(stayed),
    n_new = sum(!notnew),
    n_returned = sum(notnew)
  ) %>%
  mutate(
    prev_n_customer = lag(n_customers),
    CRR = 100 * n_stayed / prev_n_customer
  )
# # A tibble: 4 x 7
#   Date       n_customers n_stayed n_new n_returned prev_n_customer   CRR
#   <date>           <int>    <int> <int>      <int>           <int> <dbl>
# 1 2018-11-01           5        0     5          0              NA  NA  
# 2 2018-12-01           3        3     0          3               5  60  
# 3 2019-01-01           2        2     0          2               3  66.7
# 4 2019-02-01           3        1     0          3               2  50  

鉴于您提供的数据,我怀疑 CRR 是正确的。 (此流程假设您拥有的数据是月份连续的,没有数据间断。如果此 dat2 可能有一个完全不在数据中的间断月份,那么我们需要将 lag(...) 逻辑修改为自加入。也许很小,我认为如果你有“可靠”的数据不太可能。)

更新以修复 12 月到 1 月的过渡(之前已重置)。


数据:

year_mon = c("2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Dec", "2018 Dec", "2018 Dec", "2019 Jan", "2019 Jan", "2019 Feb", "2019 Feb", "2019 Feb")
customer_id = c(1, 2, 3, 4, 5, 2, 3, 4, 3, 4, 1, 2, 3)
dat <- data.frame(customer_id, year_mon)

【讨论】:

  • 感谢您的回复,它似乎运作良好,但我确实有一个问题。将您的解决方案应用于我的数据后,我已经编辑了答案以包含输出的屏幕截图,并且我注意到每年 1 月的保留率为 0。出于某种原因,似乎每年的事情都在“重置”。我从 12 月和 1 月对客户列表进行了子集化,并使用“%in%”验证确实存在一些重叠最少。您知道解决方案在每年年初“重置”的任何原因吗?见截图。
  • 我明白了,是的。 (1)数据图像不好,一般我不尝试转录。该图像更糟糕,质量低下,难以阅读。现在不需要替换它,但是文本要好得多。 (2) 是的,问题是我只是diff(...) == 1。将其更改为diff(...) %in% c(1L, -11L)。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2021-10-07
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多