新闻中心
游戏数据分析(python)
1、项目分析
1.1 项目背景
《野蛮时代》(Brutal Age)是一款风靡全球的SLG类型手机游戏。根据App Annie统计,此款游戏在12个国家取得游戏畅销榜第1,在82个国家取得游戏畅销榜前10。准确了解每个玩家的价值,对游戏的广告投放策略和高效的运营活动(如精准的促销活动和礼包推荐)具有重要意义,有助于给玩家带来更个性化的体验。因此,我们希望能在玩家进入游戏的前期就对于他们的价值进行准确的估算,以便让玩家有更好的游戏体验。
1.2 分析目标
为了了解当前游戏的运营情况,对游戏从以下四个方面进行分析
1.总体分析:从玩家数量、付费玩家占比、每日新增玩家数
2.玩家活跃度分析:从不同用户在线时长、分布特征展开分析
3.玩家付费情况分析:从PUR,ARPPU、ARPU等关键指标进行分析
4.玩家游戏习惯分析:从不同玩家的PVP、PVE这两个指标得出的情况v展开分析
1.3 思维导图
2、数据预处理
2.1 数据读取
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rc(font, family=SimHei, size=18)# 显示中文标签 plt.style.use (ggplot)#设定绘图风格 data=pd.read_csv(D:\\数据分析\\游戏玩家数据集\\tap_fun_train.csv) data.columns.to_list()data.shape2.2选取所需数据列
item = [user_id,register_time,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,pvp_win_count,pve_battle_count,pve_win_count,avg_online_minutes,pay_price,pay_count,prediction_pay_price,infantry_add_value,infantry_reduce_value,wound_infantry_add_value,wound_infantry_reduce_value] df = data.loc[:,item] df.info()2.3 数据格式类型转化
df[user_id]= df[user_id].astype(str) df[register_time]=pd.to_datetime(df[register_time]).dt.date df[day] = df[register_time].apply(lambda x : x.strftime(%Y%m%d)) df.head()2.4空值判断
df.isnull().sum()2.5删除重复数据集
df.drop_duplicates(subset=user_id,inplace=True)3、新增玩家分析
3.1新增用户数
day_grow_num = data.groupby(register_time).agg({user_id:count}).reset_index().rename(columns={user_id:grow_num}) day_grow_numfig= plt.figure(figsize=(16,6)) fig.add_subplot(1,2,1) plt.plot(df.groupby(register_time).user_id.count()) plt.title(一周内新增注册用户数量变化)fig=plt.figure(figsize=(16,6)) fig.add_subplot(1,2,2) plt.plot((df.groupby(register_time).user_id.count()).cumsum()) plt.title(累计用户人数)数据显示,活动期间玩家注册人数一直保持良好增长,截止3月6号,累计注册用户数大228W+,预测后续还将保持良好增长。
3.2 新增活跃用户数
avg_online = df[avg_online_minutes].mean() plt.plot(df.loc[df[avg_online_minutes]>=avg_online,:].groupby(register_time).user_id.count()) plt.title(一周内新增活跃用户数量变化)以上可以看出,一开始活跃用户整体数值在140,后续跌倒了20左右,然后又上升到了100,可能活动一开始对玩家吸引力比较大,后续慢慢的就失去兴趣了,期间上升推测可能有活动,促使活跃用户上升。
avg_time = train.avg_online_minutes.mean() avg_time输出值为9.7paying_avg_time=train[train.pay_price>0].avg_online_minutes.mean() paying_avg_time输出值为135.4明显可以看出,付费玩家的平均在线时长要远远大于全体玩家的平均值,活跃度比他们高得多。
plt.hist(train[avg_online_minutes],bins=[0,3,6,9,12,15,18,21,24,27,30]) plt.xlabel(平均在线时长) plt.ylabel(玩家人数) plt.title(用户平均在线时长分布图)3.3 新增付费玩家
paying_num = data[data[pay_price]>0] paying_grow_num = paying_num.groupby(register_time).agg({user_id:count}).reset_index().rename(columns={user_id:grow_num}) paying_grow_num4、玩家付费情况
4.1 付费玩家数量及占比
paying_num = data[data[pay_price]>0] paying_grow_num = paying_num.groupby(register_time).agg({user_id:count}).reset_index().rename(columns={user_id:grow_num}) paying_grow_num#新增玩家数 total_num=day_grow_num.grow_num.sum() total_num输出值为22880#新增付费玩家 paying_num=paying_grow_num.grow_num.sum() paying_num输出值为373plt.figure(figsize=(8,8)) # 绘图 patches,l_text,p_text = plt.pie([total_num-paying_num,paying_num], labels=[未付费,付费], labeldistance = 0.3, colors=[#87CEFA,#FFC0CB], explode=[0.01,0.05], autopct=%1.1f%%, pctdistance=1.15) # 设置标签大小 for t in l_text: t.set_size(20) # 设置百分数字体大小 for t in p_text: t.set_size(20) plt.show()4.2玩家消费金额分类
根据玩家充值金额,可将玩家进行分类
普通用户:pay_price=0
虾米用户:0<pay_price<1
海豚用户:1<pay_price<15
鲸鱼用户:pay_price>=15
price=df[pay_price] bins=[-1,0.1,1,14.9,10000] labels = [普通,虾米,海豚,鲸鱼] df[ret] = pd.cut(price,bins,labels=labels) s2 = df.groupby(ret).pay_price.sum().reset_index() s2[pay_price]s1 = df.groupby(ret).user_id.count().reset_index() s1[user_id]定义饼图随机颜色
def random_colors(number): elem = 0123456789abcdef colors=[] for i in range(number): colors.append(#+.join(np.random.choice(list(elem),6))) return colors vals1 = s1[user_id].tolist() vals2 = s2[pay_price].round(0).tolist() fig, ax = plt.subplots(figsize=(10,10)) labels = 普通, 虾米, 海豚, 鲸鱼 ax.pie(vals1, radius=1.2,autopct=%1.1f%%,pctdistance=0.9,colors=color2,textprops={fontsize:14,color:black}) ax.pie(vals2, radius=1,autopct=%1.2f%%,pctdistance=0.5,colors=color2,explode = [0, 0.75, 0, 0],textprops={fontsize:16,color:black}) ax.set(aspect="equal", title=玩家人群数量与消费金额) plt.legend(labels,bbox_to_anchor=(1.05, 1), loc=best, borderaxespad=1,fontsize=15) plt.show()普通玩家占98.4%; 占活跃玩家0.6%的虾米玩家(133人)贡献了1%的消费金额(131元) 占活跃玩家0.6%的海豚玩家(146人)贡献了6.7%的消费金额(799元) 占活跃玩家0.4%的鲸鱼玩家(94人)贡献了92%的消费金额(16397.86元)
4.3 玩家消费关键指标
AU:活跃用户,统计周期内,登录过游戏的用户数 。
PU:付费用户
APA:活跃付费用户数。
ARPU::平均每用户收入,即可通过 总收入/AU 计算得出。
ARPPU:: 平均每付费用户收入,可通过总收入/APA 计算得出。
PUR::付费比率,可通过 APA/AU 计算得出。
AU=df[df.avg_online_minutes>=15].user_id.count() #平均在线时长>=15分钟定义为活跃用户 ARPU = total_revenue/AU # 平均每个活跃用户收入 APA=df[(df.avg_online_minutes>=15)&(df.pay_price>0)].user_id.count()# 活跃付费用户数 total_revenue=df.pay_price.sum() #总收入 ARPPU = total_revenue/APA # 平均付费玩家收入 PUR = APA/AU # 付费率 print(fAU:{AU}) print(ftotal_revenue:{total_revenue}) print(fARPU:{ARPU}) print(fAPA:{APA}) print(fARPPU:{ARPPU}) print(fPUR:{PUR})fig,ax = plt.subplots(1,2,figsize=(15,10)) ax1,ax2 = ax.flatten() ax1.bar([AU,APA],[AU,APA],width=0,alpha=0.5) ax1.set_ylabel(活跃人数,size=20) ax2.bar([ARPU,ARPPU],[ARPU,ARPPU],width=0.5,color=r,alpha=0.5) ax2.set_ylabel(消费金额,size=20) plt.show()该游戏的人均付费率ARPU很低,说明游戏收入表现较差,但是平均每个付费用户的ARPPU很高,是ARPU的6倍多,针对这一点,我们可以开发更多的针对鲸鱼用户(投入大量资金)和海豚用户(花费中等数额)的玩法,然后随着等级上升,享受的资源越发多,且有专门的客服极速处理此类用户需求。 而对于虾米用户(小RMB玩家)付费率偏低,我们可以开展首冲活动,让用户充值少量的钱,开始逐渐引导式付费,例如充值6元获得限量礼包。而随着付费率高,就可以更多的获得渠道商的青睐。
5、玩家游戏体验分析
5.1 AU用户pvp情况
AU_pvp_battle_coun = data[data.avg_online_minutes>=15].pvp_battle_count.mean() #AU用户平均pvp次数 AU_count_pvp = data[data.avg_online_minutes>=15].pvp_battle_count.sum() #AU用户pvp总次数 AU_count_lanch_pvp = data[data.avg_online_minutes>=15].pvp_lanch_count.sum() #AU用户主动发起PVP次数 AU_rate_lanch_pvp = AU_count_lanch_pvp/AU_count_pvp #Au发起pvp概率 AU_num_win_pvp = data[data.avg_online_minutes>=15].pvp_win_count.sum() #au用户pvp的胜率 AU_rate_win_pvp = AU_num_win_pvp/AU_count_pvp #Au发起pvp胜率 print(f活跃用户平均PVP次数:{AU_pvp_battle_coun}) print(f活跃用户主动发起PVP概率:{AU_rate_lanch_pvp}) print(f活跃用户PVP胜利概率:{AU_rate_win_pvp})5.2 APA用户pve情况
APA_pve_battle_coun = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pve_battle_count.mean() # 付费用护pve总次数 APA_count_pve = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pve_battle_count.sum() # 付费用护pvp发起次数 APA_count_lanch_pve = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pve_lanch_count.sum() # 付费用户主动发起PVe概率 APA_rate_lanc_pve = APA_count_lanch_pve/APA_count_pve # 付费用户PVe胜利总次数 APA_num_win_pve = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pve_win_count.sum() # 付费用户PVe胜利概率 APA_rate_win_pve = APA_num_win_pve/APA_count_pve print(f付费用户平均PVE次数:{APA_pve_battle_coun}) print(f付费用户主动发起PVE概率:{APA_rate_lanc_pve}) print(f付费用户PVE胜利概率:{APA_rate_win_pve})5.3 APA用户pvp情况
# 付费用户平均PVP次数 APA_pvp_battle_coun = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pvp_battle_count.mean() # 付费用护pvp总次数 APA_count_pvp = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pvp_battle_count.sum() # 付费用护pvp发起次数 APA_count_lanch_pvp = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pvp_lanch_count.sum() # 付费用户主动发起PVP概率 APA_rate_lanc_pvp = APA_count_lanch_pvp/APA_count_pvp # 付费用户PVP胜利总次数 APA_num_win_pvp = data[(data.avg_online_minutes>=15) & (data.pay_price>0)].pvp_win_count.sum() # 付费用户PVP胜利概率 APA_rate_win_pvp = APA_num_win_pvp/APA_count_pvp print(f付费用户平均PVP次数:{APA_pvp_battle_coun}) print(f付费用户主动发起PVP概率:{APA_rate_lanc_pvp}) print(f付费用户PVP胜利概率:{APA_rate_win_pvp})5.4 AU用户pve情况
# 活跃用户平均PVP次数 AU_pve_battle_coun = data[data.avg_online_minutes>=15].pve_battle_count.mean() # 活跃用护pvp总次数 AU_count_pve = data[data.avg_online_minutes>=15].pve_battle_count.sum() # 活跃用护pvp发起次数 AU_count_lanch_pve = data[data.avg_online_minutes>=15].pve_lanch_count.sum() # 活跃用户主动发起PVP概率 AU_rate_lanch_pve = AU_count_lanch_pve/AU_count_pve # 活跃用户PVP胜利总次数 AU_num_win_pve = data[data.avg_online_minutes>=15].pve_win_count.sum() # 活跃用户PVP胜利概率 AU_rate_win_pve = AU_num_win_pve/AU_count_pve print(f活跃用户平均PVP次数:{AU_pve_battle_coun}) print(f活跃用户主动发起PVP概率:{AU_rate_lanch_pve}) print(f活跃用户PVP胜利概率:{AU_rate_win_pve})5.5 AU/APA战斗可视化展示
plt.figure(figsize=(15,8)) # AU玩家 plt.bar([0.75,2.75,4.75,6.75],[AU_rate_lanch_pve,AU_rate_win_pve,AU_rate_lanch_pvp,AU_rate_win_pvp],width=0.5,alpha=0.5,label=AU玩家) plt.bar([1.25,3.25,5.25,7.25],[APA_rate_lanc_pve,APA_rate_win_pve,APA_rate_lanc_pvp,APA_rate_win_pvp],width=0.5,color=r,alpha=0.5,label=APA玩家) plt.xticks([1,3,5,7],[主动发起PVE的概率,PVE获胜概率,主动发起PVP的概率,PVP获胜概率]) plt.legend() plt.show()在PVE活动中,APA玩家发起进攻的概率和胜利的概率与AU玩家基本持平;另外游戏的PVE难度不高,玩家的PVE胜率为90%,可以开展多种PVE的挑战难度。 在PVP活动中,APA玩家主动发起挑战的概率明显高于AU玩家,并且在对战中获胜的概率更高。
6、结论与建议
6.1 新增玩家分析
1)在新注册用户里只有13.9%的活跃用户,而付费用户仅占1.6%,占比比较小,应该提高用户的活跃度,推荐开服七日内打卡签到领福利等活动。
2)每日新增玩家在2/15-2/22新增玩家有一次大高峰增长;新增付费用户数在2/15-2/22号达到顶峰,但是后续也是持续下降;说明在这次活动过后,玩家的新增数量没有显著提升,可见活动对于提升游戏的人气帮助不大;活动仍然还需要持续一定的时间,让玩家充分了解游戏。;
3)付费用户中75%的用户平均使用时长超过31分钟,说明付费用户更愿意投入时间在这款游戏中。
6.2玩家付费情况分析
1)付费率PUR比较低,约17%,还有进一步的提高空间,可以开展相关活动提高付费率,从而提高渠道商青睐,如开展首冲礼包活动。
2)目前较好的手游每日ARPU超过五元;一般的手游在3-5元之间;低于3元说明表现较差。该手游的ARPU为5.44,表现良好;
3)该手游的ARPPU为32.62,说明付费用户整体的消费能力强,后续可以对付费用户进一步分析,已保证它们的持续付费;
6.3 玩家游戏习惯分析
1)APA玩家的平均PVE次数和PVP次数都是AU玩家的两倍左右,APA玩家更愿意花时间在这个游戏上;
2)在PVP对战中,APA玩家的获胜还率远超于AU玩家,说明我们的游戏道具可以让APA享受到对战的获胜的乐趣;
3)PVE的获胜概率均超过90%,建议后续可以关注是否需要出一些挑战难度大一些的PVE对战。