游戏玩家的留存率统计实现

简介: 游戏玩家的留存率统计实现

 

玩家在某段时间内注册开始游戏,经过一段时间后,仍然继续游戏的被认作是留存;这部分用户占当时新增用户的比例即是留存率,会按照每隔1单位时间(例日、周、月)来进行统计。顾名思义,留存指的就是“有多少玩家留下来了”。留存用户和留存率体现了应用的质量和保留用户的能力。

 

 

次日留存率 首次登陆后第二天登录游戏用户/统计日的注册用户数
三日留存率 首次登陆后第三天登陆过的用户/统计日的注册用户数
七日留存率 首次登陆后第七天登录过游戏的用户/统计日的注册用户数
三十日留存数 首次登陆后第三十天登录过游戏的用户/统计日的注册用户数

 

留存率 在不同的游戏中 算法不一样

留存率说明

某时间内的新增用户,经过一段时间后,仍继续登录游戏的被认作时留存用户;这部分用户占当时新增用户的比例即是留存率。

例如:

9月5日新增用户200,这200人在6日登录游戏的有100人,7日登录有80人,8日登录有50人;

则9月5日次日留存率是50%,3日留存率是40%,4日留存率是25%。

这是我们游戏里的计算方式

这样统计 有科学根据的

比如 哪天 你开广@告了 就可以看 他带来的用户质量

还有 这样的留存 数据 也会好看的

 

 

 

 

