激活数据
激活且登录率应用场景
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EPVvqeQ-1632535304890)(img/激活且登录率应用参考.png)]
活跃数据
在线数据
留存数据
留存率和游戏质量关系
游戏从封测开始,多数公司都会投入固定的内、外部宣传资源作为游戏的初期市场推广,以收集游戏的封测数据,这其中主要就是留存率
无论是端游还是手游,都非常重视这一指标,留存率成为衡量产品质量的重要指标之一,用以判定游戏的基本品质,为后续的市场资源调配提供参考。
游戏封测主要有两种形式,为发放激活码测试和不发放激活码测试,由于发放激活码测试针对的用户群体更偏向核心用户,一般来说,其留存率高于非激活码测试。
限量发放激活码封测的游戏评级留存率标准
因用户规模对留存率有一定影响,当测试用户过少时,可能不能反映游戏真实的留存率数据,因此为保证封测数据准确性,封测周期要求7天及以上,新登录总人数在5000以上,才能按相应标准评估游戏级别,如下表所示是某渠道对游戏限量发放激活码测试节点进行评级的留存标准。
不限量封测,不发放激活码的游戏评级留存率标准
不限量封测时需要接入渠道,由渠道导入自然用户量,其用户导入量不能高于封测服务器最高承受的用户能力,当用户规模接近服务器上限时停止导入,因此从某种意义上讲也是限量的。同样考虑到用户规模对留存率的影响,为确保数据准确性,要求不限量封测的用户规模至少1万人。如下表所示是某渠道对游戏不限量封测节点进行评级的留存标准。
付费率:也称付费转化率,指每日付费用户占活跃用户的比例,当付费用户的生命周期总价值有一定保证后,提升付费用户比例,就将成为提升公司营收的有效途径。其计算公式为:
付费率=付费人数/活跃人数
可以按照计算时间区间推广到周付费率,月付费率等.
关注问题:
ARPPU:**ARPPU(Average Revenue per Paying User)**即平均每付费用户收入,它反映的是每个付费用户的平均付费额度,其计算公式为:
ARPPU=付费金额/付费人数
ARPU: **ARPU(Average Revenue Per User)**即每用户平均收入,ARPU注重的是一个时间段内运营商从每个用户处所得到的收入。其计算公式为::
ARPU=付费金额/活跃人数
目前较好的手游每日ARPU超过5元;一般的手游ARPU在3~5元之间;ARPU低于3元则说明表现较差。
关注问题
付费用户比例构成
游戏运营主要目标有4点:拉新、促活、留存、付费转化。
拉新就是通过渠道合作和广告营销等方式,获得新用户;留存是将获得的用户能够尽量持久地留在产品上;促活即“促进用户活跃”,让用户愿意更频繁、更开心的游戏;付费转化则包含促进用户充值和促进用户消费。
游戏行业的拉新成本很高,要投入广告、投入时间,这些都是成本。如果用户还没有产生什么价值就流失了,那一定是亏了。相反,拉过来的用户,留存的时间越长,产生的价值也就越大,也才能弥补其他流失用户所产生的损失。因此,提高用户的留存时间,也是提高公司收入,为公司创造更多价值的重要一环。
我们可以在产品设计的每个可控环节当中进行埋点,并监控每个节点的漏斗转换,用于帮助发现产品设计中的问题。通过改善这些环节,可以获得更多的新增用户。
案例分析
上图是某一款手游在某个渠道上线第1天的数据:从点击广告进入游戏的转化率只有9.8%,付费转化率只有0.5%,也就是说10万个用户点击广告,最终进入游戏的用户只有9800人,最终付费的用户只有500人。通过上图我们可以看出主要有两个问题:
除了优化产品自身的一些细节外,提高各个环节的转化率,对渠道各项转化率指标的长期监控,以及追踪不同渠道、媒体来源用户的后续质量(包括登录、活跃、留存、付费等),能够帮助我们快速发现渠道异常、调整广告投放策略等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CJvElZs-1632535304892)(img/image-20200324224933173.png)]
数据包含近229万条记录,109个字段,以下取较重要的字段进行说明。
字段说明:
user_id:用户编码,用户唯一标识
bd_stronghold_level:要塞等级,相当于游戏账号等级
wood_reduce_value:木头消耗数量
stone_reduce_value:石头消耗数量
ivory_reduce_value:象牙消耗数量
meat_reduce_value:肉消耗数量
magic_reduce_value:魔法消耗数量
general_acceleration_reduce_value:通用加速消耗数量
building_acceleration_reduce_value:建筑加速消耗数量
reaserch_acceleration_reduce_value:科研加速消耗数量
training_acceleration_reduce_value:训练加速消耗数量
treatment_acceleration_reduce_value:治疗加速消耗数量
pvp_battle_count:玩家对玩家次数
pve_battle_count:玩家对机器次数
avg_online_minutes:日均在线时间
pay_price: 消费金额
pay_count:消费次数
我们将通过python的pandas包完成数据清洗和统计分析部分,使用matplotlib包进行数据可视化,以此来解决以下问题:
import numpy as np
import pandas as pd
import pickle
from matplotlib import pyplot as plt
import seaborn as sns
from datetime import datetime
import re
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # Mac用来正常显示中文标签
# plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df = pd.read_csv('data/tap_fun_train.csv')
#复制一份数据
df1=df.copy()
#检查是否有空值
print(df.isnull().any().any())
False
#查询数据条数
df1.shape[0]
# 2288007
#以user_id为维度,删除重复数据,并查看用户总数
df1 = df1.drop_duplicates(subset='user_id')
print('用户总数:',len(df1['user_id']))
# 用户总数: 2288007
去重后还有2288007条数据
reg_user=df1[['user_id','register_time']]
reg_user.head()
#首先将注册时间转化为天
reg_user.register_time=pd.to_datetime(reg_user.register_time,format="%Y/%m/%d")
reg_user.register_time=reg_user.register_time.apply(lambda x: datetime.strftime(x,"%Y-%m-%d"))
#计算每天注册人数
reg_user = reg_user.groupby(['register_time']).user_id.count()
#可视化
fig = plt.figure(figsize=(14, 10))
plt.plot(reg_user)
plt.xticks(rotation=90)
plt.title('用户注册分布图')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPR2f0Xs-1632535304894)(img/image-20200324225622910.png)]
#活跃用户
act_user = df1[df1['avg_online_minutes']>=30]
#付费用户
pay_user = df1[df1['pay_price']>0]
#计算付费率
pay_rate = pay_user['user_id'].count() / act_user['user_id'].count()
print('付费率为%.2f' %(pay_rate))
#付费率为0.29
ARPU:平均每用户收入
ARPU =总付费金额/总活跃用户
#计算ARPU
ARPU = pay_user['pay_price'].sum()/ act_user['user_id'].count()
print('ARPU为%.2f' %(ARPU))
#ARPU为8.55
ARPPU:平均每付费用户收入
ARPPU =总付费金额/总付费用户
#计算ARPPU
ARPPU = pay_user['pay_price'].sum()/ pay_user['user_id'].count()
print('ARPPU为%.2f' %(ARPPU))
#ARPPU为29.52
#根据不同要塞等级分类
# df1_user= df1.groupby(['bd_stronghold_level']).user_id.count()
df1_user=df1[['user_id', 'bd_stronghold_level', 'pay_count', 'pay_price']]
#通过数据透视表汇总各等级人数分布,总付费次数, 总付费金额
table=pd.pivot_table(df1_user,index=['bd_stronghold_level'],values=['user_id','pay_count','pay_price'],aggfunc={
'user_id':'count','pay_count':'sum','pay_price':'sum'})
user_pay = table.reset_index()
#计算各等级付费人数
user_count=df1_user[df1_user['pay_price']>0].groupby('bd_stronghold_level').user_id.count()
user_pay['user_count']=user_count
user_pay.head()
#计算等级付费转化率,等级人均付费次数,等级人均付费总额
user_pay['pay_rate']=user_pay.user_count/user_pay.user_id
user_pay['user_avgcount']=user_pay.pay_count/user_pay.user_count
user_pay['user_avgmoney']=user_pay.pay_price/user_pay.user_count
#修改列名
user_pay.columns = ['要塞等级', '付费次数', '付费总额', '达到人数', '付费人数', '付费转化率', '人均付费次数', '人均付费总额']
#调整列名
user_pay = user_pay[['要塞等级', '达到人数', '付费人数', '付费次数', '付费总额', '付费转化率', '人均付费次数', '人均付费总额']]
user_pay
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UP6XEzF4-1632535304897)(img/image-20200324230049571.png)]
x=user_pay['要塞等级']
y=user_pay['付费转化率']
fig = plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.xticks(x,range(0,len(x),1))
plt.grid(True)
plt.title('要塞等级和付费转化率的关系')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZlC5vLg-1632535304899)(img/image-20200324230117459.png)]
x=user_pay['要塞等级']
y=user_pay['人均付费总额']
fig = plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.xticks(x,range(0,len(x),1))
plt.grid(True)
plt.title('要塞等级和人均付费总额的关系')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGeE4rwX-1632535304901)(img/image-20200324230158231.png)]
x=user_pay['要塞等级']
y=user_pay['人均付费次数']
fig = plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.xticks(x,range(0,len(x),1))
plt.grid(True)
plt.title('要塞等级和人均付费次数的关系')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84YTLuCA-1632535304903)(img/image-20200324230231415.png)]
x=user_pay['要塞等级']
y=user_pay['达到人数']
fig = plt.figure(figsize=(12,8))
plt.bar(x,y)
plt.xticks(x,range(0,len(x),1))
plt.title('要塞等级达到人数')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtI9jhkC-1632535304904)(img/image-20200324230405839.png)]
#对10级以上的玩家进行分类
sup_user=df1[(df1['pay_price']>=500)&(df1['bd_stronghold_level']>=10)]
nor_user=df1[(df1['pay_price']<500)&(df1['pay_price']>0)&(df1['bd_stronghold_level']>=10)]
消费玩家资源类道具使用情况
#制作资源相关数据集
wood_avg = [sup_user['wood_reduce_value'].mean(), nor_user['wood_reduce_value'].mean()]
stone_avg = [sup_user['stone_reduce_value'].mean(), nor_user['stone_reduce_value'].mean()]
ivory_avg = [sup_user['ivory_reduce_value'].mean(), nor_user['ivory_reduce_value'].mean()]
meat_avg = [sup_user['meat_reduce_value'].mean(), nor_user['meat_reduce_value'].mean()]
magic_avg = [sup_user['magic_reduce_value'].mean(), nor_user['magic_reduce_value'].mean()]
data = {
'高氪玩家':[wood_avg[0], stone_avg[0], ivory_avg[0], meat_avg[0], magic_avg[0]],
'低氪玩家':[wood_avg[1], stone_avg[1], ivory_avg[1], meat_avg[1], magic_avg[1]]}
resource = pd.DataFrame(data, index=['木头', '石头', '象牙', '肉', '魔法'])
#可视化
resource.plot(kind = 'bar', stacked=True, figsize=(14, 10),legend=True)
plt.title('玩家资源使用量')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pu3L5Tnd-1632535304905)(img/game1.png)]
消费玩家加速券使用情况
#制作加速券相关数据集
genral_avg = [sup_user['general_acceleration_reduce_value'].mean(), nor_user['general_acceleration_reduce_value'].mean()]
building_avg = [sup_user['building_acceleration_reduce_value'].mean(), nor_user['building_acceleration_reduce_value'].mean()]
reaserch_avg = [sup_user['reaerch_acceleration_reduce_value'].mean(), nor_user['reaserch_acceleration_reduce_value'].mean()]
training_avg = [sup_user['training_acceleration_reduce_value'].mean(), nor_user['training_acceleration_reduce_value'].mean()]
treament_avg = [sup_user['treatment_acceleration_reduce_value'].mean(), nor_user['treatment_acceleration_reduce_value'].mean()]
data = {
'高氪玩家':[genral_avg[0], building_avg[0], reaserch_avg[0], training_avg[0], treament_avg[0]],
'低氪玩家':[genral_avg[1], building_avg[1], reaserch_avg[1], training_avg[1], treament_avg[1]]}
acceleration = pd.DataFrame(data, index = ['通用', '建筑', '科研', '训练', '治疗'])
#可视化
acceleration.plot(kind = 'bar', stacked=True, figsize=(14, 10))
plt.title('玩家加速券使用量')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgCnBdgC-1632535304907)(img/game2.png)]
两类玩家对对治疗加速券消耗都很小,对通用加速券的消耗差异较大,其他三种加速券消耗差别不大。通过体验游戏了解到加速券的使用,直接影响游戏进程的加快,因此高氪玩家更希望通过加快游戏进程增加游戏体验。
avg_online_minutes = [sup_user['avg_online_minutes'].mean(), nor_user['avg_online_minutes'].mean()]
data = {
'高氪玩家':[avg_online_minutes[0]],
'低氪玩家':[avg_online_minutes[1]]}
online_time=pd.DataFrame(data, index = ['平均在线时长'])
online_time.head()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HBFzQAw-1632535304908)(img/image-20200324230751604.png)]
#可视化
online_time.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家在线情况')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAEZd6M1-1632535304909)(img/game3.png)]
pvp_battle_avg = [sup_user['pvp_battle_count'].mean(), nor_user['pvp_battle_count'].mean()]
pvp_lanch_avg = [sup_user['pvp_lanch_count'].mean(), nor_user['pvp_lanch_count'].mean()]
pvp_win_avg = [sup_user['pvp_win_count'].mean(), nor_user['pvp_win_count'].mean()]
data = {
'高氪玩家':[pvp_battle_avg[0], pvp_lanch_avg[0], pvp_win_avg[0]],
'低氪玩家':[pvp_battle_avg[1], pvp_lanch_avg[1], pvp_win_avg[1]]}
PVP = pd.DataFrame(data, index = ['PVP次数', '主动发起PVP次数', 'PVP胜利次数'])
PVP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjQJVzUs-1632535304910)(img/image-20200324230906572.png)]
#可视化
PVP.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家pvp情况')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYspko1w-1632535304911)(img/game4.png)]
pve_battle_avg = [sup_user['pve_battle_count'].mean(), nor_user['pve_battle_count'].mean()]
pve_lanch_avg = [sup_user['pve_lanch_count'].mean(), nor_user['pve_lanch_count'].mean()]
pve_win_avg = [sup_user['pve_win_count'].mean(), nor_user['pve_win_count'].mean()]
data = {
'高氪玩家':[pve_battle_avg[0], pve_lanch_avg[0], pve_win_avg[0]],
'低氪玩家':[pve_battle_avg[1], pve_lanch_avg[1], pve_win_avg[1]]}
PVE = pd.DataFrame(data, index = ['PVE次数', '主动发起PVE次数', 'PVE胜利次数'])
PVE
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ir29LfYb-1632535304912)(img/image-20200324231006900.png)]
#可视化
PVE.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家pve情况')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oE9lBLrr-1632535304913)(img/game5.png)]
可以看到高氪玩家的平均在线时长时低氪玩家的1.6左右,而高氪玩家的PVP的三项指标数值都在低氪玩家三项指标数值的2倍左右;pve的数值两者相差不大,但高氪玩家还是高于低氪玩家。
总的来说高消费玩家更愿意投入时间在这款游戏上,它们热衷于pvp玩法,在pve的局数上也多于低消费玩家,因此游戏可以投入较多的精力在pvp的玩法改进上,吸引玩家更多的参与到pvp上,刺激玩家的消费,增加游戏的收入。
1.该游戏具有较大的用户基数,且新用户注册受游戏活动、游戏推广力度等因素影响较大。
2.该游戏的ARPU为8.55,说明该游戏的盈利能力较高。
3.对于游戏付费情况,两极分化情况十分严重,绝大多数玩家处于10级以内,且付费情况较差,而少数玩家在10级以上,且付费能力强(13级的用户付费转化率接近100%).因此对于如何让大多数玩家平滑过渡到10级,非常的重要。
4.消费习惯上,高消费玩家对象牙和通用加速券的需求远多于一般玩家。
5.在玩家行为上,高消费玩家投入游戏时间更多,它们更热衷于pvp玩法。