【2023年】プロ野球のパリーグの戦績でデータ分析 ver2　〜投手編〜

# はじめに
今回は投手の成績に注目してデータ分析を行います。

・前回の記事（打者編）

https://qiita.com/wooooo/items/4f59406f741818a3a7e6

# 引用したサイト
https://npb.jp/bis/2023/stats/tmp_c.html

# 防御率との相関係数のランキング
![スクリーンショット 2023-10-17 17.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/4338e71f-ae55-d8fa-662d-e005be9412d1.png)

|順位|項目|相関係数|
|--|--|--|
|1位|完封勝|-0.98|
|2位|故意四|0.87|
|3位|安打|0.75|
|4位|完投|-0.72|
|5位|本塁打|0.71|
|6位|死球|-0.58|
|7位|ホール|0.56|

※相関係数は小数点第3位で四捨五入しています。
 相関係数の絶対数が大きい順に並べています。
 試合、投球回、打者、勝利、敗北、失点、自責点は除外しています。

# 各項目と防御率とのグラフ
・完封勝
![Figure_防御率-完封勝.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/35dbf735-4664-fc93-0692-591bee667d26.png)

・故意四
![Figure_防御率-故意四.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/02aa9b40-2b73-c3d1-7023-a238d36ba6db.png)

・安打
安打を打たれるほど防御率が悪化していく
![Figure_防御率-安打.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/18f96f8b-6df9-e726-0d44-028b273fc2a6.png)

・完投
![Figure_防御率-完投.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/93253aab-e276-1dbc-fdc2-54b25d5b1ff7.png)

・本塁打
![Figure_防御率-本塁打.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/74a52859-463a-455e-2207-10c35b08df0d.png)

・死球
![Figure_防御率-死球.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/1488af98-607a-5f7b-7c56-4e2deca3663e.png)

・ホール
中継ぎ投手がリードを保つホールド
![Figure_防御率-ホールド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/633c5912-4d56-4dbc-29da-6dac12225adb.png)


# 環境構築
```
pip install pandas numpy seaborn matplotlib japanize-matplotlib
```

# コード
データ分析に必要なライブラリをインポートします。
```python
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
import japanize_matplotlib

pd.set_option('display.max_columns', None)

# パリーグの投手成績のCSVを読み込む
df = pd.read_csv('baseball/data/npb_2023_pacific_pitcher.csv')

# グラフの凡例のチームカラー
team_colors = {
    'オリックス': 'navy',
    'ソフトバンク': 'yellow',
    '楽天': 'red',
    'ロッテ': 'black',
    '西武': 'blue',
    '日本ハム': 'cyan'
}

# チーム順位を追加
df['順位'] = ['1', '5', '6', '2', '3', '4']
df = df.sort_values(by='順位')
```

防御率と完封勝の分析のコードです
```python
# 完封勝と防御率の関係
column = '完封勝'
plt.figure(figsize=(10, 5))
sns.scatterplot(data=df, x=column, y='防御率', hue='チーム', palette=team_colors, s=100)
plt.title(f'{column}と防御率の関係')
plt.xlabel(column)
plt.ylabel('防御率')
plt.grid(True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
for i, row in df.iterrows():
    plt.text(
        row[column], row['防御率'], str(row['順位']), color='black',
        fontsize=10, ha='right', va='bottom'
    )
# 完封勝と防御率の平均値を示す線を追加
plt.axvline(df[column].mean(), color='red', linestyle='--', label=f'{column}の平均')
plt.axhline(df['防御率'].mean(), color='blue', linestyle='--', label='防御率の平均')
#  相関係数
correlation_coefficient = np.corrcoef(df[column], df['防御率'])[0, 1]
plt.text(0.1, 0.9, f'r: {correlation_coefficient:.2f}', transform=plt.gca().transAxes)
# 回帰直線
slope, intercept = np.polyfit(df[column], df['防御率'], 1)
x = np.linspace(min(df[column]), max(df[column]), 100)
y = slope * x + intercept
plt.plot(x, y, color='black', label=f'回帰直線: y = {slope:.2f}x + {intercept:.2f}', alpha=0.2)
plt.show()
```

