Era Baru Analisis Data dalam Baseball

SHELLA THERESYA PANDIANGAN
7 min readMar 13, 2021

Sumber Data CSV : DATACAMP

  1. Revolusi Statcast

Ini adalah Aaron Judge. Judge adalah salah satu pemain terbesar secara fisik di Major League Baseball dengan tinggi 6 kaki 7 inci (2,01 m) dan berat 282 pound (128 kg). Dia juga melakukan home run terberat yang pernah tercatat. Bagaimana kita mengetahui hal ini? Statcast.

Statcast adalah sistem pelacakan mutakhir yang menggunakan kamera resolusi tinggi dan peralatan radar untuk mengukur lokasi dan pergerakan yang tepat dari pemain bola dan bisbol. Diperkenalkan pada tahun 2015 untuk semua 30 pertandingan liga utama, data Statcast merevolusi permainan. Tim terlibat dalam “perlombaan senjata” analisis data, mempekerjakan analis kiri dan kanan dalam upaya untuk mendapatkan keunggulan dalam persaingan mereka. Video yang menggambarkan sistem ini luar biasa.

Dalam buku catatan ini, kita akan membahas, menganalisis, dan memvisualisasikan data Statcast untuk membandingkan Tuan Hakim dan rekan satu timnya (yang sangat besar). Mari kita mulai dengan memuat data ke dalam Notebook kita. Ada dua file CSV, jud.csv dan stanton.csv, keduanya berisi data Statcast 2015–2017. Kami akan menggunakan DataFrames pandas untuk menyimpan data ini. Mari kita juga memuat perpustakaan visualisasi data kita, matplotlib dan seaborn.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# Load Aaron Judge’s Statcast data
judge = pd.read_csv(‘datasets/judge.csv’)

# Load Giancarlo Stanton’s Statcast data
stanton = pd.read_csv(‘datasets/stanton.csv’)

2. Apa yang dapat diukur oleh Statcast? Pertanyaan yang lebih baik mungkin, apa yang tidak bisa diukur oleh Statcast? Dimulai dengan pelempar, Statcast dapat mengukur titik data sederhana seperti kecepatan. Pada saat yang sama, Statcast menggali jauh lebih dalam, juga mengukur titik pelepasan dan kecepatan putaran setiap nada. Pindah ke pemukul, Statcast mampu mengukur kecepatan keluar, sudut peluncuran dan vektor bola saat lepas dari bat. Dari sana, Statcast juga dapat melacak waktu hang dan jarak proyeksi yang dilalui bola. Mari kita periksa lima baris terakhir dari DataFrame juri. Anda akan melihat bahwa setiap baris mewakili satu lemparan yang dilemparkan ke pemukul. Anda juga akan melihat bahwa beberapa kolom memiliki nama esoterik. Jika ini tidak masuk akal sekarang, jangan khawatir. Yang relevan akan dijelaskan seperlunya.

# Display all columns (pandas will collapse some columns if we don’t set this option)
pd.set_option(‘display.max_columns’, None)

# Display the last five rows of the Aaron Judge file
judge.tail()

Output

3. Aaron Judge dan Giancarlo Stanton, pemalas yang produktif

Ini Giancarlo Stanton. Dia juga manusia yang sangat besar, dengan tinggi 6 kaki 6 inci dan berat 245 pon. Meski tidak mengenakan jersey yang sama dengan Judge pada gambar yang diberikan, di tahun 2018 ini mereka menjadi rekan satu tim di New York Yankees. Mereka serupa dalam banyak hal, salah satunya karena mereka melakukan banyak home run. Stanton dan Judge memimpin baseball di home run pada tahun 2017, dengan masing-masing 59 dan 52. Ini adalah total yang luar biasa — pemain di urutan ketiga “hanya” melakukan 45 home run.

