高い勝率を誇るチームには"〇〇"が強みだった!?

野球は「投手」で決まる

本当?
確かに10年前、落合中日時代は打率指標 6球団最下位でもリーグ優勝を果たしていました。
そこには岩瀬や川上憲伸、浅尾のような投手陣、
荒木や井端、英智のような鉄壁守備陣の貢献が必要不可欠でした。

一方で近年は打高投低と呼ばれています。

勝率との相関性をデータを使って簡単に確認してみました。

スクリプト内容

以前の記事で作成したcsvファイルを読み込み、
必要な投打に関する情報と勝率、チーム名を取得します。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
team_score = pd.read_csv('standings-team.csv')

rank = team_score[['順位', 'チーム', '勝率']]
score = team_score.iloc[:,13:23]
score_df = pd.concat([rank, score],axis=1 ,join='outer')

各指標において値のばらつきが生じていました。
これをある程度統一化させるために、
正規化処理を施します。

順位と年度は正規化させず一旦データから離します。

float_score = score_df.dtypes[(score_df.dtypes=='int64')|(score_df.dtypes=='float64')].index.tolist()
float_score.remove('year')
float_score.remove('順位')

from  sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(score_df[float_score])
score_df[float_score] = scaler.transform(score_df[float_score])

防御率、失点は低いほうが良い。
打率、得点は高い方が良い。

...うーん...。
なんか統一感がないなと感じたので、
どちらも高い値をとるほど良い成績となるよう、
防御率・失点に負符号を掛けます。

score_df_n = score_df[['失点', '平均失点', '防御率']] * -1
score_df_d = score_df.drop(columns=['失点', '平均失点', '防御率'])
score_df = pd.concat([score_df_d, score_df_n], axis=1, join='outer')

これが勝率と相関度が高い変数たちです。
やはり失点指標より得点指標の方が勝率に大きく関わっています。

corr = score_df.corr()
corr = corr.nlargest(10, '勝率')['勝率'].index
cm = np.corrcoef(score_df[corr].values.T)
sns.set(font_scale=1.25)
sns.heatmap(cm, cbar=False, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=corr.values, xticklabels=corr.values)
plt.show()

野手、投手に関連する変数に分けて勝率との関連度を可視化させます。
今回はパリーグ6球団での分析となります。

rbi_score = score_df[['勝率','チーム','打率','本塁打','平均得点']].groupby(['チーム'], as_index=False).mean().sort_values('打率',ascending=False)
pit_score = score_df[['勝率','チーム','防御率','平均失点']].groupby(['チーム'], as_index=False).mean().sort_values('防御率',ascending=True)

def plot_scatter(path,data):
    sns.scatterplot(x='勝率',
                    y=path, 
                    hue='チーム',
                    palette={'ソフトバンク': '#FFA500',
                             '西武': '#00FFFF',
                             '日本ハム': '#4169E1',
                             '楽天': '#DC143C',
                             'ロッテ': '#A9A9A9',
                             'オリックス': '#4B0082'},
                    legend=False,
                    data=data)

可視化

チーム別のカラーは以下の通りです。
凡例をねじ込むと少々見難くなりましたので、抜きました。


打率

2009年以降の打率だとばらつきが見られるのに対して、2013年以降は勝率と打率の相関度が高いように思えます。
気になって調べてみると当時、
2010年に用いられた球(飛ぶボール)と2011-2012年の球(飛ばないボール)は
2013年以降の球と反発係数が違い、
打者の本塁打数と打率、投手の防御率に大きく影響したことが原因だと考えています。

f:id:electric-city:20200322141630p:plain:h300:w400
2013年以降の打率と勝率の散布図

それにしてもソフトバンクと西武の打線は凄いですね。

f:id:electric-city:20200322141627p:plain:h300:w400
2013年以降の打率と勝率の散布図

本塁打

ここも西武とソフトバンクの2強。
相関性は打率よりは低いように見えます。

f:id:electric-city:20200322142958p:plain:h300:w400
2013年以降の本塁打数と勝率の散布図

防御率

ここ数年の西武ライオンズ以外は勝率と防御率には相関性が見られます。
西武は二連覇中なのに防御率は6球団ワースト。
それでも打線が素晴らしいので、勝てていることが分かります。
防御率ではソフトバンク優位ですね。

f:id:electric-city:20200322142547p:plain:h300:w400
2013年以降の防御率と勝率の散布図

最後に

近年は打者成績が大きく絡んでいることが分かりました。

しかし!!

自分はデータ分析初心者なので、ここが違うよ!という点があるかもしれません。
指摘したい点がある方は是非ご教示ください。