首页 > 其他分享 >游戏玩家的留存率统计实现

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

时间:2022-12-27 19:38:04浏览次数:41  
标签:ago stat 游戏 days 玩家 留存 time date login


 


玩家在某段时间内注册开始游戏,经过一段时间后,仍然继续游戏的被认作是留存;这部分用户占当时新增用户的比例即是留存率,会按照每隔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天的记录进行更新。

 

标签:ago,stat,游戏,days,玩家,留存,time,date,login
From: https://blog.51cto.com/u_4176761/5973414

相关文章

  • 游戏服务器设计-脚本系统设计
    游戏项目中都会遇到以下的一些需求:1.从内存里查询数据2.修复个别玩家的异常数据如何能最快捷的方式去实现,目前有两种脚本引擎可以选择:beanshell和groovy.经过比较得出如下......
  • LNMP架构环境之Nginx项目1:搭建游戏网站
    1)配置站点目录cd/usr/share/nginx/rm-frhtml/通过SCP工具将gamme.zip上传到/usr/share/nginx/html/目录下#上传游戏程序unzipgame.zipcd /usr/share/nginx/sbin/2)......
  • 传奇开服教程——总结19条对待玩家的经验!
    ​1、不要开在线活动,特别是GM亲自刷怪的活动这一点是引起很多事故,比如真人PK,GM被骂,还有强烈影响了游戏的公平性,你想拉玩家?错误!你将会感觉到“累死不讨好”、“赔了夫人......
  • cocos游戏开发(1)环境准备
    cocos游戏开发(1)环境准备​​1.下载python2.7.5+版本​​​​2.下载cocosv3版本​​​​3.环境配置​​​​4.项目测试​​1.下载python2.7.5+版本如果电脑已经下载python3版......
  • 前端--3D立体魔方小游戏
    一、案列效果二、案列目录文件获取 ​​JS文件获取​​三、案列代码文件可在本文案例目录获取<!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="v......
  • 融云 x OHLA:「社交+游戏」双轮驱动,逐鹿中东陌生人社交
    ​​完整报告,限免下载,点击获取​​走过十多年的出海历程,中国创业者面临的机遇和挑战正在发生根本性变化。TikTok、SHEIN在全球大获全胜的背后,不仅有中国产业链成熟、工程师......
  • 小游戏变现方式大揭秘!
    随着羊了个羊等小游戏的爆火,不少人发现了小游戏赛道的巨大潜力,也想要在此赛道有所尝试。但是很多游戏赛道的新人对于小游戏变现问题存有疑问,今天就来跟大家分享一下小程序游......
  • JZ62 孩子们的游戏(圆圈中最后剩下的数)
    JZ62孩子们的游戏(圆圈中最后剩下的数)题目每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让n个小朋友们围成一个大......
  • Web前端--HTML+Canvas+Js实现3D魔方小游戏
    一、案列效果二、案列思路1、先将平面上的6个DIV拼接在一起。形成一张类似于3d立方体图形展开的平面图。 2、我们需要将每一个面旋转到相应的位置上,每一个面的旋转轴都是不......
  • Web前端--HTML+Canvas+Js实现3D魔方小游戏
    一、案列效果二、案例思路1、先将平面上的6个DIV拼接在一起。形成一张类似于3d立方体图形展开的平面图。 2、我们需要将每一个面旋转到相应的位置上,每一个面的旋转......