Stanton dan Judge juga berbeda dalam banyak hal. Salah satunya adalah acara bola yang dipukul, yaitu setiap bola yang dipukul yang menghasilkan suatu hasil. Ini termasuk out, hit, dan error. Selanjutnya, Anda akan menemukan jumlah pertandingan bola memukul untuk setiap pemain pada tahun 2017. Frekuensi acara lainnya sangat berbeda.

# All of Aaron Judge’s batted ball events in 2017
judge_events_2017 = judge.loc[judge[‘events’] == 2017].events
print(“Aaron Judge batted ball event totals, 2017:”)
print(judge_events_2017.value_counts())

# All of Giancarlo Stanton’s batted ball events in 2017
stanton_events_2017 = stanton.loc[stanton[‘events’] == 2017].events
print(“\nGiancarlo Stanton batted ball event

Output

4. Menganalisis home run dengan data Statcast
Dua dari metrik Statcast yang paling inovatif adalah sudut peluncuran dan kecepatan keluar:

Sudut peluncuran: sudut vertikal di mana bola meninggalkan pemukul pemain
Exit velocity: kecepatan bola bisbol saat melepaskan bat
Data baru ini telah mengubah cara tim menilai baik hitter maupun pitcher. Mengapa? Sesuai dengan Washington Post:

Bola yang dipukul dengan sudut peluncuran tinggi lebih cenderung menghasilkan pukulan.

Mari kita lihat kecepatan keluar vs. sudut peluncuran dan fokus pada home run saja (2015–2017). Dua plot pertama menunjukkan titik data. Dua yang kedua menunjukkan kontur yang dihaluskan untuk mewakili kepadatan.

5. Home run dengan pitch velocity
Statcast tidak hanya mengukur kecepatan bola yang keluar dari pemukul, tetapi juga mengukur kecepatan bola yang keluar dari tangan pelempar dan memulai perjalanannya menuju plate. Kita dapat menggunakan data ini untuk membandingkan home run Stanton dan Judge dalam hal kecepatan nada. Selanjutnya Anda akan menemukan plot kotak yang menampilkan ringkasan lima angka untuk setiap pemain: minimum, kuartil pertama, median, kuartil ketiga, dan maksimum.

# Combine the Judge and Stanton home run DataFrames for easy boxplot plotting
judge_stanton_hr = pd.concat([judge_hr, stanton_hr])

# Create a boxplot that describes the pitch velocity of each player’s home runs
sns.boxplot(x=’player_name’,y=’release_speed’, color=’tab:blue’, data=judge_stanton_hr).set_title(‘Home Runs, 2015–2017’)

Output

6. Tim tuan rumah berdasarkan lokasi lapangan (I)
Jadi Judge tampaknya memukul rumahnya dengan lemparan yang lebih cepat daripada Stanton. Kita mungkin menyebut Judge sebagai pemukul fastball. Stanton tampak agnostik terhadap kecepatan nada dan kemungkinan pergerakan pitchkarena nada yang lebih lambat (misalnya bola melengkung, penggeser, dan pergantian) cenderung memiliki lebih banyak jeda. Statcast melacak pergerakan dan jenis nada, tetapi mari beralih ke hal lain: lokasi nada. Statcast melacak zona lapangan saat melintasi pelat. Penomoran zona terlihat seperti ini (dari sudut pandang penangkap):

Kita dapat memplotnya menggunakan histogram 2D. Untuk kesederhanaan, mari kita lihat pemogokan, yang memberi kita kisi 9x9. Kita dapat melihat setiap zona sebagai koordinat pada plot 2D, pojok kiri bawah menjadi (1,1) dan pojok kanan atas menjadi (3,3). Mari kita siapkan fungsi untuk menetapkan koordinat x ke setiap nada.

def assign_x_coord(row):
“””
Assigns an x-coordinate to Statcast’s strike zone numbers. Zones 11, 12, 13,
and 14 are ignored for plotting simplicity.
“””
# Left third of strike zone
if row.zone in [1, 4, 7]:
return 1
# Middle third of strike zone
if row.zone in [2, 5, 8]:
return 2
# Right third of strike zone
if row.zone in [3, 6, 9]:
return 3

7. Tim tuan rumah berdasarkan lokasi lapangan (II)
Dan mari lakukan hal yang sama tetapi untuk koordinat y.

def assign_y_coord(row):
“””
Assigns a y-coordinate to Statcast’s strike zone numbers. Zones 11, 12, 13,
and 14 are ignored for plotting simplicity.
“””
# Upper third of strike zone
if row.zone in [1,2,3]:
return 3
# Middle third of strike zone
if row.zone in [4,5,6]:
return 2
# Lower third of strike zone
if row.zone in [7,8,9]:
return 1

8. Zona home run Aaron Judge
Sekarang kita dapat menerapkan fungsi yang telah kita buat kemudian membuat histogram 2D kita. Pertama, untuk Aaron Judge (sekali lagi, untuk lemparan di strike zone yang menghasilkan home run).

judge_strike_hr = judge_hr.copy().loc[judge_hr.zone <= 9]

# Assign Cartesian coordinates to pitches in the strike zone for Judge home runs
judge_strike_hr[‘zone_x’] = judge_strike_hr.apply(assign_x_coord, axis=1)
judge_strike_hr[‘zone_y’] = judge_strike_hr.apply(assign_y_coord, axis=1)

# Plot Judge’s home run zone as a 2D histogram with a colorbar
plt.hist2d(judge_strike_hr[‘zone_x’], judge_strike_hr[‘zone_y’], bins = 3, cmap=’Blues’)
plt.title(‘Aaron Judge Home Runs on\n Pitches in the Strike Zone, 2015–2017’)
plt.gca().get_xaxis().set_visible(False)
plt.gca().get_yaxis().set_visible(False)
cb = plt.colorbar()

Output

9. Zona home run Giancarlo Stanton
Dan sekarang untuk Giancarlo Stanton.

# Zones 11, 12, 13, and 14 are to be ignored for plotting simplicity
stanton_strike_hr = stanton_hr.copy().loc[stanton_hr.zone <= 9]

# Assign Cartesian coordinates to pitches in the strike zone for Stanton home runs
stanton_strike_hr[‘zone_x’] = stanton_strike_hr.apply(assign_x_coord, axis=1)
stanton_strike_hr[‘zone_y’] = stanton_strike_hr.apply(assign_y_coord, axis=1)

# Plot Stanton’s home run zone as a 2D histogram with a colorbar
plt.hist2d(stanton_strike_hr[‘zone_x’], stanton_strike_hr[‘zone_y’], bins = 3, cmap=’Blues’)
plt.title(‘Giancarlo Stanton Home Runs on\n Pitches in the Strike Zone, 2015–2017’)
plt.gca().get_xaxis().set_visible(False)
plt.gca().get_yaxis().set_visible(False)
cb = plt.colorbar()
cb.set_label(‘Counts in Bin’)

Output

10. Haruskah pelempar lawan takut?
Beberapa kesimpulan:

Stanton tidak melakukan banyak home run di lapangan di sepertiga bagian atas zona serangan.
Seperti hampir semua hitter, kedua pemain menyukai lemparan di tengah plate horizontal dan vertikal.
Lemparan home run paling tidak favorit dari juri tampaknya jauh sementara Stanton tampaknya jauh.
Jika kita mendeskripsikan zona home run Stanton, itu akan berada di tengah-dalam. Zona home run juri jauh lebih tersebar.
Pengambilan utama dari keseluruhan latihan ini: Aaron Judge dan Giancarlo Stanton tidak identik meskipun mereka memiliki kemiripan yang dangkal. Dalam hal home run, profil peluncuran mereka, serta kecepatan pitch dan preferensi lokasinya, berbeda.

Haruskah pelempar lawan masih takut?

​# Should opposing pitchers be wary of Aaron Judge and Giancarlo Stanton
should_pitchers_be_scared = True

--

--