首页 > 技术文章 > 《野蛮时代》运营数据分析

Rosaany 2021-11-08 18:57 原文

1. 游戏介绍

  • 游戏名称:野蛮时代
  • 开发商:Pocket Rage Ltd
  • 游戏介绍:一款拥有皮克斯画风的MMO策略类经营战争游戏,在游戏中,建造城市据点,不断扩张领土,从原始到壮大的真实过程,通过不断的狩猎和围捕,和其他玩家一同竞争,打造一个强大的部落。
  • 游戏特色: 自由扩张领土,在战斗中烧毁敌方的城镇;全景高比例缩放地图,支持玩家查看地图全景至每一个细节;选择部落并获得独特的部落技能,与盟友一起加入原始人的激烈战斗;训练15种不同技能的兵种,强大军队,选择不同的战斗策略;改造领土地形,改变资源获取策略;
    捕猎史前野兽,获得丰厚奖励;和部落一起,征服遗迹,成为最高荣誉的大酋长数据:用户注册后前7日数据,且很可能是开服数据

2. 游戏数据分析基本指标

花费一番时间,整理一些游戏运营工作中,数据分析常遇到的数据指标,要想从数据中得出什么结果,对指标的认识是必不可少的。

  • DAU
  1. 日活跃用户,在当天登录过游戏的用户 (有效反映和衡量一款游戏核心用户数)
  • DAU分类:
  1. 新用户:当天注册的用户

  2. 7天活跃用户:7天内登录过的用户。如7月10日DAU中的7天活跃用户是指7月10日登录过游戏,并且在7月3日至7月9日曾经登录过游戏的用户。

  3. 回归僵尸用户:7天前没有登录过游戏的用户(不包括新用户)。如7月10日DAU中的回归僵尸用户指的是7月10日登录过游戏,但是在7月3日至7月9日没有登录过游戏的用户。

  4. DAU/MAU:日活/月活,得到每月访问游戏的平均天数是多少(最低极限0.2,与社交游戏成败息息相关)

  5. 每日流失用户:当天登录,后续7天内不登录游戏

  • 新用户
    1.次日留存(率):注册后第二天登录游戏的用户。如7月10日的新用户中,在7月11日登录游戏的人数。
  1. 三日留存(率):两种方式:

1.点三日留存:注册后第三天登录游戏的用户。如7月10日的新用户在7月12日登录游戏的用户。

2.区间三日留存:注册后三天内登录过的用户。如7月10号的新用户在7月11号-13号登录过的用户

  1. 新手引导转化率:新手引导每一步的转化率=进行本步的用户除以进行上一步的用户

  2. 新手无操作(率)= 新手无操作率=无操作的新用户数/总的新用户数。(具体定义由各平台确定)

  • WAU
  1. WAU:周活跃用户(Weekly Active User):周活跃用户,在一周之内登录过游戏的

  2. WAU细分(依据具体情况而定,仅作参考)

1.忠实用户:连续三周登录的用户

2.回归僵尸用户:本周登录过,上周没有登录过的用户

3.留存僵尸用户:WAU-回归僵尸用户-新用户-本周新用户

4.新用户:本周注册的用户

5.留存新用户:上周注册且本周登录的用户

  1. WAU细分(登录频次:登录次数是1次/天)(依据具体情况而定,仅作参考)

轻度用户:每周登录1~2次的用户。

中度用户:每周登录3~5次的用户。

