精選

Ergast API:繪出 F1 賽場上的車手車隊表現

繼上篇 【 F1賽車哪裡看?怎麼看?線上觀賽小知識】 介紹許多關於F1的細節與近期*GP賽事的看點,也有對車手、車隊做簡單介紹。該篇文其中有些圖是Yun自行運用R繪圖出來的,像是賽事地圖、最快單圈,而在這次的文章裡,我將會講述我所使用的F1資料來源是什麼?我如何做出這些圖形?並帶大家看幾個採用Ergast這個API的作品應用。 (GP = Grand Prix 大獎賽,是賽車比賽的最高殿堂。) F1資料來源: Ergast API Ergast API: https://ergast.com/mrd/ 從 API Documentation 閱讀它的JSON參數了解基本格式: https://ergast.com/api/< series >/< season >/< round >/... series這邊固定選擇級別為F1的賽事。舉幾個例子,假如要抓六月底在奧地利Austrian Grand Prix的賽事(2019年第9場)的排位賽結果,JSON格式的API網址就是下列第一個 https://ergast.com/api/f1/2019/9/ qualifying .json 其他還有laps(圈數)、pitstops(進站)、drivers、constructors可用 https://ergast.com/api/f1/current/last/qualifying.json (最新排位結果) https://ergast.com/api/f1/current/last/results (最新比賽結果) https://ergast.com/api/f1/2019/status (年度賽事狀況:完成 / 未完成) 末端去掉 .json 會呈現表格整理的網頁,方便閱讀以作檢查。 實作過程:jsonlite、ggmap、magick 有了前面提到的json檔,在R裡面其實就能很方便地透過jsonlite套件來轉換取得dataframe的格式。不過,在自己做之前,還是先看了一下別人怎麼處理F1的資料格式,所以我大致閱讀了 Wrangling F1 Data With R – F1DataJunkie Book 這本 電子書,作者做出了一個 ergastR-core....

NBA球員出手數據怎麼畫?用nbastatR抓資料、gganimate動態呈現

總冠軍賽期間,在Reddit的r/NBA版上看到Owen Phillips發的這張經過數據處理的動態GIF,看出所有球員在場上後仰跳投的出手位置,隨著賽季時間往現今推移,有諸多變化之處,不僅單單是數量成長了超過10倍,出手點也逐漸遠離籃框,甚至到現在三分線外任何位置的後仰出手都非常多。

在他的Instagram上還有很多相當棒的圖,除了針對重點球星(Curry, KD, Kawhi等人都有)以數據做出手分析,還囊擴各種主題(投票分布、選秀結果討論),這些諸多NBA數據的來源,大多是來自於nbastatR這個package。

nbastatR

(1) 安裝方式:使用devtools以github的repository下載,過程中會請你安裝或更新許多需要用到的包,像是常見的tidyverse、tibble、curl等等,如果一直有錯誤訊息沒辦法順利安裝,可能是R的版本問題,可以重新下載RRStudio。(通常剛載完RStudio開啟後,會先跳出通知請你安裝devtools,若你沒有devtools這個package的話,要先安裝它。)
install.packages("devtools")
devtools::install_github("abresler/nbastatR")
**安裝的過程中,如果出現錯誤Error,可以看看是什麼問題。像我的console裡面寫著there is no package called 'rvest',就去安裝rvest,然後再重新跑一遍就好,過程中停在 These packages have more recent versions available. Which would you like to update? 詢問你要不要更新,就輸入1選擇All更新全部就好(其中rlang務必更新)。

(2) 啟用nbastatR:import以後就可以開始,試著運用裡面的函數找尋資料囉!可以先看看game_logs跑出來的tibble,觀察熟悉variables與data,還有它能代那些參數以後,再開始活用!
library("nbastatR")
game_logs(seasons = 2019, result_types = "team")
(3) 其他函數:除了範例中的這些以外,想要其他的數據資料的話,nbastatR這個Package裡面所有函數的相關描述都可以在開發者網站的Reference看到:http://asbcllc.com/nbastatR/reference/index.html#section-all-functions
drafts(draft_years = 2019)
metrics_leaders(seasons = 2019, metric = "pts")
上圖為2019選秀結果,剛公布的資料也能非常快就查到!

2019年得分排名,前三名正為今年度爭奪MVP的人選,Harden、PG、字母哥,最後由字母哥獲得獎項。

(4) 資料閱讀:透過閱讀資料與整理來掌握資訊,比方下面的例子,讓我了解NBA主要如何歸類籃球員的動作。
all19team <- teams_shots(all_active_teams=T,
  seasons = 2019)
all19team %>% group_by(typeAction) %>% 
  count(typeAction) %>%
  arrange(desc(n))
在這份即時更新的資料庫裡,將球員的出手動作(typeAction)分成了主要的46種, 比如跳投(Jump Shot),就又再細分成Floating、Driving Floating、Driving Floating Bank、Fadeaway、Turnaround、Turnaround Fadeaway Bank、Step Back、Step Back Bank、Running、Pullup、Running Pull-Up等各種跳投方式或組合,反映了依照場上敵方防守情形,進攻球員所反應出的進攻動作。

