游戏数据分析报告

数据来源:DC游戏玩家付费金额预测大赛
数据包含近229万条记录和109个字段。
比赛任务是用前7天数据预测前45天付费金额,
本篇博客主要关注在数据探索分析。

一些重要字段:

bd_stronghold_level:要塞等级,相当于游戏账号等级
register_time: 注册时间
pay_price: 付费金额
avg_online_minutes: 在线时长
pvp_battle_count: 人人对战次数
pvp_win_count: 人人对战胜利次数
pve_battle_count: 人机对战次数
wood_reduce_value: 木头消耗量

本文主要从以下方面探索数据;


注册时间分布

部分代码

time = pd.DataFrame()
time['register_t']  =train_data['register_time'].map(lambda x:x[5:10])
data_plot = time.groupby('register_t').size() # 返回不同分组和每组数量
data_plot.columns = ['date', 'register_counts']
plt.subplots(figsize=(18, 6))
plt.plot(data_plot)
plt.grid(True)
plt.xticks(rotation=90)
plt.title('user register distribution')
plt.show()

数据时间跨度:2018年 (1-26 ~ 3-6)
在2月15号到2月22号之间有两个用户增长的小高潮
这个期间是2018年农历新年假期
运营方在游戏中开展了一系列活动,包括舞狮活动、酋长参战、跨服战、爆竹活动等,这些活动和春节效应叠加,带来了注册人数的增加,出现峰值

付费情况分析

定义活跃用户为: 前7天平均在线时长大于30min

activate_user = train_data[train_data['avg_online_minutes']>30]
#付费率(付费人数/活跃人数)    付费率
df_pay_user=train_data[(train_data['pay_price']>0)]
pay_rate=df_pay_user['user_id'].count()/activate_user.shape[0]
print('付费率:%.2f'%(pay_rate*100),'%')#ARPU(总付费金额/活跃人数)   人均付费金额
arpu=df_pay_user['pay_price'].sum()/activate_user.shape[0]
print('ARPU:%.2f'%(arpu))#ARPPU(总付费金额/付费人数) 付费用户人均付费金额
arppu=df_pay_user['pay_price'].sum()/df_pay_user['user_id'].count()
print('ARPPU:%.2f'%(arppu))

活跃用户总体付费率为29%, 人均付费金额为8.58元, 付费用户人均付费金额29.52元

付费率:29.06 %
ARPU:8.58
ARPPU:29.52

分布情况: 75%的人付费金额在20.98元以下, 50%的人充值金额在3.97元以下

pay_user = train_data[train_data['prediction_pay_price']!=0]
pay_user['prediction_pay_price'].describe()

count 45988.000000
mean 89.213058
std 617.702040
min 0.990000
25% 0.990000
50% 3.970000
75% 20.980000
max 32977.810000
Name: prediction_pay_price, dtype: float64

等级与付费关系

