无论是出售食品杂货、金融服务还是健身会籍,只有当新客户完成了再次购买时,才能称作是成功获客,而用来反映上述行为的指标被称为客户留存率。这是影响营收的关键指标之一,因为每当客户留存率较低时,企业就需要花费更多钱到市场营销上去获取新客户。
作为营销分析人员,如果你对SQL和数据库有足够了解,就可以很容易地在大量客户数据中得出与客户留存相关的数据,并提出留存率提升方面的建议。在这篇文章中,我们将——
-
逐步向你展示如何借助SQL语言开展基本的客户留存分析,
-
如何建立客户留存机制,
-
如何绘制新客户与现有客户的留存曲线,
-
以及如何进行同期群组的客户留存分析。
客户留存曲线
对于任何想要了解其客户的企业而言,客户留存曲线都是必不可少的分析形式,并在之后解释诸如销售数据或营销计划带来的影响等方面都能起到很大的辅助。客户留存曲线同时也是一种通过可视化手段可以快速分析客户与企业之间关键交互的简单易行的方法,可以识别出客户是否发生了回访,以及发生了第一次访问后,再之后的回访率表现如何。
绘制客户留存曲线的第一步是识别出一定时期内有访问记录的客户,可称之为P1。该阶段内,应注意所选的时间跨度是合理的,并且能反映出预期的访问频率。
不同类型的企业对客户回访频次的期望是不同的:例如一家咖啡馆可能偏向选择每周一次的回访频率;而一家超市则可能会选择更长的时间跨度,可能是两周或一个月。
在以下示例中,我们将以一个月为跨度(即P1),并假设我们将要研究在2016年1月产生的新客户在接下来的一年里,客户留存率表现如何。
如上所述,第一步是确定好原始客户群,找出2016年1月新生成的客户:
January_pool AS
(
SELECT DISTINCT cust_id
FROM dataset
WHERE month(transaction_date)=1
AND year(transaction_date)=2016)
接着,我们将查看这群客户接下来一年的行为:例如,在2016年1月之后的一年里,每月有多少客户回访?
SELECT Year(transaction_date),
Month(transaction_date),
count (DISTINCT cust_id) AS number
FROM dataset
WHERE year(transaction_date)=2016
AND cust_id IN january_pool
GROUP BY 1,
2
#1和2指的是第一个和第二个column,也就是Year和Month
如上述代码所示,前面一步SELECT出来的January_pool函数出现在了第二步中。假如我们在一月份有1000名新客户,通过上述SQL语句调取出来的数据结果可能如下:
那么,最终的图示就会如下:
客户留存率的变化趋势
上述的内容显然只是留存率分析的第一步,因为我们当然还希望了解客户留存率是否存在任何趋势,比如,留存率是否在变得越来越高,或是在某些时间会比其他时候更低?
因此,一种思路是:在一月访问的客户中,有多少人在二月进行了回访?在二月访问的客户中,又有多少在三月进行了回访?依此类推。
据此,可以通过几个简单步骤来构建一个迭代模型。首先,我们需要创建一张表,并按月记录每位客户的访问,要确保包括自业务开始运营以来的所有访问记录。以下示例假设开始日期是2000年,具体分析中可以根据你自己的业务情况进行调整。
Visit_log AS
SELECT cust_id,
datediff(month, ‘2000–01–01’, transaction_date) AS visit_month
FROM dataset
GROUP BY 1,2
ORDER BY 1,2
显示结果会如下所示:
之后,我们需要重新组织此信息,以识别每次访问之间的时间间隔。因此,对于每个人在每个月发生的访问,需要先获得其下次访问的时间。
Time_lapse AS
SELECT
cust_id,
lead(visit_month, 1) over (partition BY cust_id ORDER BY cust_id, visit_month)as visit_month
FROM visit_log
接下来,我们需要计算两次访问之间的时间间隔:
Time_diff_calculated AS
SELECT cust_id,
visit_month,
lead,
lead - visit_month AS time_diff
FROM time_lapse
需要注意,客户留存率衡量的是规定一段时间间隔后客户回访的比例。因此,我们需要将给定月份内访问的客户数量与下个月发生回访的客户数量进行比较。同时,我们也想定义出那些离开了一段时间后又回来的、以及再也不回来了的客户。为此,我们需要根据客户的访问情况对他们进行分类。
Custs_categorized AS
SELECT
cust_id,
visit_month,
CASE
WHEN time_diff=1 THEN ‘retained’,
WHEN time_diff>1 THEN ‘lagger’,
WHEN time_diff IS NULL THEN ‘lost’
END AS cust_type
FROM time_diff_calculated
最终,据此我们可以确定,在某个给定月份访问的客户数量,以及下个月回访的客户数量,并计算出各个月份回访客户的比例。
SELECT visit_month,
count(cust_id where cust_type=’retained’)/count(cust_id) AS retention
FROM custs_categorized
GROUP BY 1
其他客户留存分析方法
当然,客户留存率分析还有其他的分析思路和方法,尤其当我们需要研究回头客时。例如,P1阶段有100位客户,而在P2阶段其中有80位客户回访,那么在P3阶段中,我们需要努力去保留那原始的100位客户还是仅看这剩下的80位回访的客户?
以上示例只涉及了逐期留存,某些情况下,还需要对那些相对“滞后”、超过一个月才进行回访的客户进行分类。企业则希望通过有针对性的市场营销方式来奖励那些保持每月回访的客户,或者是采用一些激励手段,使得每月访问次数少于一次的客户更频繁地回访。
因此,另一种分析思路是计算任何给定月份中留存访客的比例,即计算回访客户人数和新客户人数。在这种情况下,我们可以稍做改变,不追踪下次访问,而是追踪上一次访问。
Time_lapse_2 AS
SELECT
cust_id,
Visit_month,
lag(visit_month, 1) over (partition BY cust_id ORDER BY cust_id, visit_month)
FROM visit_log
Time_diff_calculated_2 AS
SELECT
cust_id,
visit_month,
lag,
visit_month - lag AS time_diff
FROM time_lapse_2;
Cust_categorized AS
SELECT
cust_id,
visit_month,
CASE
WHEN time_diff=1 THEN 'retained',
WHEN time_diff>1 THEN 'returning',
WHEN time_diff IS NULL THEN 'new'
END AS cust_type
FROM time_diff_calculated_2
这样一来,计算任意给定月份每种类型客户的数量就很简单。
SELECT
visit_month,
cust_type,
Count(cust_id)
FROM custs_categorized
GROUP BY 1,2
数据导出后,即可绘制下图:
同期群组表格Cohort tables
分析客户留存率的一种流行的方法是通过同期群组分析,比如根据首次访问时间定义每个客户属于哪一类群组中,然后随着时间推移,查看他们返回应用或发生回购的情况如何。
理想情况下,最终的产出表格将如下图所示:
(表格中,竖排第一行表示客户加入的时间,通常按月划分,比如1就代表1月份;
第二行表示该月新获取客户数;
第三行到最后,表示新客户加入以后,接下来每个月留存下来的客户比例是多少,比如,第一个63%表示1月份新获得了511名客户,一个月过去了,这511名客户中继续留存下来的客户还剩63%。那么47%就表示两个月过去了,当初的511名客户现在还剩47%,以此类推)
理想情况下,我们会希望该表中显示的新客户数量能每个月都在增加,并且纵向比较留存率时,它们也是随着时间推移在提高。
为了构建前面的这样一张同期群留存率表,我们首先需要确定每个月的新客户数量以及他们留存的时间。然后,计算留存率百分比就会很容易。
我们的第一个子查询将根据每个客户的初次访问时间及其留存的时间长度来对其进行分类。
first_visit AS
SELECT
cust_id,
min(visit_month) AS first_month
FROM visit_log
GROUP BY 1
然后,我们就可以按月计算新客户数。
New_users AS
SELECT first_month,
count(DISTINCT cust_id) AS new_users
FROM first_visit
GROUP BY 1
我们还想获得一张图表,例如第1个月中的新客户是在第2个月和第3个月中返回还是仅在第3个月中返回。因此,我们将创建一个子查询,以允许我们可以跟踪每个客户的访问模式。
SELECT *
FROM visit_log
LEFT JOIN visit_log AS visit_tracker
ON visit_log.cust_id = visit_tracker.cust_id
AND visit_log.visit_month < visit_tracker.visit_month
然后,我们将以上几组子查询结合起来,最终就可以获得一张精美的图表。对于每个月获得的新客户,我们将他们归入到一个同期群组中,得到这一同期群组的人数,以及接下来的每个月中,当中回访客户所占这群人数的百分比,就像之前那张表格所示。
为此,我们可以运行以下脚本:
SELECT
first_month,
new_users,
retention_month,
retained,
retention_percent
FROM (SELECT
first_month,
new_users,
(visit_tracker.visit_month - visit_log.visit_month ) AS retention_month,
Count(DISTINCT visit_tracker.cust_id) AS retained,
Count(DISTINCT visit_tracker.cust_id)/new_users AS retention_percent
FROM first_visit
LEFT JOIN visit_log AS visit_tracker
ON visit_log.cust_id = visit_tracker.cust_id
AND visit_log.visit_month < visit_tracker.visit_month
LEFT JOIN new_users
ON new_users.first_month = first_visit.first_month
GROUP BY 1,
2
)t
最终结果将为我们提供一张如下所示的表:
然后,我们就可以在Excel(或类似工具)中创建数据透视表以获取开始展示的那张同期群留存率表。
同期群组分析解释
当然,得出这样的表格只是第一步,如果我们不知道如何解释当中的数字,那之前所做的一切都是无用的。
再次使用开始的那张表格,我将介绍同期群组分析的基础知识。
首先,我们将查看每月的新客户数量,判断我们是否正在为我们的业务获取到大量客户?在这里,可以看到我们每月获得了500至600个新客户。至于这是否是我们的目标,需要与营销团队进行讨论。
那么,我们需要关心的是每月的新客户数量是否在增加?如果没有,为什么?当中哪里是高峰,哪里是低谷?例如,我们可以看到在第6期中,新增客户只有504位,但是在第5期和第7期,分别有583和598位新客户,说明数字的波动很大。如果需要去解释为什么会出现这样的波动,可以是比如说我们是一家专门针对学校业务的公司,然后在此期间学校放了一周的假期,那就可以解释新增客户数可能是受此因素下降。所以对任何情况,我们都需要有一个解释。
接着再看实际的留存率。一个典型的商业目标是随着时间不断提高我们的客户留存率,比如,沿着纵向的一列百分比往下看,我们希望能看到一个数字保持增长的趋势。因此,如果对比第1期加入的新客户的留存率,第2期加入的新客户留存率更高,就说明我们的业务在步入正轨。
正如我们在上表中看到的:1个月后,第1期的新客户返回了63%,而第2期的新客户返回了68%,就说明我们做得不错!基本上,随着时间的推移,我们的客户体验应该要越来越好,因而人们才更有可能回来。
在那之后,我们要考虑的另一个指标就是留存率低到多少需要引起我们的警惕。可以预计的是,随着时间的流逝,留存率肯定会有所下降。这也是我们需要不断获取新客户的原因。但是,如果我们可以减缓客户流失,使每段周期之间的留存率下降幅度变小,那么我们就可以将更多的资源用于满足现有客户的需求,激励他们再消费,而不仅仅是尝试寻找新客户。毕竟,获取新客户的成本往往更高。
访问频率
到目前为止,我一直没有提到的一个因素是访问频率,这是客户留存率分析的另一方面。忠实客户的价值比新客户或是偶尔才消费的一些客户要高得多。
在表格中增添每位客户的访问量,每个月访问的次数,以及平均访问时间间隔,就可以更完整地了解客户是怎样与你的业务进行交互的。您还可以根据回头客带来的收入建立同期群组。
总结
客户留存分析可以让你对业务的了解更加深入,并使决策者不仅可以跟踪其获客策略的成功与否,而且可以了解他们在客户体验方面所做的表现如何。如果你的客户不回来,那么无论是从产品质量还是与客户之间的关系上来讲,都有一些工作还需要去做得更多更好。留存分析就可以为你标记出这些问题。
来源:oschina
链接:https://my.oschina.net/u/3204727/blog/3224590