@@ -289,9 +203,7 @@
提交
-
- 根据分组字段,使用饼图/环形图展示占比情况。
-
+
根据分组字段,使用饼图/环形图展示占比情况。
绘制
@@ -303,11 +215,14 @@
第五步,商品复购分析
- 商品的复购情况分析十分重要,可以通过复购次数较多的商品,分析用户习惯和商品特征,分析维度包括:
+ 商品的复购情况分析十分重要,可以通过复购次数较多的商品,分析用户习惯和商品特征,分析维度包括:
+
- 每种商品的复购次数、排行榜;
+ 每种商品的复购次数、排行榜;
+
- 每种商品复购的用户情况,每个用户复购的次数等;
+ 每种商品复购的用户情况,每个用户复购的次数等;
+
结合品类、销量、价格区间、评价等等多种维度,进行细化分析等。
@@ -323,18 +238,12 @@
backgroundColor: '#6A7DE9!important',
}"
>
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -351,27 +260,11 @@
backgroundColor: '#6A7DE9!important',
}"
>
-
-
+
-
-
+
+
@@ -395,32 +288,11 @@
backgroundColor: '#6A7DE9!important',
}"
>
-
-
-
+
+
-
-
+
+
@@ -429,13 +301,8 @@
- 次
+
+ 次
@@ -468,28 +335,29 @@
第六步,商品价值分析
- 从商品的角度出发,看一个商品的综合价值,可以使用四象限图(波士顿矩阵)来查看商品价值分析。销量和复购率分别作为横纵轴,以平均值为分割线,将所有商品类型划分到四个象限内。
- 对于新兴产品:需要着重拓展市场
- 对于低回购产品:需要检查是否产品有质量问题,导致用户单次购买多但不会回购
+ 从商品的角度出发,看一个商品的综合价值,可以使用四象限图(波士顿矩阵)来查看商品价值分析。销量和复购率分别作为横纵轴,以平均值为分割线,将所有商品类型划分到四个象限内。
+
+ 对于新兴产品:需要着重拓展市场
+
+ 对于低回购产品:需要检查是否产品有质量问题,导致用户单次购买多但不会回购
+
对于问题产品:着重关注
-

+

-
第七步,复购深层分析
+
第七步,复购深层分析
定期追指标
-
- 用户太久不来消费就可能流失,因此衍生了一个做法:计算用户最近一次消费距今时间,如果发现用户已经距今7天/30天/60天/90天没有复购,则直接开展唤醒动作,发放优惠券。
-
+
用户太久不来消费就可能流失,因此衍生了一个做法:计算用户最近一次消费距今时间,如果发现用户已经距今7天/30天/60天/90天没有复购,则直接开展唤醒动作,发放优惠券。
-

+
@@ -505,11 +373,12 @@
找魔法数字
- 忠诚用户的复购频率会比普通用户高,这个道理也是不用分析,是个人都知道。于是,有一些数据分析师/运营,会去找这个魔法数字:用户复购X次以后,累计消费与复购率明显高于其他用户(如下图)。
+ 忠诚用户的复购频率会比普通用户高,这个道理也是不用分析,是个人都知道。于是,有一些数据分析师/运营,会去找这个魔法数字:用户复购X次以后,累计消费与复购率明显高于其他用户(如下图)。
+
比如发现用户复购4次以后,再进行复购的概率与累计消费都明显高于其他用户。运营便很有动力围绕这个“4次”做文章,通过会员奖励/连续推券/积分等手段,鼓励用户做到这个“4次复购”。
-

+
@@ -517,11 +386,12 @@
发现偏好
- 在统计用户消费频次/金额的时候,不要只粗暴地看总量,而是按品牌/品类比例进行区分,尝试找到:集中某一品牌/某一品类的忠实用户,如果发现有这一类相对“专一”的用户存在,
+ 在统计用户消费频次/金额的时候,不要只粗暴地看总量,而是按品牌/品类比例进行区分,尝试找到:集中某一品牌/某一品类的忠实用户,如果发现有这一类相对“专一”的用户存在,
+
再结合其消费金额/参与活动情况,判断用户是被打折价格吸引还是被商品吸引,从而找出运营策略。
-

