大数据分析——对游戏“野蛮时代”玩家进行大数据分析
一、选题的背景
随着大数据时代的到来,许多游戏公司开始借助数据来进行游戏运营和改进。对游戏“野蛮时代”进行数据分析,首先离不开对游戏的了解,不了解游戏很可能会影响自己的分析,从而得出错误的结论。在体验了游戏之余,混迹了微博、贴吧等社群,对游戏的玩法有了一定了解后,对数据集的各种字段代表的含义也有了一定的理解,由此开始对该数据集进行数据分析。本次选题的游戏为“野蛮时代”,该游戏是一款建立在战争策略上的游戏,玩家需要建立城市、招募军队、攻打敌人等。本次选题旨在通过对“野蛮时代”玩家的大数据分析,了解玩家的行为特征和游戏体验,从而为游戏的运营和改进提供决策支持。
通过对这些数据指标的分析,可以更好地了解用户的需求和行为,从而优化游戏设计和运营策略,提高用户满意度和留存率。
二、数据分析设计方案
本次数据分析的设计方案为:先从游戏数据库中获取玩家的数据,然后使用Python和Pandas进行数据处理和清洗,了解数据库,通过sql语句查出来符合分析要求的数据通过pandas分析matplotlib和pyecharts画图分析出来可视化结果。
三、数据分析步骤
1、数据源:数据来源于野蛮时代官网 https://ym.tap4fun.com/
2、数据清洗过程:
首先需要从游戏数据库中获取玩家的数据,包括玩家的基本信息、游戏行为数据等。数据获取后,需要进行清洗和预处理,包括去除重复数据、空值填充、异常值处理等。在清洗完数据之后,需要对数据进行特征工程,将原始数据转化为可用于学习算法的特征向量。
import pandas as pd #导入pandas库 from sqlalchemy import create_engine #导入create_engine库用于创建数据库引擎 #读取两个数据库 df = pd.read_csv("tap_fun_test.csv") #读取tap_fun_test.csv文件到DataFrame df1 = pd.read_csv("tap_fun_train.csv") list1 = []#定义一个空列表list1 df = df[ ['user_id', 'register_time', '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'] ] # 筛选出tap_fun_test.csv文件中想要的列,重新赋值给df df1 = df1[ ['user_id', 'register_time', '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'] ] # 筛选出tap_fun_train.csv文件中想要的列,重新赋值给df1 list1.append(df) #将df数据拼接到list1中 list1.append(df1) #将df1数据拼接到list1中 data = pd.concat(list1)# 将拼接后的list1组合成一个数据集data engine = create_engine('mysql://root:LAS1234567878@12@localhost:3306/big?charset=utf8')# 定义一个MySQL数据库引擎engine data.to_sql('age_of_barbarians', con=engine, index=False, if_exists='append') #将数据集data插入到MySQL数据库的表age_of_barbarians中,如果表age_of_barbarians已经存在,则将数据集追加到表age_of_barbarians之后

3、大数据分析过程
使用Matplotlib等Python库对数据进行可视化和探索性分析。通过绘制直方图、折线线图等图表,可以深入了解玩家的游戏习惯、行为特征等信息。同时,可以通过相关性分析等方法探索不同特征之间的关系。
(1)导入库
import os #导入os库用于与操作系统交互 import pandas as pd from sqlalchemy import create_engine from pyecharts import options as opts #导入pycharts库中option模块,用于设置图表属性 from pyecharts.charts import Pie, Line, Bar, Liquid engine = create_engine('mysql://root:LAS1234567878@12@localhost/big?charset=utf8') #连接MySQL数据库,查询数据并将结果保存到data中

#存储代码路径和文件名称


