高い勝率を誇るチームには"〇〇"が強みだった!?
野球は「投手」で決まる
本当?
確かに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)
可視化
チーム別のカラーは以下の通りです。
凡例をねじ込むと少々見難くなりましたので、抜きました。
最後に
近年は打者成績が大きく絡んでいることが分かりました。
しかし!!
自分はデータ分析初心者なので、ここが違うよ!という点があるかもしれません。
指摘したい点がある方は是非ご教示ください。