Soccermatics之一:使用python分析足球數(shù)據(jù)集
開始之前
本篇假設(shè)讀者熟悉python編程、matplotlib和pandas軟件包的使用
鳴謝
本篇的內(nèi)容部分參考了Soccermatics(https://soccermatics.readthedocs.io);
數(shù)據(jù)集使用了Statsbomb公司(https://www.statsbomb.com)的開放數(shù)據(jù)(https://github.com/statsbomb/open-data)。
我們可以分析些什么?
利用豐富的球場(chǎng)比賽數(shù)據(jù),可以分析射門瞬間,防守進(jìn)攻的各種選擇;分析傳球網(wǎng)絡(luò)圖、球場(chǎng)熱點(diǎn);計(jì)算射門預(yù)期進(jìn)球,評(píng)價(jià)球員控球或無球跑動(dòng),量化球員招募等等。
開發(fā)環(huán)境
基礎(chǔ)環(huán)境
python環(huán)境python3.10 venv,推薦ubuntu,安裝軟件包方便快捷,非常適合用作開發(fā)環(huán)境,直接在應(yīng)用商店中安裝,不需要使用瀏覽器下載軟件安裝包。
如果系統(tǒng)已經(jīng)安裝了python的軟件包virtualenv,則可以使用如下命令創(chuàng)建并激活虛擬運(yùn)行環(huán)境(假設(shè)所有的數(shù)據(jù)和代碼都存放在eda目錄下):
科學(xué)計(jì)算四件套:numpy、scipy、matplotlib、pandas,這幾個(gè)軟件包可以直接在python虛擬運(yùn)行環(huán)境中安裝:
推薦使用poetry來管理軟件包,pyenv管理虛擬運(yùn)行環(huán)境。
足球數(shù)據(jù)分析軟件之mplsoccermplsoccer(https://github.com/andrewRowlinson/mplsoccer)是基于畫圖軟件matplotlib的足球可視化軟件,除了可以展示球場(chǎng)為基礎(chǔ)的數(shù)據(jù)之外,還支持多種面向球賽/球員統(tǒng)計(jì)數(shù)據(jù)的圖表。mplsoccer還可以直接讀取解析足球數(shù)據(jù)提供商statsbomb的數(shù)據(jù),但本篇中沒有使用mplsoccer的這項(xiàng)功能。
足球分析軟件kloppykloppy(https://github.com/PySport/kloppy)是設(shè)計(jì)用來統(tǒng)一訪問多個(gè)足球數(shù)據(jù)集提供商的訪問庫(kù)。不同的最取數(shù)據(jù)服務(wù)商的數(shù)據(jù)在格式和描述方式上有區(qū)別,如果需要來自多個(gè)服務(wù)商的數(shù)據(jù)或者需要切換數(shù)據(jù)服務(wù)商,則代碼會(huì)比較混亂。kloppy提供了數(shù)據(jù)的序列化/反序列化、標(biāo)準(zhǔn)數(shù)據(jù)描述模型、數(shù)據(jù)過濾/轉(zhuǎn)換器等一系列功能,使讀取足球數(shù)據(jù)方便快捷。
其他配套軟件視個(gè)人喜好:編輯器Microsoft vscode以及相關(guān)插件,python軟件包jupyter等。
足球數(shù)據(jù)集
足球的數(shù)據(jù)種類很多,涵蓋了球隊(duì)?wèi)?zhàn)績(jī)、球員能力等各個(gè)方面,但要是想詳細(xì)分析某一長(zhǎng)球賽的細(xì)節(jié),目前用來分析的主要是下面幾種數(shù)據(jù)。
事件數(shù)據(jù)
事件數(shù)據(jù)詳細(xì)描述了一場(chǎng)球賽中的每一次球處理的詳細(xì)信息,比如傳球、射門、盤帶、爭(zhēng)頂?shù)?,每次事件包含了時(shí)間、球員、球場(chǎng)坐標(biāo)等,以及其他詳細(xì)信息。事件數(shù)據(jù)是由數(shù)據(jù)提供商從比賽錄像中人工提取,一般來說一場(chǎng)比賽會(huì)包含數(shù)千個(gè)事件。
顯然事件數(shù)據(jù)需要成本,但近年來一些數(shù)據(jù)服務(wù)商免費(fèi)提供了一些公開數(shù)據(jù),這些免費(fèi)的公開數(shù)據(jù)主要有:
statsbomb
賽事比賽數(shù)量賽季男足世界杯642018歐洲杯512020英超(阿森納)3303/04西甲(梅西)52004/05 – 20/21歐冠(決賽)1499/00 – 18/19女足世界杯522019美國(guó)國(guó)家聯(lián)賽362018英超32618/19 – 20/21合計(jì)1096數(shù)據(jù)下載頁(yè)面(https://github.com/statsbomb/open-data)
wyscout
賽事比賽數(shù)量賽季法甲38017/18英超38017/18意甲38017/18西甲38017/18德甲30617/18世界杯642018歐洲杯512016合計(jì)1941數(shù)據(jù)下載頁(yè)面(https://github.com/koenvo/wyscout-soccer-match-event-dataset)
追蹤數(shù)據(jù)
跟蹤數(shù)據(jù)是將球賽每時(shí)每刻的球員和足球的位置坐標(biāo)都記錄下來,每秒25幀!
免費(fèi)的追蹤數(shù)據(jù)主要有:
metrica sport
這個(gè)公開數(shù)據(jù)包含了三場(chǎng)匿名的比賽追蹤數(shù)據(jù),幀速為25Hz,除了場(chǎng)上所有球員的追蹤數(shù)據(jù)外,還提供了與追蹤數(shù)據(jù)時(shí)間對(duì)齊的事件數(shù)據(jù)。
數(shù)據(jù)下載鏈接(https://github.com/metrica-sports/sample-data)
skillcorner
SkillCorner的免費(fèi)數(shù)據(jù)包含了9場(chǎng)比賽,幀速為10Hz。數(shù)據(jù)是從直播鏡頭中采集,因此數(shù)據(jù)只包含了位于鏡頭中的球員。
數(shù)據(jù)下載鏈接(https://github.com/SkillCorner/opendata)
事件數(shù)據(jù)往往具備語(yǔ)義,適合做機(jī)器統(tǒng)計(jì)分析,雖然不同提供商的語(yǔ)義模型稍有差異;而追蹤數(shù)據(jù)包含了每刻球員的位置沒有包含語(yǔ)義,適合進(jìn)行人工分析;如果事件數(shù)據(jù)和追蹤數(shù)據(jù)的時(shí)間軸是對(duì)齊的,配合起來更加強(qiáng)大。
開始數(shù)據(jù)分析
Statsbomb數(shù)據(jù)集更新頻繁,數(shù)據(jù)豐富,還包含了其特有的360數(shù)據(jù)幀。360數(shù)據(jù)記錄了該事件發(fā)生時(shí)其他球員的位置,使態(tài)勢(shì)分析更加有依據(jù)。StatsBomb 的公開數(shù)據(jù)為 2020 年歐洲杯的 51 場(chǎng)比賽提供了360數(shù)據(jù)幀。
開放數(shù)據(jù)的每次射門事件還包含了Statsbomb根據(jù)自己的模型計(jì)算出的期望進(jìn)球概率(Expected Goals, xG)數(shù)據(jù)。
本篇使用了Statsbomb的公開數(shù)據(jù)集。
Statsbomb數(shù)據(jù)說明
由于數(shù)據(jù)訪問涉及到球場(chǎng)坐標(biāo),因此球場(chǎng)大小、進(jìn)攻方向和坐標(biāo)系統(tǒng)就尤為重要。不幸的事,這事還沒有標(biāo)準(zhǔn)可言,目前不同的數(shù)據(jù)提供商都自有一套。有的廠商坐標(biāo)原點(diǎn)是左上,有的是左下,有的坐標(biāo)范圍是[0,1],有的是標(biāo)準(zhǔn)球場(chǎng)尺寸坐標(biāo),因此在處理數(shù)據(jù)過程中特別需要注意。
下圖的球場(chǎng)尺寸是來自Statsbomb開放數(shù)據(jù)中的數(shù)據(jù)規(guī)范:

球門尺寸:

Statsbomb的位置坐標(biāo)是按照以球場(chǎng)左上為原點(diǎn),球場(chǎng)大小為120×80來記錄的。
注意:Statsbomb的長(zhǎng)度單位是碼(yard),在必要的時(shí)候,我們需要將其轉(zhuǎn)換為米,以米為單位的標(biāo)準(zhǔn)球場(chǎng)大小是105×68。
注意:數(shù)據(jù)中記錄的位置數(shù)據(jù),在進(jìn)攻(射門事件)時(shí),不論主隊(duì)客隊(duì),進(jìn)攻方向總是從左往右的,也就是說射門事件中,一般來說x坐標(biāo)都在100左右。
數(shù)據(jù)按照賽事、賽季和比賽進(jìn)行組織,采用json格式文件來描述。
賽事和賽季數(shù)據(jù)保存在competitions.json文件中,每個(gè)賽事、賽季、比賽、球員都有一個(gè)id標(biāo)識(shí)。
每個(gè)賽事和賽季的比賽存放在matches目錄中,按照賽事id目錄存放了比賽的元數(shù)據(jù)。
在events和lineups目錄中,按照比賽id存放了每個(gè)比賽的事件和陣容數(shù)據(jù)。
在使用數(shù)據(jù)之前,使用json數(shù)據(jù)查看器看一下數(shù)據(jù)的大概內(nèi)容,對(duì)格式和描述內(nèi)容有個(gè)大概了解,從文件中可以看出,數(shù)據(jù)的可讀性非常好,也有大量冗余數(shù)據(jù),適合人去理解。
同時(shí)瀏覽一下開放數(shù)據(jù)中包含的數(shù)據(jù)規(guī)范。
使用kloppy
數(shù)據(jù)加載
假設(shè)你的網(wǎng)絡(luò)可以很順利的訪問github,那么我們就可以很順利的加載數(shù)據(jù)了:
也可以把開放數(shù)據(jù)從github克隆到本機(jī),然后采用使用kloppy進(jìn)行加載
kloppy設(shè)計(jì)了一套標(biāo)準(zhǔn)數(shù)據(jù)模型,來適應(yīng)不同數(shù)據(jù)服務(wù)商的數(shù)據(jù)。
標(biāo)準(zhǔn)數(shù)據(jù)模型包含了如下類型的事件:ShotEvent、PassEvent以及GenericEvent(不識(shí)別的其他類型事件都放在這里面)等13種,大大少于各數(shù)據(jù)服務(wù)商自行定義的事件類型。那如何訪問標(biāo)準(zhǔn)數(shù)據(jù)模型之外的其他數(shù)據(jù)?
第一種方法:直接訪問
raw_event屬性保存的原始的事件,在需要時(shí)根據(jù)Statsbomb數(shù)據(jù)規(guī)范進(jìn)行訪問,但要注意這里面的數(shù)據(jù)沒有經(jīng)過kloppy的處理轉(zhuǎn)換,使用時(shí)要小心。
第二種方法,使用EventFactory。通過EventFactory將raw_event中需要的數(shù)據(jù)增加為事件的屬性。
這樣得到的dataset中的事件就包含了statsbomb_xg期望進(jìn)球概率和body_part_type進(jìn)球部位這兩個(gè)屬性,不需要訪問raw_event屬性了。
數(shù)據(jù)轉(zhuǎn)換
加載數(shù)據(jù)操作load返回kloppy事件數(shù)據(jù)集EventDataset可以使用迭代器進(jìn)行訪問,可以使用進(jìn)行過濾,也可以使用查找,還可以通過某個(gè)事件獲取關(guān)聯(lián)事件。
通常對(duì)EventDataset進(jìn)行過濾或者查找之后轉(zhuǎn)換為pandas DataFrame。
轉(zhuǎn)換操作to_df可以將數(shù)據(jù)集的指定屬性轉(zhuǎn)換成DataFrame
可以指定需要保留到DataFrame中的列名稱或者名稱通配符,還可以通過lambda進(jìn)行轉(zhuǎn)換:
而to_pandas操作可以將事件的所有屬性轉(zhuǎn)換為DataFrame的列,并可以增加一些其他列:
具體可以參考kloppy的文檔頁(yè)面。
使用mplsoccer
mplsoccer畫出一個(gè)球場(chǎng)非常簡(jiǎn)單:
效果如下:

pitch封裝了matplotlib中pyplot的許多畫圖操作,可以一對(duì)一使用。
案例:射門數(shù)據(jù)分析
將前面的東西綜合起來,我們可以得到一個(gè)表達(dá)出一場(chǎng)比賽中射門位置、射門xG(Expected Goals)的射門分析圖
效果如下:

以上。
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。