重度用户:每周登录6~7次的用户。

  1. 周流失率:本周登陆下周不再继续登陆的用户

  2. 忠诚用户数量:本周登陆3次以上(当天重复登陆算一次),最高角色等级超过15级,在线时长超过14小时的用户

  3. 忠诚度:忠诚用户数量/WAU

  4. 忠诚流失率:本周忠诚用户下周未继续登陆的用户/本周忠诚用户

  5. 转化率:本周登陆的用户在下周转化为忠诚用户的比例

  • 用户在线
  1. CCU:实时在线曲线

  2. 平均在线时长 = 总的在线时长/总登录人数

  3. 每小时在线人数 :每个小时登录的用户数

  4. 每小时注册用户:每个小时注册的用户数

  5. 最高在线人数(PCU每日峰值):同时在线人数的最高峰

  • 病毒性
  1. 发送邀请人数:时间段内,成功发送邀请的用户数

  2. 接受邀请人数:时间段内,收到邀请信的用户,点击了接受邀请

  3. 发送率:发送邀请人数/活跃用户数

  4. 接受率:接受邀请的用户/收到邀请的用户;点击接受的信数/接受到邀请的信数

  5. k因子:k-Factor(感染率)X(转化率)。用于衡量产品的病毒传播率。感染率是形容某个用户向其他用户传播游戏的程度。转化率是指将感染用户转化成新注册用户的比例。

  6. 被邀请用户比例:每天新用户中,被邀请来的用户占新用户的比例

  • 付费/充值
  1. 付费率:指定时间内,付费用户除以活跃用户数

  2. 付费额:指定时间内,付费用户消费总额

  3. ARPU值:指定时间内,消费额除以活跃用户数

  4. ARPPU值:指定时间内,消费额处于付费用户数

  5. LTV:新用户后续付费能力指标。例如:14日LTV是指今天注册的新用户在后续14天内付费额除以注册的新用户数

  6. 用户终生价值:Kontegent公式:用户终生价值=1/(1-K)X日ARPU X用户寿命(用户平均生命周期:累计,非连续)。

3. 确定指标

  • 用户黏度(DAU,MAU,DAU/MAU,留存分析)

  • 用户在线(平均在线时长)

  • 付费/充值(付费额、ARPU、ARPPU、付费率)

  • 游戏指标:
    1.PVP、PVE、战斗力、资源(科研、建筑、人物、物品)使用等等

  • 流失定义:
    (wood_reduce_value == 0 & meat_reduce_value==0 & avg_online_minutes <=2 & pay_count ==0) 假设符合条件则定义为流失用户

  • 氪金定义:
    零氪金:pay_price = 0,
    低氪金:pay_price <=68,
    中氪金:pay_price > 68 and pay_price <= 202,
    高氪金:pay_price > 202

4. 实现方式

实现方式一:做数据分层。依据业务需求分成不同的层次,如果本项目采用方式一做数据分层,细分为:

  1. 数据运营层ODS层:存放接入的原始数据,对数据装载。
  2. 数据仓库层DW层:分为DWD和DWS层,其中DWD层是对DOS层作一定的清洗工作,也就是特征工程,数据筛选;DWS层对用户统计,付费用户划分、游戏指标等;
  3. 数据应用层APP层:监控相关指标(注册、流失、平均在线时长等)

实现方式二:如果说原始数据不是很大(个人电脑内存可承载可操作),可考虑使用Python做数据分析以及可视化。

本文实现方式采取:第二种方式来完成。第一种方式后面有时间再补上

5. 结论先行

