游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现
在游戏行业,次日留存率是个很重要的指标,对于评价一款游戏的优劣具有很重要的参考价值。
下面先看以下相关的定义:
用户留存:统计时间区间内,新登用户在随后不同时期的登录使用情况。
日次留存率:日新登用户在次日( 不含首次登录当天) 登录的用户数占新登用户比例。
解决问题:
1、用户对于游戏的适应性如何;
2、评估渠道用户质量;
3、投放渠道效果评估;
4、用户对于游戏的粘性如何;
5、新登用户什么时期流失会加剧。
(以上内容来自TalkingData的《移动游戏运营数据分析指标白皮书》)
可以看出,次日留存率主要关注的是在某一日(比如2013-8-25)新登录的用户,在第二天(即2013-8-26)登录的用户数占昨日(2013-8-25)新登用户比例的情况。
接着来看“生命周期第N天上线率”的定义:
统计时间区间内,所有用户在游戏生命周期第N天登录的用户数占所有用户的比例。
解决问题:
次日留存率能解决的问题,该指标都沾些边。但该指标的主要用途还是在评价某些游戏运营过程中设置的“连续登陆送奖励”等类似策略的有效性。
下面就用一个例子来演示下如何通过SAS求出这两个指标值。
数据如下(USERID:用户ID;LOGINLONG:登陆时长(S);RECHARGE:充值金额;TIME:登录时间):
程序如下:
- ***导入数据***;
- proc import out=test datafile="H:\test.xls" dbms=excel replace;
- sheet="sheet1$";
- mixed=yes ;
- scantext=yes;
- run;
- ***计算生命周期第2天上线率***;
- proc sort data=test;by userid time;run;
- proc means data=test nway noprint;
- class userid;
- var time;
- output out=minmax(keep=userid min_time max_time) min=min_time max=max_time;
- run;
- data minmax;
- set minmax;
- format time date9.;
- do time=min_time to max_time;
- output;
- end;
- drop min_time max_time;
- run;
- data temp;
- merge minmax(in=a) test;
- by userid time;
- if a;
- run;
- data temp;
- set temp;
- if loginlong=. or recharge=. then login=0;else login=1;
- by userid;
- if first.userid then timeline=1;
- else timeline+1;
- run;
- %macro timeline;
- proc sql noprint;
- select count(distinct timeline) into:num
- from temp;
- quit;
- %do i=1 %to #
- proc sql noprint;
- create table temp1 as
- select timeline,count(distinct userid) as tnum
- from temp
- where timeline=&i and login=1;
- quit;
- proc datasets nolist;
- append base=temp2 data=temp1;
- delete temp1;
- quit;
- %end;
- data result1;
- set temp2;
- by timeline;
- if first.timeline then output;
- run;
- proc datasets nolist;delete temp2 minmax;quit;run;
- %mend;
- %timeline;
- data _null_;
- set result1;
- if _n_=1 then do;
- call symputx('snum',tnum);
- end;
- run;
- data result1;
- set result1;
- format rate 5.2;
- rate=tnum/&snum.*100;
- label timeline='游戏生命周期第N天' tnum='上线人数' rate='生命周期第N天上线率(%)';
- run;
- ***计算次日留存率***;
- proc sql;
- create table temp1 as
- select time,count(distinct userid) as new_tnum
- from temp
- where timeline=1
- group by time;
- create table temp2 as
- select time-1 as time,count(distinct userid) as mnum
- from temp
- where login=1 and timeline=2
- group by time;
- quit;
- data result2;
- merge temp1 temp2;
- format time date9.;
- by time;
- run;
- data result2;
- set result2;
- rate=mnum/new_tnum*100;
- label time='日期' new_tnum='新增用户数' rate='次日留存率(%)';
- drop mnum;
- run;
- proc datasets nolist;delete temp temp1 temp2;quit;run;
结果:
(1)次日留存率
(2)生命周期第N天上线率
p.s.:因为是测试程序用的数据,所以谈不上通过数据可视化来发现某些有价值的东西。但至少提供了一个可行的方向。如果有真实的游戏数据来做测试,或许可以发现一些有趣的现象。一般来说,生命周期第N天上线率与传统意义上的留存率是存在相关关系的。一般不会出现一款游戏的次日留存率节节走高,而生命周期第2天上线率下降的现象。
游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现的更多相关文章
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- 如何在web.config文件中配置Session变量的生命周期
实例说明:在网上购物商城中,为了维护在线购物环境,一般只有注册会员才可以购买商品.实现购物功能时,先通过Session变量记录会员的登录名,然后在购买商品页面通过判断会员是否登录确定其能否购买商品. ...
- Spring中与bean有关的生命周期
前言 记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚,然后看网上的帖子,好像都是那么一套,什么beanFactory啊,aware接 ...
- 【老孟Flutter】Flutter 中与平台相关的生命周期
老孟导读:关于生命周期的文章共有2篇,一篇(此篇)是介绍 Flutter 中Stateful 组件的生命周期. 第二篇是 Flutter 中与平台相关的生命周期, 博客地址:http://laomen ...
- Flutter--Flutter中Widget、App的生命周期
前言 在App的开发过程中,我们通常都需要了解App以及各个页面的生命周期,方便我们在App进入前台时启动一些任务,在进入后台后暂停一些任务.同时,各个页面的生命周期也很重要,每个页面消失时要做一些内 ...
- 详解Spring中Bean的作用域与生命周期
摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...
- Unity脚本中各函数成员的生命周期
在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能.但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解. 我们知道Unity ...
- Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的
前言 用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 因此脚本才有了自己的生命周期函数,如Awake,Start, Update, OnDestroy等. 在相应的方法中实现游戏 ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
随机推荐
- element ui 上传图片
upload在form模块,在demo的基础上包个form然后action写地址用?&拼接参数即可
- SpringBoot与数据访问
pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Jellyfish详解
一.Jellyfish简介 JELLYFISH是CBCB(Center for Bioinformatics and Computational Biology)的Guillaume Marçais ...
- linux软件管理之源码包管理
源码包管理tarball ====================================================================================tar ...
- Flask之勾子,错误捕获以及模板语法
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- Cassandra.yaml 配置详解
cluster_name 设置Cassandra集群的名称. 在Cassandra集群中,每一台服务器都必须具备相应的集群的名称.如果名称不一致,则当前Cassandra服务器无法加入集群. init ...
- 微信支付---H5支付
这里说的H5支付是指在微信外的浏览器打开H5商家的支付,切勿与公众号微信内支付混淆, 1.H5支付的开通流程 登陆微信商户平台页面:https://pay.weixin.qq.com/wiki/doc ...
- Win10系列:C#应用控件基础13
Image控件 开发Windows应用商店应用时,除了在界面中显示文字信息以外,还可以加入图片来配合说明及增加美观度.使用Image控件能够实现显示图片的功能,开发者可以根据需求使图片按照不同的方式显 ...
- java通过StringToKenizer获取字符串中的单词根据空格分离-详情版
public class DaXie { public static void main(String[] args) { String strin = "Hello Java World! ...
- 企业面试题:Buffer与cache的区别?
buffer缓冲 cache是缓存. 写缓冲,读缓存.简单点说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的.缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行 ...