做数据分析,都希望自己的数据是100%准确的。但理想是美好,现实却是残酷的,对于游戏数据分析尤其如此。正如数学极限,可以无限逼近,却无法达到。结合自己几年的工作经历,想说一句话,“对于游戏数据分析,我们只可能追求尽可能准确,接受一定的误差,却不能达到百分百精确”。
情景1:部分物品由于中间途径的存在,导致无法追踪其所有原始产出/回收途径。例如对于灵魂石的产出,程序后台的数据log格式是:
* 产出类型,产出物品,产出数量
* 物品包裹,灵魂石,100
* 随机副本,物品包裹,9
* 日常活动,物品包裹,14
* 道具商城,物品包裹,72
* 世界掉落,物品包裹,5
而我们的需求,是可以回溯到物品的最原始产出途径。如果直接拿“灵魂石的产出途径都是物品包裹”是没有意义的。这是个简单的例子。如果搞得复杂些,一些物品是有物品合成+中间物品汇总,梳理这些流动关系是很耗时间。
情景2:部分系统涉及预扣金钱和返还金钱,需要特殊处理。例如玩家团队竞拍,会先扣除玩家身上的金钱,如果玩家竞拍成功,不返还金钱(属于回收),如果玩家竞拍失败,返回金钱(属于流通)。而现有的程序后台设计,往往是扣除金钱时,当作回收;而返还金钱时,当作产出。针对这类系统有两种方法:一是直接拿扣除的金钱绝对值减去返回的金钱绝对值,差额就属于金钱回收数量。二是玩家竞拍成功时,打上金钱的回收log,屏蔽掉返还金钱和返回金钱的log,只计算竞拍成功时的金钱回收数据。
情景3:时间差关系。比如一个系统回收了玩家部分金钱,然后通过一些包裹返回玩家部分金钱。但是使用包裹得到的金钱数时随机的。假设玩家突然流失了,我们就无法计算返还金钱了;又过了一段时间,玩家回来使用包裹了,但是我们 已经做其它事情,不再关心真正的回收量了。
算绝对数值时很容易的,但是算一些比率却是困难的。
情景1:我们计算玩法的参与、完成情况都是选取一定周期的。比如说现在都有周数据和月数据,如果在某月上旬,某个玩法的可参与等级是>=49,而下旬维护后,产品调整后>=30级。怎么计算可参与人数呢?可以再设想一下,如果变化了N次,我们的脚本是否需要自动性很强?而维护这些变动是否要很多精力?
情景2:计算分等级段的玩法参与率、完成率。如果玩家在50~59等级段接受了玩法,在60~69等级段完成了玩法,那么完成率是算60~69等级段,还是50~59等级段呢?如果算50~59级,每个玩家的每个玩法都要回溯玩家最近参与的等级段,那是多么费力不讨好的事情,而且不可行。如果算60~69级,分子和分母就不是完全相同的一群人,而是有偏差了,所以结果是不精确的。
情景3:完成率。其实隐藏着假设条件,完成人数包含在参与人数里面。但是,如果某个玩家在上个计算周期参与了玩法,在下个计算周期完成了玩法。那么我们是要排除掉这个玩家,让数据计算精确?跨时间计算的数据都会遇到这个问题。
这3个问题,如果需要精确的答案,每个都要花很大力气去解决。但从实际效果来看,可能提高了1%左右的精度。
以上问题,在数据仓库的术语上是“缓慢变化维”。玩家的等级不断变迁、数据的时间不断前进,导致我们的一些计算只能接受有误差的形式。只要数据结果保持着趋势,不产生多大波动,我们就可以认为数据虽然有误差,但是稳定可控,可以作为决策参考。
1、数据跨服。
常规下,玩家角色的游戏行为数据都是存储在玩家角色所在服务器。但是也有例外,例如跨服随机本和跨服随机战场,一般是将玩家数据转移到某台服务器(称为跨服)进行的。而参与/完成随机本、随机战场这些特定触发的数据LOG也会自然记录到跨服,而不会做特定接口将数据转存回角色所在服。但这样的话,我们计算 每台服务器参与随机本、随机战场的玩家角色就会有误。所以我们处理这些数据时,要提前做数据清理,将角色的参与/完成玩法数据转移回角色所在服。
2、数据合服。
之前遇到某个行为数据表,是以玩家角色ID(其实就是数据库ID啦,呵呵)标识玩家,但是ID从1开始自增。当两台服务器合服时,ID就有了重复冲突。前面的历史数据与合服后新数据,玩家角色ID虽然相同,但有可能不是同一个玩家,做数据计算就需要小心翼翼。
另外就是数据指标计算定义,举每月各个服务器登录角色指标。假设在中旬的时候,某台鬼服合并到新服务器。那么对于鬼服的每个登录玩家,鬼服的登录玩家角色 数量+1,新服的登录玩家玩家角色数量+1,但是全服玩家角色数量也只是+1,而不能将每个单服的登录角色累加当作全服登录角色。
3、角色转号。
这会影响到历史数据的关联问题。大多数后台数据都是以玩家角色ID作为用户标识的,如果需要关联玩家的帐号,那么计算历史数据时,还要根据时间对应回角色转号前的帐号,而不是转号后的帐号。
4、单服全服。
以新增玩家帐号为例。某个帐号在单台服务器新增,但不一定是在全服新增。
以登录用户为例。如果算登录玩家角色,每个单服的玩家角色累计,可以算作全服的玩家角色数量;但如果算登录玩家帐号,则不能累加。因为一个帐号可能在多台服务器登录,这样会有重复计算,但是算玩家角色则不受影响,因为一个帐号N个角色还是按照N来计算。