### セイバーメトリクスの指標を用いて、より詳しく分析していきます。
+ K%：奪三振の割合(三振 / 打者)
1打者あたりの三振数の指標K%が増加すると防御率は下がる傾向にあることが分かります。
オリックスはリーグ1位のK%を誇っており三振が奪えていることが分かります。「山本由伸」や強力リリーフ陣の凄さがデータから分かります。
楽天はリーグ最下位のK%で、奪三振が少なくなっています。
![Figure_防御率-K%.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/2e9dfb33-baa5-b464-845f-4468aab12902.png)

+ K/9：9イニングあたりの三振数(三振数 / 投球回 * 9)
9イニングあたりの三振数で見てもK%と同じような分布をしています。
ただ、相関係数が0に近づいているため三振が増えても防御率の低下との関係は小さくなっています。
ピンチの場面を三振で1アウト取ったり、守備が関与しない形で確実にアウトカウントを増やし、得点期待値を下げるには有効な手段と考えられます。
![Figure_防御率-K:9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/1420672e-7c26-c6b8-9922-0d31a338d73e.png)

+ BB%：与四球の割合(四球数 / 打者)
相関係数は-0.06です。
今年のデータからは与四球が増えることは防御率が悪化することとは関係が無さそうなことが分かります。
6位の日ハムはリーグ1位のBB%を記録しており、与四球の少ないです。
5位の西武は四球数が多くなっています。
![Figure_防御率-BB%.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/7ed9f9f5-ae3f-2b6b-8fa9-0f9b36752cb0.png)

+ BB/9：9イニングあたりの四球数(四球数 / 投球回 * 9)
なおさら与四球と防御率の関係は小さいです。
![Figure_防御率-BB:9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/b5b9047c-a6d2-7ae3-25d3-412cfacc24ec.png)

+ HR%：被本塁打率(本塁打数 / 打者)
被本塁打が増加すると防御率が悪化する傾向にあることが分かります。
四球覚悟で厳しいコースに投げて本塁打を避けた方が賢明なのでしょうか。
6位の日ハムはリーグ2位の被本塁打率です。本塁打の出来くい札幌ドームからエスコンに移った影響でしょうか。
優勝したオリックスは本塁打を打たれた確率がダントツで低いです。
![Figure_防御率-HR%.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/f386e23a-f240-09d4-e8f8-7a5ef3adb88f.png)

+ HR/9：9イニングあたりの被本塁打数(本塁打数 / 投球回 * 9)
9イニングあたりの指標で見ると、被本塁打のみ防御率の悪化の傾向が高まっていることが分かります。
![Figure_防御率-HR:9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/d759d815-e8eb-4639-505f-56e003508a85.png)

+ K/BB：制球力の指標(三振数 / 四球数)
西武は奪三振数はリーグ平均ほどですが、与四球が多くK/BBがリーグ最下位となっています。優勝したオリックスと約0.8も差があります。
楽天は与四球はリーグ平均ほどですが、奪三振が少なく、リーグ下位のK/BBとなっています。
日ハムは奪三振数が少ないですが、リーグ1位のBB%でリーグ平均を超えるK/BBとなっています。
相関係数は-0.31で、防御率の低下との関係は小さいことが分かります。
![Figure_防御率-K:BB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/19b9d03c-124f-b256-3d17-df42e4241ee3.png)

+ H/9：9イニング当たりの被安打数(安打数 / 投球回 * 9)
西武がリーグ1位のH/9となっており、被安打の少なさが分かります。多くのマスクを被った2年目の古賀投手の奮闘ぶりに来季も期待です。
相関係数は0.76で強い相関を示しています。
![Figure_防御率-H:9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/d8cbcd02-b9d9-23fa-0607-45cb1ad26d3d.png)

+ IP/G：1試合当たりの投球数(投球回 / 試合数)
![Figure_防御率-IP:G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/4ecd01f0-8548-84de-5f8d-d25e152286a2.png)

+ R/G：1試合当たりの失点数(失点数 / 試合数)
![Figure_防御率-R:G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/f55a6c68-9f21-8866-303d-440b0f9dd776.png)

+ ER/G：1試合当たりの自責点数　式：自責点数 / 試合数
![Figure_防御率-ER:G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/f21e1608-06dd-5b9b-d178-f615fc22147e.png)

