云社区 博客 博客详情

谢佳标:利用R语言,将游戏数据的价值最大化

SUNSKY 发表于 2020-02-15 20:55:07 2020-02-15
0
0

【摘要】 2017年2月22日,周三晚上8点30分,乐逗游戏的谢佳标老师为大家带来了主题为“如何利用R语言对游戏用户进行深度挖掘”的交流。谢佳标老师有着九年以上的数据挖掘实战经验,同时是一位R语言的资深玩家,多次在中国R语言大会上做主题演讲,他现在乐逗游戏负责大数据挖掘及可视化工作。以下是主持人Jacty整理的交流实录,记录了谢老师与读者智慧沟通的精粹。问:文中在路径分析和付费用户分析中均提到了社会网...

2017年2月22日,周三晚上8点30分,乐逗游戏的谢佳标老师为大家带来了主题为“如何利用R语言对游戏用户进行深度挖掘”的交流。谢佳标老师有着九年以上的数据挖掘实战经验,同时是一位R语言的资深玩家,多次在中国R语言大会上做主题演讲,他现在乐逗游戏负责大数据挖掘及可视化工作。以下是主持人Jacty整理的交流实录,记录了谢老师与读者智慧沟通的精粹。


问:文中在路径分析和付费用户分析中均提到了社会网络,能否讲讲关于社会网络的知识?

: 相信看过文章的读者都发现,我在文章的路径分析和付费用户分析中均提到社会网络这个图。


大家发现在算法的右下角有一个社会网络分析的方法,这个是这几年非常流行的一种可视化方式,图中这个网络图是我们使用networkD3绘制的,可以实现动态交互地效果。

我们先简单了解下社会网络图的概念。社会网络分析(Social Netwrok Analysis,SNA)是在传统的图与网络的理论之上对社会网络数据进行分析的方法。随着人类进入了移动互联网时代,社会网络数据成了重要的数据资源。SNA的本质是利用各样本间的关系来分析整体样本的群落现象,并分析样本点在群落形成中的作用以及群落间的关系。

网络图分为无向图(只研究用户间是否发生过沟通)和有向图(图中使用箭头来标识行为的发起方和接收方):


左图和中间的图就是无向图,右边的是有向图,大家留意右边这个图的数据传递是有箭头,箭头表示发起方到接收方。我们刚才提到如果绘制交互可视化的社会网络图可以利用networkD3包绘制。但是今天给大家介绍另一个扩展包igraph。

在R中,igraph包是专门用来处理网络图的。使用之前先通过install.packages("igraph")下载安装。igraph包非常容易创建各种常规图,其中包括无边图(make_empty_graph函数)、星形图(make_star函数)、环形图(make_ring函数)、完全图(make_full_graph函数)、树状图(make_tree函数)等图形。不同形状的社会网络图可以用来发现各节点间的关系。

除了以上的方法我们还有另一个简单的方式绘制不同布局。就是先创建一个graph对象,然后利用plot函数绘制网络图,并通过设置layout参数来实现不同布局的效果。

说了那么多理论的知识。我们接下来绘制几个简单的社会网络图给大家参考。上次的gitchat分析主题已经介绍了R和包的安装,我就假设大家已经掌握了这些基本技能。大家只需要运行以下代码:

> library(igraph)
> g <-graph(c(2,1,3,1,4,1,5,1,6,1,7,1),directed = F) #创建无向图g
> par(mfrow=c(2,3))
> plot(g,vertex.size=40,layout=layout_on_grid,main="简单的网格布局") # 简单的网格布局
> plot(g,vertex.size=40,layout=layout.auto,main="自动布局") #自动布局
> plot(g,vertex.size=40,layout=layout_as_star,main="星形布局") #星形布局
> plot(g,vertex.size=40,layout=layout.circle,main="环形布局") # 环形布局
> plot(g,vertex.size=40,layout=layout_randomly,main="随机布局") # 随机布局
> plot(g,vertex.size=40,layout=layout_as_tree(g),main="树状布局") #树状布局
>par(mfrow=c(1,1))

每一行命令的前面的>是输入提示符,大家记得拷贝代码的时候要删除哦。

如果你们的计算机还没有安装igraph 包,可以直接通过install.packages("igraph")命令进行安装。

运行完命令后可以得到以下图形:


大家可以看到,这边给大家展示了六种不同的布局。除了plot()函数绘图之外,还可以使用函数tkplot()与rglplot()来制作交互图与3D图。交互图可通过界面直接设置相应点与边的颜色、大小等属性,还可以方便地拖动点来布局。当然,也可以通过设置自带的layout参数来布局。rglplot()函数源于rgl包,3D作图可以让社交网络关系图更加清晰。