Floater 是比較順暢的投球,跟著腳步的節奏,運用跑動順勢出球,會有一個較大的弧度;Runner 則是上一篇提到的騎馬射箭。通常前者的防守者較多,後者會有較大的空間出球,兩者的差異可以參考這個影片教練的動作。Pullup急停、Turnaround轉身、Fadeaway後仰跳投、Step back急停後跳(最後一刻往後踩一步拉開空間)。Driving是像在開車一樣帶球切入,可能會左右踩繞過防守者;相對地,Cutting則是空手切入,接到隊友傳來的球後隨即投籃。其他只要搭配出現Bank就是擦板球。

除了跳投,其他主動作還有上籃(Layup)灌籃(Dunk)鉤射(Hook)。而上籃和灌籃這兩類之下,還有細分Tip(指尖)、Putback(補球)、Alley Oop(空中接力)、Reverse(反身背對籃框)等等搭配。此外,最特別的是 Finger Roll 運用指力造成球的旋轉上籃。

2019 NBA例行賽的出手動作累積次數,排名前十。

gganimate

大致知道怎麼抓取球員數據以後,這邊來實際操作一下,透過dplyr篩選球員數據,ggplot來布置作圖,最後再以gganimate做動態呈現這邊以2019賽季的Kawhi當作主角,想比較他在例行賽跟季後賽的表現,看各節出手的球點有沒有什麼習慣,或命中率看起來特別高的位置?

(1)  篩選球員

teams_shots(teams = "Toronto Raptors",
  seasons = 2019, season_types = "Playoffs")
首先取得隊伍出手數據(team_shots),這裡的賽季(season_types)分為熱身賽、例行賽、季後賽、全明星賽。我只選擇挑出例行賽與季後賽。接著filter出自己想要的球員(namePlayer)。

(2) 依出手點作圖

ggplot(KLpo, aes(x=locationX, y=locationY, col=typeEvent, 
                    size=sqrt(1/(minutesRemaining+1)))) +
  geom_point(alpha=0.3)
描繪出手點(locationX, locationY),這邊我的顏色是以有沒有進球(typeEvent)來區分,大小是代表該節剩幾分鐘內的出手,越大的圓代表越接近該節尾聲。因為是位置關係,將各點以點圖的方式畫上去即可,設定一個透明度,才能比較明顯看出各點。
+ theme_bw() +
  theme(legend.position = 'top',
        legend.title=element_blank(),
        axis.ticks.x=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, face="bold", colour="maroon"),
        plot.caption = element_text(hjust = 1, face="italic")) +
  labs(x="", y="", caption = "by Yun, love850together") +
  ggtitle(label = "Kawhi Leonard", subtitle = "(2019 Playoffs)")+
  guides(size=FALSE)
為了讓圖形比較簡潔好看一點,就改為dark-on-light的theme_bw,除去標籤(labs)與XY軸刻度跟數字(ticks、text)、關閉解說(guides)、增加標題(ggtitle),調整解說legend位置、文字水平位置(hjust)。就此產生下面這兩張圖(上:例行賽;下:季後賽):


(3) 動態呈現出手(依節次)

+ facet_wrap(~nameZone) +
  transition_time(time = numberPeriod) +
  labs(title = "Kawhi Leonard's FGA in Period: {round(frame_time)}") + 
  enter_fade() + 
  exit_shrink() +
  ease_aes('circular-in-out')
這裡的幀數轉換以第幾節(numberPeriod)為定位,要注意這裡time後面只吃數字或時間格式。標題依照當下的幀數來做調整({frame_time}),同步顯示目前是第幾節的出手狀況,我採用 round 將幀數四捨五入,搭配 circular-in-out 的速率變動模式,自己測試起來覺得效果很好。而我有小小用了facet_wrap來聚焦各位置的出手(nameZone),如下:


從圖中,可以最明顯的看出季後賽的表現在場中區塊有明顯提升,紅色的點數覆蓋較多,而且在延長賽中關鍵時刻籃下是完全把握住的。Kawhi的左翼進攻次數相對於右翼較少,可以看出三分線上的大藍圈圈較多(例行賽特別多),尤其第四節以後,代表時間壓力或是敵方防守壓迫影響到外圍出手的命中率。而右翼在季後賽的第二節感覺都是比較熄火的狀態。不過整體而言命中率還是有所提升。(從下圖網友做的圖,可以看出Kawhi在季後賽的表現有多瘋狂,因為一般來說季後賽由於針對主力球員的防守強度提升,導致FT下降是正常的,但Kawhi卻提升了許多,FMVP實至名歸。)

這張圖上的TS%代表真實命中率(True Shooting Percentage),綜合考慮FG、3P和FT,算法是 TS% = Points/2*(FG Attempts + 0.44 * FT Attempts)
以球權的角度來看,每次球員拿到球出手進的話都基本上能獲得2分,而加罰進和三分球等同於多得的分數,會提高真實命中率。至於0.44怎麼算的,可以看看這篇文章。而在nbastatR要看到球員們的單季數據可用bref_players_stats(seasons = 2019)查到。

關於gganimate的動態效果,其他ease_aes參數可以參閱文件,如果日後想做暫停的感覺,stackoverflow也有網友提供作法

除了單一球員的分析,還有人運用nbastatR做出一些很棒的視覺化,像是針對團隊看各隊伍在四節之中的進攻期就滿有趣的,還有出手位置頻率分析以網格做出顏色深度,都值得去看且學習,下次再試試看把籃球場框線位置疊到資料下囉~

留言

Share Our Blog