1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python数据分析之对一个游戏的运营情况进行分析

Python数据分析之对一个游戏的运营情况进行分析

时间:2023-04-12 14:26:57

相关推荐

Python数据分析之对一个游戏的运营情况进行分析

Python数据分析之对一个游戏的运营情况进行分析

文章目录

**Python数据分析之对一个游戏的运营情况进行分析** 一、分析目标二、数据介绍三、结论1.新增用户分析2.玩家活跃度分析3.玩家付费情况分析4.玩家游戏习惯分析 四、详细分析1.新增玩家分析1.1新增玩家数量1.2新增付费玩家数量1.3新增付费玩家占比 2.玩家活跃度分析2.1全部玩家平均在线时长 2.2 付费玩家的平均在线时长2.3 平均在线时长的分布特点 3.玩家付费情况分析关键指标 4.玩家游戏习惯分析关键指标 PVP/PVE4.1AU玩家PVP情况4.2APA玩家PVP情况4.3AU玩家PVE情况4.4APA玩家PVE情况

一、分析目标

为了了解当前游戏的运营情况,对游戏从以下四个方面进行分析

1.新增玩家分析:从玩家数量、付费玩家占比、每日新增玩家数

2.玩家活跃度分析:从不同用户在线时长、分布特征展开分析

3.玩家付费情况分析:从PUR,ARPPU、ARPU等关键指标进行分析

4.玩家游戏习惯分析:从不同玩家的PVP、PVE这两个指标得出的情况v展开分析

二、数据介绍

数据来源于网络数据,数据主要记录了一段时间内,用户的相关行为数据。

对如下字段给出相关注释

‘user_id’, #玩家唯一ID

‘pay_price’, #付费金额

‘register_time’, #玩家注册时间

‘avg_online_minutes’, #在线时长

‘pvp_battle_count’, #与玩家对战次数

‘pvp_lanch_count’, #主动发起与玩家对战的次数

‘pvp_win_count’, #与玩家对战获胜的次数

‘pve_battle_count’, #与电脑对战次数

‘pve_lanch_count’, #主动发起与电脑对战的次数

‘pve_win_count’ #与电脑对战获胜次数

三、结论

1.新增用户分析

1)这段时间内新增的玩家数量是828934人,其中付费玩家19549人,站总用户数的2.4%;

2)每日新增玩家在3/10日左右新增玩家有一次大高峰增长,在3/13日左右有一次小增长;新增付费用户数在3/16号达到顶峰,但是后续也是持续下降;说明在这次活动过后,玩家的新增数量没有显著提升,可见活动对于提升游戏的人气帮助不大;活动仍然还需要持续一定的时间,让玩家充分了解游戏。

2.玩家活跃度分析

1)全部玩家的平均在线时长为11.6分钟,付费玩家的平均在线时长是135.8分钟,约是普通玩家的11倍,付费玩家拥有更高的活跃度。

2)75%的玩家的活跃时长不超过5分钟,说明用户的流失比较严重;

3)付费用户中75%的用户平均使用时长超过31分钟,说明付费用户更愿意投入时间在这款游戏中。

3.玩家付费情况分析

1)付费率PUR比较低,约17%,还有进一步的提高空间,可以开展相关活动提高付费率,从而提高渠道商青睐,如开展首冲礼包活动。

2)目前较好的手游每日ARPU超过五元;一般的手游在3-5元之间;低于3元说明表现较差。该手游的ARPU为5.44,表现良好;

3)该手游的ARPPU为32.62,说明付费用户整体的消费能力强,后续可以对付费用户进一步分析,已保证它们的持续付费;

4.玩家游戏习惯分析

1)APA玩家的平均PVE次数和PVP次数都是AU玩家的两倍左右,APA玩家更愿意花时间在这个游戏上;

2)在PVP对战中,APA玩家的获胜还率远超于AU玩家,说明我们的游戏道具可以让APA享受到对战的获胜的乐趣;

3)PVE的获胜概率均超过90%,建议后续可以关注是否需要出一些挑战难度大一些的PVE对战。

四、详细分析

In [33]:

#导入需要的库import pandas as pdimport numpy as npimport matplotlib.pyplot as plt#用来正常显示中文标签plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #用来正常显示负号plt.rcParams['axes.unicode_minus']=False#忽略警告import warningswarnings.filterwarnings('ignore')

In [34]:

df = pd.read_csv('/home/mw/input/game_data8690/game_data.csv')

In [35]:

# 查看数据的前5行df.head()

Out[35]:

5 rows × 109 columns

In [36]:

# 获取需要的列reg_sevendays_data = df[['user_id',#玩家唯一ID'pay_price', #付费金额'register_time', #玩家注册时间'avg_online_minutes', #在线时长'pvp_battle_count',#与玩家对战次数'pvp_lanch_count', #主动发起与玩家对战的次数'pvp_win_count', #与玩家对战获胜的次数'pve_battle_count',#与电脑对战次数'pve_lanch_count', #主动发起与电脑对战的次数'pve_win_count'#与电脑对战获胜次数]]reg_sevendays_data.head()

Out[36]:

In [37]:

# 查看数据信息reg_sevendays_data.info()

<class 'pandas.core.frame.DataFrame'>RangeIndex: 828934 entries, 0 to 828933Data columns (total 10 columns):user_id828934 non-null int64pay_price 828934 non-null float64register_time 828934 non-null objectavg_online_minutes 828934 non-null float64pvp_battle_count828934 non-null int64pvp_lanch_count 828934 non-null int64pvp_win_count 828934 non-null int64pve_battle_count828934 non-null int64pve_lanch_count 828934 non-null int64pve_win_count 828934 non-null int64dtypes: float64(2), int64(7), object(1)memory usage: 63.2+ MB

以上数据统计的是用户注册后七天内的数据汇总表格;

无缺失值;

需要将1-9列转化成datetime,int或float类型;

In [38]:

# 修改数据类型reg_sevendays_data.pay_price = reg_sevendays_data.pay_price.astype('float')reg_sevendays_data.register_time = reg_sevendays_data.register_time.astype('datetime64')reg_sevendays_data.avg_online_minutes = reg_sevendays_data.avg_online_minutes.astype('float')reg_sevendays_data.pvp_battle_count = reg_sevendays_data.pvp_battle_count.astype('int')reg_sevendays_data.pvp_lanch_count = reg_sevendays_data.pvp_lanch_count.astype('int')reg_sevendays_data.pvp_win_count = reg_sevendays_data.pvp_win_count.astype('int')reg_sevendays_data.pve_battle_count = reg_sevendays_data.pve_battle_count.astype('int')reg_sevendays_data.pve_lanch_count = reg_sevendays_data.pve_lanch_count.astype('int')reg_sevendays_data.pve_win_count = reg_sevendays_data.pve_win_count.astype('int')

In [39]:

# 查看数据信息reg_sevendays_data.info()

<class 'pandas.core.frame.DataFrame'>RangeIndex: 828934 entries, 0 to 828933Data columns (total 10 columns):user_id828934 non-null int64pay_price 828934 non-null float64register_time 828934 non-null datetime64[ns]avg_online_minutes 828934 non-null float64pvp_battle_count828934 non-null int64pvp_lanch_count 828934 non-null int64pvp_win_count 828934 non-null int64pve_battle_count828934 non-null int64pve_lanch_count 828934 non-null int64pve_win_count 828934 non-null int64dtypes: datetime64[ns](1), float64(2), int64(7)memory usage: 63.2 MB

In [40]:

# 将时间变成Y-m-d类型的数据reg_sevendays_data['register_date'] = reg_sevendays_data.register_time.apply(lambda x : x.strftime('%Y-%m-%d'))

In [41]:

# 查看更改后的数据reg_sevendays_data.head()

Out[41]:

1.新增玩家分析

1.1新增玩家数量

In [42]:

# 查看每日的新增玩家数量reg_sevendays_data.register_date.unique()

Out[42]:

array(['-03-08', '-03-09', '-03-10', '-03-11','-03-12', '-03-13', '-03-14', '-03-15','-03-16', '-03-17', '-03-18', '-03-19','-03-20', '-03-21', '-03-22', '-03-07'],dtype=object)