* 新用户:
  • 平均每天新用户注册数为57200人,统计表明共有40天,总共2288007条记录;

  • 其中2018年2月19日这一天注册用户数最多有117311人,2018年3月01日这一天注册用户数最小有36226人;

  • 注册人数最多的月份是2月,约占总人数的71%

  • 在线时长:

    • 228万条数据中,新用户平均在线时长在10.2分钟,中位数在1.83分钟,最大在线时长2049分钟

    • 新用户平均在线时长分界活跃用户,即平均在线时长大于10.2分钟定义为活跃用户,共有313108个活跃用户,占比13.68%

  • 流失用户:

    • 平均每天流失用户数15718人,与平均每天用户注册数占比27.48%,其中2月19日这一天来的新用户多,流失的也多,19号这一天为年后第四天,猜测可能为某个运营活动已接近尾声。
  • 氪金人群:

    • 不同的氪金人群在使用app的时长不同,氪金程度越高在线时长越高
    • 高氪金人群数与活跃用户数只有0.33%占比;零氪金占据大壁江山约有87.8%
  • 付费/充值

    • 付费率:付费用户数除以活跃用户数 = 13.23%
    • 付费额:45日付费用户消费总额 = 3916936.;
    • ARPU值:45日消费额除以活跃用户数 = 12.51
    • ARPPU值:45日消费额处于付费用户数 = 94.52
  • 游戏指标分析:

    • 氪金程度越高,玩PVP场次就越多,从低氪金等级开始,随着氪金等级每升一级,PVP场次几乎翻0.5倍,另外在PVE模式中,高氪金与中氪金玩的场次相差不大,对比PVP模式,PVE模式对于高氪金玩家来说吸引力并没有其它氪金等级的玩家强烈;
    • 氪金程度越高,游戏物品数越会越多,玩家从中氪金到高氪金阶段游戏物品翻了约3倍,这表明高氪金玩家在资源上会比其它氪金等级玩家多很多;
    • 氪金程度越高,科研等级也会越高,但数据显示,中氪金和高氪金玩家大多数类型的科研等级几乎持平(比如有:科研_侦擦等级、科研_勇士等级、科研_领土采集等级等);

在数据集有限情况下,本文展开对这款游戏数据分析,仅作为学习记录下来

6. 认识数据

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

plt.rcParams['font.sans-serif'] = ['Simhei']
plt.rcParams['axes.unicode_minus']= False
data = pd.read_csv(r'./tap_fun_train.csv')
data.head()
user_id register_time wood_add_value wood_reduce_value stone_add_value stone_reduce_value ivory_add_value ivory_reduce_value meat_add_value meat_reduce_value ... pvp_battle_count pvp_lanch_count pvp_win_count pve_battle_count pve_lanch_count pve_win_count avg_online_minutes pay_price pay_count prediction_pay_price
0 1 2018-02-02 19:47:15 20125.0 3700.0 0.0 0.0 0.0 0.0 16375.0 2000.0 ... 0 0 0 0 0 0 0.333333 0.0 0 0.0
1 1593 2018-01-26 00:01:05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0 0 0 0.333333 0.0 0 0.0
2 1594 2018-01-26 00:01:58 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0 0 0 1.166667 0.0 0 0.0
3 1595 2018-01-26 00:02:13 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0 0 0 3.166667 0.0 0 0.0
4 1596 2018-01-26 00:02:46 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0 0 0 2.333333 0.0 0 0.0

5 rows × 109 columns

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2288007 entries, 0 to 2288006
Columns: 109 entries, user_id to prediction_pay_price
dtypes: float64(13), int64(95), object(1)
memory usage: 1.9+ GB
# 检查缺失值
data.isnull().sum()
user_id                 0
register_time           0
wood_add_value          0
wood_reduce_value       0
stone_add_value         0
                       ..
pve_win_count           0
avg_online_minutes      0
pay_price               0
pay_count               0
prediction_pay_price    0
Length: 109, dtype: int64
  • 整理数据:
    1.日期时间拆分
    2.重命名部分列名