df_user=train_data[['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_people_num']=df_user[(train_data['pay_price']>0)].groupby('bd_stronghold_level').user_id.count()
#各等级付费转化率
df_stronghold_pay['pay_rate']=df_stronghold_pay['pay_people_num']/df_stronghold_pay['user_id']
#各等级平均付费金额
df_stronghold_pay['avg_pay_price']=df_stronghold_pay['pay_price']/df_stronghold_pay['user_id']
lt.figure(figsize=(16,4))
plt.subplot(131)
x=df_stronghold_pay['bd_stronghold_level']
y=df_stronghold_pay['pay_rate']
plt.xticks(x,range(0,len(x),1))
plt.plot(x,y)
plt.grid(False)
plt.xlabel('level')
plt.ylabel('pay rate')
plt.title('pay rate by level')

付费率在用户达到10级时显著提升, 付费金额付费次数也在10级后开始提升。

等级分布

small = df_stronghold_pay[df_stronghold_pay['bd_stronghold_level']<=7].user_id.sum()  #10级一下总用户数
mid = df_stronghold_pay[(df_stronghold_pay['bd_stronghold_level']>7) & (df_stronghold_pay['bd_stronghold_level']<=20)].user_id.sum()  #10-20级总用户数
large = df_stronghold_pay[df_stronghold_pay['bd_stronghold_level']>20].user_id.sum()
plt.subplots(figsize=(5, 5))
data_pie = [small, mid, large]
lables = ['junior', 'advanced', 'master']
explode = (0.2, 0, 0)
plt.pie(data_pie,labels = lables, explode = explode, shadow=True,colors = sns.color_palette('Blues', 3),autopct= '%1.4f%%',pctdistance = 0.5) # pctdistance 距离圆心距离
plt.title('user number distribution by level')
plt.show()

看用户等级分布图我们可以发现,绝大部分用户都处于7级以下
用户付费率等指标是从10级开始提升的,运营用户达到10级非常必要

春节营销活动效果探索

new_year  = train_data
new_year['register_t']  =new_year['register_time'].map(lambda x:x[5:10])
new_year_plan = new_year[(new_year['register_t']>='02-15') & (new_year['register_t']<='02-22')]
##在线时间对比
new_user_avgTime = new_year_plan['avg_online_minutes'].mean()
all_user_avgTime =  new_year['avg_online_minutes'].mean()#活跃用户比例对比(在线时长大于30的用户比例)
activate_user_newYear = new_year_plan[new_year_plan['avg_online_minutes']>=30]
newYear_activate_rate = activate_user_newYear.shape[0] / new_year_plan.shape[0]activate_user_all = new_year[new_year['avg_online_minutes']>=30]
activate_user_rate = activate_user_all.shape[0] / new_year.shape[0]

活动期间虽然日增用户数量高于总体, 但是活动拉新的用户活跃用户比率(平均在线大于30min)和付费用户比率,付费用户人均消费金额三项指标均低于总体水平。

游戏平衡度探索

muti_battel = new_year[(new_year['pvp_battle_count']>1) & (new_year['pve_battle_count']>1)]
muti_battel['win_rate'] = muti_battel['pvp_win_count'] / muti_battel['pvp_battle_count']
muti_battel['win_rate_pve'] = muti_battel['pve_win_count'] / muti_battel['pve_battle_count']pay = muti_battel[muti_battel['pay_price']>0]
pay_win_rate = pay['pvp_win_count'].sum()/pay['pvp_battle_count'].sum()unpay = muti_battel[muti_battel['pay_price']==0]
unpay_win_rate = unpay['pvp_win_count'].sum()/unpay['pvp_battle_count'].sum()
print(pay_win_rate, '\n',unpay_win_rate)

充值用户pvp对战胜率:73%

普通用户pvp对战胜率: 39%

pay_pve = muti_battel[muti_battel['pay_price']>0]
pay_win_rate_pve = pay['pve_win_count'].sum()/pay['pve_battle_count'].sum()
unpay_pve = muti_battel[muti_battel['pay_price']==0]
unpay_win_rate_pve = unpay['pve_win_count'].sum()/unpay['pve_battle_count'].sum()
print(pay_win_rate_pve, '\n',unpay_win_rate_pve

充值用户pve对战胜率:91%

普通用户pve对战胜率: 89%

x = muti_battel['pay_price'].values
y = muti_battel['win_rate'].values
fig = plt.figure(figsize=(11, 4))
ax1 = fig.add_subplot(121)
ax1.set_title('relation between pay and win pvp')
plt.xlabel('pay price')
plt.ylabel('pvp win rate')
ax1.scatter(x,y,c = 'g',marker = 'o')
plt.legend('user', loc='best')

虽然总体充值用户的pvp对战胜率要远高于普通用户

但是pvp对战 和pve 对战 胜率和充值金额并没有强烈的正相关

充值金额预测

step1 :分类,判断用户在7天后会不会继续充值,如果分类器判定不会,则45天充值金额就为前7天充值金额,通常二分类问题准确率较高,所以能保证最终结果不会太差。

step2: 回归预测, 对于判定为会继续充值的样本,继续用回归树预测具体充值金额。

# 假想1, 付费玩家大概率在7天内已经付费
# 只有9.89%的 用户的首充在7天之后
# 45 天内金额 大于 7天内金额, 证明在 7天后充值了
# 28%的人, 前七天没充值, 但是后边充值了
# 72%的人, 前七天充值了,后边还充值了after7pay = train_data[train_data['prediction_pay_price'] > train_data['pay_price']]  # 7天后有充值行为的人
day7_no_pay = after7pay[after7pay['pay_price']==0]  #前7天没有充值的人
rate = day7_no_pay.shape[0]/after7pay.shape[0]
print(round(rate*100,2), '%')
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
new_year  = train_data
new_year = new_year.drop(columns='register_t',axis=0)
#new_year['pay continue'] = new_year.pay_price.apply(lambda x: 1 if x>0 else 0)  #新建列赋值(根据其他列条件)
new_year['pay continue']=0
new_year.loc[new_year['prediction_pay_price']> new_year['pay_price'], 'pay continue']=1train_df = new_year
train_df.drop(columns=['user_id', 'register_time'], inplace=True)X1 = train_df[train_df['pay continue']==1]
X2 = train_df[train_df['pay continue']==0]
X2 = X2.sample(16000)X = pd.concat([X1,X2], axis=0)
X = shuffle(X)Y = X.loc[:, 'pay continue']
X = X.drop(columns='pay continue',axis=0)
X_train, X_test, y_train, y_test = train_test_split(X, Y, train_size=0.75, random_state=0)
clf = make_pipeline(StandardScaler(), SVC(gamma='auto'))
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

0.93
第一步的准确率可以达到0.93

回归预测:

Regre_Y = X.loc[:, 'prediction_pay_price']
Regre_X = X.drop(columns='prediction_pay_price', axis=0)
RX_train, RX_test, Ry_train, Ry_test = train_test_split(Regre_X, Regre_Y, train_size=0.75, random_state=0)#特征选择
from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=(0.5))
RX_train_selected = sel.fit_transform(RX_train)
RX_test_selected = sel.fit_transform(RX_test)from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=40, max_depth=4, random_state=0, n_jobs=1)
model.fit(RX_train_selected, Ry_train)
model.score(RX_test_selected, Ry_test)

