Python数据分析实战 | 经典的同期群分析(附实战数据和代码)

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

前几天写了一篇关于同期群分析的内容,主要从理论层面,讲清楚这个经典的分析思维是什么、为什么要做以及怎么延展。并且在文末立了个开放式flag,说点赞超过xx,就会更新提供源数据的Python实现篇。原文这里:都说经典,同同同期群分析到底是个啥?


话说像这种flag,本意其实是“拖延拖延,以后看心情更”。没想到啊,大家对于这个模型的实现有这么大的兴趣,我被不止一个群友盯梢催更....


这不,卑微小编,按时祭上原创~


这篇内容首先对同期群分析的概念做了简短的回顾,然后循着数据概览、数据清洗、思路剖析、单点实现以及最终实现的流程,力图做到每一步清晰明确和可复现。


跟着实践一遍,无论是模型理解程度还是Pandas运用的熟练度,都会蹭蹭往上蹿。


一、理论回顾


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


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


15.png


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


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


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


二、数据概览



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


16.png


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


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


17.png


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


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


三、数据清洗



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


18.png


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


19.png


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


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


20.png


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


四、思路剖析



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


21.png


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

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

  • 首先计算出当月新增的客户数,并记录客户昵称
  • 然后拿这部分客户,分别去和后面每个月购买的客户做匹配,并统计有多少客户出现复购(留存)

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

五、单月实现


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

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


22.png


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


23.png


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


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


24.png


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


25.png


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


26.png


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


27.png


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


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


遍历合并



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


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


28.png


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


#引入时间标签
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月']


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


29.png


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


30.png


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


  • 横向观察,次月流失严重,表现最好的月份次月留存也只有12%,随后平稳降低,稳定在6%左右。
  • 纵向对比,2019年当月新增客户最少,仅有2042位,但人群相对精准,留存率表现优于其他月份。
  • ...


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




相关文章
|
5天前
|
机器学习/深度学习 数据采集 算法
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
有多种方法可以处理时间序列数据中的噪声。本文将介绍一种在我们的研究项目中表现良好的方法,特别适用于时间序列概况中数据点较少的情况。
19 1
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
|
4天前
|
设计模式 开发框架 缓存
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第16天】在Python的世界里,装饰器宛如一位巧手魔术师,轻轻一挥魔杖,便能让我们的函数和类焕发新生。本文将带你领略装饰器的魔力,从基础概念到实战应用,一步步解锁装饰器的强大潜能。让我们一起踏上这段奇妙的旅程,探索如何用装饰器简化代码,增强功能。
|
2天前
|
机器学习/深度学习 数据挖掘 大数据
大数据时代的“淘金术”:Python数据分析+深度学习框架实战指南
在大数据时代,数据被视为新财富源泉,而从海量信息中提取价值成为企业竞争的核心。本文通过对比方式探讨如何运用Python数据分析与深度学习框架实现这一目标。Python凭借其强大的数据处理能力及丰富库支持,已成为数据科学家首选工具;而TensorFlow和PyTorch等深度学习框架则为复杂模型构建提供强有力的技术支撑。通过融合Python数据分析与深度学习技术,我们能在各领域中发掘数据的无限潜力。无论是商业分析还是医疗健康,掌握这些技能都将为企业和社会带来巨大价值。
20 6
|
4天前
|
测试技术 Python
Python中的装饰器:简化代码的魔法
【9月更文挑战第16天】在Python编程的世界里,装饰器就像是一把瑞士军刀,它们为函数和类赋予了额外的超能力。本文将带你探索装饰器的秘密,了解如何利用这一工具来简化代码、增强可读性并提升效率。从基础概念到实际案例,我们将一步步揭示装饰器的神秘面纱,让你的代码更加优雅和强大。
|
4天前
|
设计模式 缓存 开发者
探索Python中的装饰器:提升代码复用性的利器
本文深入探讨了Python中强大的装饰器功能,揭示了其如何通过元编程和闭包等技术手段,优雅地实现代码的复用与扩展。从基本概念到高级应用,我们将一步步揭开装饰器背后的奥秘,并通过实例展示其在实际项目开发中的巨大价值。无论是想要简化函数调用流程、增强函数功能,还是实现AOP(面向切面编程),掌握装饰器都是每位Python开发者必备的技能。
|
5天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第15天】本文将深入探讨Python中一个强大但常被误解的特性——装饰器。我们将从基础概念出发,逐步揭示装饰器如何简化代码结构,增加函数功能而无需修改其核心逻辑。通过具体示例,你将学会如何创建自定义装饰器,以及如何利用它们来管理权限、记录日志等。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇提高代码效率和可维护性的新窗口。
|
2天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
12 0
|
3天前
|
缓存 监控 测试技术
探索Python中的装饰器:提升代码的灵活性和可维护性
本文深入探讨Python装饰器的概念、用法及优势。通过实例讲解如何利用装饰器增强函数功能、日志记录及性能测试,旨在帮助读者掌握这一强大的工具,提升编程效率与代码质量。
|
4天前
|
缓存 开发者 Python
探索Python中的装饰器:提升代码复用性与可读性
本文旨在深入探讨Python装饰器的概念、实现及其应用。通过实例分析,本文展示了如何利用装饰器提高代码的模块化和重用性,从而优化开发流程。我们将从装饰器的基本定义入手,逐步解析其工作机制,并通过案例展示如何在实际项目中有效利用装饰器。
10 0
|
1月前
|
数据可视化 数据挖掘 API
Python数据分析:数据可视化(Matplotlib、Seaborn)
数据可视化是数据分析中不可或缺的一部分,通过将数据以图形的方式展示出来,可以更直观地理解数据的分布和趋势。在Python中,Matplotlib和Seaborn是两个非常流行和强大的数据可视化库。本文将详细介绍这两个库的使用方法,并附上一个综合详细的例子。