(2)PU占比
# PU 占比 sql = """ select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`, sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户` from age_of_barbarians """#定义一个SQL语句,查询付费用户和非付费用户的数量 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c1 = ( Pie()#创建一个Pie对象 .add( "",#设置饼图的标题 [list(z) for z in zip(data.columns, data.values[0])], )#将查询结果转为列表,并使用zip函数将列表打包为元组,最后将元组列表作为Pie图的数据项 .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} 占比: {d}%")) .render("pie_pu.html")#将饼图保存为一个html文件 ) os.system("pie_pu.html")#使用os.system()函数打开生成的html文件,显示饼图结果。


(3)DNU柱形图
# DNU 柱形图 sql = """ select cast(register_time as date) as day, count(1) as dnu from age_of_barbarians group by cast(register_time as date) order by day; """#定义一个SQL语句,查询每日新增用户数量 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c2 = ( Bar()#创建一个Bar对象 .add_xaxis(list(data['day']))#设置柱状图的x轴数据为日期列表 .add_yaxis("新增用户数", list(data['dnu'])) #设置柱状图的y轴数据为每日新增用户数量列表 .set_global_opts(title_opts=opts.TitleOpts(title="每日新增用户数量"))#设置柱状图的标题和全局参数 .render("bar_dnu.html") #将柱状图保存为一个html文件 ) os.system("bar_dnu.html") #使用os.system()函数打开生成的html文件,显示柱状图结果。


(4)每小时注册情况
# 每小时注册情况 sql = """ select hour(cast(register_time as datetime)) as hour, count(1) as dnu from age_of_barbarians group by hour(cast(register_time as datetime)) order by hour; """ data = pd.read_sql(con=engine, sql=sql) #使用pd.read_sql函数将结果保存到data中 c3 = ( Line() #创建一个Line对象 .add_xaxis(list(data['hour'])) #设置折线图的x轴数据为小时列表 .add_yaxis("新增用户数", list(data['dnu'])) #设置折线图的y轴数据为每小时新增用户数量列表 .set_global_opts(title_opts=opts.TitleOpts(title="每小时新增用户数量"))#设置折线图的标题和全局参数 .render("line_dnu.html")#将折线图保存为一个html文件 ) os.system("line_dnu.html")#使用os.system()函数打开生成的html文件,显示折线图结果。


(5)平均在线时长
# 平均在线时长 sql = """ select avg(avg_online_minutes) as `平均在线时长`, sum(case when pay_price > 0 then avg_online_minutes else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费玩家在线时长`, sum(case when pay_price > 0 then 0 else avg_online_minutes end) / sum(case when pay_price > 0 then 0 else 1 end) as `非付费玩家在线时长` from age_of_barbarians; """#定义一个SQL语句,查询平均在线时长、付费玩家在线时长、非付费玩家在线时长 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c4 = ( Bar() .add_xaxis(list(data.columns))#设置柱状图的x轴数据为列名列表 .add_yaxis("平均在线时长(单位:分钟)", list(data.values[0]))#设置柱状图的y轴数据为平均在线时长、付费玩家在线时长、非付费玩家在线时长 .set_global_opts(title_opts=opts.TitleOpts(title="平均在线时长")) #设置柱状图的标题和全局参数 .render("bar_online.html")#将柱状图保存为一个html文件 ) os.system("bar_online.html") #使用os.system()函数打开生成的html文件,显示柱状图结果。


(6)付费比例
# 付费比率 sql = """ select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) / sum(case when avg_online_minutes > 0 then 1 else 0 end) as `rate` from age_of_barbarians; """ #定义一个SQL语句,查询付费比率 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c5 = ( Liquid()#创建一个Liquid对象 .add("lq", [data['rate'][0], data['rate'][0]]) #设置水球图的数据为付费比率 .set_global_opts(title_opts=opts.TitleOpts(title="付费比率"))#设置水球图的标题和全局参数 .render("liquid_base.html") #将水球图保存为一个html文件 ) os.system("liquid_base.html")#使用os.system()函数打开生成的html文件,显示水球图结果。