大家看这个图:


这个图就是通过tkplot函数绘制出来的,细心的读者已经发现,我们可以通过上面的选项选择布局之类的。


这个图就是通过rglplot函数绘制出来的,已经明显看出是3D效果,可以通过鼠标去旋转社会网络图,从不同视觉进行研究。

此外,如果大家要只是为了绘制社会网络图,这边给大家推荐一款傻瓜式的软件Gephi. Gephi是专业的复杂网络分析软件,基于Java开发,使用OpenGL作为可视化引擎。这款软件对你本机的java版本有要求。需要在本机安装jre1.7以上版本,才能正常使用Gephi。


问:在讲付费玩家常用分析方法时,提到了LTV预测法,请问什么是LTV?LTV预测又是怎么预测的?

: 恩,这个问题问得好,因为在销售公司都很看重用户的LTV。那么什么是LTV呢,我们要先了解下这个概念。LTV(Lifetime Value)直译过来是生命周期价值,用于衡量游戏中用户在其生命周期内对游戏的平均贡献值。很多销售型公司都看重用户的生命价值周期,研究投入是否在一定时期内获得回报,就是评估CPA(获客成本) 与LTV的关系。如果CPA大于LTV,可以认为广告投入是划算的。特别是我们游戏公司,用户的生命周期是有限的,在其有限的生命里评估其价值,才能决定是否需要进行市场广告投放。那么LTV的计算公式是怎样的呢?其核心就是用户生命周期和用户的付费能力。公式如下:LTV=LT*ARPU,公式中LT指Lift-Time用户生命周期,ARPU指用户的人均付费金额。LTV预测主要就是利用已知的LT和ARPU,对未来进行预测。常用LTV预测的步骤如下:

  1. 计算用户生命周期LT值:LT(n)=R(1)+R(2)+…+R(n) ;//R(1)表示用户的留存率;

  2. 利用指数函数对未来的留存率进行预测;

  3. 计算出玩家的价值ARPU,由于玩家不同日期的ARPU值可能不同,可以求出一段时间内每日APRU值得平均值,例如取玩家14天的平均ARPU,即ARPU=(ARPU(1)+ARPU(2)+…+ARPU(14))/14;

  4. 计算出玩家的生命周期价值LTV=LTARPU=( R(1)+R(2)+…+R(n))ARPU。

这个LTV的预测方法是相对来说比较有规律的,是从业务总结出来的业务模型。跟大家经常听到的模型算法有所区别。可见,核心就是要预测出新增玩家在未来一段时间的每日留存率情况,进而即可计算出玩家的LTV值。

经研究发现:一批新增玩家的留存率随自然时间的增长必然无限趋近于0,用几何图形表示就是一条幂减的指数曲线。


这个图就是留存率的预测曲线图,我们可以利用前几天的留存率对未来一段时间的留存率进行预测。纵坐标是留存率,横坐标是自然时间轴,我们希望求出如下幂指数函数y=a*x^b的a、b值。篇幅有限,这边直接给出结论,其值可以用以下两个公式表示,熟悉Excel的同学应该不会陌生:


a和b的系数就是由以上两个公式求出。为了照顾不习惯用Excel的读者,我们对公式稍作解释,第一个公式里LINEST函数是对已知的坐标集合返回线性回归方程的参数,也就是取与该坐标集合拟合最好的一条直线,LN自然对数函数。INDEX( LINEST( LN(Known Ys), LN(Known Xs)), 2)是指取这条曲线的Y轴截距(X=0时的函数值),EXP是自然导数函数e。大家如果都留存率预测感兴趣 可以自己模拟一些数据演练下。

如果大家熟悉R语言,用R语言来尝试这个预测,则步骤将会简单很多。如果利用R语言求幂函数的a、b值,使用非线性回归nls函数可以轻松求出a、b值,该函数的主要表达式为nls(formula,start,…),其中formula是非线性回归模型的表达形式,即y~a*b^x,start是参数初始值。具体实现可以去看看nls函数的帮助文档。


问:付费用户的价值高,体现在直接带来了收益,但从另外一方面看让未付费用户变成付费用户是不是更有潜在价值呢?

