4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

大谷翔平選手のメジャーリーグ通算225本のホームラン分析

Posted at

はじめに

 今季メジャーリーグで歴史的な活躍をし、数々の記録を更新した大谷翔平選手。今季のレギュラーシーズンでは最終的に54本のホームランを打ち、メジャーでのホームラン数が通算225本となりました。今回は、大谷翔平選手がメジャーで打った全ホームランについて、分析をしながら印象的だったホームランを映像で振り返ります。
 分析での使用言語はPythonで、Google Colaboratoryで作業しました。

データの取得

 まずはデータを取得します。pybaseballをインストールして、プレイヤーのデータを取得します。

# pybaseballのインストール
!pip install pybaseball
import pybaseball as pb
# 大谷翔平のデータを取得
ohtani_info = pb.playerid_lookup('Ohtani', 'Shohei')

# バッティングのデータを取得
player_id = ohtani_info.iloc[0,2] # player_id = 660271
start_date = '2018-01-01'
end_date = '2024-09-30'
ohtani_data = pb.statcast_batter(start_date, end_date, player_id)
ohtani_data.head()
	pitch_type	game_date	release_speed	release_pos_x	release_pos_z	player_name	batter	pitcher	events	description	...	post_home_score	post_bat_score	post_fld_score	if_fielding_alignment	of_fielding_alignment	spin_axis	delta_home_win_exp	delta_run_exp	bat_speed	swing_length
0	SL	2023-09-03	88.7	2.17	6.01	Ohtani, Shohei	660271	666205	field_out	hit_into_play	...	0	0	0	Infield shade	Standard	134.0	0.011	-0.130	NaN	NaN
1	CU	2023-09-03	83.9	1.96	6.19	Ohtani, Shohei	660271	666205	NaN	ball	...	0	0	0	Infield shade	Standard	346.0	0.000	0.040	NaN	NaN
2	CU	2023-09-03	82.3	2.01	6.20	Ohtani, Shohei	660271	666205	NaN	ball	...	0	0	0	Infield shade	Standard	326.0	0.000	0.016	NaN	NaN
3	FF	2023-09-03	94.3	1.92	6.02	Ohtani, Shohei	660271	666205	NaN	foul	...	0	0	0	Infield shade	Standard	142.0	0.000	-0.027	NaN	NaN
4	FF	2023-09-03	93.9	2.07	5.83	Ohtani, Shohei	660271	666205	NaN	swinging_strike	...	0	0	0	Infield shade	Standard	136.0	0.000	-0.022	NaN	NaN
5 rows × 94 columns

表示されるデータ項目の一覧は以下の通りです。

今回はホームランについて分析をするため、上記のデータからレギュラーシーズンの試合でホームランを打ったときの投球データのみを抽出します。

# レギュラーシーズンの試合でホームランを打った打席のデータを時系列で抽出
hr_data = ohtani_data.query("game_type=='R' and events=='home_run'").sort_values(by=['game_date', 'inning'])
hr_data.head()
hr_data
	pitch_type	game_date	release_speed	release_pos_x	release_pos_z	player_name	batter	pitcher	events	description	...	post_home_score	post_bat_score	post_fld_score	if_fielding_alignment	of_fielding_alignment	spin_axis	delta_home_win_exp	delta_run_exp	bat_speed	swing_length
11602	CU	2018-04-03	73.6	-1.56	5.79	Ohtani, Shohei	660271	458708	home_run	hit_into_play	...	6	6	2	Standard	Standard	47.0	0.200	2.687	NaN	NaN
11580	FF	2018-04-04	91.6	-2.15	5.34	Ohtani, Shohei	660271	446372	home_run	hit_into_play	...	2	2	2	Standard	Standard	202.0	0.260	1.795	NaN	NaN
11567	SI	2018-04-06	93.8	-1.55	5.98	Ohtani, Shohei	660271	605254	home_run	hit_into_play	...	1	1	6	Standard	Standard	217.0	0.033	0.961	NaN	NaN
11455	FF	2018-04-27	97.2	-1.74	6.15	Ohtani, Shohei	660271	622663	home_run	hit_into_play	...	1	1	0	Standard	Standard	204.0	0.113	1.007	NaN	NaN
11370	SI	2018-05-10	90.8	-3.59	4.55	Ohtani, Shohei	660271	657610	home_run	hit_into_play	...	7	7	4	Standard	Standard	267.0	0.061	1.000	NaN	NaN
5 rows × 94 columns

