《Rick.C & Peter.R 共同創作》
在上一篇《【Python學習筆記_賽事預測-MLB防禦率與勝負的相關?】》中,我們研究了防禦率與勝負間的關聯性,究竟防禦率與勝負間是否存在著高度的相關性呢?有興趣的人可以回去看看這篇唷!!
我們先前的探討都只是拿單一個特定指標作為研究目標,雖說特徵越多對於機器學習是越容易提升準確度,但過多的特徵就容易造成運算成本的增加、過度擬和或維度災難等諸多問題,也因此數據派的人都希望能尋找到一種指標,那就是能夠一次涵蓋多項單一指標於一身,且又極其重要的綜合指標。而今天我們所要探討的目標就是一種綜合指標,叫做「wOBA」,不過該指標對於勝負來說是否真的重要呢?我們就來好好地探究一番吧!!我們將探討以下幾點:
1.主隊的wOBA真的比較高嗎?
2.wOBA高者就一定獲勝?
3.加權上壘率與上壘率對勝負的關係
4.wOBA高且獲勝的隊伍會屬於__?
wOBA全名為weighted On Base Average,中文叫「加權上壘率」,主要是檢視球員於場上的進攻能力對球隊有多少貢獻。
上壘率大家應該都聽過,但為什麼要加上「加權」呢?因為每一支安打的價值都不盡相同,一支全壘打的貢獻就是直接得分,總不可能跟一支一壘安打相比吧,此外加權上壘率還考慮到了保送與失誤上壘等因素,因此相對普通的上壘率,加權上壘率更能衡量球隊在打擊貢獻上的能力。wOBA的公式為:
wOBA=(w1B一壘打個數+w2B二壘打個數+w3B三壘打個數+wHR全壘打個數+wBB非故意四壞保送的個數+wHBP觸身球個數)/(打席數-故意保送次數)
我們的資料來源一樣為FANGRAPHS,數據期間我們也一樣抓取2015賽季至2021賽季,共7年的期間作為我們研究的賽期。
有長期關注我們的人應該都知道我們的第一步吧,沒錯,我們一開始一樣要先來探討「主場優勢」是否真的存在,究竟主隊的wOBA真的會表現得比較好,抑或是客隊的wOBA能克服球場的不適呢?
首先,我們一樣導入套件
# 數據整理
import numpy as np
import pandas as pd
# 可視化
import matplotlib.pyplot as plt
import seaborn as sns
import plotly as py
import plotly.graph_objs as go
接著讀取資料
df = pd.read_excel(r"C:\Users\Guess365User\Desktop\MLB\fangraphs紀錄\fan_all.xlsx",index_col='date')
df.head()
我們所爬取的資料中,只有主隊以及客隊的加權上壘率(wOBA),因此,我們要自行製作欄位「more_Betting_wOBA」,為判斷主客隊誰的加權上壘率較高;「W/L」為判斷主客隊誰獲勝;「more_wOBA_win」為判斷加權上壘率高者是否獲勝
df['more_Batting_wOBA'] = (df['Home_Batting_wOBA'] > df['Away_Batting_wOBA'])*1
df['W/L'] = (df['主隊得分'] > df['客隊得分']) *1
df["more_wOBA_win"] = (df['more_Batting_wOBA'] == df['W/L'])*1
df.head(5)
這裡我們用到剛剛創建的欄位「more_Batting_wOBA」來視覺化看看
trace0 = go.Pie(labels=df["more_Batting_wOBA"].value_counts().index,
values=df["more_Batting_wOBA"].value_counts().values,
hole=0.5,
opacity=0.9,
marker=dict(line=dict(color='white', width=1.3))
)
layout = go.Layout(title='主客wOBA')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\主客wOBA.xlsx')
藍色(1)表示主隊wOBA較高,機率為53.9%,橘色(0)表示客隊wOBA較高,機率為46.1%。我們可以發現,主隊wOBA的確有較高的機率高於客隊的wOBA,但一樣從統計的角度來看,53.9%的機率其實還是偏向於各半,所以說,wOBA並無特別受到主場優勢的加持
。
照理說,wOBA代表一個球隊的進攻能力,進攻能力越佳的隊伍,獲勝的機率應該要比較高才對,因此我們就來統計看看是否如我們想像的一樣。
這裡我們用到剛剛創建的欄位「more_wOBA_win」來視覺化看看。
trace0 = go.Pie(labels=df["more_wOBA_win"].value_counts().index,
values=df["more_wOBA_win"].value_counts().values,
hole=0.5,
opacity=0.9,
marker=dict(line=dict(color='white', width=1.3))
)
layout = go.Layout(title='wOBA與勝負關係')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\wOBA與勝負關係圖.xlsx')
此處藍色(1)為wOBA高且獲勝者,佔比高達86.5%,而橘色(0)為wOBA高但卻輸者,佔比僅13.5%,由此可知,wOBA高的隊伍,有極大的機率拿下該場勝利
。
對於機器學習來說,重複的特徵很可能影響模型的訓練準確度,以及訓練所消耗的成本,因此我們通常會將相似的特徵取其一即可,從直觀上來看,與加權上壘率相似的特徵值及是「上壘率」,所以我們接下來就是要探討一下,加權上壘率與上壘率之間是否存在高度正相關,如果真的是高度正相關,那究竟是加權上壘率對勝負比較重要,還是一般的上壘率對勝負比較重要呢?
我們將加權上壘率、上壘率與勝負間的數值取出進行相關性的分析,可以發現我們紅圈圈出的位置,大致有3個地方可以檢視
• 主隊的加權上壘率與上壘率有著0.92的高度正相關,因此必須擇其一做為我們的特徵值
• 客隊的加權上壘率與上壘率也同樣有著0.92的高度正相關,因此我們也必須擇其一做為我們的特徵值
• 接著兩個上壘率對於勝負間的關係,主隊的兩個上壘率都與勝負存在約0.5的正相關,而客隊則存在-0.5左右的負相關,不過整體可以發現加權上壘率對於勝負的影響都略高於一般的上壘率,因此我們決定保留加權上壘率,並剔除一般上壘率,以優化我們的預測模型,然而wOBA是一個綜合指標,其是否也與其他單一指標存在高度正相關,這部分我們以後會再特別為大家做統整分析
最後我們仍要回到主場優勢上,畢竟在自己相對熟悉的球場打球,照理說應該是要有較好的表現,因此我們就來統計一下wOBA高且獲勝的隊伍是否都是主隊較多呢?
我們先將wOBA高且獲勝的隊伍取出放到「df_era_win」中。
df_wOBA_win = df[df['more_Batting_wOBA'] == df['W/L']]
df_wOBA_win.head()
不過從下方的統計圖來看,藍色(1)為wOBA高且獲勝的隊伍為主隊,佔比54.3%,橘色(0)為wOBA高且獲勝的隊伍為客隊,佔比為45.7%。可以看出主客的佔比與第一點的主客wOBA高低分布圖相似,因此可以說,雖主隊因場地優勢略勝一籌,但並沒有特別獲得勝利女神的眷顧,反而是哪方wOBA高,幾乎就可以確定哪方可以獲勝
。
trace0 = go.Pie(labels= df_wOBA_win["W/L"].value_counts().index,
values= df_wOBA_win["W/L"].value_counts().values,
hole=0.5,
opacity=0.9,
marker=dict(line=dict(color='white', width=1.3))
)
layout = go.Layout(title='wOBA勝負與主客關係')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\wOBA負與主客關係圖.xlsx')
根據今天的研究,wOBA對我們來說是一個極其重要的因子,我們也從中剔除了一般的上壘率,以優化我們的模型,我們會持續朝綜合指標的方向前進,找出更多對我們預測勝負重要的特徵,如果你對棒球相當熟悉,且認為某些指標對於勝負是極其重要的存在,不妨可以下方留言告訴我們唷!!
[Guess官網平台-分析專欄] https://reurl.cc/yMOVE6
[資料視覺化 | 製作充滿說服力的資訊圖表]
[圖解資料結構 × 演算法:運用Python]
[Python 大數據專案 X 工程 X 產品 資料工程師的升級攻略]