本文目录:

  • 前言
  • 项目准备
  • 同期群分析的概念
  • 数据概览
  • 数据清洗
  • 单月实现(单行数据)
  • 遍历合并,最终实现同期群

一、前言

如今,拉新的成本越来越高,如何增加用户留存、提升用户的复购次数、增加用户的付费金额等变得尤为重要。同期群分析,是解决这些问题的一个非常重要的分析方法。

尽管有很多同期群分析的概念和思路的文章,但是就如何通过工具实现,很难找到自己合适的。基于此,本文将简单的介绍一下同期群分析的概念,并用 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个字段,详见下图:




python shangyue python 上月同期_for循环


本文用到的SQL数据源

三、同期群分析的概念

3.1 同期群分析的含义

同期群,即相同时间内具有相似或特定属性 、行为的群体。核心要素为:时间 + 特定属性,如:把9月份注册APP的用户,划分为一个群组。

同期群分析指将用户进行同期群划分后,对比不同同期群用户的相同指标。我们常说的留存率,就是同期群分析的其中一种。

同期群分析的核心:关注新增与留存

同期群分析包含了3个重要元素:

  • 客户首次行为时间,这是我们划分同期群的依据;
  • 时间维度,如:+N月或者N日留存率中的N日;
  • 指标,如:注册转化率、付款转化率、留存率等等。

3.2 同期群分析的意义

同期群分析,给到更加细致的衡量指标,帮助我们实时监控真实的用户行为、衡量用户价值,并为营销方案的优化和改进提供支撑;

横向比较:观察同一同期群在不同生命周期下的行为变化,推测相似群体的行为随时间的变化;

纵向比较:观察不同的同期群在同一个生命周期下的行为变化,验证业务行为是否取得预期效果。

其他《同期群》相关,可参考:


李启方:数据分析里经常听到的同期群,究竟是个啥?zhuanlan.zhihu.com

python shangyue python 上月同期_数据_02


3.3 实现用户同期群的思路


python shangyue python 上月同期_python shangyue_03


如上图,这张表的每一行,代表一个同期群,而他们的本质逻辑是一样的。

首先,计算出当月新增的客户数,并记录客户昵称

其次,拿这部分客户,分别去和后面每个月购买的客户做匹配,并统计有多少客户出现复购(留存);

最后,我们计算出每个月的新增客户和对应留存情况,把这些数据拼接在一起,就得到了同期群留存表。

四、数据概览

首先:拿到数据的第一步,自然是了解数据的情况。针对本次同期群分析,我们可能需要用到的字段有:

  • nick_name:客户昵称
  • pay_time:付款时间
  • order_status:订单状态,含:交易失败/交易成功
  • pay_amount:支付金额
  • purchase_quantity:购买数量


python shangyue python 上月同期_for循环


通过多次计算,可以发现付款时间中缺失值所在行的订单状态均为“交易失败”,那么下文中,都需要将订单状态为“交易失败”的行全部剔除。

针对此份数据,有3个分析方向可以选择:

  • 留存率或付款率
  • 人均付款金额
  • 人均购买次数

本文中,我们选择其中最经典,也是数分面试中最常考的留存率作为例子,需要用到的字段有:

  • nick_name:客户昵称
  • pay_time:付款时间
  • order_status:订单状态,含:交易失败/交易成功
  • pay_amount:支付金额

在本次的分析中,留存率的具体计算方式为:+N月留存率=(+N月付款用户数/首月付款用户数)*100%

特别注意:公式中的+N月存在歧义,会有两种计算方法

  • 第一种:以自然月作为月份偏移的依据。即所有首次行为在9月的用户,只要10月有付款行为,都计算进+1月留存
  • 第二种:以每30天作为月份偏移的依据。即9月30日首次付款的用户,在10月30日-11月29日之间有付款行为,才计算进+1月留存

本文采用第一种计算方法来实现,后面的文章中会采用第二种来实现。

五、数据清洗


python shangyue python 上月同期_python 加一个月 日期_05

全部封装,方便调用

python shangyue python 上月同期_python shangyue_06

清洗部分,不是本文的重点,不再赘述!

六、单月实现(单行数据)

实现后的效果,是一个单行的数据。如下图所示:


python shangyue python 上月同期_for循环_07

+1 月,代表 2019-10 加1个月的用户留存情况,即 2019-11月

此处,先用一个单月实现,详细阐述一下,同期群实现的底层原理及方法。只需要实现一个月的计算逻辑,其他月份套用即可。

由于原始数据中,订单日期是不是月份,我们先处理一下订单日期;


python shangyue python 上月同期_python 加一个月 日期_08


python shangyue python 上月同期_Python_09

自定义处理单月的逻辑,调用方法,先放在前面,后文不再截图

查看订单源数据,可知是从2019年9月开始,到2020年2月。此处,我们以2019年10月的数据为样板,实现单行的同期群分析。


python shangyue python 上月同期_python shangyue_10

拿到 2019-10 的客户昵称,并记录 客户昵称

接下来,我们要计算的是每个月的新增客户数,这个新增,是需要和之前的月份遍历匹配来验证的,2019年10月之前的客户就是2019年9月的数据:


python shangyue python 上月同期_python shangyue_11

与 2019-09 比较,拿到 2019-10 的新增客户数

然后,把2019-10 之后每个月产生订单的客户昵称,与 2019-10 的客户昵称进行匹配,计算出每个月的留存情况


python shangyue python 上月同期_Python_12


最后,把最开始的当月(2019-10)的新增客户,加入到列表:


python shangyue python 上月同期_python shangyue_13


至此,我们以2019年10月为样板月,匹配出当月纯新增客户,接着再以月的维度,对后续每个月的客户进行遍历,验证客户留存数量

我们其他月份的新增和留存计算分析逻辑,也是如此。

七、遍历合并,最终实现同期群


python shangyue python 上月同期_python 加一个月 日期_14


python shangyue python 上月同期_python shangyue_15


python shangyue python 上月同期_python 加一个月 日期_16

后文会对两处红色标注位置,单独拎出来,详细说明一下!

python shangyue python 上月同期_Python_17


python shangyue python 上月同期_python shangyue_18

最终输出的结果,这里其实还可以变形,改成百分比方式

大多数情况下,数据是以留存率的形式体现,再稍做加工即可:


python shangyue python 上月同期_for循环_19


前文中,两处标红位置,我第一次做的时候,也是绕了很久,这里详细说明一下


python shangyue python 上月同期_python 加一个月 日期_20

红色标注1

python shangyue python 上月同期_for循环_21

打印输出结果整理

由上可知: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!


python shangyue python 上月同期_python shangyue_18


上图中,在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中插入留存用户数据的位置参数,比较精髓,需要仔细深入理解一下!

第二个标注为红色的位置:


python shangyue python 上月同期_python shangyue_23

转置问题