一种计算用户留存的方法

2023-05-16

0x00 概述

用户留存分析是互联网时代常用的一种数据分析方法。而很多快速发展的公司并没有相应的方法论沉淀,这就导致了在计算用户留存的时候会出现下面的一些问题:1)用户留存的定义不明确,不同的研发有自己的理解;2)没有保留计算过程的中间表,数据可复用程度低;3)不同研发的开发习惯不同,导致计算过程和表设计不统一。

鉴于以上问题,本文将指出一种通用的用户留存定义,并提供通用的计算流程以及具体的表结构设计。

0x01 简介

用户留存在不同的业务场景有不同的定义方式,比如说用户注册留存和用户活跃留存等。虽说定义方式不同,但大致思路和计算方式基本相同,本文将以用户活跃留存为例进行说明。

用户留存分析一般会分析两个指标:用户留存数和用户留存率。以 2048年05月12日 的留存分析为例,

  • 20480512的次日留存数 = 20480512日活跃用户 交集 20480513日的活跃用户数

  • 20480512的次日留存率 = 20480512的次日留存数/20480512的总活跃数

在留存分析中,除了次日留存以外,最常用的分析指标是3日留存、7日留存和30日留存。其中7日留存和30日留存可以理解为是周留存和月留存。下面是具体的定义:

  • 3日留存率 = (第1日活跃的用户,在第3日还活跃的用户数)/第1日的活跃用户数
  • 7日留存率 = (第1日活跃的用户,在第7日还活跃的用户数)/第1日的活跃用户数
  • 30日留存率 = (第1日活跃的用户,在第30日还活跃的用户数)/第1日的活跃用户数

0x02 计算

首先说一下用户留存的计算难点在哪里。用户留存计算的时候,每天要刷新之前日期的数据,比如说今天数2048年5月30号,那我们今天要算出这几个指标:20480530当天活跃用户数,20480529的1日留存数,20480527的3日留存数,20480523的7日留存数,以及20480430的30日留存数。并且,这些数据要分别放到对应那一天的报表里面。这就要求我们每天的任务要更新历史某天的数据项。

基于上面说的难点,我们做如下设计。我们讲用户留存的计算设计分为三部分:数据流设计、表结构设计和通用代码设计。

一、数据流和表结构

数据流和表结构可以放在一起讨论,为了简单说明,我设计了最简单能说明观点的表结构。

如下图,是整个计算流程,我们设计了两张表:用户留存中间表和用户留存报表。注意一下用户留存表中的type字段,它表示的用户留存的类型,看注释可知每个取值的含义。

我们设计用户留存中间表的原因是这样可以将中间表提供给数据分析使用,方便用该表和各种数据做交集用户,因此保留了uid的粒度。

用户留存报表使用这种竖表的设计方式,主要是为了考虑每天要修改历史数据的原因。如果用横表(即多个字段分别表示用户当日活跃、1日留存、7日留存等数据),那每天就要重新刷新多天数据分区中的所有数据,使用竖表则会减少很多的计算量并且更容易维护,只需在报表系统中将竖表转成横表展示即可。

二、通用代码设计

按照上面的设计,我们可以设计一套十分简单的代码来计算留存,比如1日、3日、7日和30日留存,可以用同一套代码完成,只要传入参数不同即可。如下是留存中间表的核心代码逻辑,报表的逻辑类似就不再展示。

代码清单1:留存计算通用代码

def _rt_sql(cur_date, user_type):
    '''
    user_type:留存类型,0表示当天活跃,1表示次日留存
    '''
    start_date = dateDelta(cur_date, user_type*-1) # start_date 表示的n日留存的那一天的日期。
    sql = '''
        insert overwrite table 用户活跃天表 partition(p_{start_date}, p_{user_type})
        select 
            {start_date} as ds,
            {user_type} as user_type,
            p_0.uid
        from
            用户活跃天表 p_0 -- 当时的活跃
        join 
            用户留存中间表 p_now -- 今天活跃
        on 
            p_0.uid = p_now.uid
        where p_0.ds = {start_date} and p_0.type = 0
        and p_now.ds = {cur_date}
    '''.format(cur_date=cur_date, user_type=str(user_type), start_date=start_date)
    exec_sql(sql)  ## 封装了执行sql的代码

代码清单2:整体计算逻辑

def _run(cur_date):
    _user_act_sql(cur_date) ## 计算当日活跃的用户,代码就不再写了
    _rt_sql(cur_date, 1) ## 1日留存
    _rt_sql(cur_date, 3) ## 3日留存
    _rt_sql(cur_date, 7) ## 7日留存
    _rt_sql(cur_date, 30) ## 30日留存

