【導語】:今天我們來聊聊英雄聯盟傳奇選手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 數據清洗
此處我們對數據進行初步處理,主要包含:
- 勝負:提取勝場和負場
- KDA:提取數值
# 勝負 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 數據可視化
首先導入可視化庫,確定分析的目的:
- UZI各年度參賽場次及勝負場走勢圖
- UZI各年度賽事整體表現
- UZI最喜歡使用的英雄Top10
- UZI使用英雄Top10表現
- UZI使用Top10英雄補兵/經濟表現
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
數據:真達
後期:澤龍