同期数分析-留存率
目录
同期数分析
加载数据
单月实现
统计每个月的订单量
求2月份的订单量和用户数量
求2月之前的历史订单量
筛选出2023年2月的新增的用户数
计算2023年2月在后面的留存情况
完整的2023年2月份同期群结果
遍历合并和分析
引入月份列表
遍历
调整成留存率的形式
回购客单的同期群实现
留存客单
同期数分析
同期群分析是数据分析中的经典思维,其核心逻辑是将用户按初始行为的发生时间划分为不同的群组,进而分析相似群组的行为如何随时间变化
举例:下表记录了每个月新购买的用户数,并统计每个月的新增用户在之后月份的复购情况
数据截止到2023年7月,如图下所示。
-
数据的第一行,2023年1月有97个新用户
-
之后的+1月(2023年2月)有46%的用户再次光顾
-
+2月(2023年3月)仍有39%的回头客
-
第一行的46%、39%都是对应复购人数占2023年1月新增购买用户的比重,这些人属于2023年1月同一期的新增用户
-
其他行也是一样的道理,每一行为同一个群组,反映同一期新增用户在之后一段时间复购行为的变化趋势。

上表的百分比为留存率,留存率=某月复购用户数/对应期新增用户数
我们也可以将留存率或者说是回购率中的回购,当做观察和分析的"行为",而如果把"回购客单价"当做追踪分析的行为,就可以从客单价的维度对用户进行分析.
前面的同期群分析是从时间的维度来划分群组的,也可以改变分组逻辑,用渠道+月份来划分群组.

加载数据
# 加载数据
import pandas as pd
df = pd.read_excel('../data/k_group_anlysis.xlsx')
df

单月实现
统计每个月的订单量
# 目标1: 统计每个月的订单量
# 1.1 加入 y_m 月份标签
df['y_m'] = df['付款时间'].astype(str).str[:7]
df['y_m'].unique()
# 1.2 统计每个月的订单量 且 排序
df['y_m'].value_counts().sort_index()

求2月份的订单量和用户数量
# 3.1 指定月份 '2023-02'
month = '2023-02'# 3.2 筛选出指定月份相关的订单(订单数量)
sample = df[df['y_m'] == month]
print("二月份的订单量: ", len(sample))# 3.3 求 指定月份 每个用户的总实付总额(用户数量)
sample_c = sample.groupby('用户ID')['实付金额'].sum().reset_index()
print("二月份的用户量: ", len(sample_c))# 3.4 打印 3.3的前5条数据
sample_c.head()

求2月之前的历史订单量
history = df[df['y_m'] == '2023-01']
history.head()
print(history['y_m'].unique())history = df.loc[df['y_m'] == '2023-01',:]
history.head()

筛选出2023年2月的新增的用户数
# 目标5: 筛选出2023年2月新增的用户数
sample_new = sample_c.loc[sample_c['用户ID'].isin(history['用户ID'])==False, :]print('2月份新增用户数: ', len(sample_new))
sample_new.head()

sample_new = sample_c.loc[sample_c['用户ID'].isin(history['用户ID'])==False, :]
历史订单量是2023年1月,通过使用isin函数筛选出不是在1月订单量中就是2月新增的订单量.
计算2023年2月在后面的留存情况
# 目标6: 计算2023年2月在后面的留存情况
# 1 准备容器
re = []# 2 遍历 ['2023-03', '2023-04', '2023-05', '2023-06','2023-07','2023-08','2023-09','2023-10','2023-11','2023-12']
for month in ['2023-03', '2023-04', '2023-05', '2023-06','2023-07','2023-08','2023-09','2023-10','2023-11','2023-12']:# print(month)# 2.1 获取下个月的数据next_month = df.loc[df['y_m'] == month, :]# print('---------------------')# print(next_month)# 2.2 获取留存的数据target_user = sample_new.loc[sample_new['用户ID'].isin(next_month['用户ID']), :]# 2.3 向容器中追加 yyyy-mm留存情况: 999re.append(f"{month} 留存情况: {len(target_user)}")# 3 验证
re

完整的2023年2月份同期群结果
# 加入新增数据,得到完整2023年2月份同期群结果
re.insert(0,['2023年2月新增用户:',len(sample_c)])
re

遍历合并和分析
引入月份列表
# 目标1 为了便于循环,我们引入了月份列表
month_lst = df['y_m'].unique()
print(month_lst)

