零售行业交易数据分析(3)——群组/同期群分析(留存率分析)

news2024/10/5 18:27:01

内容简介

本文介绍了群组分析(同期群分析)的方法以及Python实现过程,并继续对一家零售公司的交易数据进行用户留存分析和可视化。

本系列的文章:

  • 《零售行业交易数据分析(1)——客户终身价值(CLTV)计算和回归预测模型》
  • 《零售行业交易数据分析(2)——RFM模型分类及可视化(Python实现)》

一、什么是群组分析

群组分析,根据特征类型将样本分组,然后比较不同群组之间的差异和相同性。比如对于不同地域、年龄、性别的用户之间的相似特征、以及差异区别,方便使用者针对用户群的特征去设计和优化产品。

常见的分组类型有:

  • 用户特征:地区、年龄、性别、职业等等。
  • 用户类型/规模:根据用户的规模、大小来区分,比如企业用户/个人用户,VIP和非VIP。
  • 产品/业务类型:不同的产品类型,业务类型。
  • 行为:用户的行为划分,注册、购买、关注、分享等等。

同期群分析

其中,按时间维度,根据用户的行为特征来划分群组,是最常用的一个群组分析方法。

比如用户首次注册时间,将用户分成21年1月份注册的用户群,21年2月注册的用户群……以此类推,这种一时间维度来区分的,这种方式也称之为同期群分析(Cohort Analysis)

在留存率分析中,同期群就是最广泛使用的方法之一。

二、代码实现过程

1)数据导入及清洗

import pandas as pd # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
import datetime as dt
import numpy as np

data=pd.read_excel('data.xlsx', parse_dates=['InvoiceDate'])

#剔除掉异常值
data = data[(data['Quantity']>0)&(data['UnitPrice']>0)]
#选择UK的数据
uk_data=data[data.Country=='United Kingdom']
#复制transaction_df,保留原数据不变
transaction_df=uk_data

transaction_df.head()

在这里插入图片描述
清洗详情见《零售行业交易数据分析(1)——客户终身价值(CLTV)计算和回归预测模型》

2)时间信息提取

1. 提取交易月份

首先定义一个函数过程,用于提取交易时间的年、月,并设定为初始日期为每月1号。然后提取每次交易时间的交易年月,作为新的一列transaction_df['TransactionMonth']

#定义函数
def get_month(x): return dt.datetime(x.year, x.month, 1) 

#提取交易月份
transaction_df['TransactionMonth'] = transaction_df['InvoiceDate'].apply(get_month)

transaction_df.head()

2. 提取首次交易月份

找出每个用户的首次交易月份,作为同期群分组的特征标签transaction_df['CohortMonth']

#提取首次交易月份
transaction_df['CohortMonth']=transaction_df.groupby('CustomerID')['TransactionMonth'].transform('min')

代码过程分步解释:

#1. 先根据CustomerID对TransactionMonth分组
grouping = transaction_df.groupby('CustomerID')['TransactionMonth'] 
# 2. 使用Transform()返回一个与自身长度相同的数据
transaction_df['CohortMonth'] = grouping.transform('min')

##组合1和2步:
transaction_df['CohortMonth']=transaction_df.groupby('CustomerID')['TransactionMonth'].transform('min')

3. 计算月份差

分别计算相差年份和相差月份,然后合计总的月份差异, 等式transaction_df['CohortIndex'] = years_diff * 12 + months_diff + 1 最后加1,使首月标签为1而非0。

#定义提取年月日过程函数
def get_date_int(df, column):
    year = df[column].dt.year
    month = df[column].dt.month
    day = df[column].dt.day
    return year, month, day

# 提取交易月份的年、月
transcation_year, transaction_month, _ = get_date_int(transaction_df, 'TransactionMonth')
# 提取首次交易月份的年、月
cohort_year, cohort_month, _ = get_date_int(transaction_df, 'CohortMonth')

# 计算相差年份
#  Get the  difference in years
years_diff = transcation_year - cohort_year
# 计算相差月份
months_diff = transaction_month - cohort_month
# 计算总的月份差异
transaction_df['CohortIndex'] = years_diff * 12 + months_diff  + 1 
transaction_df.head(5)

在这里插入图片描述

4. 计算留存率

  • 分组计算用户数量