游戏数据分析报告--<野蛮时代>相关推荐

  1. 野蛮时代SLG数据分析报告

    项目背景 <野蛮时代>(Brutal Age)是一款风靡全球的SLG(策略)类型手机游戏.准确了解每个玩家的价值和产品道具使用效果,对游戏的广告投放策略和高效的运营活动具有重要意义,有助于 ...

  2. 【数据分析实例】 300 万条《野蛮时代》的玩家数据分析

    文章目录 1. 数据集说明 2. 数据处理 3. 数据分析可视化 3.1 新增用户 3.2 用户活跃度 3.3 用户消费情况 3.4 用户游戏情况 数据集和代码(百度网盘) 1. 数据集说明 这是一份 ...

  3. 《十周成为数据分析师》笔记——业务线 第八节 常见互联网业务的数据分析报告的制作及用户分层模型

    互联网业务数据分析报告及用户分层模型 一.业务逻辑回顾及互联网相关指标 1.实战项目与业务逻辑回顾 数据报表(数据源)→用户画像(数据分析)→数据化运营(决策指导)→商业分析(宏观判断)→分析报告(结 ...

  4. 一份价值百万的大数据分析报告如何炼成?

    曾经,咨询公司一份报告就能收取企业几十万.甚至于上百万.而今,矫枉过正,数据分析报告却常常被企业认为没有任何实际价值.我经常和企业交流,他们告诉我,需要的是能够为他带来直接价值的东西,比如广告投放能够 ...

  5. 区块链公链DApp应用落地数据分析报告(二)

    在上一篇区块链公链DApp应用落地数据分析报告(一)中,我们对公链DApp应用布局的整体行业情况进行了大致的分析,从宏观上衡量,DApp总体类型单一,活跃用户主要集中于抽奖类和高风险类的菠菜项目,一方 ...

  6. 多场景业务实战-游戏数据分析

    游戏数据分析 学习目标 知道游戏行业关键数据指标 掌握ARPU, ARPPU等指标的计算方法 一.游戏行业关键数据指标 1.1 运营数据 激活数据 总激活码发放量.总激活量.总登录账号数 激活率.激活 ...

  7. 2018年8月以太坊DApp数据分析报告

    近日,链塔数据BlockData发布了<2018年8月以太坊DApp数据分析报告>,报告显示,以太坊上的DApp数量多达775个,形成了一个较为完善的开发生态圈,累计交易笔数多达3.003 ...

  8. 写好数据分析报告,数据的思路非常重要

    我比较喜欢打游戏,属于又菜又爱玩的类型. 为了提升水平,会去看一些高手的视频.每次看完高手视频,我都热血澎湃,赶紧上号准备上分. 但是,现实却告诉我,看别人玩得再6,自己上手的时候还是不行. 这不单单 ...

  9. 数据解决方案:原力大数据教你如何撰写数据分析报告

    转载于原力大数据, 作者简介 江颖,帷策智能.原力大数据创始人兼CEO,大数据应用实施领域资深专家,中国大数据商业实践先行者.武汉大学管理学硕士,13年大数据研究及应用实践经历,曾任中国移动资深大数据 ...

最新文章

  1. 集成学习--百面机器学习
  2. Js实现回车登录,监听回车事件
  3. 复制初始化和直接初始化
  4. vue-router常见问题解决方案。(滚轴回到顶部、页面跳转同一页面报错、手机电脑端路由跳转)
  5. Java 之文件目录操作
  6. centos7配置jdk1.8环境变量
  7. 7PYX 网站代码下载
  8. Linux工作笔记-重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usi
  9. Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传
  10. 手动编译包含两个import自写类的java类。
  11. 用python实现闯越顶岗实习签到
  12. 正向最大匹配、逆向最大匹配与双向匹配算法实现
  13. uni-app 将app运行在夜神安卓模拟器
  14. 华为首次自曝“天才少年”成果:入职不到一年就干成这件大事,网友:值 200 万年薪!...
  15. 如何恢复误删除的微信聊天记录?看完这个技巧分享保证你一清二楚!
  16. Java小白入门200例81之Java接口
  17. python只读打开文件_关于python:只读文件的第一行?
  18. OPC UA学习笔记
  19. xposed微信插件大全
  20. 阳康后是否二次感染,长新冠与肠道菌群的关联,多种潜在的干预措施

热门文章

  1. C语言基础之4:字符串和格式化输入/输出
  2. java唯一的id_Java:唯一的10位数ID
  3. 怀孕期间准妈妈多吃西红柿
  4. JavaScript ArrayBuffer浅析
  5. 基于gmssl SM2 签名验签测试程序
  6. 《C++Primer》学习笔记(11-12章)
  7. STM32单片机蓝牙APP智能急救手表跌倒报警心率报警MAX30102
  8. SCI和SCIE, EI, ISTP 等数据库
  9. ModelsimSE使用指南
  10. 服务器优盘启动安装win7系统教程,晨枫u盘启动工具安装原版Win7的两种方法(32位64位系统通用)...