用户行为分析是对用户在产品或触点上产生的行为及行为背后的数据进行分析,通过构建用户行为数据分析体系或者用户画像,来改变产品、营销、运营决策,实现精细化运营,指导业务增长。总之,很重要。
先来看下用户类行为指标说明,然后下面详解常写的指标。仅供参考,实际开发逻辑还是按业务需求为标准。
| 指标名称 | 解释说明 |
|---|---|
| 新增用户 | 首次联网使用应用的用户,如果一个用户首次打开某APP,那这个用户定义为新增用户:卸载再安装的设备,不会被算作一次新增,新增用户包括日新增用户,周新增用户,月新增用户。 |
| 活跃用户 | 打开应用的用户即为活跃用户,不考虑用户的使用情况,每天一台设备打开多次会话被记为一个活跃用户 |
| 周(月)活跃用户 | 用户以设备作为判断标准,在移动统计中,每个独立设备认为是一个独立用户。安卓系统根据imei号,IOS系统根据openUDUID来标识一个独立用户,每部手机一个用户。 |
| 沉默用户 | 用户仅在安装当天(次日)启动一次,后续时间无再启动的行为。该指标可以反应新增用户质量和用户与app的匹配程度 |
| 版本分布 | 不同版本的周内新增用户数,活跃用户数和启动次数。利于判断app各个版本之间的优劣和用户行为习惯。 |
| 本周回流用户 | 上周未启动过的应用,本周启动了应用的用户 |
| 连续n周活跃用户 | 连续n周,每周至少启动一次。 |
| 忠诚用户 | 连续活跃5周以上的用户 |
| 连续活跃用户 | 连续两周及以上活跃的用户 |
| 近期流失用户 | 连续n(2<=n <=4)周没有启动应用的用户。(第n+1周没有启动过) |
| 留存用户 | 某段时间内的新增用户,经过一段时间后,仍然使用应用的被认作是留存用户:这部分用户占当时新增用户的比例即是留存率 |
| 用户新鲜度 | 每天启动应用的新老用户比例,即新增用户数占活跃用户数的比例 |
| 单次使用时长 | 每次启动使用的时间长度 |
| 日使用时长 | 累计一天内使用时间长度 |
判断业务健康程度和发展趋势的一个重要指标。
最近一个周/月内,有过连续活跃n天的人数。
最近一周/月内,每个用户的平均活跃天数。
最近一周/月内,最大沉默天数超n天的用户数。
最近七天内连续三天活跃用户数。
以日明细,获取周,月用户明细。
create table dws_uv_detail_day
(
`mid_id` string COMMENT '设备唯一标识',
`user_id` string COMMENT '用户标识',
`app_time` string COMMENT '客户端日志产生时的时间',
. . . . . . (省略其他字段)
)
partitioned by(dt string)
. . . . . .
create table dws_uv_detail_wk(
`mid_id` string COMMENT '设备唯一标识',
`user_id` string COMMENT '用户标识',
`app_time` string COMMENT '客户端日志产生时的时间',
`monday_date` string COMMENT '周一日期',
`sunday_date` string COMMENT '周日日期' ,
. . . . . . (省略其他字段)
)
PARTITIONED BY (`wk_dt` string)
. . . . . .
select
'2022-01-04',
concat(date_add('2022-01-04',-6),'_','2022-01-04'),
count(*)
from
(
select uid_id
from
(
select uid_id
from
(
select
uid_id,
date_sub(dt,rank) date_diff
from
(
select
uid_id,
dt,
rank() over(partition by uid_id order by dt) rank
from dws_uv_detail_day
where dt>=date_add('2022-01-04',-6) and dt<='2022-01-04'
)t1
)t2
group by uid_id,date_diff
having count(*)>=3
)t3
group by uid_id
)t4;
用户第一次打开应用,那这个用户定义为新增用户。
日新增用户。
周新增用户。
月新增用户。
每日活跃设备 left join 每日新增产生的结果,每日新增的设备id为null,则为新增。
dws_uv_detail_day:每日活跃用户表
dws_new_mid_day:每日新增设备表
select
ud.mid_id,
ud.user_id
from dws_uv_detail_day ud left join dws_new_mid_day nm on ud.mid_id=nm.mid_id
where ud.dt='2022-01-04' and nm.mid_id is null;
「用户留存」:某段时间内的新增活跃用户,经过一段时间后,有继续访问或者使用应用被称为留存用户。
留存可以看成是一个用户在今天出现,在明天也出现,那就是次日留存。
一个用户在今天出现,在后天出现,那就是2日留存。
「留存率」:留存用户占新增活用户的比例。
次日留存率
3日留存率
7日留存率
统计2022-01-04日,以统计2022-01-03日留存率为业务需求分析:
「2022-01-03设备留存率= 01-03日新增设备 且 01-04日活跃的 占 01-03日新增设备。」(1) 01-03日新增设备 01-04日活跃表 left join 每日新增表,新增表id为null的为新增设备。 (2)01-03日新增设备 且 01-04日活跃的 01-03日新增 join 01-04的活跃。 (3)代入上面公式
计算前1天新用户访问留存明细
dws_uv_detail_day:每日活跃用户表
dws_user_retention_day:每日留存用户明细表
dws_new_mid_day:每日新增设备表
select
nm.mid_id mid_id,
nm.user_id user_id,
ud.dt dt,
1 retention_day // 留存天数
from dws_uv_detail_day ud join dws_new_mid_day nm
on ud.mid_id =nm.mid_id
where ud.dt='2022-01-04' and nm.create_date=date_add('2022-01-04',-1)
指的是只在安装当天启动过,且启动时间是在一周/月(某段时间)前。
dws_uv_detail_day:每日活跃用户表
select
'2022-01-04' dt,
count(*) silent_count
from
(
select mid_id
from dws_uv_detail_day
where dt<='2022-01-04'
group by mid_id
having count(*)=1 and min(dt)<=date_add('2022-01-04',-6)
) t1;
相当于回头客的意思,以前用过某物,过一段时间再次使用某物,这样的用户就是回流用户。用户已经记录n日以及n日以上未有登录(即先认定这部分用户已经流失),而在今天有登录,那在今天这部分用户称之为回流用户。
(时间周期)回流=(时间周期活跃-(时间周期新增-(上个时间周期)活跃
如:本周回流=本周活跃-本周新增-上周活跃。
本周活跃 left join 本周新增 left join 上周活跃。
条件是:本周新增id为null,上周活跃id为null。
dws_uv_detail_wk:每周活跃用户表
dws_new_mid_day:每日新增设备表
mid_id:设备id
select
'2022-01-04' dt,
concat(date_add(next_day('2022-01-04','MO'),-7),'_',date_add(next_day('2022-01-04','MO'),-1)) wk_dt,
count(*)
from
(
select t1.mid_id
from
(
select mid_id
from dws_uv_detail_wk
where wk_dt=concat(date_add(next_day('2022-01-04','MO'),-7),'_',date_add(next_day('2022-01-04','MO'),-1))
)t1
left join
(
select mid_id
from dws_new_mid_day
where create_date<=date_add(next_day('2022-01-04','MO'),-1) and create_date>=date_add(next_day('2022-01-04','MO'),-7)
)t2
on t1.mid_id=t2.mid_id
left join
(
select mid_id
from dws_uv_detail_wk
where wk_dt=concat(date_add(next_day('2022-01-04','MO'),-7*2),'_',date_add(next_day('2022-01-04','MO'),-7-1))
)t3
on t1.mid_id=t3.mid_id
where t2.mid_id is null and t3.mid_id is null
)t4;
最近n天(自己定义)未登录我们称之为流失用户。
流失用户数:最近7天未登录用户。
dws_uv_detail_day:每日活跃用户表
select
'2022-01-04',
count(*)
from
(
select mid_id
from dws_uv_detail_day
group by mid_id
having max(dt)<=date_add('2022-01-04',-7)
)t1;
浏览量(PV):网站各页面被查看的次数。用户多次打开或刷新同一个页面,该指标值累加。
访客数(UV):网站各页面的访问人数。所选时间段内,同一访客多次访问会进行去重。
这两个指标没啥说的,count取值或者去重count即可。
访问到下单转化率 = 下单人数 / 日活跃人数
下单到支付转化率 = 支付人数 / 下单人数
dws_uv_detail_day:每日活跃用户表
dws_user_action:用户行为表
select
'2022-01-04',
uv.day_count 日活跃人数,
ua.order_count 下单数,
cast(ua.order_count/uv.day_count as decimal(10,2)) 访问到下单转化率,
ua.payment_count 支付人数,
cast(ua.payment_count/ua.order_count as decimal(10,2)) 下单到支付转化率
from
(
select
sum(if(order_count>0,1,0)) order_count,
sum(if(payment_count>0,1,0)) payment_count
from dws_user_action
where dt='2022-01-04'
group by dt
)ua
join
(select
dt ,
count(*) day_count
from dws_uv_detail_day
where dt='2022-01-04' group by dt
)
uv on uv.dt=ua.dt
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)