大数据分析——对游戏“野蛮时代”玩家进行大数据分析

一、选题的背景

  随着大数据时代的到来,许多游戏公司开始借助数据来进行游戏运营和改进。对游戏“野蛮时代”进行数据分析,首先离不开对游戏的了解,不了解游戏很可能会影响自己的分析,从而得出错误的结论。在体验了游戏之余,混迹了微博、贴吧等社群,对游戏的玩法有了一定了解后,对数据集的各种字段代表的含义也有了一定的理解,由此开始对该数据集进行数据分析。本次选题的游戏为“野蛮时代”,该游戏是一款建立在战争策略上的游戏,玩家需要建立城市、招募军队、攻打敌人等。本次选题旨在通过对“野蛮时代”玩家的大数据分析,了解玩家的行为特征和游戏体验,从而为游戏的运营和改进提供决策支持。

  通过对这些数据指标的分析,可以更好地了解用户的需求和行为,从而优化游戏设计和运营策略,提高用户满意度和留存率。

二、数据分析设计方案

  本次数据分析的设计方案为:先从游戏数据库中获取玩家的数据,然后使用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对大数据进行分析。

 

 

 

 

 

posted @ 2023-06-07 13:14  林菁  阅读(648)  评论(0)    收藏  举报