某策略游戏公测期运营情况分析报告-基于python

    技术2022-07-10  145

    某策略游戏测试阶段运营情况分析报告-基于python

    背景了解数据字段含义加载必要的库读取数据查看数据类型和数据结构统计缺失值删除重复数据 游戏总体情况注册人数变化活跃用户数变化活跃用户比例及付费意愿 玩家行为分析用户活跃情况道具偏好情况 游戏收入分析人均收入情况各时期用户付费情况玩家不同等级收入差异累计收入金额情况 鲸鱼&海豚用户分析对鲸鱼&海豚用户打标签在线时长差异道具消耗差异对战偏好差异鲸鱼用户等级分布 其他代码补充总结

    背景

    数据集来源于tap4fun公司在DC竞赛网站发布的一组《野蛮时代》游戏测试数据,数据为20180126-20180306期间用户在七日内产生的各项数据

    根据数据集内容,本次报告主要从用户增长、行为情况,游戏收入水平等方面综合分析游戏在测试阶段的运营表现

    了解数据

    字段含义

    除prediction_pay_price外,其余字段时间均为从用户注册一直到满七天的数据累计内容,即时间有效性为七天

    加载必要的库

    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_path = r'tap_fun_train.csv' data = pd.read_csv(data_path) data.columns.to_list()

    查看数据类型和数据结构

    #查看数据集大小 data.shape

    (2288007, 109)

    #选取需要的数据列 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()

    user_id和register_time应分别为字符型和日期型数据,需转化数据类型

    #数据格式类型转化 df['user_id'] = df['user_id'].astype('str') df['register_time'] = pd.to_datetime(df['register_time']).dt.date

    统计缺失值

    #查看空值情况 df.isnull().sum()

    数据集比较完整,无缺失值现象

    删除重复数据

    因为数据为七日玩家的基本游戏数据,这边根据玩家user_id进行去重

    #删除重复数据集 df.drop_duplicates(subset='user_id',inplace=True)

    游戏总体情况

    注册人数变化

    #游戏总体情况分析 #注册用户数情况,时间1月26到3月6号之间 #日新增注册用户数量变化 fig= plt.figure(figsize=(16,6)) fig.add_subplot(1,2,1) plt.plot(df.groupby('register_time').user_id.count()) plt.title('日新增注册用户数量变化') #累计新增注册用户数量变化 fig.add_subplot(1,2,2) plt.plot((df.groupby('register_time').user_id.count()).cumsum()) plt.title('日新增注册用户数量变化')

    数据显示,活动期间玩家注册人数一直保持良好增长,截止3月6号,累计注册用户数大228W+,预测后续还将保持良好增长

    活跃用户数变化

    #活跃用户变化 #活跃用户定义为在线时长大于平均在线时长的用户 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('日新增活跃用户数量变化')

    全部用户中活跃用户占比13.7%,付费用户占比1.8%,玩家总体付费倾向与市场平均水平持平,但活跃用户中付费用户占比超10%,付费意愿较高

    活跃用户比例及付费意愿

    #活跃用户数占比 df_acvtive = df.loc[df['avg_online_minutes']>=avg_online,'user_id'].count() df_nonactive = df.loc[df['avg_online_minutes'] < avg_online,'user_id'].count() fig= plt.figure(figsize=(12,6)) fig.add_subplot(1,2,1) plt.pie([df_acvtive,df_nonactive],labels=['活跃用户','一般用户'],autopct='%1.1f%%') #付费用户占比 df_pay = df.loc[df['pay_price']>0,'user_id'].count() df_nopay = df.loc[df['pay_price']==0,'user_id'].count() fig.add_subplot(1,2,2) plt.pie([df_pay,df_nopay],labels=['付费用户','一般用户'],autopct='%1.1f%%')

    活跃用户定义为活跃时长超过所有用户的平均活跃时长,其中活跃用户占比13.7%,付费用户占比1.8%

    #查看活跃用户中付费用户所占的比例 df[(df['pay_price']>0) & (df['avg_online_minutes']>=avg_online)].user_id.count()/df[df['avg_online_minutes']>=avg_online].user_id.count()

    活跃用户中付费用户比例达12.17,该类用户整体付费意愿较强

    玩家行为分析

    #根据平均时长和玩家等级初步建立AARRR漏斗转化模型 #玩家付费意愿较高,但留存率较低,使用AARRR模型探究是哪一环节的转化率低 avg_online=df['avg_online_minutes'].mean() #1、从安装到注册后的转化率,下载游戏后如果用户在线时长为0,则表示用户没有在游戏内有过探索 rate1 = df.loc[df['avg_online_minutes']!=0,'user_id'].count()/df['user_id'].count() #2、从注册到创角后的转化率,游戏下载后会有一段引导视频,当引导视频结束,角色创立,角色等级为1,故而等级为0的是在这一过程中损失的用户 rate2 = df.loc[df['bd_stronghold_level']>=1,'user_id'].count()/df['user_id'].count() #3、从创角到成为活跃用户的转化率 rate3 = df.loc[df['avg_online_minutes']>=avg_online,'user_id'].count()/df['user_id'].count() #4、从活跃用户到付费用户的转化率 rate4 = df.loc[df['pay_price']>0,'user_id'].count()/df['user_id'].count() print(rate1,rate2,rate3,rate4)

    out:0.9812697251363305 0.5889671666214308 0.13684748342116085 0.018111395638212645 通过转化漏斗,最终付费转化率为1.8%,相对来说损失率最高的为从安装到创角、和用户激活到活跃的过程,虽然活跃用户付费率较高,但留存率较低。

    用户活跃情况

    #从用户活跃时长方面进一步验证 %matplotlib auto plt.hist(df['avg_online_minutes'],bins=[0,3,6,9,12,15,18,21,24,27,30]) plt.xlabel('平均在线时长') plt.ylabel('玩家人数') plt.title('用户平均在线时长分布图')

    data = pd.cut(df['avg_online_minutes'],bins=[0,3,6,9,12,15,18,21,24,27,30]).value_counts()

    全部用户平均活跃时长为10.2分钟,其中已留存用户平均活跃时长为15min,七日平均活跃时长不超过3min的用户占比超过60%,说明游戏总体用户参与度不高,持续游戏能力不强,在新手引导优化方面需要引起重视

    道具偏好情况

    #道具类消耗 #资源类消耗 source = ['meat_reduce_value','wood_reduce_value','stone_reduce_value','ivory_reduce_value','magic_reduce_value'] df3 = df[source] #加速类消耗 acceleration = ['general_acceleration_reduce_value','building_acceleration_reduce_value','reaserch_acceleration_reduce_value','training_acceleration_reduce_value','treatment_acceleration_reduce_value'] df4 = df[acceleration] #士兵类消耗 infantry = ['infantry_add_value','infantry_reduce_value','wound_infantry_reduce_value', 'wound_infantry_add_value'] df5 = df[infantry]

    从道具消耗角度来说,主要分为资源、加速,其中资源类道具消耗量远大于加速类道具

    在资源类道具当中,肉、木材消耗深受喜爱,占比约80%

    加速类道具中通用加速和建筑加速使用更为广泛,同时治疗加速消耗几乎无人使用,游戏设计时可适时增加使用治疗道具方面的引导

    游戏收入分析

    人均收入情况

    #ARPU和ARPPU(七日),时间窗口为一周,针对活跃用户进行的计算 #计算ARPU值 ARPU_seven = df['pay_price'].sum()/df.loc[df['avg_online_minutes']>=avg_online,'user_id'].count() ARPU_45 = df['prediction_pay_price'].sum()/df.loc[df['avg_online_minutes']>=avg_online,'user_id'].count() #计算ARPPU值 ARPPU = df['pay_price'].sum()/(df['pay_price']>0).sum() ARPPU_45 = df['prediction_pay_price'].sum()/(df['prediction_pay_price']>0).sum() print(ARPU_seven,ARPU_45) print(ARPPU,ARPPU_45)

    3.90704376764567 13.103242683035893 29.52114336735926 89.21305797164483 根据目前较好的手游每日ARPU超过5元;一般的手游ARPU在3~5元之间(每日);鉴于本ARPU值计算的时间窗口为7天,运营初期用户平均收入偏低

    各时期用户付费情况

    #付费转化率随时间的变化 df_active = df[df['avg_online_minutes'] > avg_online] data1 = df_active.groupby('register_time')['user_id'].count().to_frame().reset_index() data1.columns = ['register_time','active_num'] data2 = df_active[df_active['pay_price']>0].groupby('register_time')['user_id'].count().to_frame().reset_index() data2.columns = ['register_time','pay_num'] data3 = pd.merge(data1,data2,on='register_time',how='inner') data3['pay_rate'] = data3['pay_num']/data3['active_num'] #收入随注册时间的变化 data4=df[df['pay_price']>0].groupby('register_time')['pay_price'].sum() data4

    活跃用户中付费转化率和付费总收入整体为走低的趋势,可以看到注册时间越早的用户,付费人数和比例、总付费收入同期占比更高,这批用户应是对游戏报有更多关注,对游戏喜爱的用户,运营初期可从这部分客户身上调研,从用户角度做游戏设计上的优化等

    玩家不同等级收入差异

    #付费等级和收入之间的关系 data4 = df.groupby('bd_stronghold_level')['pay_price'].sum() data5 = df.groupby('bd_stronghold_level')['user_id'].count() #导出后在excel中作图

    不同游戏等级总收入和人数分布,可以看出游戏等级为15级以上的基本为鲸鱼用户(总收入多,人数少),普通付费玩家多集中在9-11级

    累计收入金额情况

    #用户累计贡献金额百分比 user_amount= df['pay_price'].sort_values().reset_index().cumsum() user_amount.columns = ['index','amount_cumsum'] amount_total=user_amount.amount_cumsum.max() user_amount['prop'] = user_amount.amount_cumsum.apply(lambda x:x/amount_total) plt.plot(user_amount.prop ) plt.title('用户累计贡献金额百分比') plt.xlabel('人数') plt.ylabel('百分数')

    1%用户创造了超过80%的收入,小鱼用户太多,需针对用户群体进行深度分析,保证付费质量和规模

    鲸鱼&海豚用户分析

    鲸鱼用户玩家创造了游戏的大部分收入,那么这部分玩家有什么行为特征呢? 因为此案例中小鱼用户太多,这边仅选取海豚用户与鲸鱼用户进行比较,将更能反应出不同层次玩家的差异和偏好情况

    对鲸鱼&海豚用户打标签

    #1、根据数据集情况,鲸鱼玩家的用户占比,按照总收入占比,总收入在0-1%的为小鱼用户,10%-20%的海豚用户,20%-80%的鲸鱼用户 df1 = df[['user_id','pay_price']] df1['amount_cumsum'] = df['pay_price'].sort_values().cumsum() df1['prop'] = df1['amount_cumsum'] /df1['amount_cumsum'].max() df1['labels'] = df1['prop'].apply(lambda x:'鲸鱼用户' if x>=0.8 else '海豚用户' if x>=0.01 else '小鱼用户') #鲸鱼用户占比 df1['labels'].value_counts() #三类用户占比差距

    小鱼用户 2258924 海豚用户 28994 鲸鱼用户 89 Name: labels, dtype: int64 三类用户数量悬殊

    #研究鲸鱼、海豚用户的行为差异 user_whaley = user_kind[user_kind['labels'] =='鲸鱼用户'] user_dop = user_kind[user_kind['labels'] == '海豚用户']

    在线时长差异

    #在线时长和活跃用户比例 fig= plt.figure(figsize=(16,6)) fig.add_subplot(1,2,1) plt.boxplot(user_whaley['avg_online_minutes']) fig.add_subplot(1,2,2) plt.boxplot(user_dop['avg_online_minutes']) #鲸鱼用户在线时长分布比较均匀,在100-900之间分布,平均值约为420min,而海豚用户在线时长分布异常值较多,平均在线时长不到100min

    鲸鱼用户在线时长分布比较均匀,在100-900之间分布,平均值约为453min,而海豚用户在线时长分布异常值较多,平均在线时长不到100min,这部分群体仍待刺激,以延长用户在线时长

    道具消耗差异

    #研究鲸鱼、海豚用户表现 #观察道具消耗情况 #加速类道具消耗数量 fig= plt.figure(figsize=(10.,6)) fig.add_subplot(1,2,1) acceleration = ['general_acceleration_reduce_value','building_acceleration_reduce_value','reaserch_acceleration_reduce_value','training_acceleration_reduce_value','treatment_acceleration_reduce_value'] plt.pie(user_whaley[acceleration].mean(),labels=acceleration,autopct='%1.1f%%') plt.title('鲸鱼用户加速类道具消耗数量') fig.add_subplot(1,2,2) plt.pie(user_dop[acceleration].mean(),labels=acceleration,autopct='%1.1f%%') plt.title('海豚用户加速类道具消耗数量') #鲸鱼类用户偏爱训练和科研类加速道具,海豚类用户建筑类加速道具会更多,两者治疗类道具消耗都是最小的 #资源获取类道具消耗数量 fig= plt.figure(figsize=(10.,6)) fig.add_subplot(1,2,1) acceleration1 = ['meat_reduce_value','wood_reduce_value','stone_reduce_value','ivory_reduce_value','magic_reduce_value'] plt.pie(user_whaley[acceleration1].mean(),labels=acceleration1,autopct='%1.1f%%') plt.title('鲸鱼用户资源类道具消耗数量') fig.add_subplot(1,2,2) plt.pie(user_dop[acceleration1].mean(),labels=acceleration1,autopct='%1.1f%%') plt.title('海豚用户资源类道具消耗数量') #总的来说没有特别明显的差异,肉类,木材,石头消耗数量占据多数 #勇士类数量指标,不算是道具类,主要反映的玩家在游戏中的概况 fig= plt.figure(figsize=(10.,6)) fig.add_subplot(1,2,1) acceleration2 = ['infantry_add_value','infantry_reduce_value','wound_infantry_add_value','wound_infantry_reduce_value'] plt.pie(user_whaley[acceleration2].mean(),labels=acceleration2,autopct='%1.1f%%') plt.title('鲸鱼勇士情况占比') fig.add_subplot(1,2,2) plt.pie(user_dop[acceleration2].mean(),labels=acceleration2,autopct='%1.1f%%') plt.title('海豚用户勇士情况占比') #相对之下,鲸鱼用户更偏向于招募勇士数量,相对之下勇士损失数量和伤兵产生数量的比例更大,伤兵恢复数量比例更小

    小结: 道具上,鲸鱼用户更偏向于象牙,石头等资源类道具,加速类道具中,训练加速偏好明显

    勇士情况中,勇士招募偏好明显,可能由于道具使用,勇士损失量相对较小,但勇士伤兵恢复比例较低

    加速类道具中,治疗加速几乎无人使用,需加强引导使用

    对战偏好差异

    注:pvp对人人对战,pve为人机对战

    #pvp和pve的偏好 user_dop[['pvp_battle_count','pve_battle_count']].mean() user_whaley[['pvp_battle_count','pve_battle_count']].mean() #pvp和pve胜率差别 (user_dop['pvp_win_count']/user_dop['pvp_battle_count']).mean() (user_whaley['pvp_win_count']/user_whaley['pvp_battle_count']).mean() (user_dop['pve_win_count']/user_dop['pve_battle_count']).mean() (user_whaley['pve_win_count']/user_whaley['pve_battle_count']).mean()

    从游戏场数来看鲸鱼用户的pvp和pve场数都很高,相对来说,鲸鱼用户pvp的比例更高,海豚用户更多偏好pve

    鲸鱼用户的pvp胜率远高海豚用户,高氪金玩家在游戏中可获得相当明显的优势,战斗不平衡性明显

    鲸鱼用户等级分布

    #鲸鱼玩家的用户等级 user_whaley['bd_stronghold_level'].value_counts()

    基本都在15级以上,可以看得出在初期阶段,等级普遍偏低,对于在线时长短,等级低的鲸鱼用户的价值可待进一步挖掘

    其他代码补充

    #付费人数随注册时间的变化 df[df['pay_price']>0].groupby('register_time')['user_id'].count() #注册日期和收入之间变化 plt.plot(df.groupby('register_time')['pay_price'].sum())

    总结

    游戏人气不断上升中,累计注册用户不断攀升,新注册用户稳步增长;0219-0220春节活动期间虽拉来不少新注册用户,但用户整体付费率低,付费收入增加不明显,需进一步确认活动的效果,是否存在刷量,渠道投放上是否还有优化空间根据七日数据,已活跃用户总体付费意愿较强,但新用户的活跃和留存情况不是很理想,总体付费率一般,ARPU值偏低,完善新手引导机制,促进用户转化活跃,运营上还有很长的一段路要走游戏设计优化上建议从注册时间较早的用户身上进行调研,结合不同分层用户各类道具的使用偏好,进一步优化关卡设计,道具定价等鲸鱼用户在运营初期创造了游戏近90%的营收,加强对鲸鱼用户的管理,进一步挖掘鲸鱼用户价值,并继续提升海豚和小鱼用户的活跃性,促进用户留存,增强自传播过程
    Processed: 0.011, SQL: 9