# 新增3列
data['date']= pd.to_datetime(data['register_time'],format='%Y-%m-%d %H:%M:%S').dt.date
data['hour']= pd.to_datetime(data['register_time'],format='%Y-%m-%d %H:%M:%S').dt.hour
data['month']= pd.to_datetime(data['register_time'],format='%Y-%m-%d %H:%M:%S').dt.month
# 后文着重分析的字段如下
A = {'wood_add_value':'木头获取数量','stone_add_value': '石头获取数量','ivory_add_value':'象牙获取数量','meat_add_value': '肉获取数量','magic_add_value':'魔法获取数量'}
B = {'infantry_add_value':'勇士招募数量','cavalry_add_value':'驯兽师招募数量','shaman_add_value':'萨满招募数量','wound_infantry_add_value':'勇士伤兵产生数量','wound_cavalry_add_value':'驯兽师伤兵产生数量','wound_shaman_add_value':'萨满伤兵产生数量'}
C = {'general_acceleration_add_value':'通用加速卷获取数量','building_acceleration_add_value':'建筑加速卷获取数量','reaserch_acceleration_add_value':'科研加速卷获取数量','training_acceleration_add_value':'训练加速卷获取数量','treatment_acceleraion_add_value':'治疗加速卷获取数量'}
D = {'general_acceleration_reduce_value':'通用加速卷使用数量','building_acceleration_reduce_value':'建筑加速卷使用数量','reaserch_acceleration_reduce_value':'科研加速卷使用数量','training_acceleration_reduce_value':'训练加速卷使用数量','treatment_acceleration_reduce_value':'治疗加速卷使用数量'}
E = {'bd_training_hut_level':'建筑_士兵小屋等级','bd_healing_lodge_level':'建筑_治疗小井等级','bd_stronghold_level':'建筑_要塞等级','bd_outpost_portal_level':'建筑_据点传送门等级'}
F = {'sr_scout_level':'科研_侦察等级','sr_training_speed_level':'科研_训练速度等级','sr_infantry_tier_2_level':'科研_勇士等级','sr_gathering_hunter_buff_level':'科研_领土采集等级','sr_rss_help_bonus_level':'科研_资源帮助容量等级'}
G = {'pvp_battle_count':'PVP次数','pvp_lanch_count':'主动发起PVP次数','pvp_win_count':'PVP胜利次数','pve_battle_count':'PVE次数','pve_lanch_count':'主动发起PVE次数','pve_win_count':'PVE 胜利次数'}
# 替换列名
col = [A,B,C,D,E,F,G]
for co in col:
    data.rename(columns=co,inplace=True)
data.head()
user_id register_time 木头获取数量 wood_reduce_value 石头获取数量 stone_reduce_value 象牙获取数量 ivory_reduce_value 肉获取数量 meat_reduce_value ... PVE次数 主动发起PVE次数 PVE 胜利次数 avg_online_minutes pay_price pay_count prediction_pay_price date hour month
0 1 2018-02-02 19:47:15 20125.0 3700.0 0.0 0.0 0.0 0.0 16375.0 2000.0 ... 0 0 0 0.333333 0.0 0 0.0 2018-02-02 19 2
1 1593 2018-01-26 00:01:05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0.333333 0.0 0 0.0 2018-01-26 0 1
2 1594 2018-01-26 00:01:58 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 1.166667 0.0 0 0.0 2018-01-26 0 1
3 1595 2018-01-26 00:02:13 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 3.166667 0.0 0 0.0 2018-01-26 0 1
4 1596 2018-01-26 00:02:46 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 2.333333 0.0 0 0.0 2018-01-26 0 1

5 rows × 112 columns

7. 运营指标分析

7.1 每日用户流失数

# 过滤定义为流失的用户
filter_leave = 'wood_reduce_value == 0 & meat_reduce_value==0 & avg_online_minutes <=2 & pay_count ==0'
leave = data.query(filter_leave)
plt.figure(figsize=(9,6))
leave_u = leave.groupby(by=['date']).user_id.agg([pd.Series.count])
plt.plot(leave_u,marker='*',color='seagreen')
# leave.groupby(by=['date']).user_id.nunique().plot(marker='*', color='r')
plt.title('每日流失用户数')
plt.xlabel('日期')
plt.ylabel('流失数量')
leave_u.describe()
count
count 40.000000
mean 15718.675000
std 13210.280473
min 7327.000000
25% 8466.750000
50% 9624.500000
75% 15179.500000
max 59637.000000


image

