使用Python自动化预测游戏LTV

LTV定义

LTV(life time value)也就是用户生命周期价值,是产品从用户获取到流失所得到的全部收益的总和。LTV用于衡量用户对产品所产生的价值,是所有用户运营手段为了改善的终极指标,同时LTV也应该是所有运营手段的最终衡量指标。

游戏公司在广告投放时,通常需要分析买量投入产出比,而评判能不能赚钱的指标就是ROI=LTV/CPA,其中CPA是新增用户注册成本。

LTV(N日)=(某日新增玩家第1天充值+某日新增玩家第2天充值+....+某日新增玩家第N天充值)/该日新增玩家数

传统LTV预测算法

一、LTV预估基本思路

利用真实的留存率来估算玩家未来的留存率,计算生命周期LT,计算并预估新增用户ARPU,从而计算出玩家的生命周期价值:

LTV(n)=LT(n)新增用户ARPU(n)*

二、基本定义

1、LT(生命周期)

LT(n)=Σ retention i = 1(新增当日留存)+(次日留存)+(+2日留存)+…+(+(n-1)日留存)

2、新增用户ARPU

新增用户ARPU(n)=新增用户N日累计收入/N日新增用户累计活跃天(人)数

3、LTV(n)=新增用户N日累计收入/新增用户数=LT(n)新增用户ARPU(n)*

image.png

三、预估方法

1、留存率预估

根据现有数据观察,一批新增玩家的留存率随时间的增长必然无限趋近于0,用几何图形表示就是一条递减的幂函数曲线。

该曲线可以用以下函数表示:

y=ax^b*

其中x为天数,y为留存率。通过线性回归可以得出a和b的估计值,从而预测留存率。

b值越大,说明留存率越好

1)实现方法

线性回归有许多拟合数据的方法,这里采用scipy.optimize 中的curve_fit()函数,它利用的是最小二乘算法。最小二乘算法是一种数学优化技术,在机器学习领域最有名和有效的算法之一。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

【实现代码】

# 导入数据统计的包
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np

#读取留存率数据
ret_df=pd.read_csv('ret.csv')

# 定义幂函数公式 y=ax^b
def fund(x, a, b):
    return a*(x**b)

# 截取前14天数据作为训练集
popt, pcov = curve_fit(fund, x[:14], y[:14])

#popt数组中,三个值分别是待求参数a,b
y_predict= [fund(i, popt[0],popt[1]) for i in x]

plt.plot(x,y,'b-')
plt.plot(x,y_predict,'r--')

image.png

2)模型效果

采用全量数据作为测试集,进行均方误差验证

# 导入sklearn包
from sklearn.metrics import mean_squared_error
from sklearn.metrics import median_absolute_error

# 计算MSE误差率
print("MSE误差率为:",np.mean((y-y_predict)**2))

# 计算模型预测数与实际数据误差
bias=y_predict-y
plt.plot(x,bias,'b-')

# 查询90天真实与预测留存率
print("90天真实留存率为:",y[90])
print("90天预测留存率为:",y_predict[90])

模型预测偏差趋势图


image.png

MSE误差率为:1.5912876055059092e-05
90天真实留存率为:0.0255
90天预测留存率为:0.025509515682735667

3)模型修正

现实中,模型和实际数据之间经常会存在误差,所以需要要对预测的数据进行修正。接下来,我们就要对留存预测模型进行修正。

# 使用线性回归对偏差率进行预测,进而对模型预测进行修正
x=x.reshape(-1,1)
y=y.reshape(-1,1)
y_predict=np.array(y_predict).reshape(-1,1)
ratio=(y_predict-y)/y
from sklearn.linear_model import LinearRegression
model=LinearRegression()
model.fit(x[:30],ratio[:30])
ratio2=model.predict(x)
y_predict_re=y_predict*(1+ratio2)

# 修正后模型预测与实际值的误差
print("修正后MSE误差率为:",np.mean((y-y_predict_re)**2))
plt.plot(x,y,'b-')
plt.plot(x,y_predict_re,'r--')

修正后MSE误差率为:1.3018758801605825e-05
修正后模型预测与实际值的误差:


image.png

修正后模型MSE误差率降低率,上图偏差趋势图可见,虽整体误差率不大,但前期预测误差较大,后期误差率曲趋向平缓,采用采用线性回归对偏差率进行预测拟合再修正模型,这可作为模型调优的一种方法。

4)总结

用户平均生命周期y=

image.png
f(x)d(x),其中f(x)为留存率与时间的拟合函数

拟合出留存率与时间的函数,然后算出原函数,最后算一个日期趋向于+无穷大时的极限值,该极限值就是用户平均生命周期。

观察发现前期留存率的预测是相对准确的,虽然存在下降趋势缓慢不一致现象,但误差值符合商业上的误差容忍度。

2、ARPU预测

1)ARPU介绍

ARPU(Average Revenue Per User) :平均每用户收入,可通过 总收入/DAU 计算得出。它可以衡百量产品的盈利能力和发展活力。

ARPU值常规情况下是特指某一天的付费除以DAU得出的产品都得能力的体现值,但因为产品每天新增用户不同(新老用户比例),产品状态不同(版本维护情况),用户来源不同等因素导致ARPU值每天都不一样,但是总体处于一个区间内,不同产品新增用户ARPU增长趋势区别较大,因此针对不同产品,预估方法略有区别。

【游戏1示例】

游戏1ARPU增长期较长,前期增长较大,观察规律教服从对数增长趋势。

可以采用对数函数y=a*ln(x)+b拟合新增用户ARPU(其中x为注册天数(注册当天x=1),y为新增用户ARPU)。

image.png

【游戏2示例】

就游戏2而言,新增用户arpu在7~14日的新增用户arpu会增长约4%;14日之后的新增用户arpu基本保持平稳。

当已有真实数据>n(n>=14)天时,采用LTV(n)=LT(n)*已有最新的新增用户arpu。

image.png

2)ARPU预测方法

使用多项式y=a*log(x)+b进行预测,发现实际数与模型预测值误差较大,且10日之后的新增用户arpu基本保持平稳。因此可采用已有真实AVG(arpu(n))。

#截取前60天真实arpu数据,展示趋势
x=[i for i in range(1,60)]
x=np.array(x)
y=pd.to_numeric(arpu_t.iloc[0][1:60]).values
plt.plot(x,y,'b-')

60天真实arpu趋势


image.png
#尝试采用多项式函数预测效果
# 定义多项式公式 y=a*log(x)+b
def fund(x, a, b):
    return a*np.log(x)+b

# 截取前30天数据作为训练集
popt, pcov = curve_fit(fund, x[:30], y[:30])
#popt数组中,三个值分别是待求参数a,b
y_uppre= [fund(i, popt[0],popt[1]) for i in x]
y_uppre
plt.plot(x,y,'b-')
plt.plot(x,y_uppre,'r--')

多项式函数预测模型与真实数据对比


image.png

机器学习预测算法

传统的LTV预估模型存在很大局限性,如:用户再游戏过程中,每天的ARPU都不是一个恒定值,多数游戏是前期高,后期下降并趋势于稳定,所以ARPU采用单一的国定值预测是非常不可靠的。想提升LTV预测的准确率,可尝试更多的机器学习算法进行预测,后期会继续更新。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容