OK,通用代码就是这么简单。整体也就是几十行代码的量。

0xFF 总结

用户留存是数据分析常用而且十分简单有效的一种分析方法,但是很多公司对于留存的定义和计算方式都没有形成自己的方法论。比如说留存的定义,有的数据分析理解为连续留存,以7日留存为例,那么7日留存的计算逻辑是第一日活跃,后7日内凡事有活跃的用户都算是7日留存。而另外一些数据分析就会用我们本文中提的用户点留存,即只看第7天当天十分活跃。 然后再辅助于用户流失和回流等指标一同分析。

计算逻辑同样如此,不同的研发在计算留存的时候也使用了不同的方式,这就导致了最终提供给业务方或者其它研发的表十分不宜用。因此本文指出一种常用且比较通用的用户留存计算方式,并提供一套可行的留存计算通用代码,旨在提高开发和数据分析效率,保证数据口径的一致和数据的易用。

**写在最后,**有两个问题可以考虑一下:

  1. 文中的代码逻辑有很多可以优化的地方,不知道有朋友发觉了吗?
  2. 另外,如果不用计算中间表,只计算最终的报表,有没有十分简洁的Sql实现?

更多文章欢迎关注公众号:木东居士

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种计算用户留存的方法 的相关文章

  • eclipse部署tomcat修改项目访问路径(虚拟路径)

    原文参考 xff1a http www educity cn wenda 147993 html http blog 163 com java zf blog static 19926038420129240314546 tomcat部署w
  • kernle下制作动态logo

    在uboot中实现logo的好处是反映速度快 在kernel中实现logo的好处是 xff0c 不管是android还是什么其他平台 xff0c logo显示无需考虑上层平台 参照三星平台的写法 xff0c logo的显示一方面是开机时产品
  • CMakeList.txt详解

    CMakeListsts txt详解 当你使用add library 添加一个源文件或者库时 为了确保 CMake 可以在编译时定位到你的头文件 xff0c 最好添加include directories 命令到 CMake 构建脚本中并指
  • Intel NUC10i7FNH 寒霜峡谷测试体验

    Intel NUC10i7FNH 寒霜峡谷测试体验 谈谈为什么要捣鼓Intel NUC xff1f 淘货 xff01 淘货 xff01 淘货 xff01 开箱展示装机开整看看究竟是不是像吹的那么牛B 谈谈为什么要捣鼓Intel NUC xf
  • NUTTX学习笔记(一)

    NUTTX学习笔记 1 参考文献2 目前做的工作3 遇到的问题3 接下来的工作 明天开始就要赶一个项目了 xff0c 可能要过段时间再搞 xff0c 先把目前的阶段总结一下 1 参考文献 这里推荐两个博主 xff0c 我基本是参考他们的博客
  • pixhawk入门指南

    Pixhawk入门指南 1 安装ubunutu2 配置PX4编译环境3 2021 6 8更新 这篇博客用来说明如何入门pixhawk xff0c 成为一名真正的开发者 下面我将分步骤介绍 1 安装ubunutu pixhawk源码编译可以在
  • SetTimeOut 详解

    1 SetTimeOut 1 1 SetTimeOut 语法例子 1 2 用SetTimeOut 执行Function 1 3 SetTimeOut 语法例子 1 4 设定条件使SetTimeOut 停止 1 5 计分及秒的counter
  • Ubuntu下Jlink驱动安装使用

    Ubuntu下Jlink驱动安装使用 1 Jlink驱动下载安装2 Jlink驱动配置 想自己开发Nuttx系统 xff0c 很重要的一步就是将自己的代码下载到相应的硬件上 xff0c 对于STM家族处理器而言 xff0c 我们很多时候会使
  • PX4旋翼位置控制

    PX4旋翼位置控制 1 概括2 符号和函数说明2 1 符号说明2 2 函数说明 3 代码解析3 1 外环位置控制 positionController 3 2 内环速度控制 velocityController const float am
  • 数值分析(1)误差及误差分析

    数值分析1 误差及误差分析 第一章有效数有效数字和相对误差误差的数值运算条件数 第一章 有效数 定义 xff1a 某个数字 x x x 可以写成下面的形式
  • PX4 模块代码启动流程

    PX4模块代码启动流程 由于经常纠结程序代码启动流程 xff0c 以EKF2为例总结一下 版本 V1 9 0 源码路径 xff1a src modules ekf2 ekf2 main cpp 第一步 xff1a 启动时会进入和文件名相同的
  • PX4中的卡尔曼滤波——代码公式对照解释

    PX4中位置速度卡尔曼滤波解释 1 变量解释2 代码和公式对应2 1卡尔曼滤波公式 2 2 对应代码2 2 状态更新公式说明 3 总结 这篇博客以PX4中速度和位置估计来分析卡尔曼滤波过程 xff0c 将枯燥的公式和鲜活的代码联系起来 版本
  • PX4多传感器优先级判断

    PX4多传感器优先级判断 1 简介2 代码分析2 1 主体思路2 2 代码探究 这篇博客讨论了PX4在很多传感器下如何自动选择最优传感器 版本 xff1a v1 9 0 源码位置 xff1a src lib ecl sensors sens
  • PX4垂直起降过程研究总结

    这篇博客只要对垂直起降过程和控制逻辑进行分析 版本 xff1a V1 10 2 源码位置 xff1a src modules vtol att control vtol att control main cpp src modules vt
  • PX4 四元数旋翼姿态控制修正

    PX4 四元数旋翼姿态控制修正 1 四元数介绍2 旋翼四元数角度控制逻辑3 最终控制实现逻辑4 仿真验证 版本 xff1a V1 10 2 xff1b 源码位置 xff1a src modules ma att control ma att
  • PX4实践中遇到的问题总结(持续更新中!!!!)

    PX4实践中遇到的问题总结 xff08 持续更新中 xff01 xff01 xff09 1 解锁的时候各种传感器报错2 舵机莫名抖动3 起落架没法转向4 遥控器无法校准5 遥控器校准好之后操纵出现问题 1 解锁的时候各种传感器报错 如果是处
  • PX4 添加自定义参数

    PX4 添加自定义参数 PX4添加参数1 以添加参数 VT TILT MC 2 为例2 验证 PX4添加参数 1 以添加参数 VT TILT MC 2 为例 tiltrotor cpp 在构造函数里面初始化参数映射 params handl
  • Ubuntu系统中文乱码的解决办法

    Ubuntu系统中文乱码的解决办法 文章目录 Ubuntu系统中文乱码的解决办法1 安装中文语言2 安装语言设置的命令locale3 安装中文的相关字体4 修改语言的环境变量4 1 环境变量一4 2 设置二 5 正式配置语言后记 最近在do
  • Laf Assistant:云开发从未如此爽快!

    原文链接 xff1a https forum laf run d 67 工欲善其事 xff0c 必先利其器 在编写代码时 xff0c IDE 也是我们不可或缺的 它可以让我们更高效地完成代码编写 xff0c 提高开发效率 因此 xff0c