このhr_dataを元に、以下から様々な分析と可視化を行います。

データの分析・可視化

投手の左右・球種

 まずは、投手の左右と球種について、以下のように項目を指定して可視化します。

import seaborn as sns
sns.heatmap(pd.crosstab(hr_data['pitch_name'], hr_data['p_throws']), annot=True, cmap='OrRd')

image.png

p_throwsのLが左投手、Rが右投手を示していますが、右投手の方がホームランが多くなっています。対右ではフォーシームが最も多く、次いでスライダー、シンカーとなっています。対左ではスライダー、フォーシームという順になっており、左打者に対して左投手がスライダーを投じる場面が多いことも関係していると考えられます。実際、投手の左右別に投じられたすべてのボールの球種を調べると、左投手ではスライダーの割合が多くなっています。

import seaborn as sns
sns.heatmap(pd.crosstab(ohtani_data['pitch_name'], ohtani_data['p_throws']), annot=True, cmap='OrRd', fmt='g')

image.png

球種・球速

 続いて、ホームランを打った球種ごとに球速の分布を可視化します。なお、球速はマイル(mph: miles per hour, 1mph ≒ 1.61km/h)で表示されています。

import seaborn as sns

hr_data2 = hr_data.reset_index()
sns.catplot(x='pitch_name', y='effective_speed', data=hr_data2, height=6, aspect=3)

image.png

各球種、幅広い球速に対応していますが、100mph近い速球になると流石にホームランの数が少なくなっています。

唯一100mphを超えるボールを打ったホームラン

コース

 次に、コース別でホームランを分析します。まずは以下のように投手目線でストライクゾーンを分割して、ホームラン数の分布を可視化します。

import numpy as np
import seaborn as sns

zone = hr_data.query('zone <= 9').groupby('zone')['events'].count()
matrix = np.fliplr(np.array(zone).reshape(3,3))
sns.heatmap(matrix, annot=True, cmap='OrRd')

image.png

真ん中が最も多く、コーナーが少ないという結果になっています。また、高低や内外に関してはほとんど差がありませんでした。
 コースについては更に詳細に可視化します。以下では、ボール球を含めたすべてのホームランについて、ストライクゾーンとともに可視化しています。なお、打者目線でのボールの位置を示しており、最初の図ではプロットの色が濃いほど球速が速いことを示しています。

import matplotlib.pyplot as plt

plt.scatter(hr_data['plate_x'], hr_data['plate_z'], c=hr_data['effective_speed'], cmap='OrRd')

# ストライクゾーンを描画
x = [-0.83, 0.83, 0.83, -0.83]
y = [1.5, 1.5, 3.5, 3.5]
plt.fill(x, y, color='k', alpha=0.1)

plt.xlim(-1.5, 2.75)
plt.ylim(1, 4.5)
plt.gca().set_facecolor('lightgray')
plt.show()

image.png

import matplotlib.pyplot as plt
import pandas as pd

# カテゴリカルデータを数値に変換
pitch_names, unique = pd.factorize(hr_data['pitch_name'])

plt.scatter(hr_data['plate_x'], hr_data['plate_z'], c=pitch_names, cmap='Paired')  # cにカテゴリの数値を使用

# ストライクゾーンを描画
x = [-0.83, 0.83, 0.83, -0.83]
y = [1.5, 1.5, 3.5, 3.5]
plt.fill(x, y, color='k', alpha=0.1)

# 凡例を表示
for i, pitch in enumerate(unique):
    plt.scatter([], [], c=plt.cm.Paired(i / len(unique)), label=pitch)

