利用python进行《野蛮时代》游戏数据分析

数据来源:游戏玩家付费金额预测大赛

数据包含近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:消费次数

分析思路:用户注册时间分布情况?

                    用户的付费情况(付费率,ARPU,ARPPU)?

                    各等级用户的付费情况?

                    用户的消费习惯?

                    可视化数据

分析过程:

①导入数据

import numpy as np

import pandas as pd

from pandas import read_csv

from sklearn.cluster import KMeans

import matplotlib.pyplotas plt

import pylab as pl

from matplotlib.font_managerimport FontManager, FontProperties

pd.set_option('display.max_columns',None)

#为了数据安全,copy一份数据

df=df0

#检查是否有空值

print(df.isnull().any().any())

#观察数据构成

print(df.head())


②清洗数据

#以user_id为维度,删除重复数据,并查看用户总数

df=df.drop_duplicates(subset='user_id')

print('用户总数:',len(df['user_id']))

→用户总数:2288007


③计算用户注册时间分布

#首先将注册时间精确到天

register_date=[]

for i in df['register_time']:

    date=i[5:10]

    register_date.append(date)

df['register_time']=register_date

#计算每天的注册人数

df_register=df.groupby('register_time').size()

df_register.columns=['日期','注册人数']

print(df_register)

(可视化)

plt.plot(df_register)

plt.grid(True)

pl.xticks(rotation=90)

font=FontProperties(fname='/System/Library/Fonts/PingFang.ttc')

plt.title('用户注册分布图',fontproperties=font)

plt.show()

△可以看出,用户注册数在2月19日有一次的大的高峰,其他时间也分别有几次小高峰,且高峰的持续时间很短,可以推测是因为游戏推出一些奖励活动或公司对游戏的推广取得了效果进而使注册用户激增。


④用户的付费情况(付费率,ARPU,ARPPU)

#付费率(付费人数/活跃人数)

df_pay_user=df[(df['pay_price']>0)]

pay_rate=df_pay_user['user_id'].count()/df_active_user['user_id'].count()

print('付费率:%.2f'%(pay_rate))

#ARPU(总付费金额/活跃人数)

arpu=df_pay_user['pay_price'].sum()/df_active_user['user_id'].count()

print('ARPU:%.2f'%(arpu))

#ARPPU(总付费金额/付费人数)

arppu=df_pay_user['pay_price'].sum()/df_pay_user['user_id'].count()

print('ARPPU:%.2f'%(arppu))

△目前盈利较好的手游的ARPU超过5元,一般手游在3~5元之间,盈利较差的低于3元,该游戏的ARPU为8.55元,说明盈利水平较高。


⑤不同等级用户的付费情况

df_user=df[['user_id','bd_stronghold_level','pay_price','pay_count']]

df_table=pd.pivot_table(df_user,index=['bd_stronghold_level'],

values=['user_id','pay_price','pay_count'],

aggfunc={'user_id':'count','pay_price':'sum','pay_count':'sum'})

df_stronghold_pay=pd.DataFrame(df_table.to_records())

#各等级付费人数

df_stronghold_pay['pay_num']=df_user[(df_user['pay_price']>0)].groupby('bd_stronghold_level').user_id.count()

#各等级付费转化率

df_stronghold_pay['pay_rate']=df_stronghold_pay['pay_num']/df_stronghold_pay['user_id']

#各等级平均付费金额

df_stronghold_pay['avg_pay_price']=df_stronghold_pay['pay_price']/df_stronghold_pay['user_id']

#各等级平均付费次数

df_stronghold_pay['avg_pay_count']=df_stronghold_pay['pay_count']/df_stronghold_pay['user_id']

#重命名列名

df_stronghold_pay.columns=['要塞等级','总付费次数','总付费金额','总人数',

'付费人数','付费转化率','人均付费金额','人均付费次数']

df_stronghold_pay=df_stronghold_pay[['要塞等级','总人数','付费人数','付费转化率',

'总付费金额','人均付费金额','总付费次数','人均付费次数']]

df_stronghold_pay=df_stronghold_pay.round(2)

print(df_stronghold_pay)

(可视化)

#要塞等级—付费转化率

x=df_stronghold_pay['要塞等级']

y=df_stronghold_pay['付费转化率']

plt.xticks(x,range(0,len(x),1))

plt.plot(x,y)

plt.grid(True)

plt.title('不同等级用户付费转化率',fontproperties=font)

plt.show()

#要塞等级-人均付费金额

x=df_stronghold_pay['要塞等级']

y=df_stronghold_pay['人均付费金额']

plt.xticks(x,range(0,len(x),1))

plt.plot(x,y)

plt.grid(True)

plt.title('不同等级用户人均付费jine',fontproperties=font)

plt.show()

x=df_stronghold_pay['要塞等级']

y=df_stronghold_pay['人均付费金额']

plt.xticks(x,range(0,len(x),1))

plt.plot(x,y)

plt.grid(True)

plt.title('不同等级用户人均付费jine',fontproperties=font)

plt.show()

#要塞等级-人均付费次数

x=df_stronghold_pay['要塞等级']

y=df_stronghold_pay['人均付费次数']

