文 / 66TEAM · 在下
这几天,一直有人拉着讨论这么一个问题:
已知次日留存42%,三日留存27%,七日留存15%,求一个月以后该游戏的日活跃或者LTV情况。我们把求日活跃与LTV当成两个问题来分析。
先说第一个问题: 求一个月后的日活跃,我们需要知道这天的活跃用户都是由哪些人组成。 假设这个月的时间段为10.1~10.31,我们需要求10.31的用户活跃。
那么
10.31的活跃用户=10.31当天新增的用户+10.30的次日留存用户+10.29的三日留存用户+10.28的四日留存用户……+ 10.1的30日留存的用户。
等式右边的数据,我们可以将之分解为:
10.30的次日留存用户=10.30的新增用户*次日留存
10.的三日留存用户=10.29的新增用户*三日留存
……………
10.的30日留存用户=10.1的新增用户*30日留存
而对于我们来说 10.1~10.31的新增用户是可知的,比如去问问运营平均每天导入多少用户。于是我们这个问题就简化成了:
已知2日,3日,7日留存,求该游戏的2~30日留存。 为了保证通俗易懂性,这部分不会涉及过多的专业名词或者概念。
一、基本概念
为了求2~30日的留存, 首先需要说明一些基本的数学概念。
1、我们将已知的留存2,3,7日留存42%,27%,15%以几何图形的形式表现出来
将这个图形抽象化平面几何中,我们可以看到, 实际上留存在二维空间中表现的是一个有斜向下趋势的曲线。
2、一些基本的二维曲线方程
我们再来复习一下基本的几何知识
A、幂函数
幂函数的形式为y=xa(a为实数)的函数, 常见形如:
y=x2
y=x-1即y=1/x
y=x1/2
y=x
他们在第一象限中的图形如下所示:
B、对数函数
对数函数的形式y=loga(x) 其中(a>0,且a≠1),意思为在x=ay的形式当中,已知x和a求y。
常见以e为底的对数函数, 记做lg(x)。 在第一象限中的基本图像如下图所示:
我们一看y=logax 当0的时候,,这个曲线好像我们的留存曲线啊。事实上,我们正是要将留存曲线拟合成这种对数函数的形式来进行剩余天数的推导。
C、指数函数,正弦/余弦函、伽马函数等
这些如果大家有兴趣了解,请自行百度,或者查阅相关书籍,或者咨询专业人士。
经过第二步的梳理,我们知道了我们要怎么做了。 假设我们游戏留存的函数为:y=a*lg(x)+b ß大家可以思考下,回顾一下在几何中a和b的意义。以及为什么要设置成y=a*f(x)+b的形式。
我们已知:
x=2的时候y=0.42
x=3的时候y=0.27
x=7的时候y=0.15
我们需要做的就是推导出这个公式当中a和b的值,并将其代入公式(函数)当中,求解出x=4,5,6,8,9,…。30 时候y的值。 这个过程我们称之为曲线拟合。在挖掘中称之为回归(regression)。
二、实际求解
在实际求解当中,我们有很多非常易用的工具来做这种推导,以下就列举几种较为常见的工具来实现推导。
1、Excel
A、将天数当成x轴,留存当成y轴,并画出对应曲线。
B、右键单击这条曲线,选择添加趋势线
C、点选对数,勾选显示公式和显示R平方值
D、最终我们可以看到结果
那么利用excel得出的对数函数的公式为y=-0.147*ln(x)+0.4017
利用这个公式,我们在excel一拉,就可以得出我们要的留存预测了。
预测留存使用的公式为y=-0.147*ln(c2-1)+0.4017
这里需要注意的是,excel的趋势线是按照行号进行的,所以,在图中我们需要补全4、5、6天,即使它是没有数据的。计算的时候需要将天数-1当成x值代入(这里实际上是涉及另外一个概念,但是没关系,不影响认知)
lR平方值,是用来验算曲线的拟合程度,取值范围在0~1之间,一般来说当R2<=0.95的时候,我们认为拟合精准度不高,但具体是否可以使用,看业务需求,假如只是需要一个大概估计,0.8以上就可以使用,拟合程度越高。R方这个概念我们将在之后讨论,目前只需要了解它的作用及意义。本例中结果的R方值为0.9628>0.95。可以认为这个曲线已经近似拟合。
2、SPSS
A、新建工作表, 填入数据
B、选择分析->回归->曲线估计
C、将留存设置成因变量, 将天数设置成变量,选择对数模型, 点选保存按钮,勾选预测值,以及设置95%置信区间(即R方值)
一路运行下去, 我们可以得到结果:
我们可以看到,在参数评估当中,当前模型的R方值结果只有0.938,并没有达到我们的0.95的精度要求,而本次推出的算式为 y=-0.204loge((x)+0.534。
如果需要得到更加精准的算式,请获取更多的留存信息,这样子得出的算式就会越靠近我们的真实数据。
本例中只是简单的进行示例,没有做任何额外操作,实际操作中需要考虑其他因素。
3、Python
好了, 终于到了老本行了。
回归实际上是机器学习的一部分, 用于回归处理的方法一般包括岭回归,最小二乘法等方法。本例中将采用最小二乘法来实现。
本例讲解:
http://blog.chinaunix.net/xmlrpc.php?id=3201176&r=blog/article&uid=9162199
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
import math
#定义函数
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
import math
#定义残差函数
def residuals(p,y,x):
ret=y-func(x,p)
return ret
x3=np.linspace(0,30,1000) #用于画图精度的调节
x0=[1,2,6] #x变量, 在这里2,3,7全部减1
x2=np.array(x0) #向量化x变量
y0=[0.42,0.27,0.15] #y
y2=np.array(y0)#向量化
p0=[0.5,0.5]#取值起始点
qs=leastsq(residuals,p0,args=(y2,x2)) #最小二乘法
print qs[0] #为最佳的拟合函数参数
pl.plot(x0,y0,label=’Real’,color=’red’) #画出实际图像
pl.plot(x3,func(x3,qs[0]),label=’sim’,color=’blue’) #预测图像
#统计R方
def residuals(p,y,x):
ret=y-func(x,p)
return ret
x3=np.linspace(0,30,1000) #用于画图精度的调节
x0=[1,2,6] #x变量, 在这里2,3,7全部减1
x2=np.array(x0) #向量化x变量
y0=[0.42,0.27,0.15] #y
y2=np.array(y0)#向量化
p0=[0.5,0.5]#取值起始点
qs=leastsq(residuals,p0,args=(y2,x2)) #最小二乘法
print qs[0] #为最佳的拟合函数参数
pl.plot(x0,y0,label=’Real’,color=’red’) #画出实际图像
pl.plot(x3,func(x3,qs[0]),label=’sim’,color=’blue’) #预测图像
#打印预测结果
for aa in range(1,31):
print aa,func(aa,qs[0])
pl.legend()
pl.show()
预测结果如下:
另外,推荐eviews进行线性回归与预测或者最小二乘法的执行,大家如果有兴趣也可以去下载试用一番。
三、思考
1、在上述的的推导过程中,我们使用的是纯数学知识,我们忽略了什么前置因素对于新玩家留存的影响?
2、我们预测的结果在与当前实际结果相比较的时候,精度是较高的,然而对于后续的预测,往往可能出现较大的偏差,这个时候,在预测模型当中,我们实际上忽略了什么东西的影响?
3、通过已知留存和导入,如何快速的利用工具得出玩家活跃数?
4、在实际业务当中,这个预测到底有什么用途呢?
5、实际拟合精度跟数据的多寡的关系多大呢?
6、推导出的函数公式中 a和b的值对于实际业务的指导意义又是什么?