plt.xlim(-1.5, 2.75)
plt.ylim(1, 4.5)
plt.legend(fontsize='small')
plt.gca().set_facecolor('0.6')
plt.show()

image.png

最初の図では低めの速いボールが少ない印象がありましたが、球種を見てみると実際にフォーシームは真ん中や高めに位置しています。また、ストライクゾーンからかなり離れた位置のボールもホームランにしていますが、特に明確なボール球だった2つのホームランは以下のようなホームランでした。

最も高いボールを打ったホームラン

最も体に近い位置のボール打ったホームラン

なお、この2本が誰から打ったホームランだったのか知るためには、ボールの位置を表す項目であるplate_z(高低)およびplate_x(左右)の絶対値を使って、以下のようにデータを取得しています。

#plate_zの絶対値が最大のpitcherを抽出
hr_z = hr_data[hr_data['plate_z'].abs() == hr_data['plate_z'].abs().max()]
pitcher_z = hr_z['pitcher']
pb.playerid_reverse_lookup([pitcher_z.iloc[0]])
	name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	hentges	sam	656529	hents001	hentgsa01	18548	2021.0	2024.0
#plate_xの絶対値が最大のpitcherを抽出
hr_x = hr_data[hr_data['plate_x'].abs() == hr_data['plate_x'].abs().max()]
pitcher_x = hr_x['pitcher']
pb.playerid_reverse_lookup([pitcher_x.iloc[0]])
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	snead	kirby	669912	sneak001	sneadki01	19179	2021.0	2024.0

最も高いボールはSam Hentges、最も体に近いボールはKirby Sneadからのホームランでした。

打球速度・角度・飛距離

 次に、ホームランの打球速度や角度、飛距離といった打ったボールに関する分析を行います。まず打球速度の統計量と分布は以下の通りです。

hr_data['launch_speed'].describe()
	launch_speed
count	225.000000
mean	108.587111
std	4.765254
min	93.800000
25%	105.600000
50%	108.400000
75%	111.900000
max	118.700000
import matplotlib.pyplot as plt

plt.hist(hr_data['launch_speed'], bins=25)
plt.xlabel('velocity / mph')
plt.ylabel('HR count')
plt.show()

image.png

打球速度の平均が108mph(約174km/h)、分布を見てもほとんどが100mph(約161km/h)を優に超える打球速度で、140~150km/h程が平均と言われる日本のプロ野球でのホームランの平均速度を大きく上回っています。

最も打球速度が速かったホームラン(同速で2本)

hr_fast = hr_data[hr_data['launch_speed']==hr_data['launch_speed'].max()]
print(hr_fast[['game_date', 'pitcher', 'launch_speed']])

pitcher_fast = hr_fast['pitcher']
pb.playerid_reverse_lookup(pitcher_fast.iloc[[0, 1]].values)
game_date  pitcher  launch_speed
2401  2024-04-23   598264         118.7
996   2024-07-27   669854         118.7
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	barnes	matt	598264	barnm001	barnema01	12863	2014.0	2024.0
1	blanco	ronel	669854	blanr001	blancro01	19407	2022.0	2024.0

それぞれMatt Barnes、Ronel Blancoから打ったホームランでした。

最も打球速度が遅かったホームラン

hr_slow = hr_data[hr_data['launch_speed']==hr_data['launch_speed'].min()]
print(hr_slow[['game_date', 'pitcher', 'launch_speed']])

pitcher_slow = hr_slow['pitcher']
pb.playerid_reverse_lookup([pitcher_slow.iloc[0]])
game_date  pitcher  launch_speed
1447  2024-06-25   623167          93.8
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	flexen	chris	623167	flexc001	flexech01	13896	2017.0	2024.0

Chris Flexenから打ったホームランでした。

次に打球の角度の分布を可視化しました。

hr_data['launch_angle'].describe()
	launch_angle