: 这个问题是正确的,大家可能听过一句话,就是20%的用户创建公司80%的价值。也就是所谓的二八原则。这个在传统行业是金句名言,很多企业也是遵循这个原则去进行用户维护的。这么做的另一个原因是因为数据分析手段以前没有那么发达,还有公司人力有限,才集中服务核心用户。但是现在在互联网时代,我们可以收集用户的任何行为,包括用户浏览商品的轨迹(电商),我们就可以利用大数据分析技术研究用户的偏好,对其进行精准推送,这样使其成为付费用户的概率很大。这也是从未付费变成付费可能的一个业务研究方向。那我们游戏用户来说,我们的付费用户占比不足10%,所以我们更需要挖掘潜在的付费用户。

结合两位读者的问题来说,我们可以研究所有玩家的玩游戏行为、玩家基本属性(包括性别、年龄、终端、区域)等信息,将用户进行分群,如果发现一些未付费用户与付费用户分在一类,说明这些的行为相似。也是我们认为的潜在付费用户,可以对其进行打折活动推送。这样他们就有可能转化为付费用户。

付费率也是业务非常看重的一个指标,我们做数据挖掘的一个重点就是研究潜在付费用户,提高付费率。


问:我们在实际工作中,经常会听到用户群体,请问这个又需要运用什么算法模型呢?

: 用户分群也就是我们经常说的把相似的用户聚为一类,然后针对不同的用户群进行针对性营销策略,是精细化运营非常重要的一步。那么怎么对用户进行分群呢?常用的做法可以利用聚类分析实现,聚类分析也是无监督模型的一种。聚类分析是一种原理简单、应用广泛的数据挖掘技术。顾名思义,聚类分析即是把若干事物按照某种标准归为几个类别,其中较为相近的聚为一类,不那么相近的聚于不同类。

聚类分析在客户分类、文本分类、基因识别、空间数据处理、卫星图片分析、医疗图像自动检测等领域有着广泛的应用;而聚类分析本身的研究也是一个蓬勃发展的领域,数据分析、统计学、机器学习、空间数据库技术、生物学和市场学也推动了聚类分析研究的进展。聚类分析已经成为数据分析研究中的一个热点。聚类算法种类繁多,且其中绝大多数可以用R实现。

  • K-均值聚类(K-Means)

  • K-中心点聚类(K-Medoids)

  • 密度聚类(Densit-based Spatial Clustering of Application with Noise,DBSCAN)

  • 层次聚类(系谱聚类 Hierarchical Clustering,HC)

  • 期望最大化聚类(Expectation Maximization,EM)

这几种是常见的聚类分析算法。需要说明的是,这些算法本身无所谓优劣,而最终运用于数据的效果却存在好坏差异,这在很大程度上取决于数据使用者对于算法的选择是否得当。实际业务生产中,k-均值聚类和层次聚类运用最广泛。我们以K-均值聚类为例给大家讲解下原理。

它的思路是以随机选取的k(预设类别数)个样本作为起始中心点,将其余样本归入相似度最高中心点所在的簇(cluster),再确立当前簇中样本坐标的均值为新的中心点,依次循环迭代下去,直至所有样本所属类别不再变动。算法的计算过程非常直观。这边涉及到计算不同样本点的距离,在R中可以利用dist函数实现。我们给出示意图帮助大家理解k-均值聚类的过程:


大家先查看这幅图,一共有五张子图。假设我们想把这十个点分成三类。第一步,就是随机选择三个点作为簇中心。第二步,计算其他7个点与这三个簇的距离,选择聚类最近的簇分在一起,可以看见第二幅图。然后根据每一类的样本从新计算簇中心,就是大家看到的第三幅图。依次下去,达到最优后k-均值聚类就会停止。

R中主要使用4个软件包—stat、cluster、fpc和mclust。大家如果对聚类分析感兴趣可以查看这几个包。


问:怎么选择算法?怎么评估选择的算法比较优呢?

: 很多学习数据分析、数据挖掘的童靴都面临这个困惑。因为很多模型算法都可以实现相同的目的,比如说分类预测的研究 就有很多种算法可以实现。包括线性回归模型、logitic回归、knn近邻、朴素贝叶斯、决策树、随机森林、人工神经网络、支持向量机等等。


如上面这个图,这里只是罗列了一些常用的算法模型。像左边的预测性模型,这些都可以对未来进行预测,我们如果选择算法呢?如果对不同的算法进行评估,对于分类来说,需要把精力花费在学习问题找到合适的分类器。这时候,考虑到不同算法间的各种差异是很有帮助的。例如,在分类问题中,决策树因在建模过程中有明确的规则输出使得模型通俗易懂,而黑箱操作的神经网络得到的模型则很难解释。如果你要设计一个欺诈用户甄别模型,上述的模型特点就是很重要的选择模型依据,因为需要发现欺诈用户的异常行为模式,即使神经网络算法能更好地甄别欺诈用户,但是如果不能解释清楚这些预测背后的模式,那么再好的预测也是没有用的。

