本文目录:
- 前言
- 项目准备
- 同期群分析的概念
- 数据概览
- 数据清洗
- 单月实现(单行数据)
- 遍历合并,最终实现同期群
一、前言
如今,拉新的成本越来越高,如何增加用户留存、提升用户的复购次数、增加用户的付费金额等变得尤为重要。同期群分析,是解决这些问题的一个非常重要的分析方法。
尽管有很多同期群分析的概念和思路的文章,但是就如何通过工具实现,很难找到自己合适的。基于此,本文将简单的介绍一下同期群分析的概念,并用 Python 实现同期群分析。
本文所涉及的完整实战数据和代码等,详见百度云网盘链接:
链接:https://pan.baidu.com/s/1_CTwkdzFbXNH9iZPoYm2bw
提取码:maz8
Ps:本文重代码工具实现,分析的思路及结论暂不涉及!
二、项目准备
Python
- 版本:3.6
- IDE:pycharm
- 库:pandas、pymysql
本文所用的数据集来源于:上一篇中,《Python读取Excel数据,插入到MySQL》的数据。
Dima:Python 读取 Excel 数据,并插入到MySQLzhuanlan.zhihu.com
数据集一共只包含6个字段,详见下图:
本文用到的SQL数据源
三、同期群分析的概念
3.1 同期群分析的含义
同期群,即相同时间内具有相似或特定属性 、行为的群体。核心要素为:时间 + 特定属性,如:把9月份注册APP的用户,划分为一个群组。
同期群分析,指将用户进行同期群划分后,对比不同同期群用户的相同指标。我们常说的留存率,就是同期群分析的其中一种。
同期群分析的核心:关注新增与留存。
同期群分析包含了3个重要元素:
- 客户首次行为时间,这是我们划分同期群的依据;
- 时间维度,如:+N月或者N日留存率中的N日;
- 指标,如:注册转化率、付款转化率、留存率等等。
3.2 同期群分析的意义
同期群分析,给到更加细致的衡量指标,帮助我们实时监控真实的用户行为、衡量用户价值,并为营销方案的优化和改进提供支撑;
横向比较:观察同一同期群在不同生命周期下的行为变化,推测相似群体的行为随时间的变化;
纵向比较:观察不同的同期群在同一个生命周期下的行为变化,验证业务行为是否取得预期效果。
其他《同期群》相关,可参考:
李启方:数据分析里经常听到的同期群,究竟是个啥?zhuanlan.zhihu.com
3.3 实现用户同期群的思路
如上图,这张表的每一行,代表一个同期群,而他们的本质逻辑是一样的。
首先,计算出当月新增的客户数,并记录客户昵称;
其次,拿这部分客户,分别去和后面每个月购买的客户做匹配,并统计有多少客户出现复购(留存);
最后,我们计算出每个月的新增客户和对应留存情况,把这些数据拼接在一起,就得到了同期群留存表。
四、数据概览
首先:拿到数据的第一步,自然是了解数据的情况。针对本次同期群分析,我们可能需要用到的字段有:
- nick_name:客户昵称
- pay_time:付款时间
- order_status:订单状态,含:交易失败/交易成功
- pay_amount:支付金额
- purchase_quantity:购买数量
通过多次计算,可以发现付款时间中缺失值所在行的订单状态均为“交易失败”,那么下文中,都需要将订单状态为“交易失败”的行全部剔除。
针对此份数据,有3个分析方向可以选择:
- 留存率或付款率
- 人均付款金额
- 人均购买次数
本文中,我们选择其中最经典,也是数分面试中最常考的留存率作为例子,需要用到的字段有:
- nick_name:客户昵称
- pay_time:付款时间
- order_status:订单状态,含:交易失败/交易成功
- pay_amount:支付金额
在本次的分析中,留存率的具体计算方式为:+N月留存率=(+N月付款用户数/首月付款用户数)*100%。
特别注意:公式中的+N月存在歧义,会有两种计算方法:
- 第一种:以自然月作为月份偏移的依据。即所有首次行为在9月的用户,只要10月有付款行为,都计算进+1月留存
- 第二种:以每30天作为月份偏移的依据。即9月30日首次付款的用户,在10月30日-11月29日之间有付款行为,才计算进+1月留存
本文采用第一种计算方法来实现,后面的文章中会采用第二种来实现。
五、数据清洗
全部封装,方便调用
清洗部分,不是本文的重点,不再赘述!
六、单月实现(单行数据)
实现后的效果,是一个单行的数据。如下图所示:
+1 月,代表 2019-10 加1个月的用户留存情况,即 2019-11月
此处,先用一个单月实现,详细阐述一下,同期群实现的底层原理及方法。只需要实现一个月的计算逻辑,其他月份套用即可。
由于原始数据中,订单日期是不是月份,我们先处理一下订单日期;
自定义处理单月的逻辑,调用方法,先放在前面,后文不再截图
查看订单源数据,可知是从2019年9月开始,到2020年2月。此处,我们以2019年10月的数据为样板,实现单行的同期群分析。
拿到 2019-10 的客户昵称,并记录 客户昵称
接下来,我们要计算的是每个月的新增客户数,这个新增,是需要和之前的月份遍历匹配来验证的,2019年10月之前的客户就是2019年9月的数据:
与 2019-09 比较,拿到 2019-10 的新增客户数
然后,把2019-10 之后每个月产生订单的客户昵称,与 2019-10 的客户昵称进行匹配,计算出每个月的留存情况:
最后,把最开始的当月(2019-10)的新增客户,加入到列表:
至此,我们以2019年10月为样板月,匹配出当月纯新增客户,接着再以月的维度,对后续每个月的客户进行遍历,验证客户留存数量。
我们其他月份的新增和留存计算分析逻辑,也是如此。
七、遍历合并,最终实现同期群
后文会对两处红色标注位置,单独拎出来,详细说明一下!
最终输出的结果,这里其实还可以变形,改成百分比方式
大多数情况下,数据是以留存率的形式体现,再稍做加工即可:
前文中,两处标红位置,我第一次做的时候,也是绕了很久,这里详细说明一下:
红色标注1
打印输出结果整理
由上可知:len(month_list) = 6,则:range(len(month_list)-1),即 range(5),range是左包右不包。则是[0,1,2,3,4]。
第一次for循环,i = 0。for 循环内部嵌套的 for 循环,是 range(1, 6) 和 range(0, 5) 组合;即:1 0 、2 1 、3 2 、4 3 、5 4。
i=0,则是起始月 2019-09,for 循环内部的for循环,要依次循环寻找下一个月,直到找到最后一月为止。由数据源可知:到2020-02,依次计算下一个月,后面还有5个月。因此 order 的取数参数 j 需要的是第一个range(1, 6)。因为 0 是起始月,所以后面每次循环,都需要不断的+1!
上图中,在i=0的情况下,而range(0,5) 请看第一行,[0,1,2,3,4]就分别对应 +1月、+2月、+3月、+4月、+5月。在i=1或 i>1 后,后面就会出现有些月份是没有数据的,就全部为0!
第二次for循环,i = 1。for 循环内部嵌套的 for 循环,是 range(2, 6) 和 range(0, 5) 组合;即:2 0 、3 1 、4 2 、5 3。
i=1,则是起始月 2019-10,for 循环内部的for循环,要依次循环寻找下一个月,直到找到最后一月为止。由数据源可知:到2020-02,依次计算下一个月,后面还有4个月。因此 order 的取数参数 j 需要 range(2, 6)。
...
最后一次for循环,i = 4。for 循环内部嵌套的 for 循环,是 range(5, 6) 和 range(0, 5) 组合;即 5 0;......
这里的核心在于:zip 两个range 函数,第一个是order 取数的位置参数,第二个是往count中插入留存用户数据的位置参数,比较精髓,需要仔细深入理解一下!
第二个标注为红色的位置:
转置问题