随机推荐

  • PX4垂起(Tiltrotor)偏航控制研究

    PX4垂起 xff08 Tiltrotor xff09 偏航控制研究 PX4垂起 xff08 Tiltrotor xff09 偏航控制研究1 问题描述2 过渡过程中为什么没有偏航角度控制问题1 xff1a 为什么在过渡阶段固定翼位置控制没有
  • PX4卡尔曼滤波分析

    PX4卡尔曼滤波分析 本文主要介绍了PX4中EKF相关的代码
  • 飞行器参数辨识-极大似然估计

    飞行器参数辨识 极大似然估计 1 理论1 1 极大似然估计一般理论1 2 极大似然估计应用在飞行器参数估计1 3 拟线性化求解带估计参数 2 程序实现2 1 飞行器运动的状态方程 1 理论 1 1 极大似然估计一般理论 n n n 个随机观
  • 使用opencv进行车牌提取及识别

    https blog csdn net u011808673 article details 78510692
  • ​天天干着打杂的活,你做好突破自我的觉悟了吗?

    天天干着打杂的活 xff0c 你做好突破自我的觉悟了吗 xff1f 本文为草核儿创作 xff0c 经授权在本公众号原创首发 关于作者 xff1a 草核儿 xff0c 互联网行业沉思者 xff01 希望传播的是正能量 xff0c 但偶尔会被误
  • 数据仓库系列:如何优雅地规划数仓体系

    0x00 前言 数仓规划是数仓建设的蓝图 xff0c 涵盖从需求分析开始到最终的数仓评估验收整个环境 xff1b 数仓规划之所以重要 xff0c 是因为它是描述了数据流动的概念性框架 xff0c 为元数据管理奠定了基础 xff0c 对数据加
  • 【实践案例分享】有赞数据仓库实践之路

    作者 xff1a 叶瑞典 团队 xff1a 数据中台 一 大数据环境下的有赞数仓 关于数据仓库 xff0c 在维基百科中将它定义为用于报表和数据分析的系统 xff0c 是商务智能 Business Intelligence 的核心部分 在数
  • 3分钟看懂用户标签体系怎么做

    随着越来越多的企业开始追求对用户的精细化运营 用各种手段延长用户的生命周期 xff0c 促进用户的活跃与转化 xff0c 并尽一切可能产生商业价值 xff0c 已经是运营的核心 而要做好精准化运营的第一步 xff0c 便是更好的认识我们的用
  • 数据运营系列(三):熵权法如何确定指标权重构建评价体系

    1 熵权法 信息论基本原理解释信息是系统有序性的度量单位 xff0c 而熵可以度量系统的无序程度 xff1b 如果某个指标的信息熵越小 xff0c 该指标提供的信息量越大 xff0c 指标变异程度 方差 高 xff0c 因此在综合评价中所起
  • 漫谈数据团队协作之各岗位间的相互尊重

    最近和几位资深的团队管理者聊团队协作 xff0c 受益匪浅 xff0c 其中有一个观点令居士印象深刻 xff1a 想让团队成员之间能够默契地协作 xff0c 有非常多的方法 xff0c 但是 xff0c 有一个很重要且很基本的要求是 xff
  • 【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

    文章目录 一 功能简介二 软件设计三 实验现象联系作者 一 功能简介 本项目使用Proteus8仿真STM32单片机控制器 xff0c 使用LCD1602显示模块 按键模块 HC05蓝牙 DHT11温湿度 PCF8591 ADC模块 光线传
  • 直播PPT分享-如何体现数据同学的业务敏感度

    今天即兴给大家直播分享了一次 xff0c 反馈还比较不错 xff0c 不少童鞋私信我要ppt xff0c 这里就统一发出来给大家参考了 xff0c 其实内容很少 xff0c 6句话搞定 以后 xff0c 居士会不定期地直播分享 xff0c
  • 无题

    今天在思考一个问题 xff0c 关于互联网行业的 xff0c 其他行业还不太清楚不敢妄加评论 互联网行业在当前社会中其实面临着很多社会问题需要解决和探索 xff0c 比如职业发展的不确定性 35岁的职业危机 职业社交关系的难处理 xff0c
  • Markdown学习笔记:如何画流程图

    如何使用markdown画流程图 话说网上关于使用markdown画流程图的相关的教程真是一堆堆的坑 xff0c 我丝毫不怀疑这些博文作者确实是知道如何使用markdown画流程图了 xff0c 但是写出来的文章却丝毫没有明白具体的使用方法
  • Gradle打jar包,包含所有依赖

    前言 最近被gradle折腾的欲仙欲死 gradle想把所有依赖打进jar包主要有两种方式 xff1a 一种是重写jar动作 xff0c 一种是用第三方插件 为了装x xff0c 我一直都是用的第一种方式 xff0c 结果出了问题解决不了
  • Spring Data Rest如何暴露ID字段

    前言 为了懒省事 xff0c 使用Spring Data Rest来直接提供rest接口 xff0c 重点遇到点小坑 xff0c 记录一下 记录 问题 entity xff1a span class hljs annotation 64 E
  • hadoop清空回收站

    直接删除目录 xff08 不放入回收站 xff09 hdfs dfs span class hljs attribute rm span span class hljs attribute skipTrash span path span
  • 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容 xff0c 包括它的原理 设计 以及在我们大数据场景下的实现方式 最新文章已经迁入公众 xff1a 木东居士 全文由下面几个部分组成 xff1a 先分享一下拉链表的用途 什么是拉链
  • 《数据仓库实践》

    序言 2017 年初 xff0c 我开始在简书上写关于数据仓库的系列博客 xff0c 博客主题围绕大数据场景下数据仓库的理论和实践来展开 xff0c 截止现在已有十篇左右 最初写作的时候主要是抱着学习和总结的态度 xff0c 导致很多地方略
  • 一种计算用户留存的方法

    0x00 概述 用户留存分析是互联网时代常用的一种数据分析方法 而很多快速发展的公司并没有相应的方法论沉淀 xff0c 这就导致了在计算用户留存的时候会出现下面的一些问题 xff1a 1 xff09 用户留存的定义不明确 xff0c 不同的