python 加一个月 日期_手把手教你用 Python 实现同期群分析(1)

本文目录:

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

一、前言

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

尽管有很多同期群分析的概念和思路的文章,但是就如何通过工具实现,很难找到自己合适的。基于此,本文将简单的介绍一下同期群分析的概念,并用 Python 实现同期群分析。

本文所涉及的完整实战数据和代码等,详见百度云网盘链接:

链接:https://pan.baidu.com/s/1_CTwkdzFbXNH9iZPoYm2bw

提取码:maz8

Ps:本文重代码工具实现,分析的思路及结论暂不涉及!

二、项目准备

Python

  • 版本:3.6
  • IDE:pycharm
  • 库:pandas、pymysql

本文所用的数据集来源于:上一篇中,《Python读取Excel数据,插入到MySQL》的数据。

Dima:Python 读取 Excel 数据,并插入到MySQL​zhuanlan.zhihu.com

数据集一共只包含6个字段,详见下图:

aaac96d83cb8f60565f8ff2b538acc78.png
本文用到的SQL数据源

三、同期群分析的概念

3.1 同期群分析的含义

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

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

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

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

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

3.2 同期群分析的意义

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

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

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

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

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

3.3 实现用户同期群的思路

5960094d96b88820d39036e252e82a35.png

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

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

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

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

四、数据概览

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

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

aaac96d83cb8f60565f8ff2b538acc78.png

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

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

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

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

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

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

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

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

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

五、数据清洗

d004b4f8efa1c6afe0cd2452842379ca.png
全部封装,方便调用

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

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

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

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

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

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

2563c6dfb9a3eed0fa5ee3f6bc97c58f.png

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

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

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

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

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

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

9fba2d7a454979b4537dd0c02938421a.png

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

5d42710041a8785ed5ca94f4870f5d83.png

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

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

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

da4430bc43c4954e0a7eb57419a648a5.png

7634edad868dd00de7a90d7b8b500d4a.png

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

08ced761a2894dac81a07b5410316bfd.png

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

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

f45948c38c7233a2538565393c80ff00.png

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

82e852754951daa3d85995be8f33c099.png
红色标注1

db2cadcbdf8d815bd7e7aa2835f725bd.png
打印输出结果整理

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

a446782a4a6bf15c0e08b82f66050029.png

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

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

f730be5d1e4fed3d4cc0248104c6e301.png
转置问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值