鳥槍換炮,利用python3對球員做大數(shù)據(jù)降維(因子分析得分),為C羅找到合格僚機

原文轉載自「劉悅的技術博客」https://v3u.cn/a_id_176

眾所周知,尤文圖斯需要一座歐冠獎杯,C羅也還想再拿一座歐冠獎杯,為自己的榮譽簙上錦上添花。意甲霸主在意甲雖然風生水起,予取予求,但是在今年歐冠1/8決賽賽場上,被法甲球隊里昂所淘汰,痛定思痛,球隊解雇了主教練薩里,簽約名宿皮爾洛,但是要想在歐冠賽場上奪冠,這還不夠,球隊還需要什么?沒錯,需要一名強力中鋒,在正印中鋒伊瓜因難堪大用的情況下,尤文圖斯必須引進一名強力中鋒。

現(xiàn)在的問題是,在新賽季即將開始、疫情下球隊銀根緊縮的背景下,到底誰才是合格的引援人選?本次我們使用基于Python3的factor_analyzer庫來對球員進行分析,試圖尋找尤文圖斯最適合引援的球員。

首先我們來劃定范圍,先排除掉不可能的簽約,比如拜仁的萊萬多夫斯基,或者是熱刺的哈里凱恩亦或是皇馬的哈基姆本澤馬,這三人都是世界級中鋒,但是由于身價等多種因素導致他們加盟尤文圖斯的可能性無限趨近于零。好吧,讓我們現(xiàn)實點,巴薩的蘇亞雷斯,羅馬的哲科以及馬競的莫拉塔才是可能的人選,蘇亞雷斯已經(jīng)和巴薩鬧翻,出走幾乎是必然。莫拉塔下個賽季也不會出現(xiàn)在卡爾德隆球場,哲科在羅馬雖然過得還不錯,但是很明顯他想要更高的榮譽。

數(shù)據(jù)分析首先就得有數(shù)據(jù),讓我們來看看他們三個上賽季的比賽數(shù)據(jù)。

首先來看看同在西甲的蘇亞雷斯和莫拉塔:

image

這里我們抽取中鋒最重要的兩項數(shù)據(jù),進球數(shù)和進球轉化率,可以看到在進球數(shù)相差4個的情況下,莫拉塔的進球轉化率僅為14.5%,落后于蘇亞雷斯的19%。

作為中鋒,除了進球,還需要一定的策應能力,這樣就可以為C羅的后插上提供幫助:

image

可以看到在策應能力上,莫拉塔也落后于蘇亞雷斯,讓我們再看看同在意甲的哲科和伊瓜因的數(shù)據(jù):

image

哲科在上個賽季無論是進攻能力還是策應能力都明顯強于伊瓜因。

現(xiàn)在我們來抽取一些高階數(shù)據(jù),這里以進球、轉換率和助攻作為特征樣本,當然了,如果愿意,也可以添加一些別的特征,這里只是簡單演示一下,但是需要注意一點,數(shù)據(jù)建模只有有限的參考價值,因為球員的個人因素如:球員國籍,球員丑聞,球員個人目標定位(或期望值),球員傷病史及嚴重程度等等,這些都是沒有參考數(shù)據(jù)的。

所以,我們以純能力數(shù)據(jù)為核心考量,球員轉會身價及年薪這些成本因素不作年化成本計算,理論上也可以說是從主觀角度根據(jù)轉會新聞對此進行判斷。同樣,球員及所處球隊的競訓水平也不作為參考數(shù)據(jù),因為即便天賦再高的球員,長期和不在同一水平的球員或者教練員一起訓練,也會導致與期望值有巨大偏差。

將數(shù)據(jù)添加到數(shù)據(jù)集:

import pandas as pd  
import numpy as np  
from pandas import DataFrame,Series  
  
#構建數(shù)據(jù)集  
mydata = {  
       '進球':[16,12,16,8],  
       '進球轉化率':[19,14,13,10],  
       '助攻':[8,2,7,4],  
}  
data = DataFrame(mydata)  
  
data.index=['蘇亞雷斯','莫拉塔','哲科','伊瓜因']  
  
print(data)

數(shù)據(jù)矩陣:

進球  進球轉化率  助攻  
蘇亞雷斯  16     19   8  
莫拉塔   12     14   2  
哲科    16     13   7  
伊瓜因    8     10   4

因子分析是通過對原始數(shù)據(jù)相關系數(shù)內部結構的研究,將多個指標轉化為少量互相不相關且不可觀測的隨機變量(即因子),以提取原有指標的絕大部分的信息的統(tǒng)計方法。因子分析首先將原始數(shù)據(jù)標準化處理,建立相關系數(shù)矩陣并計算其特征值和特征向量,接著從中選擇特征值大于等于1的特征值個數(shù)為公共因子數(shù),或者根據(jù)特征值累計貢獻率大于80%來確定公共因子,求得正交或斜交因子載荷矩陣,最后計算公因子得分和綜合得分。

第一步,建立因子分析模型:

from factor_analyzer import FactorAnalyzer, Rotator  
  