这边有一个从业务需求方向的角度考虑的:为了确保模型能够对未知对象进行正确预测,需要对模型性能进行评估,避免模型出现可能存在的过拟合问题。我们可以利用包括caret、rminer和rocr这类算法包来评估模型性能以防止过拟合问题。这几个包是这几年R语言中在模型评估方面特别火的。特别是caret包,它有非常丰富的数据处理、数据抽样、数据建模、模型评估等功能。进一步,对模型性能进行评估还有助于我们得到更优、健壮性更好的模型,以便准确地预测未知数据。在数据挖掘过程中,每个模型和算法具有不同的适用场景,但最终评价的结果一定是以业务价值为导向,而非模型自身的评价指标,所以,在选取模型时,将更多的将采取一些机器学习算法。

这边讲一个通用的方法:K折交叉验证。K折交叉验证技术能够解决过拟合问题,因此被广泛应用于分类器性能评估领域。它是一种统计学上将数据样本切割成较小子集的实用方法,目的是为了得到可靠稳定的模型。先在一个子集上做分析, 而其它子集则用来做分析的确认及验证。初始子集被称为训练集,剩余的子集则被称为验证集。重复执行完n次K折交叉验证后,就能够根据n次检验的平均正确率实现对模型性能的真实评估。

K折交叉验证这边介绍caret包的train函数。使用caret包的train函数来建模并自动实施10折交叉验证。设置训练控制参数,进行重复3次的10折交叉验证。

> library(caret)
> control <-trainControl(method="repeatedcv",number=10,repeats=3)

这样就构建了三个十折交叉验证。这边调用rpart函数构建决策树,寻找最优模型。

> library(caret)
> control <- trainControl(method="repeatedcv",number=10,repeats=3)
> model <- train(accept~.,data=car,method="rpart",+trControl=control)plot(model)


从而得到cp值04633205的模型准确率最高(0.7802949)。此外,混淆矩阵和ROC曲线也是常用来评估模型的预测能力。如果要对分类模型的性能进行评估,我们可以首先基于预测结果和实际分类结果产生一个分类表,然后基于混淆矩阵来获取诸如模型的精确度、召回率、特异性以及准确率等性能指标。前文我们已经使用了table函数生成混淆矩阵。受试者工作特征曲线(Receiver Operating Characteristic,ROC)是一种常见的二元分类系统性能展示的图形,在曲线上分别标注了不同切点的真正率以及假正率。ROC曲线来源于信号检测理论,它显示了给定模型的灵敏性(Sensitivity)真正率与假正率(False Postive Rate)之间的比较评定。给定一个二元分类问题,我们通过对测试数据集的不同部分所显示的模型可以正确识别“1”实例的比例与模型将“0”实例错误地识别为“1”的比例进行分析,来评定不同模型的准确率。真正率的增加是以假正率的增加为代价的,ROC曲线下面的面积AUC(Area Under Curve)就是比较模型的准确度的指标和依据。面积大的模型对应的模型准确度要高,也就是要择优应用的模型。面积越接近0.5,对应的模型的准确率就越低。这些内容是节选至我的新书《R语言游戏数据分析与挖掘》。里面详细介绍了不同算法的选择和调优,如果对这块感兴趣的读者,可以留意下这本书。


问:您使用R时,在什么平台上跑,R能处理的数据量如何,R中怎么处理大数据量?

: 我一般是在windows上跑,不过有些东西会在linux上跑。大数据量可以结合其他工具,比如说你直接调用数据库的数据。比如说你可以利用RODBC包实现与市面上流行的ODBC数据库,直接从数据库中读取或者运行sql,只需要将要分析的中间数据传给R。或者可以利用RHadoop和sparkR与Hadoop和spark结合。也可以利用一些并行包提升运算性能,比如说foreach包。利用foreach和randomForest结合,可以实现并行的随机森林,这样可以极大提高性能。所以随着技术和计算机性能的提升,我觉得这方面不是问题了。


问:在路径分析和付费用户分析中,均提到了关联规则,区别就是一个是时序关联规则,另一个是apriori算法,能讲讲这两者的具体区别吗?

