本篇文章将带大家学习简单的数据分析,关于pyecharts和pandas部分知识自行学习。
拿到数据,我们先在脑子里想想,我们手中的数据能够分析什么,能够通过可视化能够更直观的反应出什么,我们先来看数据。
- 分析各个结点的通过人数以及离开人数
在这里我们可以先用柱状图分析在每个结点的通过人数和离开人数,能够直观的看出哪个结点通过的人少离开的人最多,更直观的看出断层。
最简单的柱状图,添加x轴数据和y轴数据即可。
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='750px', height='570px')
)
.add_xaxis(self.df['node'].tolist())
.add_yaxis('passnum', self.df['passnum'].tolist())
.add_yaxis('leavenum', self.df['leavings'].tolist())
)
bar.render('GameaNalysis.html')
接着我们开始对其添加各种参数进行调整,最终如下。
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='600px')
)
.add_xaxis(self.df['node'].tolist())
.add_yaxis('passnum', self.df['passnum'].tolist())
.add_yaxis('leavenum', self.df['leavings'].tolist())
.set_global_opts(title_opts=opts.TitleOpts(title='基本情况分析'),
xaxis_opts=opts.AxisOpts(axispointer_opts=opts.AxisPointerOpts(is_show=True, type_='shadow') # x轴引导线
),
yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True), # 背景分割线
axistick_opts=opts.AxisTickOpts(is_show=True) # y轴刻度线
),
datazoom_opts=opts.DataZoomOpts(is_show=True)
)
)
bar.render('GameaNalysis.html')
根据可视化的图形我们能够看出,在新手引导1此处,用户流失的的数量相对于其他结点所流失的跟多,游戏厂商更应该考虑新手引导环节的玩家体验或是此处的复杂度和困难度情况。
- 分析次日的留存人数
次日留存人数的理解应该是第二日某些玩家还在此结点处停留的数量情况。
这里我们可以使用饼图,漏斗图此类的图形,更能直观的反映出情况(漏斗图真的丑),除了任务三即将通关之外,其余的留存人数我们都取下来。
完成,感觉还能够再优化下所展示的数值,更方便我们看到。
pie = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='600px')
)
.add('数量', [list(mtype) for mtype in zip(self.df['node'].tolist(), self.df['savethenextday'].tolist()[0: -1])],
radius=['40%', '70%'], # 掏空部分
center=['50%', '56%'], # 饼图位置
)
.set_global_opts(title_opts=opts.TitleOpts(title='次日留存人数'),
legend_opts=opts.LegendOpts(type_="scroll", pos_right='10%', pos_top='15%', orient="vertical")
)
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {d}% \n数量:{c}')
)
)
return pie
- 相对通过率,绝对通过率,留存率分析
最后到我们的相对通过率,绝对通过率,留存率此类数据的分析,这部分的数据可以用面积折线图以及雷达图等。个人绝对面积折线图更能直观的看出变化。
line = (
Line(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='630px')
)
.add_xaxis(self.df['node'].tolist())
.add_yaxis('相对通过率',
self.df['relativepassrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.add_yaxis('绝对通过率',
self.df['absolutepassrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.add_yaxis('留存率',
self.df['retentionrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.set_global_opts(yaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
max_=1.2
),
xaxis_opts=opts.AxisOpts(axispointer_opts=opts.AxisPointerOpts(is_show=True),
axislabel_opts={'rotate': '30'},
),
title_opts=opts.TitleOpts(title='各比例情况分析', subtitle='最终数据=数值×100%'),
legend_opts=opts.LegendOpts(pos_left='40%')
)
)
return line
效果如下
通过可视化分析我们可以清晰的看出在不同结点的玩家人数情况,在新手引导1处次日留存人数以及离开的人数都相对较高,我们通过面积折线图也能够看出新手引导1到新手引导2之间的坡度较陡。游戏厂商更应该考虑此处的设计情况,是否游戏难度相对于其他结点较高?此处是否给玩家的体验感最差?等等等等。
最后是整体的代码
import pandas as pd
from pyecharts.charts import Bar, Pie, Radar, Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Grid, Page
class analyze:
def __init__(self):
self.df = pd.read_excel('./gameimg.xlsx')
def Bar(self):
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='650px')
)
.add_xaxis(self.df['node'].tolist())
.add_yaxis('passnum', self.df['passnum'].tolist())
.add_yaxis('leavenum', self.df['leavings'].tolist())
.set_global_opts(title_opts=opts.TitleOpts(title='基本情况分析'),
xaxis_opts=opts.AxisOpts(axispointer_opts=opts.AxisPointerOpts(is_show=True, type_='shadow') # x轴引导线
),
yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True), # 背景分割线
axistick_opts=opts.AxisTickOpts(is_show=True) # y轴刻度线
),
datazoom_opts=opts.DataZoomOpts(is_show=True)
)
)
return bar
def Pie(self):
pie = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='600px')
)
.add('数量', [list(mtype) for mtype in zip(self.df['node'].tolist(), self.df['savethenextday'].tolist()[0: -1])],
radius=['40%', '70%'], # 掏空部分
center=['50%', '56%'], # 饼图位置
)
.set_global_opts(title_opts=opts.TitleOpts(title='次日留存人数'),
legend_opts=opts.LegendOpts(type_="scroll", pos_right='10%', pos_top='15%', orient="vertical")
)
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {d}% \n数量:{c}')
)
)
return pie
def Line(self):
line = (
Line(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS, width='1400px', height='630px')
)
.add_xaxis(self.df['node'].tolist())
.add_yaxis('相对通过率',
self.df['relativepassrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.add_yaxis('绝对通过率',
self.df['absolutepassrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.add_yaxis('留存率',
self.df['retentionrate'].tolist(),
is_smooth=True,
is_symbol_show=True, # 是否显示结点 关闭后LabelOpts无效
areastyle_opts=opts.AreaStyleOpts(opacity=0.6), # 透明度
label_opts=opts.LabelOpts(is_show=True) # 是否显示数字
)
.set_global_opts(yaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
max_=1.2
),
xaxis_opts=opts.AxisOpts(axispointer_opts=opts.AxisPointerOpts(is_show=True),
axislabel_opts={'rotate': '30'},
),
title_opts=opts.TitleOpts(title='各比例情况分析', subtitle='最终数据=数值×100%'),
legend_opts=opts.LegendOpts(pos_left='40%')
)
)
return line
def main(self):
Bar = analyze().Bar()
Pie = analyze().Pie()
Line = analyze().Line()
page = Page(layout=Page.SimplePageLayout)
page.add(Bar)
page.add(Pie)
page.add(Line)
page.render('GameaNalysis.html')
print('Successfully generated visualization chart!')
if __name__ == '__main__':
analyze().main()
歇逼了
Original: https://blog.csdn.net/weixin_52807972/article/details/126044359
Author: IceLandk
Title: 某游戏客户流失情况数据分析
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/696526/
转载文章受原作者版权保护。转载请注明原作者出处!