fa = FactorAnalyzer(rotation=None)  
fa.fit(data)

print(fa.loadings_)


公共因子與原有變量指標之間的關聯(lián)程度由因子載荷值體現(xiàn),由于初始因子載荷矩陣結構不夠簡明,各個因子的含義不突出。為此采用方差最大法,使各個變量在某個因子上產(chǎn)生較高的載荷,而在其余因子上載荷較小。

但是公共因子與原有變量指標之間的關聯(lián)程度由因子載荷值體現(xiàn),由于初始因子載荷矩陣結構不夠簡明,各個因子的含義不突出。為此采用方差最大法,使各個變量在某個因子上產(chǎn)生較高的載荷,而在其余因子上載荷較小,經(jīng)過特征數(shù)據(jù)迭代收斂,得到旋轉后因子載荷矩陣:

rotator = Rotator()  
print("旋轉后矩陣:\n", rotator.fit_transform(fa.loadings_))

隨后我們可以簡單看一下變量方差,即是每個原始變量在每個共同因子的負荷量的平方和,也就是指原始變量方差中由共同因子所決定的比率。變量的方差由共同因子和唯一因子組成。共同性表明了原始變量方差中能被共同因子解釋的部分,共同性越大,變量能被因子說明的程度越高,即因子可解釋該變量的方差越多。共同性的意義在于說明如果用共同因子替代原始變量后,原始變量的信息被保留的程度。

print(fa.get_communalities())

也可以查看因子相關矩陣和特征值:

print(fa.get_eigenvalues())

當然了,我們的最終目的是根據(jù)因子模型對各個球員進行綜合打分,最后使用各個因子方差貢獻率占3個因子方差貢獻率的比重作為權重進行加權匯總,得到各個球員的綜合得分F,即:

def F(factors):  
    return sum(factors*fa.get_factor_variance()[1])

之后就可以在矩陣中依次進行計算:



scores = []  
for i in range(len(fa.transform(data))):  
    new = F(fa.transform(data)[i])  
    scores.append(new)  
  
print(scores)


得到分值數(shù)組:

[0.7294004536510521, -0.2958329655707666, 0.530110265958429, -0.9636777540387146]

然后我們就可以為原矩陣添加一列數(shù)據(jù):

data['綜合打分'] = scores
print(data)

得到新矩陣:

進球  進球轉化率  助攻      綜合打分  
蘇亞雷斯  16     19   8  0.729400  
莫拉塔   12     14   2 -0.295833  
哲科    16     13   7  0.530110  
伊瓜因    8     10   4 -0.963678

同時可以指定按照新字段列進行排序,方便數(shù)據(jù)展示:

data = data.sort_values(by='綜合打分',ascending=False)

得到排序后的矩陣:

進球  進球轉化率  助攻      綜合打分  
蘇亞雷斯  16     19   8  0.729400  
哲科    16     13   7  0.530110  
莫拉塔   12     14   2 -0.295833  
伊瓜因    8     10   4 -0.963678

如果愿意,我們也可以對矩陣進行可視化操作,這里以水平柱狀圖為例子:

import matplotlib.pyplot as plt  
import matplotlib  
  
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  
matplotlib.rcParams['axes.unicode_minus'] = False  
  
  
plt.barh(range(4), scores, height=0.7, color='steelblue', alpha=0.8)    
plt.yticks(range(4), ['蘇亞雷斯','莫拉塔','哲科','伊瓜因'])  
plt.xlim(-1,2)  
plt.xlabel("分數(shù)")  
plt.title("引援打分")  
for x, y in enumerate(scores):  
    plt.text(y + 0.2, x - 0.1, '%s' % y)  
plt.show()
image

根據(jù)綜合評分,蘇亞雷斯無疑是最佳人選,退而求其次是哲科,第三選擇是莫拉塔,無論如何,他們三位的綜合能力都要比隊內的伊瓜因都要強,從這個角度來看,就算選擇莫拉塔,也是比讓伊瓜因留隊更好的選擇。

結語:必須指出的一點是,球員特征所形成的數(shù)據(jù)結果,絕對不能成為做決策的主要依據(jù),只能作為參考而存在,過度依賴數(shù)據(jù)往往可能適得其反,比如曾被譽為足壇“數(shù)據(jù)戰(zhàn)術大師”的貝尼特斯,其根據(jù)數(shù)據(jù)排首發(fā)陣型的操作曾經(jīng)聒噪一時,可現(xiàn)在呢?只能混跡于中超聯(lián)賽。截止到本文發(fā)布的2020年9月24日凌晨,尤文圖斯俱樂部通過租借的形式引進莫拉塔,而蘇亞雷斯600萬英鎊轉會馬德里競技,哲科留隊。尤文圖斯選擇了因子分析模型分數(shù)不高的莫拉塔,莫拉塔能否幫助C羅圓夢?新賽季歐冠誰執(zhí)牛耳?讓我們拭目以待。

原文轉載自「劉悅的技術博客」 https://v3u.cn/a_id_176

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容