# 按照'CohortMonth'和'CohortIndex'分组
grouping = transaction_df.groupby(['CohortMonth', 'CohortIndex'])
# 计算每个组里的唯一CustomerID数量
cohort_data = grouping['CustomerID'].apply(pd.Series.nunique)
#重新定义索引值
cohort_data = cohort_data.reset_index()
# 结果查看
cohort_data.head()

在这里插入图片描述

  • 数据透视表查看每月留存用户数
cohort_counts = cohort_data.pivot(index='CohortMonth',columns ='CohortIndex',values = 'CustomerID')

在这里插入图片描述

  • 留存率计算结果
#留存率计算
cohort_sizes = cohort_counts.iloc[:,0]
retention = cohort_counts.divide(cohort_sizes, axis=0)
#重新定义索引
retention.index = retention.index.strftime('%Y-%m')
#结果格式转换
retention.round(3)*100

在这里插入图片描述

5. 热力图可视化

plt.figure(figsize=(16, 10))

plt.title('Retention Rate in percentage:- Monthly Cohorts', fontsize = 14)

sns.heatmap(retention, annot=True, fmt= '.0%',cmap='YlGnBu', vmin = 0.0 , vmax = 0.6)
plt.ylabel('Cohort Month')
plt.xlabel('Cohort Index')
plt.yticks( rotation='360')
plt.show()

在这里插入图片描述
从热力图结果可见,商店最近8月-10月的留存率有所提高,纵向和横向分析都可见颜色有明显由浅变深;但是12月的留存率异常低,这是因为数据集的时间范围是 01/12/2010 到09/12/2011,12月份只有9天的数据,所以这个异常点也是可解释的。从整体上看, 该公司的用户留存数有所提高,近期召回了许多的老用户。

参考资料

参考文章: https://www.analyticsvidhya.com/blog/2021/06/cohort-analysis-using-python-for-beginners-a-hands-on-tutorial/
数据集:https://archive.ics.uci.edu/ml/datasets/Online+Retail#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt扫盲-QSplitter理论总结

QSplitter理论总结一、概述二、使用说明1. 添加子控件2. 内部控件大小和位置一、概述 QSplitter允许用户通过拖动子部件之间的边界来控制子部件的大小。这个经常在我们使用的一些工具软件中最常使用 比如就像 QAssistant 里面的索引栏和内容直间,鼠标放在那个分界区…

3dMax中的两足动物及动画制作方法

3dMax的两足动物简介 3DMax是一款专业的3D电脑设计软件,用于制作3D动画、游戏、模型、图像等,在视频游戏开发商、影视工作室的工作中发挥着重要作用。Biped 是3D max 软件中动画的基本部分。3dMax中的Biped为角色建模中的角色部分提供运动并将其连接到现…

基于Java+SpringMvc+vue+element实现驾校管理系统详细设计

基于JavaSpringMvcvueelement实现驾校管理系统详细设计 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

PPI网络的构建与美化(String+Cytoscape)

目录写在前面一、使用string分析数据二、使用Cytoscape构建网络1. 导入TSV文件2. Analyze Network3. Generate Style4. CytoNCA计算Betweenness三、美化网络1. 根据Betweenness调整网络2. 选择你需要的蛋白,做个双环网络图3. 调整字体大小颜色、气泡大小等4. 保存图…

【TypeScript】JavaScript VS TypeScript数据类型

💭💭 ✨:JavaScript VS TypeScript数据类型   💟:东非不开森的主页   💜: 你若盛开,清风自来💜💜   🌸: 如有错误或不足之处,希望可以指正&…

【TS】TypeScript 实践中的 Equals 是如何工作的?

How does the Equals work in typescript 循着线索慢慢来 在 ts 中如何判断两种类型完全一致? 三年前,在社区有一场关于支持 type level equal operator 的讨论 TypeScript#27024。 大佬 mattmccutchen 给出了一个非常精彩的解决方案: Her…

智公网:教师编的这些规则要知道!

1、有了教师资格证,是否还需要考取编制? 答:有了教师资格证之后是需要继续教师编制考试的。只有通过了教师编制考试才能有教师编,只有一个教师资格证,只能证明是具备了从业资格。通过教师编制的人员被称为在编人员&am…

【Web开发】Python实现Web图表功能(D-Tale编译打包)

