在游戏行业,次日留存率是个很重要的指标,对于评价一款游戏的优劣具有很重要的参考价值。

下面先看以下相关的定义:

用户留存:统计时间区间内,新登用户在随后不同时期的登录使用情况。

日次留存率:日新登用户在次日( 不含首次登录当天) 登录的用户数占新登用户比例。

解决问题:

1、用户对于游戏的适应性如何;
2、评估渠道用户质量;
3、投放渠道效果评估;
4、用户对于游戏的粘性如何;
5、新登用户什么时期流失会加剧。

(以上内容来自TalkingData的《移动游戏运营数据分析指标白皮书》)

可以看出,次日留存率主要关注的是在某一日(比如2013-8-25)新登录的用户,在第二天(即2013-8-26)登录的用户数占昨日(2013-8-25)新登用户比例的情况。

接着来看“生命周期第N天上线率”的定义:

统计时间区间内,所有用户在游戏生命周期第N天登录的用户数占所有用户的比例。

解决问题:

次日留存率能解决的问题,该指标都沾些边。但该指标的主要用途还是在评价某些游戏运营过程中设置的“连续登陆送奖励”等类似策略的有效性。

下面就用一个例子来演示下如何通过SAS求出这两个指标值。

数据如下(USERID:用户ID;LOGINLONG:登陆时长(S);RECHARGE:充值金额;TIME:登录时间):

程序如下:

  1. ***导入数据***;
  2. proc import out=test datafile="H:\test.xls" dbms=excel replace;
  3. sheet="sheet1$";
  4. mixed=yes ;
  5. scantext=yes;
  6. run;
  7.  
  8. ***计算生命周期第2天上线率***;
  9. proc sort data=test;by userid time;run;
  10.  
  11. proc means data=test nway noprint;
  12. class userid;
  13. var time;
  14. output out=minmax(keep=userid min_time max_time) min=min_time max=max_time;
  15. run;
  16.  
  17. data minmax;
  18. set minmax;
  19. format time date9.;
  20. do time=min_time to max_time;
  21. output;
  22. end;
  23. drop min_time max_time;
  24. run;
  25.  
  26. data temp;
  27. merge minmax(in=a) test;
  28. by userid time;
  29. if a;
  30. run;
  31.  
  32. data temp;
  33. set temp;
  34. if loginlong=. or recharge=. then login=0;else login=1;
  35. by userid;
  36. if first.userid then timeline=1;
  37. else timeline+1;
  38. run;
  39.  
  40. %macro timeline;
  41.  
  42. proc sql noprint;
  43. select count(distinct timeline) into:num
  44. from temp;
  45. quit;
  46.  
  47. %do i=1 %to #
  48.  
  49. proc sql noprint;
  50. create table temp1 as
  51. select timeline,count(distinct userid) as tnum
  52. from temp
  53. where timeline=&i and login=1;
  54. quit;
  55.  
  56. proc datasets nolist;
  57. append base=temp2 data=temp1;
  58. delete temp1;
  59. quit;
  60.  
  61. %end;
  62.  
  63. data result1;
  64. set temp2;
  65. by timeline;
  66. if first.timeline then output;
  67. run;
  68.  
  69. proc datasets nolist;delete temp2 minmax;quit;run;
  70.  
  71. %mend;
  72.  
  73. %timeline;
  74.  
  75. data _null_;
  76. set result1;
  77. if _n_=1 then do;
  78. call symputx('snum',tnum);
  79. end;
  80. run;
  81.  
  82. data result1;
  83. set result1;
  84. format rate 5.2;
  85. rate=tnum/&snum.*100;
  86. label timeline='游戏生命周期第N天' tnum='上线人数' rate='生命周期第N天上线率(%)';
  87. run;
  88.  
  89. ***计算次日留存率***;
  90. proc sql;
  91. create table temp1 as
  92. select time,count(distinct userid) as new_tnum
  93. from temp
  94. where timeline=1
  95. group by time;
  96.  
  97. create table temp2 as
  98. select time-1 as time,count(distinct userid) as mnum
  99. from temp
  100. where login=1 and timeline=2
  101. group by time;
  102. quit;
  103.  
  104. data result2;
  105. merge temp1 temp2;
  106. format time date9.;
  107. by time;
  108. run;
  109.  
  110. data result2;
  111. set result2;
  112. rate=mnum/new_tnum*100;
  113. label time='日期' new_tnum='新增用户数' rate='次日留存率(%)';
  114. drop mnum;
  115. run;
  116.  
  117. proc datasets nolist;delete temp temp1 temp2;quit;run;

