今回はセイバーメトリクスについて
少し調べてみました。


解説動画はこちら



さて
今回はセイバーメトリクスについてです
知らない方もいるかもしれないので
簡単な説明ですが

セイバーメトリクスとは
野球においてデータを
統計学的見地から客観的に分析し
選手の評価や戦略を考える
分析手法のことです。

ざっくり考えると
勝つためにデータ分析しましょう
ってことですね。

なので、今回は
勝利に貢献する指標を
見つけてみようと思います。

まず、データに関しては
こちらのサイトのデータを参考にしています。

プロ野球データFreak



さて、チームの成績データを見てみましょう。

TSVやCSVに取得したデータを
まとめていれば、ファイルの読み込みが出来ます。

ファイルの読み込み
import pandas as pd
team_df = pd.read_table('baseball_all_team_stats2.tsv')
team_df.shape
(168, 51)



今回使用するのは、こんな感じのデータです。
スクリーンショット 2022-08-20 17.56.12

2009 - 2022年8月20日までのデータです。



さて次は、最近のリーグ成績を見てみましょう。

こんな感じのコードで時系列での
成績をまとめることが出来ます。

順位(Y軸)は反転させておくと
いい感じになります。

import matplotlib.pyplot as plt
import seaborn as sns

# セリーグ
se_league = team_df[team_df['リーグ']=='セリーグ']
g = sns.relplot(x='年度', y='順位', hue='チーム' , data=se_league, kind='line')
g.fig.axes[0].invert_yaxis()
g.fig.set_figwidth(12)
download

こちらはパリーグです
download-1

これで見ると、セリーグは順位変動が激しく
パリーグは特にソフトバンクが強いですね
ここ最近は5位以下になったことが無さそうです


次は勝率を見てみましょう。

2009 - 2022までの全試合での全チームの勝率
groupby  = team_df[['チーム','試合','勝利','敗北']].groupby('チーム').sum()
groupby['勝率']  = groupby['勝利'] / groupby['試合']
groupby.sort_values('勝率',ascending=False)
スクリーンショット 2022-08-20 17.57.07

パリーグはソフトバンク
セリーグは巨人
の勝率が良いですね

とはいえ、べらぼうに差があるわけでは
無いようです。


次はこの勝利数に貢献する指標を見てみましょう。


勝利数に貢献しそうな指標は何か?
target_kpi = ['得点', '平均得点', '失点', '平均失点', '打率', '本塁打','防御率', '安打', '出塁率', '長打率', 'OPS']

for kpi in target_kpi:
    tmp_df = team_df[['チーム','勝利'] + [kpi]]
    print(kpi , '相関係数 : ' , tmp_df.corr().iloc[1,0])
    g=sns.jointplot(x='勝利', y=kpi, data=tmp_df,kind='reg')
    g.fig.set_figwidth(3)
    g.fig.set_figheight(3)
    plt.show()
スクリーンショット 2022-08-20 17.57.24

# 相関係数のみ計算する
corrs = {}
for kpi in target_kpi:
    tmp_df = team_df[['チーム','勝利'] + [kpi]]
    corrs[kpi] = tmp_df.corr().iloc[1,0]

for k,v in sorted(corrs.items() , reverse=True , key=lambda x:x[1]):
        print(k,v)
得点 0.6752214591815026
安打 0.6266412461266061
打率 0.5737515556643754
OPS 0.5707190644752489
出塁率 0.5601397549262012
平均得点 0.5484023969333554
長打率 0.5206867389057273
本塁打 0.4614069008549154
失点 -0.03810712231263921
平均失点 -0.28881452409175656
防御率 -0.30572213281469424



勝利数に貢献しそうな指標としては
得点が一番関係性が高そうです。

野球のルールの性質上
相手チームよりもたくさん点を取った方が勝つので
得点数は勝利に貢献するのは当たり前でしょうね。


次はこの得点に貢献する指標を見てみましょう。

得点に貢献しそうな指標は?
target_kpi = ['打率', '本塁打', '安打', '出塁率', '長打率', 'OPS']

corrs = {}
for kpi in target_kpi:
    tmp_df = team_df[['チーム','得点'] + [kpi]]
    corrs[kpi] = tmp_df.corr().iloc[1,0]

for k,v in sorted(corrs.items() , reverse=True , key=lambda x:x[1]):
        print(k,v)
OPS 0.8708254335866881
長打率 0.8159000896409998
安打 0.8097657028521518
出塁率 0.8054269840935689
本塁打 0.7637663066912697
打率 0.7457514146368397


平均得点だと
OPS 0.9567899908827453
長打率 0.9145865090996436
出塁率 0.8454041544924719
本塁打 0.7794856511615135
打率 0.7363115009552308
安打 0.5156269035543274


OPSは
得点数だと0.870
平均得点だと0.956
という高い相関係数になります。


OPSはOn-base plus sluggingの略で
野球において打者を評価する指標の1つで
出塁率と長打率を足し合わせた値になります。


こういった指標を一つ一つ検証し
どんな指標が貢献するのかを探るのも
セイバーメトリクスの醍醐味かと思います。


今回は勝利数に関しては得点

得点に関してはOPSが
高い貢献度があることが分かりました。

次回はこの、OPS周りを
詳しく深掘りしていきたいと思います。

今回はここまでです
それでは。