🍺基于Flask实现服务器的相关文章如下🍺: 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)&#x1f3…

MySQL中SQL语句执行顺序及优化

概要 本文章主要是分析SQL语句关键字的执行顺序,以及在每一个阶段我们有哪些优化,可以去做哪些优化,和注意事项。 1. SQL语句关键字的执行顺序 通常我们执行一条SQL语句它的执行顺序如下 selectfrom.joinwheregroup byhavingorder by聚合函…

Vitepress(二):部署

什么是Git Page github Pages可以被认为是用户编写的、托管在github上的静态网页。 github pages有300M免费空间,资料自己管理,保存可靠; 实现项目自动推送到Github 首先新建一个自己的项目用于存放github pages的内容 格式是 自己githu…

《元宇宙2086》影视工业弯道超车?《科普时报》刊登采访报道

科普时报-第267期 2023年01月06日 星期五 第05版:书香文史刊载了题目为“《元宇宙2086》影视工业弯道超车?”的关于高泽龙的采访报道。全文内容如下:在2022年中国金鸡百花电影节暨第35届中国电影金鸡奖期间,我创作的中国首部元宇宙…

Linux开发工具的使用(二)

文章目录Linux开发工具的使用(二)1.Linux编译器gcc/g使用1.1 背景1.2 验证每一个阶段的效果1.2.1 预处理1.2.2 编译1.2.3 汇编1.2.4 链接1.2.5 记忆1.3 链接的理解1.3.1 ldd指令1.3.2 预备1.3.3 动态库和静态库感性理解到实际理解2.Linux项目自动化构建工…

吴恩达《机器学习》——SVM支持向量机

SVM支持向量机1. 线性SVM1.1 从Logistic回归出发1.2 大边界分类与SVM1.3 调整正则化参数2. 非线性SVM(高斯核函数)2.1 高斯核2.2 非线性分类2.3 参数搜索数据集、源文件可以在Github项目中获得 链接: https://github.com/Raymond-Yang-2001/AndrewNg-Mac…

Java编程基础

1,基本概念 (1)JDK、JRE、JVM的关系: JDK:Java Development Kit,Java开发工具包JRE: Java Runtime Environment,Java运行环境JVM:Java Virtual Machine,Java虚拟机JDK包…

2023年山东最新建筑八大员(电气施工员)模拟真题题库及答案

百分百题库提供建筑八大员(电气)考试试题、建筑八大员(电气)考试预测题、建筑八大员(电气)考试真题、建筑八大员(电气)证考试题库等,提供在线做题刷题,在线模拟考试&…

【UE4 第一人称射击游戏】22-拾取弹药

上一篇:【UE4 第一人称射击游戏】21-添加动态扩散准心本篇效果:当角色触碰到弹药箱后,玩家的后备弹夹就会多50发子弹,并且触碰到弹药箱后,会播放相应的声音和粒子特效。步骤:新建一个蓝图类(父类…

MySQL-5.7 innodb在线DDL操作(增删改索引、列、外键、表、外键)

基本概念 在开始阅读前,先熟悉下以下概念,以便更加方便理解。 DML DML(Data Manipulation Language)数据操作语言-数据库的基本操作,SQL中处理数据等操作统称为数据操纵语言,简而言之就是实现了基本的“增删改查”操作…

jenkins中错误总结

每次使用jenkins都会遇到不同的bug,接下来我们看一下这几个 libXrender.so.1: cannot open shared object file: No such file or directory 接下来我们看一下解决方案,一步一步安装好就可以了 yum install ksh -y yum install libXext.so.6 -y yum install libX…

案例分析 - 考查点总览

个人总结,仅供参考,欢迎加好友一起讨论 系分 - 案例分析 - 总览知识点 往年案例一览 一般情况下,往下数5、6年的题目出题形式,具有参考意义 年份试题一试题二试题三试题四试题五2022年系统分析与建模[结构化与面向对象分析、用例…

MySQL (四)------DML操作表记录-增删改【重点】DQL操作表记录-查询【重点】

DML操作表记录-增删改【重点】 准备工作: 创建一张商品表(商品id,商品名称,商品价格,商品数量.) create table product(pid int primary key auto_increment,pname varchar(40),price double,num int ); 1.1 插入记录 1.1.1 语法 方式一: 插入指定列, 如果没有把这个列进行列…