(7)用户游戏胜率
# 用户游戏胜率 sql = """ select 'PVP' as `游戏类型`, sum(pvp_win_count) / sum(pvp_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pvp_win_count else 0 end) / sum(case when pay_price > 0 then pvp_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pvp_win_count else 0 end) / sum(case when pay_price = 0 then pvp_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians union all select 'PVE' as `游戏类型`, sum(pve_win_count) / sum(pve_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pve_win_count else 0 end) / sum(case when pay_price > 0 then pve_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pve_win_count else 0 end) / sum(case when pay_price = 0 then pve_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians """#定义一个SQL语句,查询游戏胜率 data = pd.read_sql(con=engine, sql=sql) #使用pd.read_sql函数将结果保存到data中 data = pd.read_sql(con=engine, sql=sql) c6 = ( Bar() #创建一个Bar对象 .add_dataset( source=[data.columns.tolist()] + data.values.tolist() #设置数据集 ) .add_yaxis(series_name="平均胜率", y_axis=[])#设置平均胜率柱状图 .add_yaxis(series_name="付费用户胜率", y_axis=[]) #设置付费用户胜率柱状图 .add_yaxis(series_name="非付费用户胜率", y_axis=[])#设置非付费用户胜率柱状图 .set_global_opts( title_opts=opts.TitleOpts(title="游戏胜率"), #设置柱状图的标题和全局参数 xaxis_opts=opts.AxisOpts(type_="category"), #设置x轴数据类型为分类数据类型 ) .render("dataset_bar_rate.html")#将柱状图保存为一个html文件 ) os.system("dataset_bar_rate.html")#使用os.system()函数打开生成的html文件,显示数据集柱状图结果。



(8)用户游戏场次
# 用户游戏场次 sql = """ select 'PVP' as `游戏类型`, avg(pvp_battle_count) as `平均场次`, sum(case when pay_price > 0 then pvp_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pvp_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians union all select 'PVE' as `游戏类型`, avg(pve_battle_count) as `均场次`, sum(case when pay_price > 0 then pve_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pve_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians """# 使用 Pandas 库的 read_sql 函数从数据库中读取数据,并存储在 data 变量中 data = pd.read_sql(con=engine, sql=sql) c7 = ( Bar() .add_dataset(# 添加数据源,将列名和行数据组成的列表作为参数传递 source=[data.columns.tolist()] + data.values.tolist() ) .add_yaxis(series_name="平均场次", y_axis=[])# 添加平均场次系列 .add_yaxis(series_name="付费用户平均场次", y_axis=[]) # 添加付费用户平均场次系列 .add_yaxis(series_name="非付费用户平均场次", y_axis=[])# 添加非付费用户平均场次系列 .set_global_opts(# 设置全局选项,包括图表标题和 x 轴标签 title_opts=opts.TitleOpts(title="游戏场次"), xaxis_opts=opts.AxisOpts(type_="category"), ) .render("dataset_bar_times.html")# 渲染生成 HTML 文件 ) os.system("dataset_bar_times.html")# 在操作系统中打开 HTML 文件