plt.xticks(x,range(0,len(x),1))

plt.plot(x,y)

plt.grid(True)

plt.title('不同等级用户人均付费次数',fontproperties=font)

plt.show()

△用户等级到达10级时,付费率接近60%,等级到达13级时,付费率接近100%,且人均付费金额和次数两项指标也在用户达到10级后增长迅速,因此可以认定10级以上用户为游戏的核心用户。

△但是观察用户等级分布,发现绝大部分用户还是处在10级以下的水平,因此如何使用户达到10级是游戏运营接下来需要考虑的事。


⑥不同玩家的消费习惯

该游戏充值主要可以获得道具类(木头、石头、象牙、肉、魔法)和加速券类(通用、建筑、科研、训练、医疗)。根据用户的充值金额大小,分别分析两类消费品的消耗情况。

#将等级>=10级的玩家划分为:消费>=500为高消费玩家,<500为普通玩家

df_eli_user=df[(df['pay_price']>=500)&(df['bd_stronghold_level']>=10)]

df_nor_user=df[(df['pay_price']<500)&(df['bd_stronghold_level']>10)]

#不同玩家的道具消耗情况

wood_avg=[df_eli_user['wood_reduce_value'].mean(),df_nor_user['wood_reduce_value'].mean()]

stone_avg=[df_eli_user['stone_reduce_value'].mean(),df_nor_user['stone_reduce_value'].mean()]

ivory_avg=[df_eli_user['ivory_reduce_value'].mean(),df_nor_user['ivory_reduce_value'].mean()]

meat_avg=[df_eli_user['meat_reduce_value'].mean(),df_nor_user['meat_reduce_value'].mean()]

magic_avg=[df_eli_user['magic_reduce_value'].mean(),df_nor_user['magic_reduce_value'].mean()]

props_data={'high_value_player':[wood_avg[0],stone_avg[0],ivory_avg[0],meat_avg[0],magic_avg[0]],

                        'normal_player':[wood_avg[1],stone_avg[1],ivory_avg[1],meat_avg[1],magic_avg[1]]}

df_props=pd.DataFrame(props_data,index=['wood','stone','ivory','meat','magic'])

df_props=df_props.round(2)

print(df_props)

#可视化

ax=df_props.plot(kind='bar',title='Props Reduce',

                grid=True,legend=True)

plt.show()

△普通玩家和高消费玩家对木头、石头、肉的消耗都较大,魔法的消耗都较小,而在象牙的消耗上,高消费玩家和普通玩家的消耗差距较大。

#不同玩家的加速券消耗情况

general_avg=[df_eli_user['general_acceleration_reduce_value'].mean(),

            df_nor_user['general_acceleration_reduce_value'].mean()]

building_avg=[df_eli_user['building_acceleration_reduce_value'].mean(),

              df_nor_user['building_acceleration_reduce_value'].mean()]

research_avg=[df_eli_user['reaserch_acceleration_reduce_value'].mean(),

              df_nor_user['reaserch_acceleration_reduce_value'].mean()]

training_avg=[df_eli_user['training_acceleration_reduce_value'].mean(),

              df_nor_user['training_acceleration_reduce_value'].mean()]

treatment_avg=[df_eli_user['treatment_acceleration_reduce_value'].mean(),

              df_nor_user['treatment_acceleration_reduce_value'].mean()]

acceleration_data={'high_value_player':[general_avg[0],building_avg[0],research_avg[0],

                          training_avg[0],treatment_avg[0]],

                  'normal_player':[general_avg[1],building_avg[1],research_avg[1],

                          training_avg[1],treatment_avg[1]]}

df_acceleration=pd.DataFrame(acceleration_data,index=['general','building','researching','training','treatment'])

print(df_acceleration.round(2))

#可视化

ax=df_acceleration.plot(kind='bar',title='Acceleration Reduce',

                grid=True,legend=True)

plt.show()

△两类玩家对对治疗加速券消耗都很小,对通用加速券的消耗差异较大,其他三种加速券消耗差别不大。

结论:1.该游戏具有较大的用户基数,且新用户注册受游戏活动、新版本等因素影响较大。

             2.该游戏的ARPU为8.55,说明该游戏的盈利能力较高。

             3.用户等级达到10级后,付费意愿明显上升,且达到13级时付费率将近100%。但是绝大多数用户仍然停留在10级以下,如何使用户平滑升至10级尤为重要。

             4.消费习惯上,高消费玩家对象牙和通用加速券的需求远多于一般玩家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,423评论 0 13
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,235评论 0 23
  • 实话生活 体悟人生 木风恒:怎么 那颗螺钉拧不出来了啊 兄弟:吃力啊 不好弄 太短了 又怕不小心给弄坏了 到时更难...
    木风恒阅读 179评论 0 1
  • 你远走高飞, 飞不过我的思恋, 我恨我痴心。 你恨心转身, 转不出我的情深, 我恨我痴心。 我爱的, 一直是你, ...
    筋工元素阅读 409评论 3 2
  • 走进军旅(散文诗) 是你走的时候了。带着小村的光荣与骄傲,带着十八岁军人的将军梦,你走了。沿着哥哥当年的应...
    天然水阅读 188评论 0 4