count	225.000000
mean	28.857778
std	5.493279
min	18.000000
25%	25.000000
50%	28.000000
75%	33.000000
max	46.000000
import matplotlib.pyplot as plt
plt.hist(hr_data['launch_angle'], bins=25)
plt.xlabel('angle / degree')
plt.ylabel('HR count')
plt.show()

image.png

おおよそ25~30度がホームランに最適な角度と言われており、実際に平均角度の28度前後のホームランが多くなっています。

最も打球角度が大きかったホームラン

hr_high = hr_data[hr_data['launch_angle']==hr_data['launch_angle'].max()]
print(hr_high[['game_date', 'pitcher', 'launch_angle']])

pitcher_high = hr_high['pitcher']
pb.playerid_reverse_lookup([pitcher_high.iloc[0]])
game_date  pitcher  launch_angle
1031  2024-07-25   643511          46.0
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	rogers	tyler	643511	roget002	rogerty01	15541	2019.0	2024.0

Tyler Rogersから打ったホームランでした。

最も打球角度が小さかったホームラン(同じ角度で2本)

hr_low = hr_data[hr_data['launch_angle']==hr_data['launch_angle'].min()]
print(hr_low[['game_date', 'pitcher', 'launch_angle']])

pitcher_low = hr_low['pitcher']
pb.playerid_reverse_lookup(pitcher_low.iloc[[0, 1]].values)
 game_date  pitcher  launch_angle
6561  2021-06-18   570632          18.0
6388  2021-06-29   592791          18.0
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	ureña	josé	570632	urenj001	urenajo01	11589	2015.0	2024.0
1	taillon	jameson	592791	tailj001	taillja01	11674	2016.0	2024.0

それぞれJosé Ureña、Jameson Taillonから打ったホームランでした。

次に飛距離の分布です。なお、225本のうち2本は計測データがないため、223本分のデータになります。また、飛距離はフィート(ft, 1ft ≒ 30.5cm)で表示されています。

hr_data['hit_distance_sc'].describe()
hit_distance_sc
count	223.000000
mean	414.130045
std	27.399877
min	338.000000
25%	396.500000
50%	414.000000
75%	433.500000
max	493.000000
import matplotlib.pyplot as plt
plt.hist(hr_data['hit_distance_sc'], bins=25)
plt.xlabel('distance / ft')
plt.ylabel('HR count')
plt.show()

image.png

平均飛距離が414ft(約126m)、最長は約150mのホームランでした。

最長飛距離のホームラン

hr_max = hr_data[hr_data['hit_distance_sc']==hr_data['hit_distance_sc'].max()]
print(hr_max[['game_date', 'pitcher', 'hit_distance_sc']])

pitcher_max = hr_max['pitcher']
pb.playerid_reverse_lookup([pitcher_max.iloc[0]])
game_date  pitcher  hit_distance_sc
867  2023-06-30   674072            493.0
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	henry	tommy	674072	henrt001	henryto01	26285	2022.0	2024.0

Tommy Henryから打ったホームランでした。

最短飛距離のホームラン

hr_min = hr_data[hr_data['hit_distance_sc']==hr_data['hit_distance_sc'].min()]
print(hr_min[['game_date', 'pitcher', 'hit_distance_sc']])
pitcher_min = hr_min['pitcher']
pb.playerid_reverse_lookup([pitcher_min.iloc[0]])
game_date  pitcher  hit_distance_sc
555  2024-08-24   671737            338.0
name_last	name_first	key_mlbam	key_retro	key_bbref	key_fangraphs	mlb_played_first	mlb_played_last
0	bradley	taj	671737	bradt002	bradlta01	22543	2023.0	2024.0

Taj Bradleyから打ったホームランでした。

打球方向

 次に、打球の方向について分析します。打球の到達位置を表すデータについて、以下を参考に数値の変換を行ってプロットしました。まずは打ったボールの球速と打球方向の関係を可視化します。プロットの色が濃いほど、速いボールを打ったことを表しています。

import matplotlib.pyplot as plt

# ホームベースを(0, 0)として、単位をftに変換
x = (hr_data['hc_x']-125.42)*2.5
y = (198.27-hr_data['hc_y'])*2.5