print('平均每日流失用户数与平均每日注册用户数占比:%.2f%%'%(15718/57200*100))
平均每日流失用户数与平均每日注册用户数占比:27.48%

7.2 新用户在线时长

data.avg_online_minutes.describe()
count    2.288007e+06
mean     1.020749e+01
std      3.895946e+01
min      0.000000e+00
25%      5.000000e-01
50%      1.833333e+00
75%      4.833333e+00
max      2.049667e+03
Name: avg_online_minutes, dtype: float64

在228万条数据下,新用户平均在线时长在10.2分钟,中位数在1.83分钟,最大在线时长2049分钟
假设以平均在线时长大于10.2分钟定义为活跃用户,新增一列,区分是否为活跃用户,区分条件:
非活跃用户:0<=avg_online_minutes <=10.2
活跃用户:avg_online_minutes>=10.2

  • 划分是否活跃
data['是否活跃用户'] = pd.cut(data.avg_online_minutes,bins=[0,10.2,100000],labels=[0,1],right=False)
data[['是否活跃用户']].describe()
是否活跃用户
count 2288007
unique 2
top 0
freq 1974899
print('共有活跃用户数:%.0f'% (2288007-1974899),'占比%.2f%%' % ((2288007-1974899)/2288007*100))
共有活跃用户数:313108 占比13.68%

7.3 新用户数

7.3.1 每日新用户数

dau = data.groupby(by=['date']).user_id.nunique()
plt.figure(figsize=(9,6))
plt.plot(dau,marker='*', color='r')
plt.title('每日新用户数')
plt.xlabel('日期')
plt.ylabel('注册数')
dau.describe()
count        40.000000
mean      57200.175000
std       16347.806529
min       36226.000000
25%       44703.250000
50%       52876.000000
75%       61699.250000
max      117311.000000
Name: user_id, dtype: float64


image

7.3.2 平均每日新用户数

avg_reg = data.groupby(by=['date']).user_id.nunique().mean()
print('平均每日新用户数:%.0f'%avg_reg)
平均每日新用户数:57200

7.3.3 每月新用户数

mau = data.groupby(by=['month']).user_id.nunique()
mau = mau.to_frame()
plt.figure(figsize=(9,6))
rects = plt.bar(mau.index, mau.user_id, color='c')
plt.title('每月新用户数')
plt.xlabel('月份')
plt.ylabel('注册数')
plt.xticks(np.arange(1,4), mau.index)

# 添加注释
def set_label(rects):
    for rect in rects:
        height = rect.get_height() # 获取⾼度
        plt.text(x = rect.get_x() + rect.get_width()/2, # ⽔平坐标
        y = height + 0.5, # 竖直坐标
        s = height, # ⽂本
        ha = 'center') # ⽔平居中
set_label(rects)

# 占比
mau['user_id'].map(lambda x:(x/mau['user_id'].sum())).to_frame()
user_id
month
1 0.170638
2 0.713487
3 0.115876


image

7.4 每日活跃用户平均在线时长

plt.figure(figsize=(9,6))
avg_ac_online = data[data['是否活跃用户'] == 1].groupby(by=['date']).avg_online_minutes.mean().round(2)
plt.plot(avg_ac_online,marker='*', color='g')
plt.title('每日活跃用户平均在线时长')
plt.xlabel('日期')
plt.ylabel('活跃用户在线时长')
avg_ac_online.describe().to_frame()
avg_online_minutes
count 40.000000
mean 61.353750
std 8.059266
min 46.770000
25% 56.515000
50% 61.310000
75% 65.877500
max 76.450000


7.5 氪金人群划分

  • 新增一列,以不同的付费额作为划分不同氪金人群
labels = ['零氪金','低氪金','中氪金','高氪金']
bins = [0,0.001,68,202,100000]
data['氪金人群'] = pd.cut(data.pay_price,bins=bins,labels=labels,right=False)

