【导语】:今天我们来聊聊英雄联盟传奇选手Uzi,Python技术部分请看第四部分。Show me data,用数据说话
最近,在被B站的「后浪」和「入海」刷屏后,一个男人也官宣了退役。他就是英雄联盟知名选手Uzi,有许多人在感慨“神退役了,我的青春结束了”。一时间Uzi的退役引起网络热议,“电竞”一词再度冲上热搜榜首,作为电竞产业快速发展过程中的代表性人物,Uzi这次在6月3日官宣由于手伤和糖尿病的身体情况影响不得以退役,不禁令人唏嘘。
今天,我们就带你用数据盘点一下英雄联盟传奇选手Uzi的职业生涯。
01、从网瘾少年到年薪千万的电竞天才
说起Uzi,如果有玩游戏的小伙伴,对这个名字肯定不会陌生。Uzi,真名简自豪,人称小狗,站在电子竞技顶峰的男人,不不,更准确的说应该是站在电子竞技商业价值顶峰的男人,唯一一个和NIKE签约的电子竞技选手。
Uzi在英雄联盟的整个职业生涯中取得非常辉煌耀眼的成绩,在英雄联盟乃至整个电子竞技圈声名赫赫。在英雄联盟领域,Uzi获得过很多冠军,也收获了众多的粉丝。在2018年的雅加达亚运会上,他率领国家队击败了强大的韩国队,从而帮助中国获得了历史首枚电竞亚运会金牌。
提到小狗,我们就不得不提到皇族,小狗的在新老皇族待了7年,中途离开还是因为皇族降级到低级别联赛,所以不要说小狗是三姓家奴,感觉还是很忠诚的。小狗职业生涯也有不少迷之操作,著名的就是世界赛“灯笼我不捡,八强我自豪”,还有著名的洗澡事件,永获洗澡狗成就。
下面我们就结合他的职业生涯数据,总结一下Uzi作为选手的表现。
02、2013-2019 Uzi 七年职业生涯数据
我们整理了Uzi从13年到19年的数据,具体的代码解说请看第四部分。
Uzi各年度赛事表现
首先看到Uzi的各年度赛事表现,这里可以看到柱状图表示的是胜负,红为胜、蓝为负,曲线为胜率。
18年应该是巅峰,但是懂的人都知道,18年的皇族应该是最有希望的一年,国内横扫,队内关系好,亚运会中国夺冠当中就有4个RNG成员。但是再多的荣耀也抵不过S赛输给G2,赛前感觉能把对手锤进土里,赛后被所有人锤进土里,这可能是Uzi退役的转折点。那届世界赛RNG败给了自己,IG败给了女团,要不是王校长出面,IG可能是历史最惨的冠军。
Uzi击杀/死亡/KDA曲线图
我们再看Uzi各年击杀/死亡/KDA曲线图,17年KDA最高,18年击杀最多。只能说18年的RNG内战真的强,但是15年的3.8是什么鬼,在QG到底经历了什么,有知道答案就可以给我们留言哦。
Uzi最喜欢使用的英雄Top10
看到这张图,Uzi比赛最爱用的英雄,EZ男枪领先不意外,毕竟是一代版本一代神。但是VN也能排名靠前,只能说果然是本命英雄,操作真的好。
Uzi使用英雄Top10表现
我们把X锁定,就是英雄锁定,切换到KDA和最高击杀的曲线图,卡莎还是最稳定的,所以在最近的LPL里,卡莎都是非ban必选的英雄,寒冰的KDA和人头差距有点大,证明寒冰果然是真工具人。
Uzi使用Top10英雄补兵/经济表现
最后看到补兵和经济,卡莎再次荣登榜首,还是英雄太适合比赛了,说到补兵,你们应该也忘不了Uzi名场面,为了补兵1打5。
03、微博数据和B站数据
Uzi官宣退役微博数据
我们爬取了小狗的退役微博,做了用户画像:
Uzi微博粉丝性别占比
可以看到男性粉丝占到绝大多数,高达76.61%。女性粉丝为23.39%。
Uzi微博粉丝年龄分布
发现小狗真的是90后的青春,90后粉丝占比最高,达到66.7%。只能长叹到,我们的青春真的结束了!其次是00后,占比20.08%。
Uzi微博评论词云图
词云图也可以看到都是鼓励小狗继续前进的话,但是吧,作为一个签约nike 的选手,退役后应该不会比某某开差的。
Uzi入驻B站 词云数据
我们还做了小狗在B站发的第一条视频评论的词云图:这个视频于6月5日发布到B站,目前这个视频累计播放量达到853.6万,弹幕为4.4万。最高全站日排名第一。
Uzi B站第一条视频评论数据
C君认为亮点还是在于这个二级,在之前采访厂长说:“和Uzi打,二级抓下就完事了。”可能这句话会一直持续到小狗结束直播生涯。
05、用Python爬取Uzi,七年职业生涯数据
我们使用Python获取并分析了score网站、微博和B站相关的数据,进行了分析。此处展示赛事数据分析的代码。
01 数据读入
首先读入分析所用的数据集,包含2013~2019年UZI赛事整体表现和使用英雄数据,数据预览如下:
# 导入包 import numpy as np import pandas as pd # 读入英雄数据 df_hero = pd.DataFrame() for i in range(7): df = pd.read_excel('../data/UZI赛事数据.xlsx', sheet_name=i) df_hero = df_hero.append(df, ignore_index=True) df_hero.head()
# 读入比赛数据 df_com = pd.read_excel('../data/UZI赛事数据.xlsx', sheet_name=7) df_com
02 数据清洗
此处我们对数据进行初步处理,主要包含:
# 胜负 df_hero['胜场'] = df_hero['胜负'].str.extract('W-(\d+)L').astype('int') df_hero['负场'] = df_hero['胜负'].str.extract('W-.*?L-(\d+)').astype('int') # KDA提取数值 df_hero['KDA_2'] = df_hero['KDA'].str.extract('(\d+.*\d+)').astype('float') df_hero.head()
03 数据可视化
首先导入可视化库,确定分析的目的:
from pyecharts.charts import Bar, Line, Pie, Page from pyecharts import options as opts
UZI使用英雄数据分析
UZI各年度参赛场次及胜负场走势图
df_com.head()
df_com = df_com.sort_values('年份') df_com['KDA'] = df_com.KDA.str.extract(r'(\d+.*\d+)') # 提取数据 x1_line1 = df_com['年份'].values.astype('str').tolist() y1_line1 = df_com['胜场'].values.tolist() y1_line2 = df_com['负场'].values.tolist() y1_line3 = [i*100 for i in df_com['胜率']] # 条形图 bar1 = Bar() bar1.add_xaxis(x1_line1) bar1.add_yaxis('胜场', y1_line1) bar1.add_yaxis('负场', y1_line2) bar1.extend_axis(yaxis=opts.AxisOpts(name='胜率', axislabel_opts=opts.LabelOpts(formatter="{value}%")) ) bar1.set_global_opts( title_opts=opts.TitleOpts('UZI各年度赛事表现'), yaxis_opts=opts.AxisOpts(name='场次', axislabel_opts=opts.LabelOpts(formatter="{value}次")) ) # 折线图 line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line1.add_xaxis(x1_line1) line1.add_yaxis('胜率', y1_line3, yaxis_index=1) # 层叠图 bar1.overlap(line1) bar1.render()
df_com.KDA.str.extract('(\\d+)')
# 条形图 bar1 = Bar() bar1.add_xaxis(x1_line1) bar1.add_yaxis('胜场', y1_line1) bar1.add_yaxis('负场', y1_line2) bar1.extend_axis(yaxis=opts.AxisOpts(name='胜率', axislabel_opts=opts.LabelOpts(formatter="{value}%")) ) bar1.set_global_opts( title_opts=opts.TitleOpts('UZI各年度赛事表现'), yaxis_opts=opts.AxisOpts(name='场次', axislabel_opts=opts.LabelOpts(formatter="{value}次")) ) # 折线图 line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line1.add_xaxis(x1_line1) line1.add_yaxis('胜率', y1_line3, yaxis_index=1) # 层叠图 bar1.overlap(line1) bar1.render()
UZI各年度赛事整体表现
df_com['击杀总数'] = df_com['击杀总数(场均)'].str.extract(r'(\d+)').astype('int') df_com['死亡总数'] = df_com['死亡总数(场均)'].str.extract(r'(\d+)').astype('int') # 提取数据 x1_line1 = df_com.年份.astype('str').values.tolist() y1_line1 = df_com.击杀总数.values.tolist() y1_line2 = df_com.死亡总数.values.tolist() y1_line3 = df_com.KDA.values.tolist() # 折线图 line2 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line2.add_xaxis(x1_line1) line2.add_yaxis('击杀', y1_line1) line2.add_yaxis('死亡', y1_line2) line2.extend_axis(yaxis=opts.AxisOpts(name='KDA', axislabel_opts=opts.LabelOpts(formatter="{value}")) ) line2.set_global_opts( title_opts=opts.TitleOpts('UZI各年度赛事表现'), yaxis_opts=opts.AxisOpts(name='次数') ) line2.set_series_opts(linestyle_opts=opts.LineStyleOpts(width=3)) # 折线图 line3 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line3.add_xaxis(x1_line1) line3.add_yaxis('KDA', y1_line3, yaxis_index=1) # 层叠 line2.overlap(line3) line2.render()
x1_line1 = df_com.年份.astype('str').values.tolist() y1_line1 = df_com.击杀总数.values.tolist() y1_line2 = df_com.死亡总数.values.tolist() y1_line3 = df_com.KDA.values.tolist()
# 折线图 line2 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line2.add_xaxis(x1_line1) line2.add_yaxis('击杀', y1_line1) line2.add_yaxis('死亡', y1_line2) line2.extend_axis(yaxis=opts.AxisOpts(name='KDA', axislabel_opts=opts.LabelOpts(formatter="{value}")) ) line2.set_global_opts( title_opts=opts.TitleOpts('UZI各年度赛事表现'), yaxis_opts=opts.AxisOpts(name='次数') ) line2.set_series_opts(linestyle_opts=opts.LineStyleOpts(width=3)) # 折线图 line3 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line3.add_xaxis(x1_line1) line3.add_yaxis('KDA', y1_line3, yaxis_index=1) # 层叠 line2.overlap(line3) line2.render()
UZI最喜欢使用的英雄Top10
x1_line1 = df_com.年份.values.astype('str').tolist() y1_line1 = df_com.胜场.values.tolist() y1_line2 = df_com.负场.values.tolist() y1_line3 = [i*100 for i in df_com.胜率]
# 条形图 bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) bar1.add_xaxis(x1_line1) bar1.add_yaxis('胜场', y1_line1) bar1.add_yaxis('负场', y1_line2) bar1.extend_axis(yaxis=opts.AxisOpts(name='胜率', axislabel_opts=opts.LabelOpts(formatter="{value}%")) ) bar1.set_global_opts( title_opts=opts.TitleOpts('UZI各年度赛事表现'), yaxis_opts=opts.AxisOpts(name='场次', axislabel_opts=opts.LabelOpts(formatter="{value}次")) ) # 折线图 line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px')) line1.add_xaxis(x1_line1) line1.add_yaxis('胜率', y1_line3, yaxis_index=1) # 层叠 bar1.overlap(line1) bar1.render()
hero_num = df_hero.groupby('英雄')['场次'].sum().sort_values(ascending=False) # 柱形图 bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) bar2.add_xaxis(hero_num[:10].index.tolist()) bar2.add_yaxis('', hero_num[:10].values.tolist()) bar2.set_global_opts(title_opts=opts.TitleOpts(title='UZI最喜欢使用的英雄Top10'), visualmap_opts=opts.VisualMapOpts(max_=80)) bar2.render()
结语
最后C君想说的是,Uzi的游戏天赋有目共睹,如同那个反向Q的男人,转战吃鸡居然也拿到世界赛的冠军,但是这些都不是我们普通人练一练就可以达到的。最近大热综艺《老师请回答》中,一个小孩子想去当王者职业选手,被两个王者职业选手教育了就是最好的例子,所以我们还是踏踏实实的干一些自己擅长的事情,把爱好当成爱好,这难道不香么!
CDA数据分析师 出品
作者:泽龙、Mika
数据:真达
后期:泽龙