遍历
# 1 月份列表 month_lst
month_lst = df['y_m'].unique()# 2 准备最终容器 final
final = pd.DataFrame()# 3 遍历月份列表
for i in range(len(month_lst)):# print(i, month_lst[i])# 3.1 构造和月份一样长的列表,方便后续格式统一 countcount = [0] * len(month_lst)# print(count)# 3.2 筛选出当月订单,并按用户ID分组 target_monthtarget_month = df[df['y_m'] == month_lst[i]]# print('---------------------------')# print(target_month)# 3.3 求当月订单每个用户的实付金额 target_userstarget_users = target_month.groupby("用户ID")['实付金额'].sum().reset_index()# print('---------------------------')# print(month_lst[i], len(target_users))# 3.4 判断是否是第一个月if i == 0:# 3.4.1 如果是第一个月,则跳过(因为不需要和历史数据验证是否为新增用户) new_target_usersnew_target_users = target_month.groupby("用户ID")['实付金额'].sum().reset_index()else:# 3.4.2 如果不是第一个月# 3.4.2.1 找到之前的历史订单 historyhistory = df.loc[df['y_m'].isin(month_lst[:i])]# print(history)# print('-------------------------')# 3.4.2.2 筛选出未在历史订单中出现过的新增用户 new_target_usersnew_target_users = target_users.loc[target_users['用户ID'].isin(history["用户ID"])==False,:]# 3.5 将当月新增用户数放在第一个值中count[0] = len(new_target_users)# print(count)# 3.6 以月为单位,循环遍历,计算留存情况"""for j, ct in zip(range(i+1,len(month_lst)), range(1, len(month_lst))):i = 2i+1=3, 12, [3, 4, 5, 6, 7, 8, 9, 10, 11] 1, 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]i = 3i+=4, 12, [4, 5, 6, 7, 8, 9, 10, 11]1, 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]"""for j, ct in zip(range(i+1,len(month_lst)), range(1, len(month_lst))):# 3.6.1 下一个月的订单 next_monthnext_month = df.loc[df['y_m'] == month_lst[j], :]next_users = next_month.groupby("用户ID")['实付金额'].sum().reset_index()# 3.6.2 计算在该月仍然留存的用户数量isin = new_target_users['用户ID'].isin(next_users['用户ID']).sum()count[ct] = isin# print(count)# 3.7 格式转置result = pd.DataFrame({month_lst[i] : count}).T# print(result)# print('-------------------------------')# 3.8 合并final = pd.concat([final, result], axis=0)# 4 指定列名 '当月新增','+1月','+2月','+3月','+4月','+5月','+6月','+7月','+8月','+9月','+10月','+11月'
final.columns = ['当月新增','+1月','+2月','+3月','+4月','+5月','+6月','+7月','+8月','+9月','+10月','+11月']# 5 验证
final

调整成留存率的形式
# 目标: 调整成留存率的形式
# 1 让final每个元素 除以 当月新增, 只保留 第二列往后的列内容
result = final.divide(final['当月新增'], axis = 0).iloc[:,1:]
# 2 新增当月新增列
result['当月新增'] = final['当月新增']
# 3 验证
result

回购客单的同期群实现
#引入y_m
month_lst = df['y_m'].unique()#后面加了个m,代表金额相关
final_m = pd.DataFrame()#中间代码相同
for i in range(len(month_lst) - 1):#构造和月份一样长的列表,方便后续格式统一count = [0] * len(month_lst)#筛选出当月订单,并按用户昵称分组target_month = df.loc[df['y_m'] == month_lst[i],:]target_users = target_month.groupby('用户ID')['实付金额'].sum().reset_index()#如果是第一个月,则跳过(因为不需要和历史数据验证是否为新增用户)if i == 0:new_target_users = target_month.groupby('用户ID')['实付金额'].sum().reset_index()else:#如果不是,找到之前的历史订单history = df.loc[df['y_m'].isin(month_lst[:i]),:]#筛选出未在历史订单中出现过的新增用户new_target_users = target_users.loc[target_users['用户ID'].isin(history['用户ID']) == 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 = df.loc[df['y_m'] == month_lst[j],:]next_users = next_month.groupby('用户ID')['实付金额'].sum().reset_index()#计算在该月仍然留存的用户的回购金额isin_m = next_users.loc[next_users['用户ID'].isin(new_target_users['用户ID']) == True,'实付金额'].sum()count[ct] = isin_m#格式转置result = pd.DataFrame({month_lst[i]:count}).T#合并final_m = pd.concat([final_m,result])final_m.columns = ['当月新增','+1月','+2月','+3月','+4月','+5月','+6月','+7月','+8月','+9月','+10月','+11月']final_m

留存客单
# 留存客单
result_m = final_m / final
result_m['当月新增'] = final_m['当月新增']
result_m