7.5.1 all用户与活跃用户平均在线时长

plt.figure(figsize=(9,6))
all_m = data.groupby(by=['date']).avg_online_minutes.mean().round(2)
ac_m = data[data['是否活跃用户'] == 1].groupby(by=['date']).avg_online_minutes.mean().round(2)
ac_all_m = pd.merge(all_m, ac_m, on='date')
ac_all_m.columns = ['all用户平均在线时长','活跃用户平均在线时长']
sns.lineplot(data=ac_all_m)
plt.title('all用户与活跃用户平均在线时长')
plt.xlabel('日期')
plt.ylabel('在线时长')
Text(0, 0.5, '在线时长')


7.5.2 all用户与活跃用户在不同氪金人群平均在线时长

plt.figure(figsize=(9,6))
all_m = data.groupby(by=['氪金人群']).avg_online_minutes.mean().round(2).to_frame()
all_m['用户群'] = 'all用户'
ac_m = data[data['是否活跃用户'] == 1].groupby(by=['氪金人群']).avg_online_minutes.mean().round(2).to_frame()
ac_m['用户群'] = '活跃用户'
ac_all_m = pd.concat([all_m, ac_m], axis=0)
ac_all = ac_all_m.reset_index()
ac_all.rename(columns={'avg_online_minutes':'平均在线时长'},inplace=True)
# barplot主要用来描述样本的均值和置信区间
rects = sns.barplot(data=ac_all,hue='氪金人群',x='用户群',y='平均在线时长') # 黑线默认情况则标识了95%的置信区间
plt.title('all用户与活跃用户在不同氪金人群平均在线时长')
plt.xlabel('日期')
plt.ylabel('用户类型')
Text(0, 0.5, '在线时长')


7.5.3 氪金人群数量分布

plt.figure(figsize=(9,6))
all_m = data.groupby(by=['氪金人群']).user_id.nunique().to_frame()
all_m['用户群'] = 'all用户'
ac_m = data[data['是否活跃用户'] == 1].groupby(by=['氪金人群']).user_id.nunique().to_frame()
ac_m['用户群'] = '活跃用户'
ac_all_m = pd.concat([all_m, ac_m], axis=0)
ac_all = ac_all_m.reset_index()
ac_all.rename(columns={'user_id':'用户数'},inplace=True)
rects = sns.barplot(data=ac_all,hue='氪金人群',x='用户群',y='用户数')
plt.title('all用户与活跃用户氪金人群数量分布')
plt.xlabel('用户群')
plt.ylabel('用户数')
ac_all
氪金人群 用户数 用户群
0 零氪金 2246568 all用户
1 低氪金 38707 all用户
2 中氪金 1684 all用户
3 高氪金 1048 all用户
4 零氪金 274987 活跃用户
5 低氪金 35413 活跃用户
6 中氪金 1662 活跃用户
7 高氪金 1046 活跃用户


7.5.4 氪金人群分布占比

ac_all_num = ac_all.groupby('用户群')['用户数'].sum().to_frame().reset_index()
acal = pd.merge(ac_all_num,ac_all,on='用户群')
acal.columns=['用户群','总用户数','氪金人群','用户数']
acal['氪金人群用户数与总用户数占比(%)'] = round(acal['用户数']/acal['总用户数']*100,2)
acal
用户群 总用户数 氪金人群 用户数 氪金人群用户数与总用户数占比(%)
0 all用户 2288007 零氪金 2246568 98.19
1 all用户 2288007 低氪金 38707 1.69
2 all用户 2288007 中氪金 1684 0.07
3 all用户 2288007 高氪金 1048 0.05
4 活跃用户 313108 零氪金 274987 87.82
5 活跃用户 313108 低氪金 35413 11.31
6 活跃用户 313108 中氪金 1662 0.53
7 活跃用户 313108 高氪金 1046 0.33