-- 登录日志
DROP TABLE IF EXISTS log_login;
CREATE TABLE log_login(
  id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
  player_id INT(11) UNSIGNED NOT NULL,
  last_login_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',
  register_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00', 
  PRIMARY KEY (id)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

 

log_login的数据在每个玩家登陆的时候产生一条,为了接下去的存储过程执行效率的考虑,冗余了每个玩家的注册时间。

 

-- 统计留存率
DROP TABLE IF EXISTS stat_remain;
CREATE TABLE stat_remain(
  id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
  dru INT(11) NOT NULL, -- 每日新注册用户
  second_day INT(11) DEFAULT NULL,
  third_day INT(11) DEFAULT NULL,
  seventh_day INT(11) DEFAULT NULL,
  thirtieth_day INT(11) DEFAULT NULL,  
  stat_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',
  add_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00', 
  PRIMARY KEY (id)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

 

DELIMITER $$

-- 统计留存率

DROP PROCEDURE IF EXISTS stat_remain_player$$

CREATE PROCEDURE stat_remain_player()

BEGIN

-- 今天的日期

declare today date default curdate();

declare yesterday date default date_sub(today, interval 1 day);

declare days_ago_2 date default date_sub(today, interval 2 day);

declare days_ago_3 date default date_sub(today, interval 3 day);

declare days_ago_4 date default date_sub(today, interval 4 day);



declare days_ago_6 date default date_sub(today, interval 6 day);

declare days_ago_7 date default date_sub(today, interval 7 day);



declare days_ago_13 date default date_sub(today, interval 13 day);

declare days_ago_14 date default date_sub(today, interval 14 day);



declare days_ago_29 date default date_sub(today, interval 29 day);

declare days_ago_30 date default date_sub(today, interval 30 day);



-- 统计昨天DRU(就是昨天一天的注册人数)

insert into stat_remain(dru, stat_time, add_time) select count(id) , yesterday, now() from user where role_num>0 and roll=false and last_login_time>'2000-01-01' and add_time between yesterday and today;



-- 修改前天的2日留存

update stat_remain set second_day = (
select(
   (select count(distinct player_id) from log_login where (register_time between days_ago_2 and yesterday) and (last_login_time between yesterday and today))
/ 
(select count(distinct player_id) from log_login where (register_time between days_ago_2 and yesterday))
)
) where stat_time = days_ago_2;



-- 修改大前天的3日留存

update stat_remain set third_day = (
select(
   (select count(distinct player_id) from log_login where (register_time between days_ago_3 and days_ago_2) and (last_login_time between yesterday and today))
/ 
(select count(distinct player_id) from log_login where (register_time between days_ago_3 and days_ago_2))
)
) where stat_time = days_ago_3;


-- 7日留存

update stat_remain set seventh_day = (
select(
   (select count(distinct player_id) from log_login where (register_time between days_ago_7 and days_ago_6) and (last_login_time between yesterday and today))
/ 
(select count(distinct player_id) from log_login where (register_time between days_ago_7 and days_ago_6))
)
) where stat_time = days_ago_7;



-- 14日留存

update stat_remain set fourteen_day = (
select(
   (select count(distinct player_id) from log_login where (register_time between days_ago_14 and days_ago_13) and (last_login_time between yesterday and today))
/ 
(select count(distinct player_id) from log_login where (register_time between days_ago_14 and days_ago_13))
)
) where stat_time = days_ago_14;



-- 30日留存

update stat_remain set thirtieth_day = (
select(
   (select count(distinct player_id) from log_login where (register_time between days_ago_30 and days_ago_29) and (last_login_time between yesterday and today))
/ 
(select count(distinct player_id) from log_login where (register_time between days_ago_30 and days_ago_29))
)
) where stat_time = days_ago_30;
END
$$



DELIMITER ;

stat_remain_player 存储过程在每新的一天的0点0分1秒左右去执行,生成stat_remain数据,并对离当天stat_time差距为1天,2天,6天和29天的记录进行更新。

 

目录
相关文章
|
1月前
|
存储 前端开发 JavaScript
循环购融合众店模式:提升复购率与用户粘性
本文介绍了如何将业务逻辑、用户交互和激励机制转化为实际的软件实现。首先,设计了数据库表结构,包括用户、商品和订单等信息。接着,提供了后端代码架构示例,使用Python和Flask框架实现用户购买商品的功能,包括计算能量值、贡献值、积分和消费券,并更新用户信息和创建订单。最后,提到了前端代码的实现,使用前端框架与用户进行交互。
|
4月前
|
机器学习/深度学习 图形学 UED
优化用户体验与广告收入平衡的策略:提升IAA游戏变现效率
【7月更文第30天】随着移动游戏市场的竞争日益激烈,开发者必须确保他们的应用既能吸引并保留用户,又能从中获得足够的收入来维持运营和发展。IAA是一种有效的收入来源,但如果处理不当,可能会损害用户体验。因此,了解如何平衡IAA与用户体验至关重要。
231 0
|
6月前
|
机器学习/深度学习 搜索推荐 数据挖掘
回归树模型分析纪录片播放量影响因素|数据分享
回归树模型分析纪录片播放量影响因素|数据分享
|
6月前
|
小程序 数据挖掘 BI
如何统计玩家在游戏中的各种操作
如何统计玩家在游戏中的各种操作
64 0
|
机器学习/深度学习 人工智能 缓存
走近高德驾车ETA(预估到达时间)
ETA(Estimated Time of Arrival),即预估到达时间,指的是用户在当前时刻出发按照给定路线前往目的地预计需要的时长。如何准确地预估ETA对于高德地图的诸多业务板块都起到至关重要的作用。
走近高德驾车ETA(预估到达时间)
|
小程序 数据挖掘 BI
如何统计游戏中的数据
文主要内容是教你如何统计小游戏中的数据,强烈建议收藏,因为你迟早会在自己的小游戏中用到。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
166 0
|
安全 小程序 黑灰产治理
营销效果提升80%,坏账率下降70%的秘诀
专业的风险防控系统为你保驾护航。
1184 0
营销效果提升80%,坏账率下降70%的秘诀
怎么才能快速提高小程序留存率!
有效提升用户留存率的方法
1091 1
|
小程序
怎么让用户留些来还总想着你,这4招教你快速提高小程序留存率!
到底有没有可能,让用户一直心心念念你的产品,就算离开了也会再回来,从而提升自己的小程序的留存率呢?
1054 0