相关文章:
同期数分析-留存率
目录 同期数分析 加载数据 单月实现 统计每个月的订单量 求2月份的订单量和用户数量 求2月之前的历史订单量 筛选出2023年2月的新增的用户数 计算2023年2月在后面的留存情况 完整的2023年2月份同期群结果 遍历合并和分析 引入月份列表 遍历 调整成留存率的形式 回…...
Java前后端交互:构建现代Web应用
在现代Web应用开发中,前后端分离是一种常见的架构模式。后端通常负责数据处理和业务逻辑,而前端则负责用户界面和用户体验。Java作为后端开发的强大语言,提供了多种方式与前端进行交互。本文将探讨Java后端与前端交互的几种主要方式ÿ…...
vue3中用axios请求怎么添加cookie
在 Vue 3 中使用 axios 发起请求时,可以通过配置 axios 的请求选项来携带 Cookies。具体来说,确保跨域请求时,设置 withCredentials: true,以便发送和接收 Cookies。 1. Axios 配置携带 Cookie 首先确保你在 axios 请求中设置了…...
informer学习笔记
一、informer讲解 infomer 要解决的三大问题: Attention计算的更快Decoder要一次性输出所有预测堆叠encoder也要更快 1. Attention 在长序列中,并非每一个位置的Attention都重要,对于每一个Q来说,只有一小部分的K与其有较强的…...
Elasticsearch介绍和使用
一、Elasticsearch 强大的搜索和分析能力: Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎。它能够快速地对大量数据进行全文搜索、结构化搜索和复杂的数据分析操作。对于大型数据集,它可以高效地处理各种查询需求,包括关键词搜索…...
【Flutter】基础入门:代码基本结构
通过这个简单的 Flutter 示例程序,我们可以快速了解 Flutter 的代码结构,理解每个部分的作用。 import package:flutter/material.dart; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}…...
如何进行数据库缩容 | OceanBase应用实践
作者:关炳文,爱可生 DBA 团队成员,负责数据库相关技术支持。 本文详细介绍了OceanBase V3.2版的集群中,面对数据文件缩容的场景的一套缩容方案,作为大家的参考。 缩容场景 某银行运行的一套采用1-1-1架构的OceanBase…...
机器学习和深度学习的差别
定义和基本原理 机器学习: 定义:机器学习是一种让计算机自动从数据中学习规律和模式的方法,无需明确编程。它通过构建数学模型,利用已知数据进行训练,然后对新的数据进行预测或决策。基本原理:机器学习算…...
RAG拉满-上下文embedding与大模型cache
无论怎么选择RAG的切分方案,仍然切分不准确。 最近,anthropics给出了补充上下文的embedding的方案,RAG有了新的进展和突破。 从最基础的向量查询,到上下文embedding,再到rerank的测试准确度都有了明显的改善…...
前端学习---(2)CSS基础
CSS 用来干什么? CSS 是用来指定文档如何展示给用户的一门语言——如网页的样式、布局、等等。 css语法: 选择器{ 属性名: 属性值; 属性名: 属性值; } h1 {color: red;font-size: 5em; }h1: 选择器 color: 属性 冒号之前是属性,冒号之后是值。 font-size…...
Pandas常用计算函数
目录 排序函数 nlargest函数 nsmallest函数 sort_values函数 df.sort_values Series.sort_values 聚合函数 corr函数-相关性 min函数-最小值 max函数-最大值 mean函数-平均值 sum函数-求和 count函数-统计非空数据 std函数-标准偏差 quantile函数-分位数 排序函…...
C++ | Leetcode C++题解之第473题火柴拼正方形
题目: 题解: class Solution { public:bool makesquare(vector<int>& matchsticks) {int totalLen accumulate(matchsticks.begin(), matchsticks.end(), 0);if (totalLen % 4 ! 0) {return false;}int len totalLen / 4, n matchsticks.s…...
深度解析RLS(Recursive Least Squares)算法
目录 一、引言二、RLS算法的基本思想三、RLS算法的数学推导四、RLS算法的特点五、RLS算法的应用场景六、RLS算法的局限性七、总结 一、引言 在自适应滤波领域,LMS(Least Mean Squares)算法因其计算简单、实现方便而广受欢迎。然而࿰…...
Centos 7.9NFS搭建
原创作者:运维工程师 谢晋 Centos 7.9NFS搭建 NFS服务端安装客户机访问共享配置 NFS服务端安装 SSH连接系统登录到服务端安装nfs服务 # yum -y install nfs-utils2. 安装完成后,查看需要共享的目录,这边共享的是/home目录,如…...
Python库numpy之三
Python库numpy之三 # NumPy数组创建函数二维数组创建函数numpy.eye应用例子numpy.diag应用例子numpy.vander应用例子 # NumPy数组创建函数 二维数组创建函数 numpy.eye 词法:numpy.eye(N, MNone, k0, dtype<class ‘float’>, order‘C’, *, deviceNone, …...
postgresql 安装
一、下载 PostgreSQL: File Browser 下载地址 PostgreSQL: File Browser 上传到服务器,并解压 二、安装依赖 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel 创建postgresql 和目录 useradd …...
基于机器学习的天气数据分析与预测系统
天气预报是日常生活中非常重要的信息来源,能够帮助人们合理安排日程、预防自然灾害。随着数据科学和机器学习的快速发展,传统的天气预报方法逐渐向基于数据驱动的机器学习方法转变。本文将探讨如何构建一个基于机器学习的天气数据分析与预测系统…...
Java项目-基于Springboot的在线外卖系统项目(源码+说明).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...
ANSYS Workbench纤维混凝土3D
在ANSYS Workbench建立三维纤维混凝土模型可采用CAD随机几何3D插件建模后导入,模型包含球体粗骨料、圆柱体长纤维、水泥砂浆基体等不同组分。 在CAD随机几何3D插件内设置模型参数后运行,即可在AutoCAD内建立三维纤维混凝土模型,插件支持任意…...
【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例
上篇文章:Vue】Vue(九)OptionsAPI与CompositionAPI的区别 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日11点13分 文章目录 toRefs()和toRe…...
从电磁炉到户外电源:拆解单相SVPWM如何让你的逆变器更安静、更高效
从电磁炉到户外电源:单相SVPWM如何实现静音与高效的双重突破当你深夜用电磁炉煮面时,是否曾被突然的蜂鸣声吓一跳?或是发现户外电源给设备充电时,散热风扇的噪音盖过了山林鸟鸣?这些常见问题背后,隐藏着一个…...
上线前最后一道防线,DeepSeek代码审查如何帮你拦截87%的CVE类缺陷?
更多请点击: https://intelliparadigm.com 第一章:上线前最后一道防线,DeepSeek代码审查如何帮你拦截87%的CVE类缺陷? 在软件交付生命周期末期,传统人工代码审计与通用SAST工具常因误报率高、上下文理解弱而漏检高危漏…...
37家金融客户紧急启用的DeepSeek扫描辅助加固包(含未公开API调用密钥策略)
更多请点击: https://kaifayun.com 第一章:DeepSeek漏洞扫描辅助的背景与战略价值 近年来,大模型在安全领域的应用正从辅助问答向深度协同防御演进。DeepSeek系列模型凭借其开源、高推理精度及强代码理解能力,成为构建智能化漏洞…...
终极歌词同步神器LRCGET:5分钟为你的音乐库添加完美歌词
终极歌词同步神器LRCGET:5分钟为你的音乐库添加完美歌词 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否厌倦了在听歌时手动搜索歌词…...
机器学习赋能矩方法:破解稀薄气体强非平衡流动模拟难题
1. 项目概述:当矩方法遇见机器学习在计算流体力学领域,模拟稀薄气体动力学和强非平衡流动,一直是个让工程师和科学家们头疼的“硬骨头”。想象一下,你正在设计一架高超音速飞行器,当它以数倍音速在大气层边缘飞行时&am…...
自然语言处理的实战项目:从0到1搭建属于自己的文本分类系统
对于软件测试从业者而言,日常工作中我们每天都会接触大量的文本数据:缺陷管理系统中的bug描述、测试用例的步骤说明、用户反馈的问题报告、需求文档的规格描述,甚至是接口返回的异常信息文本。这些非结构化文本往往隐含着关键业务信息&#x…...
Midjourney V6锐化失控?3步诊断+5组--sref/--stylize协同参数公式,立竿见影修复模糊与锯齿
更多请点击: https://intelliparadigm.com 第一章:Midjourney V6锐化失控的本质归因 Midjourney V6 引入的全新扩散架构与隐式细节增强机制,导致图像生成过程中高频纹理被过度强化,其根本原因并非参数误配,而是模型在…...
TorchEasyRec:阿里巴巴开源的推荐系统深度学习框架详解
第一部分:项目概览与核心功能 一、项目简介:什么是 TorchEasyRec? TorchEasyRec 是阿里巴巴 PAI 团队开发的基于 PyTorch 的推荐系统框架,专门用于构建生产级别的深度学习推荐模型。简单来说,它就是一个让你能够快速…...
密码学入门:区块链中的密码学原理
密码学入门:区块链中的密码学原理 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊密码学这个重要话题。作为一个Web3探索者,密码学是区块链的基础。今天就来分享一下区块链中常用的密码学原理。 为什么密码学很重要&a…...
Video2X专业级AI视频增强实战指南:GPU加速无损放大的深度技术解析
Video2X专业级AI视频增强实战指南:GPU加速无损放大的深度技术解析 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trendi…...