4、完整程序源代码
import pandas as pd #导入pandas库 from sqlalchemy import create_engine #导入create_engine库用于创建数据库引擎 #读取两个数据库 df = pd.read_csv("tap_fun_test.csv") #读取tap_fun_test.csv文件到DataFrame df1 = pd.read_csv("tap_fun_train.csv") list1 = []#定义一个空列表list1 df = df[ ['user_id', 'register_time', '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'] ] # 筛选出tap_fun_test.csv文件中想要的列,重新赋值给df df1 = df1[ ['user_id', 'register_time', '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'] ] # 筛选出tap_fun_train.csv文件中想要的列,重新赋值给df1 list1.append(df) #将df数据拼接到list1中 list1.append(df1) #将df1数据拼接到list1中 data = pd.concat(list1)# 将拼接后的list1组合成一个数据集data engine = create_engine('mysql://root:LAS1234567878@12@localhost:3306/big?charset=utf8')# 定义一个MySQL数据库引擎engine data.to_sql('age_of_barbarians', con=engine, index=False, if_exists='append') #将数据集data插入到MySQL数据库的表age_of_barbarians中,如果表age_of_barbarians已经存在,则将数据集追加到表age_of_barbarians之后
import os #导入os库用于与操作系统交互 import pandas as pd from sqlalchemy import create_engine from pyecharts import options as opts #导入pycharts库中option模块,用于设置图表属性 from pyecharts.charts import Pie, Line, Bar, Liquid # 导入Pie饼图模块,导入pandas库 engine = create_engine('mysql://root:LAS1234567878@12@localhost/big?charset=utf8') #定义一个MySQL数据库引擎engine # PU 占比 sql = """ select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`, sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户` from age_of_barbarians """#定义一个SQL语句,查询付费用户和非付费用户的数量 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c1 = ( Pie()#创建一个Pie对象 .add( "",#设置饼图的标题 [list(z) for z in zip(data.columns, data.values[0])], )#将查询结果转为列表,并使用zip函数将列表打包为元组,最后将元组列表作为Pie图的数据项 .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} 占比: {d}%")) .render("pie_pu.html")#将饼图保存为一个html文件 ) os.system("pie_pu.html")#使用os.system()函数打开生成的html文件,显示饼图结果。 # DNU 柱形图 sql = """ select cast(register_time as date) as day, count(1) as dnu from age_of_barbarians group by cast(register_time as date) order by day; """#定义一个SQL语句,查询每日新增用户数量 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c2 = ( Bar()#创建一个Bar对象 .add_xaxis(list(data['day']))#设置柱状图的x轴数据为日期列表 .add_yaxis("新增用户数", list(data['dnu'])) #设置柱状图的y轴数据为每日新增用户数量列表 .set_global_opts(title_opts=opts.TitleOpts(title="每日新增用户数量"))#设置柱状图的标题和全局参数 .render("bar_dnu.html") #将柱状图保存为一个html文件 ) os.system("bar_dnu.html") #使用os.system()函数打开生成的html文件,显示柱状图结果。 # 每小时注册情况 sql = """ select hour(cast(register_time as datetime)) as hour, count(1) as dnu from age_of_barbarians group by hour(cast(register_time as datetime)) order by hour; """ data = pd.read_sql(con=engine, sql=sql) #使用pd.read_sql函数将结果保存到data中 c3 = ( Line() #创建一个Line对象 .add_xaxis(list(data['hour'])) #设置折线图的x轴数据为小时列表 .add_yaxis("新增用户数", list(data['dnu'])) #设置折线图的y轴数据为每小时新增用户数量列表 .set_global_opts(title_opts=opts.TitleOpts(title="每小时新增用户数量"))#设置折线图的标题和全局参数 .render("line_dnu.html")#将折线图保存为一个html文件 ) os.system("line_dnu.html")#使用os.system()函数打开生成的html文件,显示折线图结果。 # 平均在线时长 sql = """ select avg(avg_online_minutes) as `平均在线时长`, sum(case when pay_price > 0 then avg_online_minutes else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费玩家在线时长`, sum(case when pay_price > 0 then 0 else avg_online_minutes end) / sum(case when pay_price > 0 then 0 else 1 end) as `非付费玩家在线时长` from age_of_barbarians; """#定义一个SQL语句,查询平均在线时长、付费玩家在线时长、非付费玩家在线时长 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c4 = ( Bar() .add_xaxis(list(data.columns))#设置柱状图的x轴数据为列名列表 .add_yaxis("平均在线时长(单位:分钟)", list(data.values[0]))#设置柱状图的y轴数据为平均在线时长、付费玩家在线时长、非付费玩家在线时长 .set_global_opts(title_opts=opts.TitleOpts(title="平均在线时长")) #设置柱状图的标题和全局参数 .render("bar_online.html")#将柱状图保存为一个html文件 ) os.system("bar_online.html") #使用os.system()函数打开生成的html文件,显示柱状图结果。 # 付费比率 sql = """ select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) / sum(case when avg_online_minutes > 0 then 1 else 0 end) as `rate` from age_of_barbarians; """ #定义一个SQL语句,查询付费比率 data = pd.read_sql(con=engine, sql=sql)#使用pd.read_sql函数将结果保存到data中 c5 = ( Liquid()#创建一个Liquid对象 .add("lq", [data['rate'][0], data['rate'][0]]) #设置水球图的数据为付费比率 .set_global_opts(title_opts=opts.TitleOpts(title="付费比率"))#设置水球图的标题和全局参数 .render("liquid_base.html") #将水球图保存为一个html文件 ) os.system("liquid_base.html")#使用os.system()函数打开生成的html文件,显示水球图结果。 # 用户游戏胜率 sql = """ select 'PVP' as `游戏类型`, sum(pvp_win_count) / sum(pvp_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pvp_win_count else 0 end) / sum(case when pay_price > 0 then pvp_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pvp_win_count else 0 end) / sum(case when pay_price = 0 then pvp_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians union all select 'PVE' as `游戏类型`, sum(pve_win_count) / sum(pve_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pve_win_count else 0 end) / sum(case when pay_price > 0 then pve_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pve_win_count else 0 end) / sum(case when pay_price = 0 then pve_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians """#定义一个SQL语句,查询游戏胜率 data = pd.read_sql(con=engine, sql=sql) #使用pd.read_sql函数将结果保存到data中 data = pd.read_sql(con=engine, sql=sql) c6 = ( Bar() #创建一个Bar对象 .add_dataset( source=[data.columns.tolist()] + data.values.tolist() #设置数据集 ) .add_yaxis(series_name="平均胜率", y_axis=[])#设置平均胜率柱状图 .add_yaxis(series_name="付费用户胜率", y_axis=[]) #设置付费用户胜率柱状图 .add_yaxis(series_name="非付费用户胜率", y_axis=[])#设置非付费用户胜率柱状图 .set_global_opts( title_opts=opts.TitleOpts(title="游戏胜率"), #设置柱状图的标题和全局参数 xaxis_opts=opts.AxisOpts(type_="category"), #设置x轴数据类型为分类数据类型 ) .render("dataset_bar_rate.html")#将柱状图保存为一个html文件 ) os.system("dataset_bar_rate.html")#使用os.system()函数打开生成的html文件,显示数据集柱状图结果。 # 用户游戏场次 sql = """ select 'PVP' as `游戏类型`, avg(pvp_battle_count) as `平均场次`, sum(case when pay_price > 0 then pvp_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pvp_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians union all select 'PVE' as `游戏类型`, avg(pve_battle_count) as `均场次`, sum(case when pay_price > 0 then pve_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pve_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians """# 使用 Pandas 库的 read_sql 函数从数据库中读取数据,并存储在 data 变量中 data = pd.read_sql(con=engine, sql=sql) c7 = ( Bar() .add_dataset(# 添加数据源,将列名和行数据组成的列表作为参数传递 source=[data.columns.tolist()] + data.values.tolist() ) .add_yaxis(series_name="平均场次", y_axis=[])# 添加平均场次系列 .add_yaxis(series_name="付费用户平均场次", y_axis=[]) # 添加付费用户平均场次系列 .add_yaxis(series_name="非付费用户平均场次", y_axis=[])# 添加非付费用户平均场次系列 .set_global_opts(# 设置全局选项,包括图表标题和 x 轴标签 title_opts=opts.TitleOpts(title="游戏场次"), xaxis_opts=opts.AxisOpts(type_="category"), ) .render("dataset_bar_times.html")# 渲染生成 HTML 文件 ) os.system("dataset_bar_times.html")# 在操作系统中打开 HTML 文件
-- 解决精度问题 -- 修改字段类型 alter table age_of_barbarians modify register_time timestamp(0); alter table age_of_barbarians modify avg_online_minutes float(10, 2); alter table age_of_barbarians modify pay_price float(10, 2); -- 1.用户分析 -- 用户总量 select count(1) as total, count(distinct user_id) as users from age_of_barbarians; -- PU ( Paying Users):付费用户总量 select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`, sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户` from age_of_barbarians; -- DNU(Daily New Users): 每日游戏中的新登入用户数量,即每日新用户数。 select cast(register_time as date) as day, count(1) as dnu from age_of_barbarians group by cast(register_time as date) order by day; -- 每小时的新登入用户数量 select hour(cast(register_time as datetime)) as hour, count(1) as dnu from age_of_barbarians group by hour(cast(register_time as datetime)) order by hour; # 2.用户活跃度分析 -- 平均在线时长 select avg(avg_online_minutes) as `平均在线时长`, sum(case when pay_price > 0 then avg_online_minutes else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户在线时长`, sum(case when pay_price > 0 then 0 else avg_online_minutes end) / sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户在线时长` from age_of_barbarians; # --3.用户付费情况分析 -- APA(Active Payment Account):活跃付费用户数。 select count(1) as APA from age_of_barbarians where pay_price > 0 and avg_online_minutes > 0; -- 60987 -- ARPU(Average Revenue Per User) :平均每用户收入。 select sum(pay_price) / sum(case when avg_online_minutes > 0 then 1 else 0 end) from age_of_barbarians; -- 0.582407 -- ARPPU (Average Revenue Per Paying User): 平均每付费用户收入。 select sum(pay_price) / sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) from age_of_barbarians; -- 29.190265 -- PUR(Pay User Rate):付费比率,可通过 APA/AU 计算得出。 select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) / sum(case when avg_online_minutes > 0 then 1 else 0 end) from age_of_barbarians; -- 0.02 -- 付费用户人数,付费总额,付费总次数,平均每人付费,平均每人付费次数,平均每次付费 select count(1) as pu, -- 60988 sum(pay_price) as sum_pay_price, -- 1780226.7 avg(pay_price) as avg_pay_price, -- 29.189786 sum(pay_count) as sum_pay_count, -- 193030 avg(pay_count) as avg_pay_count, -- 3.165 sum(pay_price) / sum(pay_count) as each_pay_price -- 9.222539 from age_of_barbarians where pay_price > 0; # --4.用户习惯分析 # # --胜率 select 'PVP' as `游戏类型`, sum(pvp_win_count) / sum(pvp_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pvp_win_count else 0 end) / sum(case when pay_price > 0 then pvp_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pvp_win_count else 0 end) / sum(case when pay_price = 0 then pvp_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians union all select 'PVE' as `游戏类型`, sum(pve_win_count) / sum(pve_battle_count) as `平均胜率`, sum(case when pay_price > 0 then pve_win_count else 0 end) / sum(case when pay_price > 0 then pve_battle_count else 0 end) as `付费用户胜率`, sum(case when pay_price = 0 then pve_win_count else 0 end) / sum(case when pay_price = 0 then pve_battle_count else 0 end) as `非付费用户胜率` from age_of_barbarians; # --pvp场次 select 'PVP' as `游戏类型`, avg(pvp_battle_count) as `平均场次`, sum(case when pay_price > 0 then pvp_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pvp_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians union all select 'PVE' as `游戏类型`, avg(pve_battle_count) as `均场次`, sum(case when pay_price > 0 then pve_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`, sum(case when pay_price = 0 then pve_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次` from age_of_barbarians
四、总结
1、通过对以上的数据的挖掘和对这些数据指标的分析,可以深入了解玩家的行为特征和游戏体验,从而对游戏进行改进和优化。同时,本次分析结果还可以为游戏公司提供决策支持,包括针对不同玩家群体的市场推广策略、游戏设计和运营策略等。从而更好地了解用户的需求和行为,从而优化游戏设计和运营策略,提高用户满意度和留存率。
2、通过这次的课程设计,加强了我在python高级运用的技能。途中遇到麻烦时还请教了数据库老师,向他答疑解惑,与此同时我也更加清楚和了解如何结合使用sql和python对大数据进行分析。

浙公网安备 33010602011771号