天天看點

php遊戲留存率計算邏輯,遊戲玩家的留存率統計實作

玩家在某段時間内注冊開始遊戲,經過一段時間後,仍然繼續遊戲的被認作是留存;這部分使用者占當時新增使用者的比例即是留存率,會按照每隔1機關時間(例日、周、月)來進行統計。顧名思義,留存指的就是“有多少玩家留下來了”。留存使用者和留存率展現了應用的品質和保留使用者的能力。

次日留存率

首次登陸後第二天登入遊戲使用者/統計日的注冊使用者數

三日留存率

首次登陸後第三天登陸過的使用者/統計日的注冊使用者數

七日留存率

首次登陸後第七天登入過遊戲的使用者/統計日的注冊使用者數

三十日留存數

首次登陸後第三十天登入過遊戲的使用者/統計日的注冊使用者數

留存率 在不同的遊戲中 算法不一樣

留存率說明

某時間内的新增使用者,經過一段時間後,仍繼續登入遊戲的被認作時留存使用者;這部分使用者占當時新增使用者的比例即是留存率。

例如:

9月5日新增使用者200,這200人在6日登入遊戲的有100人,7日登入有80人,8日登入有50人;

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

這是我們遊戲裡的計算方式

這樣統計 有科學根據的

比如 哪天 你開廣告了 就可以看 他帶來的使用者品質

還有 這樣的留存 資料 也會好看的

php遊戲留存率計算邏輯,遊戲玩家的留存率統計實作

-- 登入日志

DROPTABLEIF EXISTS log_login;

CREATETABLElog_login(

id INT(11) UNSIGNEDNOTNULLAUTO_INCREMENT,

player_id INT(11) UNSIGNEDNOTNULL,

last_login_time timestampNOTNULLDEFAULT'2000-01-01 00:00:00',

register_time timestampNOTNULLDEFAULT'2000-01-01 00:00:00',

PRIMARYKEY(id)

)ENGINE=MYISAM DEFAULTCHARSET=utf8;

log_login的資料在每個玩家登陸的時候産生一條,為了接下去的存儲過程執行效率的考慮,備援了每個玩家的注冊時間。

-- 統計留存率

DROPTABLEIF EXISTS stat_remain;

CREATETABLEstat_remain(

id INT(11) UNSIGNEDNOTNULLAUTO_INCREMENT,

dru INT(11)NOTNULL,-- 每日新注冊使用者

second_day INT(11)DEFAULTNULL,

third_day INT(11)DEFAULTNULL,

seventh_day INT(11)DEFAULTNULL,

thirtieth_day INT(11)DEFAULTNULL,

stat_time timestampNOTNULLDEFAULT'2000-01-01 00:00:00',

add_time timestampNOTNULLDEFAULT'2000-01-01 00:00:00',

PRIMARYKEY(id)

)ENGINE=MYISAM DEFAULTCHARSET=utf8;

DELIMITER

−−統計留存率DROPPROCEDUREIFEXISTSstatremainplayer

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天的記錄進行更新。