同期数分析-留存率
目录
同期数分析
加载数据
单月实现
统计每个月的订单量
求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…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...