用户留存率计算

做企业级报表的人经常会遇到留存率的概念。对于不同的项目,留存率的概念也会有所不同。针对我所在的手机应用、手机游戏方向的用户留存率统计,在此做一些简要的说明。

用户留存率这个概念在网上没有搜到其具体的定义,在此仅对我公司的计算模式进行简要整理:用户留存率是只某一基础用户群在特定的一段时间内使用某一应用(游戏)的比率。需要注意两个概念:

1、基础用户群:是指按照给定要求规范出的特定群体。例如,我们要统计2月份《二战风云》的日留存,统计的基础用户群是指2月1日全天使用了《二战风云》这一游戏的所有玩家。

2、特定的一段时间内使用:这个概念对不同的人可能有不同的两种理解。一是连续的时间内,每天都在使用该应用;二是在特定的时间段内,不定期的使用该应用。这里,我们统计采用的是后者。

现在举例说明该统计所要达到的效果:

第一天 第二天 第三天 第四天 第五天 第六天 第七天

访问量 100 110 120 130 140 150 160

留存量 100 90 80 70 60 50 40
对于以上数据进行说明:我们以第一天访问的总人数100作为基数统计日留存。可以看到,虽然每天的用户访问量是在递增的,但是用户留存量是递减的(用户留存当然是越来越少喽!)。其计算方法我想大家也就可以看出一二了吧!对,第二天的留存量是指在第一天基数的100人中,有90人第二天又使用了该应用;而第三天的留存量是指在第一天基数的100人中,有80人第三天又使用了该应用,以此类推……

可能有人会问,第三天的80人为什么不是以第二天的90人作为基数呢?我个人认为第二种方式在统计上是存在弊端的。举例说明:如果一个用户第二天没有使用该应用,但以后的每天都在使用,在这种情况下,我们可以确定的是:该用户是活跃用户;但如果用第二种方法统计的话,该用户就不会在我们统计的数据内。

现就以上所述方法的统计流程进行简单介绍:

1、抽取基础数据作为统计基数

2、抽取第二天访问数据数据,并以该数据与抽取的基础数据做交集,得到第二天留存量

3、用留存量/基础数据得出第二天的留存率

4、以上方法每天循环,提取每天的用户留存数据

一下是用户日留存的存储过程,仅供参考(mysql)



CREATE PROCEDURE `PRO_REMAIN_USER_BY_DAY`(in in_day dateTime)
begin
declare Ttime datetime;
declare Tflag int;
declare TtemFlag int;
declare TdayFlag2 varchar(20);

declare Tnum int;
declare Tnum1 int;
declare Tcount int;
set in_day=ifnull(in_day,adddate(current_date(),-1));

set Tcount=(select count(1) from remain_user_data where addTime =in_day );
if Tcount =0 then
insert into remain_user_data(addTime) values(in_day);
end if;
set Tflag=1;
set TtemFlag=0;
set Ttime=in_day;

CREATE TEMPORARY TABLE tempTable(id bigint );
while Tflag<30 do

truncate table tempTable;

#抽取基础数据
insert into tempTable
select player_id from day_logout_notify where logout_time>=Ttime and logout_time

set Tnum=(select ifnull(count(distinct id),0) from tempTable );

if Tnum>0 then
#抽取第 Tnum天留存量
set Tnum1=(select ifnull(count(distinct p.player_id),0)
from tempTable t join day_logout_notify p on t.id=p.player_id
where p.logout_time>=in_day and logout_time if Tflag=1 then
set Tnum=1;
end if;
set TdayFlag2=concat( 'data',Tflag);

#计算留存率 并更新
set @sqlstr=concat('update remain_user_data set ',TdayFlag2,'=',Tnum1/Tnum,' where addTime=',concat('\'',DATE(Ttime),'\''));
prepare stmt from @sqlstr;
execute stmt;
end if;

#时间加1,循环
set Ttime=adddate(Ttime,-1);
set Tflag=Tflag+1;
end while;
drop table tempTable;
end;



该存储过程已经过测试,可以放心使用。

你可能感兴趣的:(数据库)