In [43]:

# 看用户id是否重复reg_sevendays_data.user_id.nunique()

Out[43]:

828934

In [44]:

# 用户ID不重复,根据用户ID计算出每天新增的人数day_grow_num = reg_sevendays_data.groupby('register_date').agg({'user_id':'count'}).reset_index().rename(columns={'user_id':'grow_num'})day_grow_num

Out[44]:

1.2新增付费玩家数量

In [45]:

# 查看付费玩家paying_num = reg_sevendays_data[reg_sevendays_data['pay_price']>0]paying_grow_num = paying_num.groupby('register_date').agg({'user_id':'count'}).reset_index().rename(columns={'user_id':'grow_num'})paying_grow_num

Out[45]:

In [46]:

# 创建画布plt.figure(figsize=(15,8))# 绘制折线图# 实例化ax1 = plt.gca()ax2 = plt.gca()ax1 = plt.gca() # 获取当前轴域ax1.set_xlabel('日期') # 设置x轴标签ax1.set_ylabel('新增玩家人数', color='r') # 设置y轴标签ax1.plot(day_grow_num.register_date, day_grow_num.grow_num, color='red',label='新增玩家人数',marker='o',alpha=0.5) # 数据绘制ax1.tick_params(axis='y', labelcolor='red') # 设置y轴刻度属性ax2 = ax1.twinx() # 创建新axes实例,共享x轴,并设置ax2.set_ylabel('新增付费玩家人数', color='blue')ax2.plot(paying_grow_num.register_date, paying_grow_num.grow_num, color='blue',label='新增付费玩家人数',marker='o',alpha=0.5)ax2.tick_params(axis='y', labelcolor='blue')plt.title('新增玩家数量',size=25)plt.show()

观察上图可知,每日新增玩家在3/10日左右新增玩家有一次大高峰增长,在3/13日左右有一次小增长;新增付费用户数在3/16号达到顶峰,但是后续也是持续下降;说明在这次活动过后,玩家的新增数量没有显著提升,可见活动对于提升游戏的人气帮助不大;活动仍然还需要持续一定的时间,让玩家充分了解游戏。

1.3新增付费玩家占比

In [47]:

# 新增玩家数total_num = day_grow_num.grow_num.sum()total_num

Out[47]:

828934

In [48]:

# 新增付费玩家数paying_num = paying_grow_num.grow_num.sum()paying_num

Out[48]:

19549

In [49]:

# 制作占比的饼状图plt.figure(figsize=(8,8))# 绘图patches,l_text,p_text = plt.pie([total_num-paying_num,paying_num],labels=['未付费','付费'],labeldistance = 0.3,colors=['#87CEFA','#FFC0CB'],explode=[0.01,0.05],autopct='%1.1f%%',pctdistance=1.15)# 设置标签大小for t in l_text:t.set_size(20)# 设置百分数字体大小for t in p_text:t.set_size(20)# 设置标题plt.title('付费用户仅占新增用户的2.4%',size=25)plt.show()

2.玩家活跃度分析

2.1全部玩家平均在线时长

In [50]:

avg_time = reg_sevendays_data.avg_online_minutes.mean()avg_time

Out[50]:

11.62811755821332

2.2 付费玩家的平均在线时长

In [51]:

paying_avg_time = reg_sevendays_data[reg_sevendays_data.pay_price > 0].avg_online_minutes.mean()paying_avg_time

Out[51]:

135.78975906695996

明显可以看出,付费玩家的平均在线时长要远远大于全体玩家的平均值,活跃度比他们高得多。

2.3 平均在线时长的分布特点

In [52]:

# 全体用户的时长分布特点

In [53]:

# 绘制箱线图plt.figure(figsize=(10,10))plt.boxplot(reg_sevendays_data.avg_online_minutes)plt.show()

In [54]:

# 查看描述统计值reg_sevendays_data.avg_online_minutes.describe()

Out[54]:

count 828934.000000mean 11.628118std42.814941min 0.00000025% 0.00000050% 2.00000075% 5.000000max 1606.000000Name: avg_online_minutes, dtype: float64

In [55]:

# 付费用户的时长分布特点

In [56]:

# 绘制箱线图plt.figure(figsize=(10,10))plt.boxplot(reg_sevendays_data[reg_sevendays_data.pay_price > 0].avg_online_minutes)plt.show()

In [57]:

# 查看描述统计值reg_sevendays_data[reg_sevendays_data.pay_price > 0].avg_online_minutes.describe()

Out[57]:

count 19549.000000mean 135.789759std 146.600271min0.00000025% 31.00000050% 84.00000075% 191.000000max 1081.000000Name: avg_online_minutes, dtype: float64

右上面的数据我们可以发现,75%的用户平均使用时长<=5分钟,也就是说用户流失非常严重;

付费用的75%的用户平均在线时长都超过了31分钟;

3.玩家付费情况分析

关键指标

AU、PU、APA、ARPU、ARPPU、PUR

In [58]:

# 每个活跃玩家收入# 活跃用户数AU = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].user_id.count() # 将平均在线时长>=15分钟定义为活跃用户# 总收入total_revenue = reg_sevendays_data.pay_price.sum()# 平均每个活跃用户收入ARPU = total_revenue/AU# 活跃付费用户数APA = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].user_id.count()# 平均付费玩家收入ARPPU = total_revenue/APA# 付费率PUR = APA/AUprint(f'AU:{AU}')print(f'total_revenue:{total_revenue}')print(f'ARPU:{ARPU}')print(f'APA:{APA}')print(f'ARPPU:{ARPPU}')print(f'PUR:{PUR}')

AU:102224total_revenue:556900.0400000003ARPU:5.44784042886211APA:17072ARPPU:32.620667760074994PUR:0.16700579120363124

In [59]:

# 将数据可视化fig,ax = plt.subplots(1,2,figsize=(15,10))ax1,ax2 = ax.flatten()ax1.bar(['AU','APA'],[AU,APA],width=0.5,alpha=0.5)ax1.set_ylabel('活跃人数',size=20)ax2.bar(['ARPU','ARPPU'],[ARPU,ARPPU],width=0.5,color='r',alpha=0.5)ax2.set_ylabel('消费金额',size=20)plt.show()

该游戏的人均付费率ARPU很低,说明游戏收入表现较差,但是对比ARPU,平均每个付费用户的ARPPU很高,是ARPU的6倍多,针对这一点,我们可以开发更多的针对鲸鱼用户和海豚用户的玩法,让他们玩的更开心。

付费率偏低,我们可以开展首冲活动,让用户充值少量的钱,开始逐渐付费,例如充值6元获得限量的礼包。付费率高,就可以更多的获得渠道商的青睐。

4.玩家游戏习惯分析

关键指标 PVP/PVE

4.1AU玩家PVP情况

In [60]:

# 活跃用户平均PVP次数AU_pvp_battle_coun = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pvp_battle_count.mean()# 活跃用护pvp总次数AU_count_pvp = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pvp_battle_count.sum()# 活跃用护pvp发起次数AU_count_lanch_pvp = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pvp_lanch_count.sum()# 活跃用户主动发起PVP概率AU_rate_lanch_pvp = AU_count_lanch_pvp/AU_count_pvp# 活跃用户PVP胜利总次数AU_num_win_pvp = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pvp_win_count.sum()# 活跃用户PVP胜利概率AU_rate_win_pvp = AU_num_win_pvp/AU_count_pvpprint(f'活跃用户平均PVP次数:{AU_pvp_battle_coun}')print(f'活跃用户主动发起PVP概率:{AU_rate_lanch_pvp}')print(f'活跃用户PVP胜利概率:{AU_rate_win_pvp}')

活跃用户平均PVP次数:14.998982626389106活跃用户主动发起PVP概率:0.5679058161194217活跃用户PVP胜利概率:0.5309191680971735

4.2APA玩家PVP情况

In [61]:

