菊池雄星データ - 2023/04/04 vs KC (Kansas City Royals)

python勉強

2023/04/04 vs KC (Kansas City Royals)

菊池雄星 選手のデータをチェック

2022年8月8日と2023年4月4日の2つの日付のデータを比較

\==**<span style="font-size: 24px;">まとめ</span>**==

*   球速アップしてる
*   リリースポイントの変化。プレートの立つ位置を変えた？

以下それぞれデータ

***

# データ

皆さんこんにちは！今回は、野球のデータを使って菊池雄星選手のパフォーマンスを分析していきたいと思います。

まず、2022年8月8日と2023年4月4日の2つの日付のデータを取得します。そして、菊池雄星選手のデータだけを抽出して、それを結合していきます。

<pre><code>!pip install pybaseball
from pybaseball import statcast
import pandas as pd

# 2022年8月8日のデータ取得
df_2022_single_day = statcast(start_dt='2022-08-08', end_dt='2022-08-08')
df_579328_2022_single_day = df_2022_single_day[df_2022_single_day['pitcher'] == 579328]

# 2023年4月4日のデータ取得
df_2023_single_day = statcast(start_dt='2023-04-04', end_dt='2023-04-04')
df_579328_2023_single_day = df_2023_single_day[df_2023_single_day['pitcher'] == 579328]

# 両日のデータを結合
df_579328_selected_days = pd.concat([df_579328_2022_single_day, df_579328_2023_single_day])

</code></pre>

***

# 球種チェック

それでは、菊池雄星選手が投げた球種を見ていきましょう。

ここで分析したデータから、彼が使用したユニークな球種は4つあります。それぞれ、「フォーシーム・ファストボール」、「スライダー」、「チェンジアップ」、「カーブ」となっています。

<pre><code># 投球結果を抽出
df_579328 = df_579328_selected_days

# df_579328のpitch_typeカラムに含まれるユニークな球種を確認する
unique_pitch_types = df_579328['pitch_type'].unique()

# 確認した球種を表示する
print(unique_pitch_types)

</code></pre>

結果

<pre><code>['FF' 'SL' 'CH' 'CU']
</code></pre>

*   'FF': Four-seam Fastball（フォーシーム・ファストボール）
*   'SL': Slider（スライダー）
*   'CH': Changeup（チェンジアップ）
*   'CU': Curveball（カーブボール）

***

# 球種割合

菊池雄星選手が左打者と右打者に対してどのような球種を投げているのかを見ていきましょう。2022年と2023年のデータをもとに、球種の出現回数をカウントします。

<pre><code>import pandas as pd

def pitch_counts(df):
    # 左打者と右打者に対する投球データを抽出
    df_L = df[df['stand'] == 'L']
    df_R = df[df['stand'] == 'R']

    # 各カテゴリーでの球種の出現回数をカウント
    total_counts = df['pitch_type'].value_counts()
    left_counts = df_L['pitch_type'].value_counts()
    right_counts = df_R['pitch_type'].value_counts()

    # 出現回数をデータフレームにまとめる
    pitch_counts_table = pd.DataFrame({'Total': total_counts, 'Left Batter': left_counts, 'Right Batter': right_counts})

    # NaNを0に置き換える
    pitch_counts_table.fillna(0, inplace=True)

    # カウントを整数に変換する
    pitch_counts_table = pitch_counts_table.astype(int)

    return pitch_counts_table

# 2022年と2023年のデータに対して球種カウントを取得
pitch_counts_2022 = pitch_counts(df_579328_2022_single_day)
pitch_counts_2023 = pitch_counts(df_579328_2023_single_day)

# 結果を表示
print("2022年の球種カウント:")
print(pitch_counts_2022)
print("\n2023年の球種カウント:")
print(pitch_counts_2023)

</code></pre>

