野蛮游戏数据分析
野蛮时代游戏数据分析
分析任务说明:
-
野蛮时代游戏的用户及付费信息进行分析,部分数据如下:

数据包含近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:消费次数
需要解决的问题:
- 导入数据
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()
#检查是否有空值
False
- 查找是否有缺失值,得到结果为False,即没有缺失值,说明数据还是很完整的
#多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#查询数据条数
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()

从图中很直观的看出 :
从1月26日到3月6日期间,注册人数有不少高峰
2月19日游戏的注册人数迎来一次大的高峰,分析可能是这段期间游戏内部发布了一系列活动,或者游戏对各个推广的渠道增加了曝光
2月19日高峰过后,注册人数较之前没有明显的增长,反而相比之前下降了许多,因此并没有带给游戏更多的热度!
付费分析
付费率=付费人数/活跃用户
- 将每日游戏时长大于30分钟的玩家定义为活跃用户
#活跃用户
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=pay_user['pay_price'].sum()/act_user['user_id'].count()
print('ARPU为%.2f' %(ARPU))
ARPU为8.55
目前较好的手游ARPU超过5元;一般的手游ARPU在3~5元之间;ARPU低于3元则说明表现较差。可见该手游的盈利能力较好。
#计算ARPPU 平均每付费用户收入
#ARPPU =总付费金额/总付费用户
ARPPU=pay_user['pay_price'].sum()/pay_user['user_id'].count()
print('ARPPU为%.2f' %(ARPPU))
ARPPU为29.52
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'})
table
user_pay = table.reset_index()
user_pay
#计算各等级付费人数
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

#要塞等级和付费转化率的关系
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()

#要塞等级和人均付费总额的关系
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()

可以通过人均消费总额看出,在20级以后人均消费额的曲线出现了陡增,该阶段的用户应该已经了解了游戏的核心玩法,因此可以对该部分用户加强消费引导, 提升游戏的收入。
#要塞等级和人均付费次数的关系
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()

通过观察付费转化率和要塞等级的关系可以发现
9级时付费转化率为26%
10级时的付费转化率已经接近60%
在14级之后的玩家, 付费转化率达100%。观察人均消费总额和人均消费次数可以发现,10级之后,两项指标也同时呈现显著的增长。
#达到各个要塞等级的人数柱状图
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()

观察要塞等级达到人数的柱状图可以发现,大量的用户集中在10以下,因此游戏的运营方向应该是如何是用户平滑的达到10级
可以通过进一步分析或者通过游戏内发放问卷调查的方式了解用户在10级以下时遇到的困难和问题,进一步优化游戏内容,增强引导用户提升要塞等级。
#对10级以上的玩家进行分类
#高氪玩家(充值金额高于500元)
sup_user=df1[(df1['pay_price']>=500)&(df1['bd_stronghold_level']>=10)]
#低氪玩家(充值金额低于500元大于0元)
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]]}
data
resource = pd.DataFrame(data, index=['木头', '石头', '象牙', '肉', '魔法'])
resource
#可视化
resource.plot(kind = 'bar', stacked=True, figsize=(14, 10),legend=True)
plt.title('玩家资源使用量')
plt.show()


高消费玩家和低消费对木头、石头、肉的消耗都较大,魔法的消耗都较小
而在象牙的消耗上,高消费玩家和低消费玩家的消耗差距较大。可能是因为象牙资源在游戏中的用途相对高端一些,而木头和肉类是游戏发展过程中必需的资源。
高氪玩家在资源上的平均使用量要远远高于低氪玩家,象牙资源最能够体现出一个玩家在游戏上的消费水平
#制作加速券相关数据集
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], training_avg[0], treament_avg[0]],
'低氪玩家':[genral_avg[1], building_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()

两类玩家对对治疗加速券消耗都很小,对通用加速券的消耗差异较大,其他三种加速券消耗差别不大。通过体验游戏了解到加速券的使用,直接影响游戏进程的加快,因此高氪玩家更希望通过加快游戏进程增加游戏体验。
#消费玩家在线时长情况
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()

#可视化
online_time.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家在线情况')
plt.show()

#消费玩家pvp情况
#PvP(player versus player),指玩家对战玩家,即玩家互相利用游戏资源攻击而形成的互动竞技。
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

#可视化
PVP.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家pvp情况')
plt.show()

#消费玩家pve情况
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

#可视化
PVE.plot(kind = 'bar', figsize=(10,8))
plt.title('玩家pve情况')
plt.show()
20211212151715201-1220493157.png)
高消费玩家更愿意投入时间在这款游戏上,它们热衷于pvp玩法,在pve的局数上也多于低消费玩家
分析结论:
1.该游戏具有较大的用户基数,且新用户注册受游戏活动、游戏推广力度等因素影响较大。
2.该游戏的ARPU为8.55,说明该游戏的盈利能力较高。
3.对于游戏付费情况,两极分化情况十分严重,绝大多数玩家处于10级以内,且付费情况较差,而少数玩家在10级以上,且付费能力强(13级的用户付费转化率接近100%).因此对于如何让大多数玩家平滑过渡到10级,非常的重要。
4.消费习惯上,高消费玩家对象牙和通用加速券的需求远多于一般玩家。
5.在玩家行为上,高消费玩家投入游戏时间更多,它们更热衷于pvp玩法。
本次项目在黑马程序员李键老师指导下完成。
数据 tap_fun_train.csv获取方式:tap_fun_train.csv

浙公网安备 33010602011771号