+ LOB%：ランナーの残塁率(安打 + 四球 + 死球) - 失点) / (安打 + 四球 + 死球 - (1.4 × 本塁打)
LOB%は出塁した走者を本塁に返さなかった割合です。
僅差ではありますが、5位の西武がリーグ1位のLOB%を記録しています。防御率はオリックスの方が低いため、出塁の多さ、得点圏などが要因だと思います。
4位の楽天はリーグ最下位のLOB%を記録しています。
相関係数は-0.92で強い相関を示しており、防御率の低下と関係が大きいことが分かります。
![Figure_防御率-LOB%.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/4a8f54a3-32c1-a06b-2e0d-1dacf45c2987.png)

+ FIP：守備に左右されない投手の実力の指標((13 × 本塁打数) + (3 × (四球数 + 死球数)) - (2 × 三振数)) / 投球回 + 定数
オリックスはダントツでFIPが低いです。
西武の防御率はリーグ２位ですが、FIPはリーグ最下位で、LOB%はリーグ最下位となっており、低い防御率は源田選手や外崎選手の二遊間の守備を中心に守備の恩恵を受けていると考えられます。
3位のロッテはリーグ平均を下回るLOB%ですが、防御率が悪く、投手の実力の低さが分かります。
![Figure_防御率-FIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/9e22b618-53d0-e457-ff39-da512c061e55.png)

+ WHIP：イニング当たりの出塁者数(安打数 + 四球数) / 投球回
相関係数が0.89で強い相関を示しています。
打者成績の出塁率同様に出塁されないほど、防御率が低くなることが分かります。
![Figure_防御率-WHIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/781f5bfd-6f93-603a-b10e-21344a555f78.png)

+ BABIP：打者が打った打球がヒットになる確率(安打数 - 本塁打数) / (打者数 - 三振数 - 本塁打数 + 犠飛数)
オリックスは意外にも？リーグ平均の値を記録しています。
西武はリーグ1位のヒットになりにくさを示しています。守備シフトや守備力の高さ、運などが要因でしょうか？
投手成績で悪い印象の楽天はリーグ平均ほどの値でした。
ロッテがリーグ最下位を記録しています。マリンの風があるとはいえ、「ヒットになる確率」なので守備力の低さが要因でしょうか。
球場別のヒットになり易さが気になります。
![Figure_防御率-BABIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/269fb8d1-3bfc-4c7e-daa9-7f6cceaa8144.png)

また、FIPとBABIPで比較してみました。
![Figure_FIP-BABIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/b30a5c46-73e6-5419-4dc0-ddfb35d0b241.png)
オリックスはFIPはリーグ1位の低さで、投手力の高さが分かりますが、BABIPがリーグ平均ほどで守備などが平均並みとなっています。投手の育成は上手くいっていますが、野手の守備の指導が良くもなく悪くもなくといったところでしょうか。

ロッテはFIPがリーグ2位で投手の実力は評価できますが、BABIPがリーグ最下位で守備で足を引っ張っている可能性があります。

西武はFIPがリーグ最下位となっていますが、BABIPがリーグ1位で投手の実力は低めですが、守備の助けが大きいと思います。

セイバーメトリクスの指標の中で防御率との相関係数が高い順に並べると

|順位|項目|相関係数|
|--|--|--|
|1位|ER/G|1.00|
|2位|R/G|0.99|
|3位|LOB%|-0.92|
|4位|WHIP|0.89|
|5位|H/9|0.76|
|6位|HR/9|0.70|
|7位|HR%|0.67|

※相関係数は小数点第3位で四捨五入しています。
 相関係数の絶対数が大きい順に並べています。

# おわりに
特徴のあるチーム名を出して様々書いていきました。
西武が投手成績は良いですが、FIPが悪いというデータが意外でした。
オリックスの投手の実力が際立っているデータばかりで、優勝の要因は投手力にあると思えるレベルでした。
海を渡ると言われているエースがいなくなる来季は各指標がどう変化するのでしょうか。
様々な指標で見ると面白さが爆増してくると思います。
興味持った方々は色んなデータを利用しつつ分析してみてください！