![](https://pbs.twimg.com/media/FtKfQ7PaQAEj7wt?format=png\&name=360x360)

***

# 球種割合・円グラフ

それでは、菊池雄星選手の球種分布を円グラフで見ていきましょう。

ここでは、左打者と右打者に対する球種分布、そして全体の球種分布を比較しています。2022年と2023年のデータをもとに、各球種の使用割合がどのように変化しているのかを確認できます。

<pre><code>import matplotlib.pyplot as plt

def plot_pitch_distribution(df, year):
    df_L = df[df['stand'] == 'L']
    df_R = df[df['stand'] == 'R']

    fig, axs = plt.subplots(1, 3, figsize=(18, 6))
    plt.suptitle(f'Pitch Distribution in {year}')

    colors = {'FF': 'red', 'SL': 'blue', 'CH': 'green', 'CU': 'orange'}

    # Total
    df['pitch_type'].value_counts().plot(kind='pie', ax=axs[0], autopct='%.1f%%', colors=[colors[key] for key in df['pitch_type'].value_counts().index])
    axs[0].set_title('Total')
    axs[0].set_ylabel('')

    # vs Left batter
    df_L['pitch_type'].value_counts().plot(kind='pie', ax=axs[1], autopct='%.1f%%', colors=[colors[key] for key in df_L['pitch_type'].value_counts().index])
    axs[1].set_title('vs Left batter')
    axs[1].set_ylabel('')

    # vs Right batter
    df_R['pitch_type'].value_counts().plot(kind='pie', ax=axs[2], autopct='%.1f%%', colors=[colors[key] for key in df_R['pitch_type'].value_counts().index])
    axs[2].set_title('vs Right batter')
    axs[2].set_ylabel('')

    plt.show()

# Plot pitch distribution for 2022 and 2023 data
plot_pitch_distribution(df_579328_2022_single_day, 2022)
plot_pitch_distribution(df_579328_2023_single_day, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FtKfg-daUAEBv4q?format=jpg\&name=large)

![](https://pbs.twimg.com/media/FtKfpqyaAAE-rqx?format=jpg\&name=large)

***

# 投球コース

今度は、菊池雄星選手の投球位置を散布図で見ていきましょう。

ここでは、各球種ごとに投球位置をプロットしています。さらに、ストライクゾーンを赤い四角で示しています。2022年と2023年のデータを比較することで、彼の投球位置がどのように変化しているのかを確認できます。

<pre><code>import matplotlib.pyplot as plt

def plot_pitch_location(df, year):
    # データを pitch_type ごとにグループ分けする
    grouped = df.groupby('pitch_type')

    colors = {'FF': 'red', 'SL': 'blue', 'CH': 'green', 'CU': 'orange'}

    # pitch_type ごとに、'plate_x' を X 軸、'plate_z' を Y 軸とした散布図を作成する
    for pitch_type, data in grouped:
        plt.scatter(data['plate_x'], data['plate_z'], label=pitch_type, color=colors[pitch_type])

    # ストライクゾーン
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]
    plt.fill(x, y, color='r', alpha=0.1)

    # 凡例を表示する
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

    plt.xlim(-3, 3)
    plt.ylim(-2, 6)

    plt.xlabel('Plate X')
    plt.ylabel('Plate Z')

    # 罫線
    plt.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    plt.title(f'Pitch Location in {year}')
    
    # グラフを表示する
    plt.show()

# 2022年と2023年のデータに対して投球位置をプロット
plot_pitch_location(df_579328_2022_single_day, 2022)
plot_pitch_location(df_579328_2023_single_day, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FtKf9RlaMAApw9M?format=png\&name=small)

![](https://pbs.twimg.com/media/FtKgCORaQAAHnmP?format=png\&name=small)

***

# リリースポイント

さて、今度は菊池雄星選手のリリースポイント（投球の手放し位置）を散布図で見ていきましょう。

各球種ごとにリリースポイントをプロットしています。これにより、彼の投球の手放し位置が球種によってどのように異なるのか、また、リリースポイントがどのように変化しているのかを確認できます。

<pre><code>import matplotlib.pyplot as plt

def plot_release_point(df, year):
    # データを pitch_type ごとにグループ分けする
    grouped = df.groupby('pitch_type')

    colors = {'FF': 'red', 'SL': 'blue', 'CH': 'green', 'CU': 'orange'}

    # pitch_type ごとに、'release_pos_x' を X 軸、'release_pos_z' を Y 軸とした散布図を作成する
    for pitch_type, data in grouped:
        plt.scatter(data['release_pos_x'], data['release_pos_z'], label=pitch_type, color=colors[pitch_type])

    # 凡例を表示する
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

    plt.xlabel('Release Pos X')
    plt.ylabel('Release Pos Z')

    # 罫線
    plt.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    plt.title(f'Release Point in {year}')

    # X軸とY軸のレンジを指定
    plt.xlim(1.2, 3)
    plt.ylim(5, 6)

    # グラフを表示する
    plt.show()

# 2022年と2023年のデータに対してリリースポイントをプロット
plot_release_point(df_579328_2022_single_day, 2022)
plot_release_point(df_579328_2023_single_day, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FtKgrY9aEAA_KXB?format=png\&name=small)

![](https://pbs.twimg.com/media/FtKgta4aQAAS2QS?format=png\&name=small)

***

# リリースポイント・球種ごとに見る

今回は、菊池雄星選手のリリースポイントを球種ごとに分けて見ていきましょう。

2022年と2023年のデータを色分けし、同じグラフにプロットしています。これにより、球種ごとにどのようにリリースポイントが変化しているかを視覚的に比較できます。

<pre><code>import matplotlib.pyplot as plt

def plot_release_point_by_year(df_2022, df_2023):
    # 両方のデータフレームを結合
    combined_df = pd.concat([df_2022, df_2023])

    # データを pitch_type ごとにグループ分けする
    grouped = combined_df.groupby('pitch_type')

    # グラフの数と行列を指定
    nrows = 2
    ncols = 2

    # サブプロットのタイトル用に球種を格納
    titles = []

    fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(10, 10))

    for idx, (pitch_type, data) in enumerate(grouped):
        # サブプロットのタイトルに球種を追加
        titles.append(pitch_type)

        # サブプロットに対応する行と列のインデックスを計算
        row = idx // ncols
        col = idx % ncols

        ax = axes[row][col]

        # 2022年と2023年のデータをそれぞれプロット
        data_2022 = data[data.index.isin(df_2022.index)]
        data_2023 = data[data.index.isin(df_2023.index)]

        ax.scatter(data_2022['release_pos_x'], data_2022['release_pos_z'], label='2022', color='blue')
        ax.scatter(data_2023['release_pos_x'], data_2023['release_pos_z'], label='2023', color='red')

        ax.set_title(pitch_type)
        ax.set_xlabel('Release Pos X')
        ax.set_ylabel('Release Pos Z')

        # 罫線
        ax.grid(which='both', linestyle='--', color='gray', alpha=0.5)

        # 凡例を表示する
        ax.legend()

    # グラフを表示する
    plt.tight_layout()
    plt.show()

# 各球種ごとにグラフを分けて、2022年と2023年のデータを色分けしてプロット
plot_release_point_by_year(df_579328_2022_single_day, df_579328_2023_single_day)

</code></pre>

![](https://pbs.twimg.com/media/FtKhNIyakAAFrxO?format=png\&name=medium)

***

# スピンレート

ここでは、菊池雄星選手のリリーススピンレートを球種ごとに分けて、2022年と2023年のデータをボックスプロットで表示しています。

ボックスプロットは、データの分布を示すのに役立ち、四分位範囲や外れ値を視覚的に把握できます。さらに、各ボックスプロットの上に平均値が表示されているので、変化が一目でわかりますね。リリーススピンレートは、投球の回転数であり、球質を見るのに適しています。

<pre><code>import matplotlib.pyplot as plt
import pandas as pd

def plot_spin_rate_by_year_boxplot(df_2022, df_2023, pitch_types):
    fig, axs = plt.subplots(len(pitch_types), 1, figsize=(8, len(pitch_types) * 4))

    for i, pitch_type in enumerate(pitch_types):
        ax = axs[i]

        grouped_2022 = df_2022[df_2022['pitch_type'] == pitch_type].dropna(subset=['release_spin_rate'])
        grouped_2023 = df_2023[df_2023['pitch_type'] == pitch_type].dropna(subset=['release_spin_rate'])

        data_to_plot = []
        labels = []
        if not grouped_2022.empty:
            data_to_plot.append(grouped_2022['release_spin_rate'])
            labels.append('2022')
        if not grouped_2023.empty:
            data_to_plot.append(grouped_2023['release_spin_rate'])
            labels.append('2023')

        if data_to_plot:
            bp = ax.boxplot(data_to_plot, labels=labels)
            for j, d in enumerate(data_to_plot):
                mean_val = d.mean()
                ax.text(j + 0.8, mean_val, f"{mean_val:.1f}", ha='center', va='bottom', fontsize=10, color='blue')

        ax.set_title(f"Pitch Type: {pitch_type}")
        ax.set_xlabel('Year')
        ax.set_ylabel('Release Spin Rate')

        # 罫線
        ax.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    fig.suptitle('Release Spin Rate by Year and Pitch Type', fontsize=16, y=1.02)
    plt.tight_layout(pad=3)
    plt.show()

# 2022年と2023年のデータに対してリリーススピンレートをプロット
pitch_types_2022 = df_579328_2022_single_day['pitch_type'].unique()
pitch_types_2023 = df_579328_2023_single_day['pitch_type'].unique()

# 両年に存在する球種と、2022年には存在しないが2023年に存在する球種を取得
all_pitch_types = set(pitch_types_2022) | set(pitch_types_2023)

plot_spin_rate_by_year_boxplot(df_579328_2022_single_day, df_579328_2023_single_day, all_pitch_types)

</code></pre>

![](https://pbs.twimg.com/media/FtKhiIOaQAIPin2?format=png\&name=large)

***

# 球速

ここでは、菊池雄星選手のリリーススピードを球種ごとに分けて、2022年と2023年のデータをボックスプロットで表示しています。

<pre><code>import matplotlib.pyplot as plt
import pandas as pd

def plot_release_speed_by_year_boxplot(df_2022, df_2023, pitch_types):
    fig, axs = plt.subplots(len(pitch_types), 1, figsize=(8, len(pitch_types) * 4))

    for i, pitch_type in enumerate(pitch_types):
        ax = axs[i]

        grouped_2022 = df_2022[df_2022['pitch_type'] == pitch_type].dropna(subset=['release_speed'])
        grouped_2023 = df_2023[df_2023['pitch_type'] == pitch_type].dropna(subset=['release_speed'])

        data_to_plot = []
        labels = []
        if not grouped_2022.empty:
            data_to_plot.append(grouped_2022['release_speed'])
            labels.append('2022')
        if not grouped_2023.empty:
            data_to_plot.append(grouped_2023['release_speed'])
            labels.append('2023')

        if data_to_plot:
            bp = ax.boxplot(data_to_plot, labels=labels)
            for j, d in enumerate(data_to_plot):
                mean_val = d.mean()
                ax.text(j + 0.8, mean_val, f"{mean_val:.1f}", ha='center', va='bottom', fontsize=10, color='blue')

        ax.set_title(f"Pitch Type: {pitch_type}")
        ax.set_xlabel('Year')
        ax.set_ylabel('Release Speed')

        # 罫線
        ax.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    fig.suptitle('Release Speed by Year and Pitch Type', fontsize=16, y=1.02)
    plt.tight_layout(pad=3)
    plt.show()

# 2022年と2023年のデータに対してリリーススピードをプロット
pitch_types_2022 = df_579328_2022_single_day['pitch_type'].unique()
pitch_types_2023 = df_579328_2023_single_day['pitch_type'].unique()

# 両年に存在する球種と、2022年には存在しないが2023年に存在する球種を取得
all_pitch_types = set(pitch_types_2022) | set(pitch_types_2023)

plot_release_speed_by_year_boxplot(df_579328_2022_single_day, df_579328_2023_single_day, all_pitch_types)

</code></pre>

![](https://pbs.twimg.com/media/FtKh0t0aMAATZQx?format=png\&name=medium)

***