plt.scatter(x, y, c=hr_data['effective_speed'], cmap='OrRd')
plt.xlim(-350, 350)
plt.ylim(0, 550)

# ファールラインと内野を描画
plt.plot([0, -300], [0, 300], color='w')
plt.plot([0, 300], [0, 300], color='w')
plt.plot([-63, 0], [63, 126], color='w')
plt.plot([63, 0], [63, 126], color='w')

plt.gca().set_facecolor('green')
plt.show()

image.png

速球は逆方向(レフト方向)に打ち返していることがわかります。また、以下のように打球速度と打球方向の関係をプロットすると、ライト方向のホームランほど打球速度が速い(プロットの色が濃い)ことがわかりました。

import matplotlib.pyplot as plt

x = (hr_data['hc_x']-125.42)*2.5
y = (198.27-hr_data['hc_y'])*2.5

plt.scatter(x, y, c=hr_data['launch_speed'], cmap='OrRd')
plt.xlim(-350, 350)
plt.ylim(0, 550)
plt.plot([0, -300], [0, 300], color='w')
plt.plot([0, 300], [0, 300], color='w')
plt.plot([-63, 0], [63, 126], color='w')
plt.plot([63, 0], [63, 126], color='w')
plt.gca().set_facecolor('green')
plt.show()

image.png

また球種と打球方向の関係は以下のようになりました。

import matplotlib.pyplot as plt
import pandas as pd

x = (hr_data['hc_x']-125.42)*2.5
y = (198.27-hr_data['hc_y'])*2.5
pitch_names, unique = pd.factorize(hr_data['pitch_name'])

plt.scatter(x, y, c=pitch_names, cmap='Paired')
for i, pitch in enumerate(unique):
    plt.scatter([], [], c=plt.cm.Paired(i / len(unique)), label=pitch)

plt.xlim(-350, 350)
plt.ylim(0, 650)
plt.plot([0, -300], [0, 300], color='w')
plt.plot([0, 300], [0, 300], color='w')
plt.plot([-63, 0], [63, 126], color='w')
plt.plot([63, 0], [63, 126], color='w')
plt.legend(fontsize='small', ncol=4)
plt.gca().set_facecolor('0.6')
plt.show()

image.png

シーズンごとの比較

 ここからはいくつかの項目について、シーズンごとにどのようにデータが変化しているのか分析を行います。まずは以下のようにしてデータを分割します。

yearly_data = {}

for year in range(2018, 2025):
  yearly_data[year] = hr_data[hr_data['game_date'].str.startswith(str(year))]

# 例として2024年のデータを表示
hr_2024 = yearly_data[2024]
hr_2024.head()
pitch_type	game_date	release_speed	release_pos_x	release_pos_z	player_name	batter	pitcher	events	description	...	post_home_score	post_bat_score	post_fld_score	if_fielding_alignment	of_fielding_alignment	spin_axis	delta_home_win_exp	delta_run_exp	bat_speed	swing_length
2680	SI	2024-04-03	93.2	1.64	5.64	Ohtani, Shohei	660271	573124	home_run	hit_into_play	...	5	5	3	Strategic	Standard	134.0	0.114	0.939	74.36720	8.27785
2655	CH	2024-04-05	79.4	-2.87	6.06	Ohtani, Shohei	660271	543294	home_run	hit_into_play	...	6	4	6	Standard	Standard	231.0	-0.115	1.583	73.82423	8.34844
2602	SL	2024-04-08	85.6	-2.38	5.77	Ohtani, Shohei	660271	543351	home_run	hit_into_play	...	2	4	2	Infield shade	Standard	168.0	-0.141	0.982	82.31695	7.41697
2564	FF	2024-04-12	95.4	-2.70	5.83	Ohtani, Shohei	660271	650633	home_run	hit_into_play	...	1	1	2	Infield shade	Standard	216.0	0.099	0.976	70.75460	7.72320
2408	SL	2024-04-21	81.7	-1.38	5.85	Ohtani, Shohei	660271	605288	home_run	hit_into_play	...	2	2	0	Infield shade	Standard	86.0	0.200	1.739	82.79045	8.16199

