python 数据分析_Python 数据分析实战:经典的同期群分析

以下文章来源于数据不吹牛 ,作者小 z

5e7ac95e8e9f09031717b749作者 | 周志鹏

责编 | 郭 芮

本文首先对同期群分析的概念做了简短介绍,然后循着数据概览、数据清洗、思路剖析、单点实现以及最终实现的流程,力图做到每一步清晰明确和可复现。跟着实践一遍,无论是模型理解程度还是 Pandas 运用的熟练度,都会蹭蹭往上蹿。(注:完整实战数据和代码,空降文末即可获取)

什么是同期群分析?

同期群分析是数据分析中一个 hin 经典的思维,核心是将用户按初始行为的发生时间,划分为不同的群组,进而分析相似群组的行为如何随时间变化而变化。

一般是通过像这样的留存表来实现:

5e7ac95e8e9f09031717b749每一行,代表当月新增客户,在接下来几个月的留存情况。

通过横向对比,能够对客户留存和生命周期有初步的认识。基于纵向观察,可以发现不同期客户,留存情况的差异,以反推该期引入的客户是否精准。

这个表看起来简单明晰,也有一些成熟的工具能够实现,但是,真要基于订单数据用 Python 来实现,还是要绞一番脑汁的。

数据概览

首先,导入订单数据,顺带看一看源数据长什么样子:

5e7ac95e8e9f09031717b749这是一份小 z 杂货铺的数据,比炒粉高级那么一些。后续分析会用到的关键字段有客户昵称,付款时间,订单状态和支付金额。

再查看数据量和缺失情况:

5e7ac95e8e9f09031717b749订单共计 42713 行,除付款时间外,其他都是完整的(不含缺失值)。

格式整体规整,付款时间为 datetime 格式,购买金额和数量则是数值型。

数据清洗

清洗的重点在于搞清楚为什么会有那么多付款时间是缺失的。我们先筛选出付款时间为空值的行,一探究竟:

5e7ac95e8e9f09031717b749貌似,缺失付款时间的数据,订单状态主要是 " 交易失败 "。这里做一个初步推断,之所以缺失付款时间,是因为没有产生实际交易。

5e7ac95e8e9f09031717b749果然,缺失付款时间的订单都是 " 交易失败 " 状态,而完整的数据则是 " 交易成功 "。

接下来,只需要筛选出交易成功的订单就好:

5e7ac95e8e9f09031717b74940339 行数据,就是同期群分析的主战场。

思路剖析

再让最开始的留存表刷一下存在感:

5e7ac95e8e9f09031717b749直接思考怎么样一次性生成这张表,着实费头发。更合理的方式是用搭积木的思维来拆解这张表。

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

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

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

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

单月实现

循着上一步的思路,问题变得简单起来,实现一个月的计算逻辑,其他月份套用即可。

杂货铺的数据时间维度和上面的留存表不太一样,因为不涉及到时间序列,用字符串形式的 " 年 - 月 " 标签更加方便:

5e7ac95e8e9f09031717b749订单源数据是从 19 年 9 月开始,到 2020 年 2 月。我们以 2019 年 10 月的数据为样板,实现单行的同期群分析。

5e7ac95e8e9f09031717b749显而易见,2019 年 10 月份一共有 7336 位客户,购买了 8096 笔订单。

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

5e7ac95e8e9f09031717b749和历史数据做匹配,验证并筛选出 2019 年 10 月新增的客户数:

5e7ac95e8e9f09031717b749然后,和 10 月之后每个月的客户昵称进行匹配,计算出每个月的留存情况:

5e7ac95e8e9f09031717b749把最开始的当月新增客户加入到列表:

5e7ac95e8e9f09031717b7492019 年 10 月新增客户 7083 位,次月(11 月)留存 539 人,随后有所降低,而到了 2020 年 2 月留存回购客户数较上月有小幅上升。

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

遍历合并

上一步我们以 2019 年 10 月为样板,先根据历史订单,匹配出当月纯新增客户,接着再以月的维度,对后续每个月的客户进行遍历,验证客户留存数量。

为了便于循环,我们引入了月份列表:

5e7ac95e8e9f09031717b749完整代码和关键注释如下:

# 引入时间标签

month_lst = order [ ' 时间标签 ' ] .unique ( )

final = pd.DataFrame ( )

for i in range ( len ( month_lst ) - 1 ) :

# 构造和月份一样长的列表,方便后续格式统一

count = [ 0 ] * len ( month_lst )

# 筛选出当月订单,并按客户昵称分组

target_month = order.loc [ order [ ' 时间标签 ' ] == month_lst [ i ] ,: ]

target_users = target_month.groupby ( ' 客户昵称 ' ) [ ' 支付金额 ' ] .sum ( ) .reset_index ( )

# 如果是第一个月份,则跳过(因为不需要和历史数据验证是否为新增客户)

if i == 0:

new_target_users = target_month.groupby ( ' 客户昵称 ' ) [ ' 支付金额 ' ] .sum ( ) .reset_index ( )

else:

# 如果不是,找到之前的历史订单

history = order.loc [ order [ ' 时间标签 ' ] .isin ( month_lst [ :i ] ) ,: ]

# 筛选出未在历史订单出现过的新增客户

new_target_users = target_users.loc [ target_users [ ' 客户昵称 ' ] .isin ( history [ ' 客户昵称 ' ] ) == False,: ]

# 当月新增客户数放在第一个值中

count [ 0 ] = len ( new_target_users )

# 以月为单位,循环遍历,计算留存情况

for j,ct in zip ( range ( i + 1,len ( month_lst ) ) ,range ( 1,len ( month_lst ) ) ) :

# 下一个月的订单

next_month = order.loc [ order [ ' 时间标签 ' ] == month_lst [ j ] ,: ]

next_users = next_month.groupby ( ' 客户昵称 ' ) [ ' 支付金额 ' ] .sum ( ) .reset_index ( )

# 计算在该月仍然留存的客户数量

isin = new_target_users [ ' 客户昵称 ' ] .isin ( next_users [ ' 客户昵称 ' ] ) sum ( )

count [ ct ] = isin

# 格式转置

result = pd.DataFrame ( {month_lst [ i ] :count} ) .T

# 合并

final = pd.concat ( [ final,result ] )

final.columns = [ ' 当月新增 ','+1 月 ','+2 月 ','+3 月 ','+4 月 ','+5 月 ' ]

当当当当!顺利得到了我们预期的数据。

5e7ac95e8e9f09031717b749不过,真实数据是留存率形式体现,再稍做加工即可:

5e7ac95e8e9f09031717b749终于,大功告成!实现了我们所希望的同期群分析表。简单扫两眼,可以发现:

横向观察,次月流失严重,表现最好的月份次月留存也只有 12%,随后平稳降低,稳定在 6% 左右。

纵向对比,2019 年当月新增客户最少,仅有 2042 位,但人群相对精准,留存率表现优于其他月份。

...

由于篇幅有限,可视化的部分就留给旁友们自己去实践咯 ~

完整数据源和代码:https://pan.baidu.com/s/1x_f1a5-zqJdRAxMKsL70Ew 提取码:aiqf

作者:周志鹏,3 年数据分析,深切感受到数据分析的有趣和学习过程中缺少案例的无奈,遂新开公众号「数据不吹牛」,定期更新数据分析相关技巧和有趣案例(含实战数据集),欢迎大家关注交流。

声明:本文为作者投稿,版权归其所有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值