# 付费用户平均PVP次数APA_pvp_battle_coun = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pvp_battle_count.mean()# 付费用护pvp总次数APA_count_pvp = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pvp_battle_count.sum()# 付费用护pvp发起次数APA_count_lanch_pvp = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pvp_lanch_count.sum()# 付费用户主动发起PVP概率APA_rate_lanc_pvp = APA_count_lanch_pvp/APA_count_pvp# 付费用户PVP胜利总次数APA_num_win_pvp = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pvp_win_count.sum()# 付费用户PVP胜利概率APA_rate_win_pvp = APA_num_win_pvp/APA_count_pvpprint(f'付费用户平均PVP次数:{APA_pvp_battle_coun}')print(f'付费用户主动发起PVP概率:{APA_rate_lanc_pvp}')print(f'付费用户PVP胜利概率:{APA_rate_win_pvp}')

付费用户平均PVP次数:27.22176663542643付费用户主动发起PVP概率:0.6550900522884255付费用户PVP胜利概率:0.6868289114109267

4.3AU玩家PVE情况

In [62]:

# 活跃用户平均PVP次数AU_pve_battle_coun = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pve_battle_count.mean()# 活跃用护pvp总次数AU_count_pve = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pve_battle_count.sum()# 活跃用护pvp发起次数AU_count_lanch_pve = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pve_lanch_count.sum()# 活跃用户主动发起PVP概率AU_rate_lanch_pve = AU_count_lanch_pve/AU_count_pve# 活跃用户PVP胜利总次数AU_num_win_pve = reg_sevendays_data[reg_sevendays_data.avg_online_minutes>=15].pve_win_count.sum()# 活跃用户PVP胜利概率AU_rate_win_pve = AU_num_win_pve/AU_count_pveprint(f'活跃用户平均PVP次数:{AU_pve_battle_coun}')print(f'活跃用户主动发起PVP概率:{AU_rate_lanch_pve}')print(f'活跃用户PVP胜利概率:{AU_rate_win_pve}')

活跃用户平均PVP次数:27.781333150727814活跃用户主动发起PVP概率:0.9967407521130004活跃用户PVP胜利概率:0.90410430711

4.4APA玩家PVE情况

In [63]:

# 付费用户平均PVe次数APA_pve_battle_coun = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pve_battle_count.mean()# 付费用护pve总次数APA_count_pve = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pve_battle_count.sum()# 付费用护pvp发起次数APA_count_lanch_pve = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pve_lanch_count.sum()# 付费用户主动发起PVe概率APA_rate_lanc_pve = APA_count_lanch_pve/APA_count_pve# 付费用户PVe胜利总次数APA_num_win_pve = reg_sevendays_data[(reg_sevendays_data.avg_online_minutes>=15) & (reg_sevendays_data.pay_price>0)].pve_win_count.sum()# 付费用户PVe胜利概率APA_rate_win_pve = APA_num_win_pve/APA_count_pveprint(f'付费用户平均PVE次数:{APA_pve_battle_coun}')print(f'付费用户主动发起PVE概率:{APA_rate_lanc_pve}')print(f'付费用户PVE胜利概率:{APA_rate_win_pve}')

付费用户平均PVE次数:51.773605904404874付费用户主动发起PVE概率:0.9957120827624596付费用户PVE胜利概率:0.9110330712688048

In [64]:

# 可视化plt.figure(figsize=(15,8))# AU玩家plt.bar([0.75,2.75,4.75,6.75],[AU_rate_lanch_pve,AU_rate_win_pve,AU_rate_lanch_pvp,AU_rate_win_pvp],width=0.5,alpha=0.5,label='AU玩家')plt.bar([1.25,3.25,5.25,7.25],[APA_rate_lanc_pve,APA_rate_win_pve,APA_rate_lanc_pvp,APA_rate_win_pvp],width=0.5,color='r',alpha=0.5,label='APA玩家')plt.xticks([1,3,5,7],['主动发起PVE的概率','PVE获胜概率','主动发起PVP的概率','PVP获胜概率'])plt.legend()plt.show()

在PVE活动中,APA玩家发起进攻的概率和胜利的概率与AU玩家基本持平;另外游戏的PVE难度不高,玩家的PVE胜率为90%,可以开展多种PVE的挑战难度。

在PVP活动中,APA玩家主动发起挑战的概率明显高于AU玩家,并且在对战中获胜的概率更高。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。