7.6 付费/充值

       付费率:指定时间内,付费用户除以活跃用户数
       付费额:指定时间内,付费用户消费总额
       ARPU值:指定时间内,消费额除以活跃用户数
       ARPPU值:指定时间内,消费额处于付费用户数
       LTV:用户生命周期价值

7.6.1 付费率

order_user_num = data[data.pay_count>0].shape[0] # 付费用户
ac_user_num = data[data['是否活跃用户'] == 1].shape[0] # 活跃用户数
print('付费率:%.2f%%' % (order_user_num/ac_user_num * 100))
付费率:13.23%

7.6.2 付费额

# 45日付费金额
day45_order = data[data.pay_count>0]['prediction_pay_price'].sum()
print('45日付费额:%.2f' % (day45_order))
# 40日付费金额
daynull_order = data[data.pay_count>0]['pay_price'].sum()
print('未知时间付费额:%.2f' % (daynull_order))
45日付费额:3916936.11
40日付费额:1223326.66

7.6.3 ARPU值

# 指定时间内,消费额除以活跃用户数
# 45日的ARPU
print('45日的ARPU:%.2f' % (day45_order/ac_user_num))
# 40日付费金额
print('未知时间的ARPU:%.2f' % (daynull_order/ac_user_num))
45日的ARPU:12.51
40日的ARPU:3.91

7.6.4 ARPPU值

# 指定时间内,消费额处于付费用户数
# 45日的ARPU
print('45日的ARPPU:%.2f' % (day45_order/order_user_num))
# 40日付费金额
print('未知时间的ARPPU:%.2f' % (daynull_order/order_user_num))
45日的ARPPU:94.52
40日ARPPU:29.52

8. 游戏指标分析

8.1 氪金人群PVP平均场次

G
{'pvp_battle_count': 'PVP次数',
 'pvp_lanch_count': '主动发起PVP次数',
 'pvp_win_count': 'PVP胜利次数',
 'pve_battle_count': 'PVE次数',
 'pve_lanch_count': '主动发起PVE次数',
 'pve_win_count': 'PVE 胜利次数'}
pvp_num = pd.pivot_table(data,values=['PVP次数', '主动发起PVP次数', 'PVP胜利次数'],index=['氪金人群'], aggfunc='mean')
pvp_num.head()
PVP次数 PVP胜利次数 主动发起PVP次数
氪金人群
零氪金 1.723228 0.664597 0.760918
低氪金 22.610458 15.895342 15.069962
中氪金 54.789786 45.863420 43.035036
高氪金 73.050573 62.517176 56.512405
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群PVP平均场次')
plt.xlabel('氪金人群')
plt.ylabel('PVP次数')
Text(0, 0.5, 'PVP次数')


list(zip(range(len(pvp_num)),pvp_num['PVP次数']))
[(0, 1.723228497868749),
 (1, 22.610458056682255),
 (2, 54.78978622327791),
 (3, 73.05057251908397)]
pvp_num.plot(kind='bar', stacked='True',figsize=(10,8),colormap='tab10')
for a,b in zip(range(len(pvp_num)),pvp_num['PVP次数']):
    plt.text(a,b/2,f'{b:.2f}', ha='center', va='bottom', size=12)
plt.title('氪金人群PVP平均场次')
plt.xlabel('氪金人群')
plt.ylabel('PVP次数')
Text(0, 0.5, 'PVP次数')


8.2 氪金人群PVE平均场次