+
@@ -529,10 +399,14 @@
记录场景
- 低频消费的用户,不代表一定没有复购,很有可能只是没有触发需求场景而已,比如典型的:
- 1)喜爱参与大促的用户;
- 2)节假日/礼品消费的用户;
- 3)换季/上新时才出现的用户。
+ 低频消费的用户,不代表一定没有复购,很有可能只是没有触发需求场景而已,比如典型的:
+
+ 1)喜爱参与大促的用户;
+
+ 2)节假日/礼品消费的用户;
+
+ 3)换季/上新时才出现的用户。
+
这些用户的复购周期是必然远远低于常规用户的,但在特定场景下的消费又非常刚需。因此与其平时浪费资源乱发券,不如通过消费记录/搜索记录等,标志出重点场景用户,集中在这些场景下赢取用户消费。
@@ -556,7 +430,9 @@ import { downBlobFile } from "@/utils/index.js";
import * as echarts from "echarts";
const { proxy } = getCurrentInstance();
const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const knowledgeHtml2 = ref(`在电商/零售数据分析中,复购数据分析是非常重要的部分。尤其是在当今新用户获取成本越来越高的今天,根据中国电子商务中心提供的公开数据显示,商家获得一个新用户的成本是维护一个老用户的 5 - 10 倍,一个满意的用户会带来至少 8 笔潜在生意,一个不满意的用户可能会影响超过 25 个人的购买意愿。
通过复购行为分析,了解用户偏向和用户习惯,优化相关产品、活动等,提高用户粘性和产品粘性,才能实现产品/业务的稳定增长。
本文我们一起看下,复购分析可以从哪些角度入手,核心指标复购率如何计算。
一、复购率是什么?
复购率通常指重复购买率,在不同业务场景下,也有各自的计算方式。常见的是从用户角度和订单角度两种。
1、用户复购率:
指一定时间段内,购买次数>1次的用户数/有过购买行为的用户总数
2、订单复购率:
指一定时间段内,重复交易订单数/交易订单总数
在实际分析中,还需要根据业务场景和需求,对于公式中的指标取值范围进行确定。
例如:
【购买次数】计算的两种方式:
a.同一天多个订单分别计算次数
b.一个客户一天产生多笔订单交易,只算一次购买
2、复购分析如何做?
影响复购率的因素通常是商品、活动、服务、用户满意度等,根据复购分析,我们也会从这些方面入手调整策略,达到提高复购、提高用户粘性的作用。
所以在进行复购分析时,我们就可以从用户、订单、产品几个角度入手进行分析。
分析工具:海致BDP个人版
数据情况:零售订单示例数据
包含字段:订单ID、用户ID、购买日期、商品ID、购买金额
1、区分首购订单 or 复购订单
要计算复购率,首先我们需要根据用户ID、订单ID和购买日期,区分每行数据订单是首购or 复购第几次
在上传的基础工作表中「添加字段」

计算公式:dense_rank()over ( partition by [用户ID] order by [购买日期],[订单ID] )
公式逻辑:这里我们使用窗口函数,按照用户ID分组,按照购买日期和订单ID进行排序,即可计算出该行订单数据是用户的第几次购买。
(这里我们将同一天,不同订单ID计为多次购买)

计算出的结果示例:
某用户在2月4日分开交易2笔订单,3月27日交易一笔,计算字段结果分别计1,2,3次

根据计算结果,可以区分首购 or 复购订单
计算后,将工作表进行一次追加合并,将窗口函数结果物化,便于后续的计算和做图。
点击右上角-创建合表,选择追加合并,添加工作表,命名后保存为表1.1。

2、复购用户数&复购订单数
计算复购率, 需要先计算分子,也就是复购用户数和复购订单数。
我们通过对用户ID和订单ID进行去重计数得出。
在刚刚保存的表1.1 右上角,点击新建图表,在图表编辑界面添加计算字段


复购用户数—计算公式:
count(distinct(if([区分首购订单or复购订单]=2,[用户ID],null)))
计算逻辑:复购标记字段=2的即为有过复购行为的用户,按此条件对用户ID进行去重计数,即可得出有过复购行为的用户数量。
将计算字段拖至数值栏,即可展示复购用户数

复购订单数逻辑类似,区别在于条件是:只要复购标记字段不等于1,都属于复购订单。
计算公式:count(distinct(if([区分首购订单or复购订单]<>1,[订单ID],null)))

3、用户复购率&订单复购率
已经求出复购率公式的分子后,依然在图表编辑界面,添加字段,求出复购率
用户复购率:
计算公式:[复购用户数]/count(distinct([用户ID]))
用上一步计算的复购用户数/用户ID去重计数值,即可表示用户复购率
订单复购率:
计算公式:[复购订单数]/count(distinct([订单ID]))
4、复购时间间隔
了解用户的复购周期,也是复购分析中必要的指标,这里需要计算用户复购和首次购买之间的时间间隔
在刚才的合表1.1 右上角,选择创建合表,进行追加合并,设置过滤条件,筛选出所有的复购订单,保存为表1.2

再次选择创建合表—多表关联

将表1.1作为左表,1.2作为右表,选择关联方式inner-join,关联字段为2张表的用户ID。
设置过滤条件:左表复购标记字段=1


进行字段设置,左表相关字段为首购数据字段,右表为复购数据字段

命名保存为表1.3
保存后点击添加字段,使用公式,计算两次购买时间间隔
公式:DAY_DIFF([复购购买日期],[首次购买日期])

计算结果示例:

三、复购分析-可视化
根据刚才的数据计算结果,我们可以进行可视化展示,通过可视化图表的形式,发现数据规律和问题
1、重点指标数据
使用指标卡,展示重点指标数据,还可以配合全局筛选器,筛选展示不同时间段、不同地区等指标数据

2、复购数据—时间趋势
使用表1.1,对用户复购情况,做日期维度的分析展示
图表类型:双轴图
购买用户总数为用户ID去重计数

订单复购分析类似。按照日期维度,可以按季度、按月、按周查看复购率和用户数/订单数之间的变化关系。同时监控数据健康度,理想状态下复购率应该是较为稳定的,根据数据变化,及时发现异常问题。
3、复购时间间隔分析
可以根据复购时间间隔进行分组展示,了解用户在不同时间间隔范围内,进行复购行为的占比情况
添加分组字段,根据业务需求,设置自定义步长和组别

将分组字段放置维度栏,用户ID去重计数作为数值,使用饼图/环形图展示占比情况(这里我们主要分析第二次购买与首购的时间间隔,通过筛选器控制)

也可以使用折线图,展示复购时间间隔的趋势

根据可视化图表显示,示例数据中用户在7天内产生复购行为的占比最大,其次是60天以上,说明在短时间内用户粘性最高,产生复购的可能性最大, 对于占比较小的时间间隔,可以采取相应措施对用户进行引导召回。
复购时间间隔的分析还可以下钻到具体商品,了解商品的复购周期等。
4、商品复购分析
除了用户复购和订单复购分析外,针对于商品的复购情况分析也十分重要,可以通过复购次数较多的商品,分析用户习惯和商品特征。
我们可以在表1.3中添加商品复购标记字段
公式:if([首购商品ID]=[复购商品ID],1,0)
首购商品ID=复购商品ID,即表示该用户有复购该商品行为

按照商品ID,计算商品ID计数,即查看每种商品的复购次数

还可以通过图层下钻,了解每种商品,复购的用户情况,每个用户复购的次数等

商品的复购分析,还可以结合品类、销量、价格区间、评价等等多种维度,进行细化分析

针对用户的复购分析,还可以从新老用户的复购率、不同渠道来源用户的复购率等角度,进行拆解分析。
结合用户的RFM分析,更加详细的了解用户的消费习惯,了解商品的特征,通过复购率的变化优化我们的业务策略
`)
+const knowledgeHtml2 = ref(
+ `在电商/零售数据分析中,复购数据分析是非常重要的部分。尤其是在当今新用户获取成本越来越高的今天,根据中国电子商务中心提供的公开数据显示,商家获得一个新用户的成本是维护一个老用户的 5 - 10 倍,一个满意的用户会带来至少 8 笔潜在生意,一个不满意的用户可能会影响超过 25 个人的购买意愿。
通过复购行为分析,了解用户偏向和用户习惯,优化相关产品、活动等,提高用户粘性和产品粘性,才能实现产品/业务的稳定增长。
本文我们一起看下,复购分析可以从哪些角度入手,核心指标复购率如何计算。
一、复购率是什么?
复购率通常指重复购买率,在不同业务场景下,也有各自的计算方式。常见的是从用户角度和订单角度两种。
1、用户复购率:
指一定时间段内,购买次数>1次的用户数/有过购买行为的用户总数
2、订单复购率:
指一定时间段内,重复交易订单数/交易订单总数
在实际分析中,还需要根据业务场景和需求,对于公式中的指标取值范围进行确定。
例如:
【购买次数】计算的两种方式:
a.同一天多个订单分别计算次数
b.一个客户一天产生多笔订单交易,只算一次购买
2、复购分析如何做?
影响复购率的因素通常是商品、活动、服务、用户满意度等,根据复购分析,我们也会从这些方面入手调整策略,达到提高复购、提高用户粘性的作用。
所以在进行复购分析时,我们就可以从用户、订单、产品几个角度入手进行分析。
分析工具:海致BDP个人版
数据情况:零售订单示例数据
包含字段:订单ID、用户ID、购买日期、商品ID、购买金额
1、区分首购订单 or 复购订单
要计算复购率,首先我们需要根据用户ID、订单ID和购买日期,区分每行数据订单是首购or 复购第几次
在上传的基础工作表中「添加字段」

计算公式:dense_rank()over ( partition by [用户ID] order by [购买日期],[订单ID] )
公式逻辑:这里我们使用窗口函数,按照用户ID分组,按照购买日期和订单ID进行排序,即可计算出该行订单数据是用户的第几次购买。
(这里我们将同一天,不同订单ID计为多次购买)

计算出的结果示例:
某用户在2月4日分开交易2笔订单,3月27日交易一笔,计算字段结果分别计1,2,3次

根据计算结果,可以区分首购 or 复购订单
计算后,将工作表进行一次追加合并,将窗口函数结果物化,便于后续的计算和做图。
点击右上角-创建合表,选择追加合并,添加工作表,命名后保存为表1.1。

2、复购用户数&复购订单数
计算复购率, 需要先计算分子,也就是复购用户数和复购订单数。
我们通过对用户ID和订单ID进行去重计数得出。
在刚刚保存的表1.1 右上角,点击新建图表,在图表编辑界面添加计算字段


复购用户数—计算公式:
count(distinct(if([区分首购订单or复购订单]=2,[用户ID],null)))
计算逻辑:复购标记字段=2的即为有过复购行为的用户,按此条件对用户ID进行去重计数,即可得出有过复购行为的用户数量。
将计算字段拖至数值栏,即可展示复购用户数

复购订单数逻辑类似,区别在于条件是:只要复购标记字段不等于1,都属于复购订单。
计算公式:count(distinct(if([区分首购订单or复购订单]<>1,[订单ID],null)))

3、用户复购率&订单复购率
已经求出复购率公式的分子后,依然在图表编辑界面,添加字段,求出复购率
用户复购率:
计算公式:[复购用户数]/count(distinct([用户ID]))
用上一步计算的复购用户数/用户ID去重计数值,即可表示用户复购率
订单复购率:
计算公式:[复购订单数]/count(distinct([订单ID]))
4、复购时间间隔
了解用户的复购周期,也是复购分析中必要的指标,这里需要计算用户复购和首次购买之间的时间间隔
在刚才的合表1.1 右上角,选择创建合表,进行追加合并,设置过滤条件,筛选出所有的复购订单,保存为表1.2

再次选择创建合表—多表关联

将表1.1作为左表,1.2作为右表,选择关联方式inner-join,关联字段为2张表的用户ID。
设置过滤条件:左表复购标记字段=1


进行字段设置,左表相关字段为首购数据字段,右表为复购数据字段

命名保存为表1.3
保存后点击添加字段,使用公式,计算两次购买时间间隔
公式:DAY_DIFF([复购购买日期],[首次购买日期])

计算结果示例:

三、复购分析-可视化
根据刚才的数据计算结果,我们可以进行可视化展示,通过可视化图表的形式,发现数据规律和问题
1、重点指标数据
使用指标卡,展示重点指标数据,还可以配合全局筛选器,筛选展示不同时间段、不同地区等指标数据

2、复购数据—时间趋势
使用表1.1,对用户复购情况,做日期维度的分析展示
图表类型:双轴图
购买用户总数为用户ID去重计数

订单复购分析类似。按照日期维度,可以按季度、按月、按周查看复购率和用户数/订单数之间的变化关系。同时监控数据健康度,理想状态下复购率应该是较为稳定的,根据数据变化,及时发现异常问题。
3、复购时间间隔分析
可以根据复购时间间隔进行分组展示,了解用户在不同时间间隔范围内,进行复购行为的占比情况
添加分组字段,根据业务需求,设置自定义步长和组别

将分组字段放置维度栏,用户ID去重计数作为数值,使用饼图/环形图展示占比情况(这里我们主要分析第二次购买与首购的时间间隔,通过筛选器控制)

也可以使用折线图,展示复购时间间隔的趋势

根据可视化图表显示,示例数据中用户在7天内产生复购行为的占比最大,其次是60天以上,说明在短时间内用户粘性最高,产生复购的可能性最大, 对于占比较小的时间间隔,可以采取相应措施对用户进行引导召回。
复购时间间隔的分析还可以下钻到具体商品,了解商品的复购周期等。
4、商品复购分析
除了用户复购和订单复购分析外,针对于商品的复购情况分析也十分重要,可以通过复购次数较多的商品,分析用户习惯和商品特征。
我们可以在表1.3中添加商品复购标记字段
公式:if([首购商品ID]=[复购商品ID],1,0)
首购商品ID=复购商品ID,即表示该用户有复购该商品行为

按照商品ID,计算商品ID计数,即查看每种商品的复购次数

还可以通过图层下钻,了解每种商品,复购的用户情况,每个用户复购的次数等

商品的复购分析,还可以结合品类、销量、价格区间、评价等等多种维度,进行细化分析

针对用户的复购分析,还可以从新老用户的复购率、不同渠道来源用户的复购率等角度,进行拆解分析。
结合用户的RFM分析,更加详细的了解用户的消费习惯,了解商品的特征,通过复购率的变化优化我们的业务策略
`
+);
const knowledgeHtml = ref(
`复购率分析是评估消费者对某一品牌或产品忠诚度的重要指标,它反映了消费者满意度和重复购买的行为。通过复购率分析,企业可以更好地了解消费者的购买行为和需求,从而制定更精准的营销策略和产品优化方向。
复购率的计算有两种主要方法:
按客户计算:一定时间内再次购买的客户的人数除以购买的总人数。这种方法不考虑客户购买的次数,只关注是否有重复购买行为。
按订单计算:一定时间内再次购买的客户的订单数除以购买的总订单数。这种方法会统计多次购买的客户订单,区分每次购买的订单。
推荐企业采取按客户计算的复购率算法,因为它更能反映消费者的忠诚度。然而,按订单计算的复购率可能会因为多次购买的客户产生的订单数较多而显得更高。
复购率分析的重要性体现在以下几个方面:
反映客户忠诚度:高复购率意味着消费者对产品的认可度高,愿意再次购买,从而反映出较高的客户忠诚度。
预测销售趋势:通过分析复购率的变化趋势,企业可以预测产品的未来表现,做出更明智的选品决策。
指导选品策略:结合其他指标如销售额、转化率等,对复购率进行综合分析,可以帮助企业筛选出具有潜力的爆款产品。
为了进行复购率分析,企业可以采用以下步骤:
1.收集数据:收集包括订单ID、订单日期、客户名称等指标的数据。
2.计算复购率:根据收集的数据计算一个月内每个用户的购买次数、统计一个月内的购买人数、统计每个月内多次购买的人数并计算月复购率。
3.可视化展示:通过可视化图表的形式展示复购率数据,发现数据规律和问题,如复购时间间隔分析、商品复购分析等。
4.结论分析:根据复购率和用户总数的变化趋势,分析用户黏性的健康度,制定相应的运营策略。
通过复购率分析,企业不仅可以评估现有客户的忠诚度和满意度,还可以预测未来的销售趋势,为产品优化和营销策略提供有力支持。
`
);
@@ -1378,7 +1254,7 @@ const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
return [2, 1];
}
}
- if (rowIndex === 1) {
+ if (rowIndex === 1) {
if (columnIndex === 6) {
return [0, 0];
}
@@ -1442,12 +1318,7 @@ const draw = () => {
fiftyNum.value = 0;
thirtyNumIn.value = 0;
thirtyNumOut.value = 0;
- if (
- !step4Data.value[0].params2 ||
- !step4Data.value[2].params2 ||
- !step4Data.value[4].params2 ||
- !step4Data.value[6].params2
- ) {
+ if (!step4Data.value[0].params2 || !step4Data.value[2].params2 || !step4Data.value[4].params2 || !step4Data.value[6].params2) {
proxy.$modal.msgError("请完成所有时间间隔分组选择!");
return;
}
@@ -1478,7 +1349,7 @@ const draw = () => {
text: "时间间隔",
left: "center",
textStyle: {
- color: "#fff",
+ color: "#000",
},
},
tooltip: {
@@ -1488,7 +1359,7 @@ const draw = () => {
orient: "vertical",
left: "left",
textStyle: {
- color: "#fff",
+ color: "#000",
},
},
series: [
@@ -1496,6 +1367,11 @@ const draw = () => {
name: "时间间隔",
type: "pie",
radius: "50%",
+ label: {
+ show: true,
+ position: "inside",
+ formatter: "{b} {d}%",
+ },
data: [
{ value: sevenNum.value, name: "7天内" },
{ value: fiftyNum.value, name: "15天内" },
@@ -1679,87 +1555,45 @@ const step5Submit = () => {
}
for (let i in step5DataTable3.value) {
// console.log(fileTable1.value[i]);
- if (
- !step5DataTable3.value[i].params1 ||
- !step5DataTable3.value[i].params2
- ) {
+ if (!step5DataTable3.value[i].params1 || !step5DataTable3.value[i].params2) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
- if (
- step5DataTable2.value[0].params &&
- step5DataTable2.value[0].params != "裤子" &&
- step5DataTable2.value[0].params != "外套"
- ) {
+ if (step5DataTable2.value[0].params && step5DataTable2.value[0].params != "裤子" && step5DataTable2.value[0].params != "外套") {
step5Error.value++;
}
- if (
- step5DataTable2.value[1].params &&
- step5DataTable2.value[1].params != "衬衫" &&
- step5DataTable2.value[1].params != "短袖" &&
- step5DataTable2.value[1].params != "睡衣"
- ) {
+ if (step5DataTable2.value[1].params && step5DataTable2.value[1].params != "衬衫" && step5DataTable2.value[1].params != "短袖" && step5DataTable2.value[1].params != "睡衣") {
step5Error.value++;
}
- if (
- step5DataTable3.value[0].params1 &&
- step5DataTable3.value[0].params1 != "无"
- ) {
+ if (step5DataTable3.value[0].params1 && step5DataTable3.value[0].params1 != "无") {
step5Error.value++;
}
- if (
- step5DataTable3.value[0].params2 &&
- step5DataTable3.value[0].params2 != "0"
- ) {
+ if (step5DataTable3.value[0].params2 && step5DataTable3.value[0].params2 != "0") {
step5Error.value++;
}
- if (
- step5DataTable3.value[1].params1 &&
- step5DataTable3.value[1].params1 != "无"
- ) {
+ if (step5DataTable3.value[1].params1 && step5DataTable3.value[1].params1 != "无") {
step5Error.value++;
}
- if (
- step5DataTable3.value[1].params2 &&
- step5DataTable3.value[1].params2 != "0"
- ) {
+ if (step5DataTable3.value[1].params2 && step5DataTable3.value[1].params2 != "0") {
step5Error.value++;
}
- if (
- step5DataTable3.value[2].params1 &&
- step5DataTable3.value[2].params1 != "无"
- ) {
+ if (step5DataTable3.value[2].params1 && step5DataTable3.value[2].params1 != "无") {
step5Error.value++;
}
- if (
- step5DataTable3.value[2].params2 &&
- step5DataTable3.value[2].params2 != "0"
- ) {
+ if (step5DataTable3.value[2].params2 && step5DataTable3.value[2].params2 != "0") {
step5Error.value++;
}
- if (
- step5DataTable3.value[3].params1 &&
- step5DataTable3.value[3].params1 != "C"
- ) {
+ if (step5DataTable3.value[3].params1 && step5DataTable3.value[3].params1 != "C") {
step5Error.value++;
}
- if (
- step5DataTable3.value[3].params2 &&
- step5DataTable3.value[3].params2 != "1"
- ) {
+ if (step5DataTable3.value[3].params2 && step5DataTable3.value[3].params2 != "1") {
step5Error.value++;
}
- if (
- step5DataTable3.value[4].params1 &&
- step5DataTable3.value[4].params1 != "D"
- ) {
+ if (step5DataTable3.value[4].params1 && step5DataTable3.value[4].params1 != "D") {
step5Error.value++;
}
- if (
- step5DataTable3.value[4].params2 &&
- step5DataTable3.value[4].params2 != "2"
- ) {
+ if (step5DataTable3.value[4].params2 && step5DataTable3.value[4].params2 != "2") {
step5Error.value++;
}
console.log(step5Error.value, "错误数");
@@ -1892,17 +1726,11 @@ const downloadData = () => {
window.open(baseUrl + "/api/downDataByUserPortrait/analysisByRepurchase");
};
const submitData = () => {
- if (
- !step1AnswerFlag.value ||
- !step2AnswerFlag.value ||
- !step4AnswerFlag.value ||
- !step5AnswerFlag.value
- ) {
+ if (!step1AnswerFlag.value || !step2AnswerFlag.value || !step4AnswerFlag.value || !step5AnswerFlag.value) {
proxy.$modal.msgError("请先完成所有步骤!");
return;
}
- errorNum.value =
- step1Error.value + step2Error.value + step4Error.value + step5Error.value;
+ errorNum.value = step1Error.value + step2Error.value + step4Error.value + step5Error.value;
console.log(errorNum.value, "总错误次数");
portraitModel
.submit({
diff --git a/src/views/portraitModel/components/retainAnalysis.vue b/src/views/portraitModel/components/retainAnalysis.vue
index c988ab0..c6201e4 100644
--- a/src/views/portraitModel/components/retainAnalysis.vue
+++ b/src/views/portraitModel/components/retainAnalysis.vue
@@ -238,7 +238,7 @@
分析结论:
- 1、7日留存率,只有27%,流失率达到了73%,相对比较低,需要提供用户粘性;
+ 1、7日留存率,只有27%,流失率达到了73%,相对比较低,需要提高用户粘性;
2、平缓之后,能够留存下来的客户,是公司的忠诚用户;
@@ -910,10 +910,10 @@ const step3Data = ref([
const step4Data = ref([
{
name: "平均数",
- data1: "666",
- data2: "A",
- data3: "189",
- data4: "衬衫",
+ data1: "85%",
+ data2: "73%",
+ data3: "27%",
+ data4: "4%",
},
]);
const step5Data = ref([
diff --git a/src/views/portraitModel/components/rfmAnalysis.vue b/src/views/portraitModel/components/rfmAnalysis.vue
index b68d530..35c6830 100644
--- a/src/views/portraitModel/components/rfmAnalysis.vue
+++ b/src/views/portraitModel/components/rfmAnalysis.vue
@@ -2,7 +2,7 @@

-
任务知识导入
+
任务知识导入
@@ -55,10 +55,16 @@
-
-
-
-
+
@@ -701,14 +707,21 @@ const step1Submit = () => {
if (i == 0) {
if (fileTable1.value[0].params && fileTable1.value[0].params == "纳入") {
stepError1.value++;
+ fileTable1.value[0].isError = true;
+ }else{
+ fileTable1.value[0].isError = false;
}
// console.log(fileTable1.value[0].params);
} else {
if (fileTable1.value[i].params && fileTable1.value[i].params == "剔除") {
stepError1.value++;
+ fileTable1.value[i].isError = true;
+ }else{
+ fileTable1.value[i].isError = false;
}
}
}
+ console.log(fileTable1.value, "000");
proxy.$modal.msgSuccess("提交成功");
console.log(stepError1.value, "错误次数");
step1AnswerFlag.value = true;
@@ -929,6 +942,7 @@ const submitData = () => {
userId: JSON.parse(getUserInfo()).userId,
taskName: "RFM分析",
numberOfErrors: errorNum.value,
+ subState:1,
})
.then((res) => {
proxy.$modal.msgSuccess("提交成功");
@@ -1156,7 +1170,7 @@ const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
width: 945px;
height: 26px;
// background: #003b75;
- background: #FFF8EE;
+ background: #fff8ee;
border-radius: 10px;
// border: 1px solid #0052a3;
font-size: 12px;
@@ -1182,7 +1196,7 @@ const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
/* 将悬停背景色改为红色 */
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
- background-color: #F5F7FA !important;
+ background-color: #f5f7fa !important;
}
::v-deep .el-dialog {
diff --git a/src/views/portraitModel/components/viscosityAnalysis.vue b/src/views/portraitModel/components/viscosityAnalysis.vue
index 178a2f7..d060347 100644
--- a/src/views/portraitModel/components/viscosityAnalysis.vue
+++ b/src/views/portraitModel/components/viscosityAnalysis.vue
@@ -22,16 +22,24 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
案例背景:
- 用户粘性分析是一种衡量用户对产品或服务的忠诚度和黏性程度的分析方法。它帮助企业了解用户的行为习惯、使用频率和留存率,以评估用户对产品或服务的依赖程度和忠诚度。用户粘性分析模型通常包括以下指标:活跃用户数、留存率、使用频率、用户转化率、用户流失率。
- 留存率、用户转化率、用户流失率,前面模型已经单独分析过,本实验项目重点分析用户活跃情况。
- 常见的用户活跃度统计一段时间内活跃用户的分布情况,如使用了几次、使用了几天、使用了多长时间等。比如一周内用户使用产品的天数分布,使用了
- 2 天以上的用户占比,连续使用 7 天的用户人数等。
- 在用户粘性分析的指标中,DAU/MAU就是最频繁使用的指标。日活跃用户占月活跃用户的比例越高,表明用户对App的使用粘性越高。
- 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。
- 周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
- 月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
- 用户粘性通常用DAU/MAU的公式来计算,还有一个公式是每月用户平均活跃天数。DAU即日活跃用户数,MAU即月活跃用户数。
- 比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。
+ 用户粘性分析是一种衡量用户对产品或服务的忠诚度和黏性程度的分析方法。它帮助企业了解用户的行为习惯、使用频率和留存率,以评估用户对产品或服务的依赖程度和忠诚度。用户粘性分析模型通常包括以下指标:活跃用户数、留存率、使用频率、用户转化率、用户流失率。
+
+ 留存率、用户转化率、用户流失率,前面模型已经单独分析过,本实验项目重点分析用户活跃情况。
+
+ 常见的用户活跃度统计一段时间内活跃用户的分布情况,如使用了几次、使用了几天、使用了多长时间等。比如一周内用户使用产品的天数分布,使用了 2 天以上的用户占比,连续使用 7 天的用户人数等。
+
+ 在用户粘性分析的指标中,DAU/MAU就是最频繁使用的指标。日活跃用户占月活跃用户的比例越高,表明用户对App的使用粘性越高。
+
+ 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。
+
+ 周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
+
+ 月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
+
+ 用户粘性通常用DAU/MAU的公式来计算,还有一个公式是每月用户平均活跃天数。DAU即日活跃用户数,MAU即月活跃用户数。
+
+ 比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。
+
下表为某APP用户的登录日志,假设所有用户共计10名。
@@ -45,26 +53,12 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important',
}"
>
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
下载数据
@@ -76,10 +70,12 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
第一步,日活跃用户分析
- 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。分析近一个月日活跃用户变动情况,包括变动率。这个时候统计活跃用户需要进行去重,一天活跃多次的只保留一条记录。
+ 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。分析近一个月日活跃用户变动情况,包括变动率。这个时候统计活跃用户需要进行去重,一天活跃多次的只保留一条记录。
+
日活跃率 = 去重后的日活跃用户数量 / 历史累计去重后的用户数量*100%
- 日活跃平均时长=登录时长/活跃用户数,计算结果保留小数点后两位
+ 日活跃平均时长=登录时长/活跃用户数,计算结果保留小数点后两位
+
-
-
-
+
+
-
-
+
-
- %
+
+ %
-
+
-
-
+
-
- 绘制图表
-
+
绘制图表
分析结论
-
+
提交
@@ -166,7 +122,8 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
第二步,周活跃用户分析
- 周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
+ 周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
+
周活跃率 = 去重后的周活跃用户数量 / 历史累计去重后的用户数量*100%
@@ -181,49 +138,23 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important',
}"
>
-
-
-
-
-
+
+
+
-
-
+
-
+
-
- %
+
+ %
@@ -234,9 +165,7 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
第三步,月活跃用户分析
-
- 月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
-
+ 月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
-
-
-
+
+
-
-
+
-
+
-
- %
+
+ %
@@ -304,25 +208,14 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
比率指标1- DAU/MAU
通过用户粘性指标定义为过去一天的比过去30天的
-

+
比率指标2 - 月平均活跃天数
-
分子可理解为过去30天用户的总活跃天数,分母为过去30天活跃用户数
- ,分子/分母 即为 过去30天的人均活跃天数
-

+
分子可理解为过去30天用户的总活跃天数,分母为过去30天活跃用户数 ,分子/分母 即为 过去30天的人均活跃天数
+
@@ -336,16 +229,10 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important',
}"
>
-
-
+
-
-
+
@@ -359,39 +246,40 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important',
}"
>
-
-
+
-
-
+
+
+
+ DAU/MAU比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。对于常见的App,用户粘性的取值范围就是3%~100%,不同领域的App也会有不同的基准值,例如移动游戏会以20%为基线,而工具类App会以40%为基线。
+
+
+ 例子1: 从极限的角度看,如果每天活跃都是同样的用户,例如每天都是1万DAU,那么30天内每天都是这1万用户在活跃,MAU也是1万,于是DAU/MAU就是100%,用户粘性达到上限,微信就是接近100%的例子。
+
+
+ 例子2: 另一个极端的例子,如果每天活跃用户都不相同,例如每天1万DAU,那么30天内每天的活跃用户都不同,MAU就是30万,于是DAU/MAU就是1/30,用户完全没有粘性。
+
+
+ 在日常的项目和产品运营工作中, 单日的DAU/MAU的数值往往受到周期(工作日/周末)、版本更新和活动的影响,用户粘性在短期内的波动较大。所以通常要采用长期的均值作参考,例如一个月、两个大版本之间。eg:以某客户App为例,DAU/MAU的数值在工作日约50%,而在周末和假期的数值则在20%左右。那么谈到用户粘性的时候,通常采用每天DAU/MAU的平均值39.37%。
+
+
+
-
-
-
+
@@ -1313,18 +1201,7 @@ const step2RightAnswer = ref([
ratio: "60",
},
]);
-const step4RightAnswer = ref([
- "6",
- "10",
- "11",
- "13",
- "2",
- "5",
- "3",
- "5",
- "1",
- "4",
-]);
+const step4RightAnswer = ref(["6", "10", "11", "13", "2", "5", "3", "5", "1", "4"]);
onMounted(() => {
getData();
});
@@ -1424,22 +1301,7 @@ const draw = () => {
},
xAxis: {
type: "category",
- data: [
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10",
- "11",
- "12",
- "13",
- "14",
- ],
+ data: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"],
},
yAxis: {
type: "value",
@@ -1460,11 +1322,7 @@ const draw = () => {
const drawEcharts = () => {
for (let i in step1Data.value) {
console.log(step1Data.value[i]);
- if (
- !step1Data.value[i].params1 ||
- !step1Data.value[i].params2 ||
- !step1Data.value[i].params3
- ) {
+ if (!step1Data.value[i].params1 || !step1Data.value[i].params2 || !step1Data.value[i].params3) {
proxy.$modal.msgError("请完成所有填空数据");
return;
}
@@ -1575,11 +1433,7 @@ const step1Submit = () => {
step1Error.value = 0;
for (let i in step1Data.value) {
// console.log(fileTable1.value[i]);
- if (
- !step1Data.value[i].params1 ||
- !step1Data.value[i].params2 ||
- !step1Data.value[i].params3
- ) {
+ if (!step1Data.value[i].params1 || !step1Data.value[i].params2 || !step1Data.value[i].params3) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
@@ -1747,16 +1601,10 @@ const getData = () => {
})
.then((res) => {
for (let i in res.data.stuMachineLearningInfoDTOList) {
- if (
- res.data.stuMachineLearningInfoDTOList[i].loginTime ==
- step1Data.value[i].date
- ) {
- step1Data.value[i].params1 =
- res.data.stuMachineLearningInfoDTOList[i].activeUser;
- step1Data.value[i].params2 =
- res.data.stuMachineLearningInfoDTOList[i].activeUserRate;
- step1Data.value[i].params3 =
- res.data.stuMachineLearningInfoDTOList[i].activeUserTime;
+ if (res.data.stuMachineLearningInfoDTOList[i].loginTime == step1Data.value[i].date) {
+ step1Data.value[i].params1 = res.data.stuMachineLearningInfoDTOList[i].activeUser;
+ step1Data.value[i].params2 = res.data.stuMachineLearningInfoDTOList[i].activeUserRate;
+ step1Data.value[i].params3 = res.data.stuMachineLearningInfoDTOList[i].activeUserTime;
}
}
step2Data.value[0].params1 = res.data.stepFiveA;
@@ -1820,17 +1668,11 @@ const downloadData = () => {
window.open(baseUrl + "/api/downDataByUserPortrait/analysisByStickiness");
};
const submitData = () => {
- if (
- !step1AnswerFlag.value ||
- !step2AnswerFlag.value ||
- !step3AnswerFlag.value ||
- !step4AnswerFlag.value
- ) {
+ if (!step1AnswerFlag.value || !step2AnswerFlag.value || !step3AnswerFlag.value || !step4AnswerFlag.value) {
proxy.$modal.msgError("请先完成所有步骤!");
return;
}
- errorNum.value =
- step1Error.value + step2Error.value + step3Error.value + step4Error.value;
+ errorNum.value = step1Error.value + step2Error.value + step3Error.value + step4Error.value;
console.log(errorNum.value, "总错误次数");
portraitModel
.submit({