シーズンごとのホームラン数は以下の通りです。

yearly_hr = []

for year, hr in yearly_data.items():
  yearly_hr.append([year, len(hr)])

yearly_hr = pd.DataFrame(yearly_hr, columns=['year', 'hr'])
yearly_hr
year	hr
0	2018	22
1	2019	18
2	2020	7
3	2021	46
4	2022	34
5	2023	44
6	2024	54
import matplotlib.pyplot as plt

plt.bar(yearly_hr['year'], yearly_hr['hr'])
plt.xlabel('year')
plt.ylabel('HR count')
plt.show()

image.png

2020年は怪我やシーズンの短縮などの影響もあってホームラン数も7本のみとなっていますが、2021年からはホームラン数が増加しています。
 次に、ストライクゾーン内のコース別のホームランをシーズンごとに比較します。なお、コースは投手目線の位置となっています。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(2, 4, figsize=(9, 4))

for idx, year in enumerate(range(2018, 2025)):
    zone = yearly_data[year].query('zone <= 9').groupby('zone')['events'].count()
    for i in range(1, 10):
        if i not in zone.index:
            zone.loc[i] = 0
    matrix = np.fliplr(np.array(zone).reshape(3, 3))

    ax = axes[idx // 4, idx % 4]
    sns.heatmap(matrix, annot=True, cmap='OrRd', ax=ax)
    ax.set_title(f'{year}')

fig.delaxes(axes[1, 3])
plt.tight_layout()
plt.show()

image.png

2020年までは低めのボールをほとんど打っていなかったのに対し、ここ数シーズンでは低めのボールもホームランにしています。21年や22年では、左打者に対して多く投じられるであろうアウトコースのホームランが多く、うまく対応できるようになっていると考えられます。また今シーズンは真ん中のホームランが圧倒的に多く、甘いボールを逃すことなくホームランにしていると言えます。
 次に飛距離と打球速度をシーズンごとに比較します。それぞれ、年度、平均値、最大値と、該当年度の全数値を羅列した表を取得した後、箱ひげ図を作成して比較しています。

yearly_dis = []

for year in range(2018, 2025):
  yearly_dis.append([year, yearly_data[year]['hit_distance_sc'].mean(),
                     yearly_data[year]['hit_distance_sc'].max(),
                     yearly_data[year]['hit_distance_sc'].values])

yearly_dis = pd.DataFrame(yearly_dis, columns=['year', 'average', 'longest distance', 'distance'])
yearly_dis
year	average	longest distance	distance
0	2018	413.300000	449.0	[397.0, 400.0, 449.0, 410.0, 414.0, 411.0, 443...
1	2019	406.388889	447.0	[429.0, 393.0, 362.0, 388.0, 400.0, 396.0, 416...
2	2020	401.571429	439.0	[402.0, 402.0, 351.0, 417.0, 439.0, 385.0, 415.0]
3	2021	416.065217	470.0	[421.0, 451.0, 422.0, 431.0, 402.0, 413.0, 440...
4	2022	407.647059	462.0	[406.0, 415.0, 390.0, 419.0, 407.0, 413.0, 418...
5	2023	421.659091	493.0	[447.0, 431.0, 397.0, 391.0, 415.0, 401.0, 413...
6	2024	414.944444	476.0	[430.0, 379.0, 362.0, 403.0, 423.0, 450.0, 360...
import seaborn as sns
import pandas as pd

data = []
for i, row in yearly_dis.iterrows():
    year = row['year']
    for value in row['distance']:
        data.append([year, value])

df = pd.DataFrame(data, columns=['year', 'distance'])
sns.boxplot(x='year', y='distance', data=df)

image.png

平均飛距離が大きく伸びているわけではないですが、2021年からは最長距離が伸びており、以下のシーズンごとの打球速度と相関があるような結果となっています。

yearly_vel = []

for year in range(2018, 2025):
  yearly_vel.append([year, yearly_data[year]['launch_speed'].mean(),
                     yearly_data[year]['launch_speed'].max(),
                     yearly_data[year]['launch_speed'].values])

yearly_vel = pd.DataFrame(yearly_vel, columns=['year', 'average', 'max velocity', 'velocity'])
yearly_vel
year	average	max velocity	velocity
0	2018	106.390909	112.9	[104.5, 100.0, 112.4, 112.0, 108.7, 102.8, 108...
1	2019	107.022222	114.4	[111.6, 111.0, 107.2, 104.1, 104.3, 106.9, 107...
2	2020	106.885714	111.3	[101.0, 105.4, 102.0, 110.4, 111.3, 109.1, 109.0]
3	2021	109.917391	117.2	[106.3, 115.2, 108.2, 108.9, 107.2, 108.3, 107...
4	2022	107.973529	118.0	[108.0, 108.1, 108.0, 108.3, 109.4, 109.8, 110...
5	2023	109.081818	117.1	[110.8, 110.3, 108.6, 116.7, 107.3, 103.9, 114...
6	2024	109.074074	118.7	[105.6, 105.2, 106.9, 107.3, 110.0, 118.7, 96....
import seaborn as sns
import pandas as pd

data = []
for i, row in yearly_vel.iterrows():
    year = row['year']
    for value in row['velocity']:
        data.append([year, value])

df = pd.DataFrame(data, columns=['year', 'velocity'])
sns.boxplot(x='year', y='velocity', data=df)

image.png

2021年から打球速度の最速値が上がっており、よりパワーが増していることが示唆されます。
 最後にシーズンごとの打球方向の比較です。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(2, 4, figsize=(14, 6))

for idx, year in enumerate(range(2018, 2025)):
  x = (yearly_data[year]['hc_x']-125.42)*2.5
  y = (198.27-yearly_data[year]['hc_y'])*2.5

  ax = axes[idx // 4, idx % 4]
  ax.scatter(x, y, c='w')
  ax.set_xlim(-350, 350)
  ax.set_ylim(0, 550)
  ax.plot([0, -300], [0, 300], color='w')
  ax.plot([0, 300], [0, 300], color='w')
  ax.plot([-63, 0], [63, 126], color='w')
  ax.plot([63, 0], [63, 126], color='w')
  ax.set_facecolor('green')
  ax.set_title(f'{year}')

fig.delaxes(axes[1, 3])
plt.tight_layout()
plt.show()

image.png

2018、19年はライト方向に偏っているわけでもなく、センターから逆方向にもバランスよく打っています。21年にはそれ以前よりも全ホームラン数自体が増えていましたが、特にライト方向へのホームランが急増していることがわかります。その後もライト方向は多いですが、センターから左中間方向も増えています。

分析結果の総括と所感

 以上のデータ分析から、2021年に傾向が変化し、ホームラン数の増加や飛距離・打球速度の向上が見られ、メジャー移籍当初と比較してパワーアップしていることがわかります。また打ったボールのコースや打球方向にも偏りがなくなっていて、どのようなボールでも広角に強い打球でホームランを打つことができるようになっていると言えます。今シーズンは移籍初年度、打者専念、リハビリと投手復帰に向けた調整など、過去数シーズンとは異なる状況の中でのシーズンでしたが、様々な項目でキャリアハイの成績を残しました。来シーズン以降、これらのデータがどのように変化し、さらに記録を更新していくのか楽しみです。

終わりに

 今回は大谷選手のメジャー全ホームランを分析しました。以前の投稿でも大谷選手の打撃結果の分析と予測モデルの作成を行いましたが、来シーズンは投手としての復帰も予定されています。投手データについてはまだ分析をしたことがないため、大谷選手のみならず今季非常に良い結果を残した今永投手を含め、山本投手、ダルビッシュ投手、松井投手、菊池投手などの投球データの分析にも取り組んでみたいと思います。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?