结果:

(1)次日留存率

(2)生命周期第N天上线率

p.s.:因为是测试程序用的数据,所以谈不上通过数据可视化来发现某些有价值的东西。但至少提供了一个可行的方向。如果有真实的游戏数据来做测试,或许可以发现一些有趣的现象。一般来说,生命周期第N天上线率与传统意义上的留存率是存在相关关系的。一般不会出现一款游戏的次日留存率节节走高,而生命周期第2天上线率下降的现象。

游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现的更多相关文章

  1. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  2. 如何在web.config文件中配置Session变量的生命周期

    实例说明:在网上购物商城中,为了维护在线购物环境,一般只有注册会员才可以购买商品.实现购物功能时,先通过Session变量记录会员的登录名,然后在购买商品页面通过判断会员是否登录确定其能否购买商品. ...

  3. Spring中与bean有关的生命周期

    前言 记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚,然后看网上的帖子,好像都是那么一套,什么beanFactory啊,aware接 ...

  4. 【老孟Flutter】Flutter 中与平台相关的生命周期

    老孟导读:关于生命周期的文章共有2篇,一篇(此篇)是介绍 Flutter 中Stateful 组件的生命周期. 第二篇是 Flutter 中与平台相关的生命周期, 博客地址:http://laomen ...

  5. Flutter--Flutter中Widget、App的生命周期

    前言 在App的开发过程中,我们通常都需要了解App以及各个页面的生命周期,方便我们在App进入前台时启动一些任务,在进入后台后暂停一些任务.同时,各个页面的生命周期也很重要,每个页面消失时要做一些内 ...

  6. 详解Spring中Bean的作用域与生命周期

    摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...

  7. Unity脚本中各函数成员的生命周期

    在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能.但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解. 我们知道Unity ...

  8. Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的

    前言 用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 因此脚本才有了自己的生命周期函数,如Awake,Start, Update, OnDestroy等. 在相应的方法中实现游戏 ...

  9. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

随机推荐

  1. [easyUI] 树形菜单 tree

    0.效果图 1. 一个id为mytree的无序列表 <h2>easy UI Tree</h2> <ul id="mytree"></ul& ...

  2. Python自学:第三章 访问列表元素

    #输出并首字母大写 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[0].title()) 输出为: T ...

  3. vue 上拉加载自定义组件,超好用哦

    1.创建组件components > zj-roll > index.vue <template> <div> <slot></slot> ...

  4. localStorage、sessionStorage用法以及区别

    设置: sessionStorage.setItem("key", "value");localStorage.setItem("site" ...

  5. OpenStack 部署步骤详解(mitaka/ocata/一键部署)

    正文 OpenStack作为一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,开放源代码项目的云计算管理平台项目.具体知识我会在后面文章中做出介绍,本章主要按步骤给大家演示在C ...

  6. vue-router beforeEach死循环

    vue中页面跳墙处理 页面跳墙中使用 vue-router中的 beforeEach的死循环问题 问题展现 import Router from 'vue-router' const router = ...

  7. 为什么会出现container、injection技术?发展历史及未来发展趋势

    container 原因: 随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务 ...

  8. tensorFlow(一)相关重要函数理解

    1.函数及参数:tf.nn.conv2d conv2d( input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NH ...

  9. intelij idea设置和使用git

    一.通过git从远程拉取代码到idea本地 1.git配置 2.通过git拉取远程仓库代码 图一: 图二: 3.下一步下一步即可 二.share本地仓库代码到git上 注意: 通过share会变成一个 ...

  10. ES6和ES5变量声明的区别(var let const)

    // es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...