: 两者确实不同。是根据研究需求而选择的。我们先简单了解下关联规则的基本概念。关联规则是从事务数据库、关系数据库和其他信息存储中的大量数据项集之间发现有趣的、频繁出现的模式、关联和相关性。更确切地说,关联规则通过量化的数字描述物品甲的出现对物品乙的出现有多大的影响。关联规则模式属于描述型模式,发现关联规则的算法属于无监督学习的方法。

关联规则分析也称为购物篮分析,最早是为了发现超市销售数据库中不同商品之间的关联关系。我们可以将这个分析思路很好地移植到游戏的道具销售分析中。

这边举一个例子来理解这块:例如,想研究一款游戏的用户购买喜好,如“哪组商品可能会在一次购物中同时购买?”或者“某用户购买了5000金币的道具,那该用户在以后一段时间里购买8000金币的概率有多大?” 我们要研究的就是这些概率(可能性)。常见的关联规则算法有多种:Apriori算法、FP-树频集算法和基于划分的算法等。其中Apriori算法是最常用也是最经典的挖掘频繁项集的算法。其核心思想是通过连接产生候选项及其支持度然后通过剪枝生成频繁项集,这里频繁项集指的是所有支持度大于等于给定最小支持度的项集。该算法的主要思想是找出存在于事务数据集中最大的频繁项集,再利用得到的最大频繁项集与预先设定的最小置信度阈值生成强关联规则。

如这边运用Apriori算法得到以下两条规则:


大家看这个截图。我们有几个概念需要了解的:lhs(左项,也叫前项,条件项),rhs(右项、后项或者结果项)。support是支持度、confidence是置信度、lift是提升度。我们的关联规则要设置最小支持度阈值和最小置信度阈值,符合这些条件的规则才会生成。另外,请大家仔细看下这两条规则。是不是6的左项就是7的右项,6的右项就是7的左项,支持度和提升度也是相同的,对吧。规则6、规则7指的都是用户购买过超值大礼包和新手礼包的支持度是0.0159,提升度是13.19,由此说明apriori算法是不考虑物品购买前后顺序的。我们这是考虑了不同物品之间的关联规则,不考虑其购买时间,购买顺序。如果需要考虑物品购买顺序因素,可以利用arulesSequences包中的cspade函数实现cSPADE算法。

我们先简单了解下基于时序关联规则的原理。基于序列的关联规则(Sequence Analysis)又称序列分析,这种方法是在关联规则分析(Association Analysis)的基础上,进一步考虑了关联物品之间的先后顺序,即数据集中的每个序列的条目都是有序排序的,且输出的结果也是有序的。

同样,我们也举一个例子帮助理解。例如一个用户在一段时间内,发生了三次交易,第一次购物为A和B,第二次购物为A和C,第三次为D,故该用户的序列为<{A,B},{A,C},{D}>,这与<{A,B}{D}{A,C}>是不同的。表示这个完整的信息流称为序列(sequence),如序列<{A,B},{A,C},{D}>;序列中最小组成单位的集合称为数据项(item),如{A,B}就是一个数据项;用于标识同一个序列内不同数据项之间的前后顺序关系称为事件(event),通常用时间戳来表示。

基于序列的关联规则常用的算法为由zaki提出的可以使用各种约束限制的cSPADE算法。在R中,可以使用arulesSequences包中的核心函数cspade实现。其基本表达式为:

cspade(data, parameter
= NULL, control = NULL, tmpdir = tempdir())

其中,data是事务型数据,parameter用于设置各类约束限制。关于这个函数的使用,我们已经在文章中提到了,这边就不再赘述了大家要记住一点,做关联规则要求得到数据类型是事务型,所以数据处理需要特别细心,特别花时间。


问:我想问工程实践的问题:1. 在与传统数据库的结合使用中,有什么技巧可以分享(比如如何避免数据在本地跑)?2. 您在使用R编写数据分析的代码时,代码量会很大吗,如何组织这些工程文件?

: 我们工作中一般都是直接连接服务器的数据库,避免把大数据保存到R内存中。另外,我们编写的代码量是非常大的,一般是根据项目来分类管理。


(以上内容转自GitChat,版权归GitChat所有,转载请联系GitChat,微信号:GitChat,原文:《谢佳标:利用R语言,将游戏数据的价值最大化》

本文转载自异步社区。

原文链接:https://www.epubit.com/articleDetails?id=NC7E3EF92DEB00001ACEA1740AE102210


登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 0
点赞
分享文章到微博
分享文章到朋友圈

上一篇:梅子:探索式测试应用场景实战解析

下一篇:程序员必备技能:在Github上部署自己的简历

评论 (0)


登录后可评论,请 登录注册

评论