游戏数据分析报告--<野蛮时代>
游戏数据分析报告
数据来源: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)
游戏数据分析报告--<野蛮时代>相关推荐
- 野蛮时代SLG数据分析报告
项目背景 <野蛮时代>(Brutal Age)是一款风靡全球的SLG(策略)类型手机游戏.准确了解每个玩家的价值和产品道具使用效果,对游戏的广告投放策略和高效的运营活动具有重要意义,有助于 ...
- 【数据分析实例】 300 万条《野蛮时代》的玩家数据分析
文章目录 1. 数据集说明 2. 数据处理 3. 数据分析可视化 3.1 新增用户 3.2 用户活跃度 3.3 用户消费情况 3.4 用户游戏情况 数据集和代码(百度网盘) 1. 数据集说明 这是一份 ...
- 《十周成为数据分析师》笔记——业务线 第八节 常见互联网业务的数据分析报告的制作及用户分层模型
互联网业务数据分析报告及用户分层模型 一.业务逻辑回顾及互联网相关指标 1.实战项目与业务逻辑回顾 数据报表(数据源)→用户画像(数据分析)→数据化运营(决策指导)→商业分析(宏观判断)→分析报告(结 ...
- 一份价值百万的大数据分析报告如何炼成?
曾经,咨询公司一份报告就能收取企业几十万.甚至于上百万.而今,矫枉过正,数据分析报告却常常被企业认为没有任何实际价值.我经常和企业交流,他们告诉我,需要的是能够为他带来直接价值的东西,比如广告投放能够 ...
- 区块链公链DApp应用落地数据分析报告(二)
在上一篇区块链公链DApp应用落地数据分析报告(一)中,我们对公链DApp应用布局的整体行业情况进行了大致的分析,从宏观上衡量,DApp总体类型单一,活跃用户主要集中于抽奖类和高风险类的菠菜项目,一方 ...
- 多场景业务实战-游戏数据分析
游戏数据分析 学习目标 知道游戏行业关键数据指标 掌握ARPU, ARPPU等指标的计算方法 一.游戏行业关键数据指标 1.1 运营数据 激活数据 总激活码发放量.总激活量.总登录账号数 激活率.激活 ...
- 2018年8月以太坊DApp数据分析报告
近日,链塔数据BlockData发布了<2018年8月以太坊DApp数据分析报告>,报告显示,以太坊上的DApp数量多达775个,形成了一个较为完善的开发生态圈,累计交易笔数多达3.003 ...
- 写好数据分析报告,数据的思路非常重要
我比较喜欢打游戏,属于又菜又爱玩的类型. 为了提升水平,会去看一些高手的视频.每次看完高手视频,我都热血澎湃,赶紧上号准备上分. 但是,现实却告诉我,看别人玩得再6,自己上手的时候还是不行. 这不单单 ...
- 数据解决方案:原力大数据教你如何撰写数据分析报告
转载于原力大数据, 作者简介 江颖,帷策智能.原力大数据创始人兼CEO,大数据应用实施领域资深专家,中国大数据商业实践先行者.武汉大学管理学硕士,13年大数据研究及应用实践经历,曾任中国移动资深大数据 ...
最新文章
- 集成学习--百面机器学习
- Js实现回车登录,监听回车事件
- 复制初始化和直接初始化
- vue-router常见问题解决方案。(滚轴回到顶部、页面跳转同一页面报错、手机电脑端路由跳转)
- Java 之文件目录操作
- centos7配置jdk1.8环境变量
- 7PYX 网站代码下载
- Linux工作笔记-重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usi
- Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传
- 手动编译包含两个import自写类的java类。
- 用python实现闯越顶岗实习签到
- 正向最大匹配、逆向最大匹配与双向匹配算法实现
- uni-app 将app运行在夜神安卓模拟器
- 华为首次自曝“天才少年”成果:入职不到一年就干成这件大事,网友:值 200 万年薪!...
- 如何恢复误删除的微信聊天记录?看完这个技巧分享保证你一清二楚!
- Java小白入门200例81之Java接口
- python只读打开文件_关于python:只读文件的第一行?
- OPC UA学习笔记
- xposed微信插件大全
- 阳康后是否二次感染,长新冠与肠道菌群的关联,多种潜在的干预措施
热门文章
- C语言基础之4:字符串和格式化输入/输出
- java唯一的id_Java:唯一的10位数ID
- 怀孕期间准妈妈多吃西红柿
- JavaScript ArrayBuffer浅析
- 基于gmssl SM2 签名验签测试程序
- 《C++Primer》学习笔记(11-12章)
- STM32单片机蓝牙APP智能急救手表跌倒报警心率报警MAX30102
- SCI和SCIE, EI, ISTP 等数据库
- ModelsimSE使用指南
- 服务器优盘启动安装win7系统教程,晨枫u盘启动工具安装原版Win7的两种方法(32位64位系统通用)...