pvp_num = pd.pivot_table(data,values=['PVE次数', '主动发起PVE次数', 'PVE 胜利次数'],index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群PVE平均场次')
plt.xlabel('氪金人群')
plt.ylabel('PVE次数')
pvp_num
PVE 胜利次数 PVE次数 主动发起PVE次数
氪金人群
零氪金 1.914146 2.141877 2.133394
低氪金 34.833260 38.167592 37.968300
中氪金 68.611639 74.910926 74.472090
高氪金 81.838740 89.126908 88.460878


8.3 氪金人群人均物品数

A
{'wood_add_value': '木头获取数量',
 'stone_add_value': '石头获取数量',
 'ivory_add_value': '象牙获取数量',
 'meat_add_value': '肉获取数量',
 'magic_add_value': '魔法获取数量'}
pvp_num = pd.pivot_table(data,values=A.values(),index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群人均物品数')
plt.xlabel('氪金人群')
plt.ylabel('物品数')
Text(0, 0.5, '物品数')


8.4 氪金人群人均人物数

B
{'infantry_add_value': '勇士招募数量',
 'cavalry_add_value': '驯兽师招募数量',
 'shaman_add_value': '萨满招募数量',
 'wound_infantry_add_value': '勇士伤兵产生数量',
 'wound_cavalry_add_value': '驯兽师伤兵产生数量',
 'wound_shaman_add_value': '萨满伤兵产生数量'}
pvp_num = pd.pivot_table(data,values=B.values(),index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群人均人物数')
plt.xlabel('氪金人群')
plt.ylabel('人物数')
Text(0, 0.5, '人物数')


8.5 氪金人群人均功能数

8.5.1 氪金人群人均加速卷获取情况

C
{'general_acceleration_add_value': '通用加速卷获取数量',
 'building_acceleration_add_value': '建筑加速卷获取数量',
 'reaserch_acceleration_add_value': '科研加速卷获取数量',
 'training_acceleration_add_value': '训练加速卷获取数量',
 'treatment_acceleraion_add_value': '治疗加速卷获取数量'}
pvp_num = pd.pivot_table(data,values=C.values(),index=['氪金人群'], aggfunc='mean')
pvp_num
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群人均加速卷获取情况')
plt.xlabel('氪金人群')
plt.ylabel('加速卷获取数')
Text(0, 0.5, '加速卷获取数')


8.5.2 氪金人群人均加速卷使用情况

D
{'general_acceleration_reduce_value': '通用加速卷使用数量',
 'building_acceleration_reduce_value': '建筑加速卷使用数量',
 'reaserch_acceleration_reduce_value': '科研加速卷使用数量',
 'training_acceleration_reduce_value': '训练加速卷使用数量',
 'treatment_acceleration_reduce_value': '治疗加速卷使用数量'}
pvp_num = pd.pivot_table(data,values=D.values(),index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群人均加速卷使用情况')
plt.xlabel('氪金人群')
plt.ylabel('加速卷数')
Text(0, 0.5, '加速卷数')


8.6 氪金人群人均建筑数

E
{'bd_training_hut_level': '建筑_士兵小屋等级',
 'bd_healing_lodge_level': '建筑_治疗小井等级',
 'bd_stronghold_level': '建筑_要塞等级',
 'bd_outpost_portal_level': '建筑_据点传送门等级'}
pvp_num = pd.pivot_table(data,values=E.values(),index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人群人均建筑数')
plt.xlabel('氪金人群')
plt.ylabel('建筑数')
Text(0, 0.5, '建筑数')


8.7 氪金人均科研等级

F
{'sr_scout_level': '科研_侦察等级',
 'sr_training_speed_level': '科研_训练速度等级',
 'sr_infantry_tier_2_level': '科研_勇士等级',
 'sr_gathering_hunter_buff_level': '科研_领土采集等级',
 'sr_rss_help_bonus_level': '科研_资源帮助容量等级'}
pvp_num = pd.pivot_table(data,values=F.values(),index=['氪金人群'], aggfunc='mean')
plt.figure(figsize=(9,6))
sns.lineplot(data=pvp_num, marker='*',sizes=20)
plt.title('氪金人均科研等级')
plt.xlabel('氪金人群')
plt.ylabel('科研等级')
Text(0, 0.5, '科研等级')


【数据如有侵权,请联系删除】

推荐阅读