数据分析:在缓慢变化中寻找跳变——基于缓慢变化维度的用户分群
引导语
数据分析中,我们常常有下面几种分群方式:
基础属性类:年龄、性别、城市、学历、用于首次来源
- 特点:
基本是不变化的,虽然年龄、城市等也会发生变化,但本质上我们是将其作为一个用户固定属性进行分析。
- 优势:
用户属性稳定,分群永远不变化。
- 劣势:
是维度有限,很多分析维度很难找到固定属性。
图:某业务用户数分年龄段曲线(来自腾讯灯塔截图)
动态属性类:当天启动方式、当日拉活渠道、新老用户、当日播放视频数、当日是否领取红包。
- 特点:
基本上是基于用户当天的一些行为或状态数据,例如启动方式,每天的启动方式都可能变化,其它也相同。
- 优势:
优点是与业务结合行强相关,分群方式灵活,能够迅速定位问题。例:(1)今天领红包的用户留存降低了,可以快速定位是否是红包产品出现了问题;(2)主动启动用户留存持续上涨,说明产品在朝着正向发展,是个好势头。
- 劣势:
用户的属性经常发生变化,很难解释是结构变化还是效果变化,容易引入互为因果的问题。例:今天领红包的用户留存降低了,到底是红包产品出了问题,还是今天有一大批留存低的用户领了红包呢?因果关系不易排清。
图:微视红包业务,按用户当日领取金额分群的有关数据(来自腾讯灯塔截图)
基于运营视角的缓慢变化维度
有没有合适分群方式,可以结合基础属性和动态数据的优势,解决相关问题。例如,希望分析红包业务,有没有对用户留存产生影响,我们设想几种方式。
- 按当日是否领取红包将用户分群,分为「领取红包用户」「未领红包用户」,洞察用户留存,这里会受领取红包渗透率影响较大,另外每天领取红包的用户,没有了一致性和连续性(每天不是一批用户)。
- 我们通过特征判断,高龄群体喜欢领红包,分析高龄群体的特征,但又无法解释红包业务。
- 通过号码包圈选,圈选出过去1个月有领取过红包N次以上的用户,观察这批用户的留存率变化,这种方法相对好一些,但是受圈选的日期影响较大。
其实,这里我们更关心的是,比较喜欢领取红包的那批人,他们究竟留存上有什么变化?
我们引入了数据仓库中缓慢变化维的概念,例如,每天均将用户按照过去1个月领取红包的天数做分段,这样,用户的分群是在缓慢变化,解决了分群一致性问题,监控的指标是短期变化,可以很好的监控出业务异动。
图:按最近1个月(每日向前滚动计算1个月)领取红包天数分层,DAU用户留存曲线
如上图,我们清晰的看到,红包敏感群体(「22-28天」)群组的用户留存率在明显下跌,如果按照领取用户的留存,那么这批红包敏感群体会被大量的不敏感但领取用户稀释掉。
其实我们还可以基于业务视角,构造出很多与业务强相关的缓慢变化维(我们后文称呼为「运营视角缓慢变化维」),如:
· 过去1个月活跃天数
· 过去1个月是否有观看直播
· 过去1个月发布视频天数
通过在运营视角缓慢变化维上分析异动数据,还非常容易找到业务的交集影响和变化。
红包敏感群体(缓慢变化维中,过去1个月领取红包22-28天),发布渗透率在逐渐提高,这说明红包模块和发布模块,用户产生了较强的交集,也许可以在产品层面迭代,促进2个模块的相互互动。
运营视角缓慢变化维的构造维需要注意如下几点:
- 维度选择,要滚动较长的周期,例如历史28天、历史90天领取红包天数,这里的滚动周期越短,时效性越好,反映用户最近的状态;滚动周期越长,维度的稳定性越好,维度一致性不易变化。
- 维度选择,应尽可能选择鲁棒性好、受极端值影响小的指标,如历史28天领取红包天数,就比历史28天领取红包次数,因为领取次数可能因某一天次数极高影响,不易反映出用户的真实分层情况。
- 指标选择,指标要选择时间跨度远小于维度的,如我们按照历史28天XX指标分层,适合监控用户的次日留存率,3日留存率等,但不适合监控28日留存率。
总的来说,运用运营视角缓慢变化维,本质上是,在一个低频变化上发现其中的高频变化。
BI工具的应用
对于BI工具,需要区分维度表和事实表,现在很多BI工具就可以支持「按天变化的维度信息」,可以方便快捷的利用缓慢变化维进行异动分析,以腾讯灯塔为例:
图:腾讯灯塔关于缓慢变化维的适配
目前,团队已经将较多用户行为数据,作为用户基础画像的一部分,引入到数据分析之中,在日常的运营分析和异动监控中广泛应用。
原文作者:刘健阁
原文链接:
https://mp.weixin.qq.com/s/3eLhduKVDiP2igJupFYZPw
腾讯NEXT学院
求职干货 | 前辈blog | 前端课程
↓↓↓点击阅读原文,体验python入门课程
喜欢这样的干货就点个在看吧!
- laravel访问路由在nginx服务器上无法处理
- How Tomcat Works, A Guide to Developing Your Own Java Servlet Container
- 【开发指南】如何为nexus 5编译固件
- 支持向量机(SVM)入门详解(续)与python实现
- 数据库
- 关于Bom头的一些坑
- 使用shell脚本查看数据库负载情况(81天)
- 无法连接远程mysql数据库解决方案
- 归档问题导致的数据库无法启动 (80天)
- ubuntu上安装php7.0+nginx+mysql
- spring mvc 时间日期转换(@DateTimeFormat 注解)
- php链式操作的实现
- 循序渐进调优ddl的案例 (79天)
- Timer类的schedule()方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PAT (Basic Level) Practice (中文)1018 锤子剪刀布 (20 分)
- 还在用传统的方式驱动一个通信模组?不如一起来学习下TOS的AT模组框架吧!
- 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(一)词法分析
- Codeforces Round #199 (Div. 2)C. Cupboard and Balloons
- PAT (Basic Level) Practice (中文)1004 成绩排名 (20 分)
- PAT (Basic Level) Practice (中文)1020 月饼 (25 分)
- 201709-2ccf计算机职业资格认证考试第二题公共钥匙盒
- SAP Spartacus里cx-carousel的实现
- 技术分享 | 改写 mysqldump 解决 DEFINER 问题
- CNS图表复现04—单细胞聚类分群的resolution参数问题
- 学习Vue3.0,先从搭建环境开始
- AIM Tech Round 5 (rated, Div. 1 + Div. 2)C. Rectangles
- PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
- 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(二)语法分析
- PAT (Basic Level) Practice (中文)1023 组个最小数 (20 分)