Пошаговый обзор моего первого опыта создания проекта на языке программирования R.

В распоряжении аналитика много инструментов. Excel должен быть наиболее широко распространенным, и это то, с чем у меня больше всего опыта. Это быстро, эффективно и понятно почти всем аналитикам. С учетом сказанного я готов бросить вызов себе, чтобы изучить R с бейсбольными данными.

Некоторые из моих самых ранних воспоминаний связаны с бейсболом. Я играю с 3 лет, моя бейсбольная карьера продолжалась на втором курсе колледжа, и с тех пор я скучаю по ней. После работы на разных должностях аналитика за последние несколько лет пришло время вернуться и освоить новый навык, пока я этим занимаюсь.

Изучайте R с бейсбольными данными

Те, кто знаком с текущим состоянием бейсбола, знают о различных вариантах использования огромного количества доступных данных о бейсболе. Мне интересно найти полезную информацию, которая дополнит работу гигантов отрасли.

Я рассматривал возможность работы над некоторыми идеями:

  • Отчет о лучших нападающих для команд в определенных погодных условиях
  • Влияние погоды на результативность ватина в масштабах всей лиги
  • Модель регрессионного анализа, определяющая наиболее значимые показатели, способствующие повышению результативности ударов в плохих погодных условиях.

Это то, о чем я думаю, но уже есть много литературы на тему погоды и результативности в MLB.

Этот анализ, проведенный Кохом и Панорской укрепляет мое понимание эффективности ударов в холодную и теплую погоду.

Вот более свежая статья о том, как погода может повлиять на решения по составу. Он уделяет больше внимания плотности воздуха во время игр и тому, как температура влияет на плотность воздуха.

Главный вывод: нападающие лучше всего себя чувствуют в жарких погодных условиях.

Хорошо. Это полезно. Я заинтересован в том, чтобы стать более гранулированным.

Фредди Фриман — игрок, за которым мне нравится наблюдать. Он также является горячей темой сейчас, пока он ведет переговоры с Atlanta Braves.

Для этого анализа я сравню эффективность ударов Фредди Фримена с каждым другим игроком с 1-й базы в лиге, но я хочу добавить еще одно ограничение. Хочу проанализировать его производительность в играх выше 70 градусов. Почему? Согласно первой статье, на которую я ссылался выше, Атланта занимает второе место по количеству игр, сыгранных в холодную погоду.

Почему это актуально? Фредди Фриман помогает привлекать болельщиков на игры в Атланте. Большинство из этих игр проходят в теплую погоду. Исторически так сложилось, что нападающие лучше работают в теплую погоду.

Гипотеза

Эффективность Фредди Фримена в теплых матчах в среднем лучшая в лиге.

Почему я так думаю? Фриман играет в более теплых играх, чем другие игроки первой базы.

Работа в спринтах

Для начала я импортирую данные из Baseball Savant, показываю данные в R и фильтрую по событиям 1-й базы при погоде › 70 градусов. Я импортирую данные о погоде позже.

Вот как выглядит мой первый файл через 20 минут:

install.packages('tidyverse')
install.packages('readr')

require(devtools)
library(readr)
library(readxl)
library(ggplot2)

savant_data_12_7 <- read_excel("savant_data_12_7.xlsx")
View(savant_data_12_7) 

ggplot(savant_data_12_7, aes(pitches, woba)) + geom_point() + geom_smooth()

Я хочу просмотреть данные Baseball Savant, чтобы понять, двигаюсь ли я в правильном направлении. Последняя строка кода сверху создала такой график:

Давайте поменяем местами поля и координаты wOBA и посмотрим, улучшит ли это визуальное представление:

Это имеет смысл. Отбивающие, которые видят больше всего шагов, колеблются вокруг значения нагрузки чуть больше 0,3.

Пришло время поработать над импортом данных о погоде, отфильтровать нападающих по тем, у кого самый высокий wOBA и наибольшая дальность попадания, и красиво представить данные.

Задачи в проектах кодирования могут занять больше времени, чем вы думаете

Мне потребовалась минута, чтобы попытаться отфильтровать данные из Baseball Savant. К счастью, я нашел лучшие данные в Stathead Baseball. Я смог отфильтровать данные на основе того, сколько игр каждый игрок с низов сыграл в сезоне 2020 и 2021 годов при температуре выше 70 градусов.

Правка. В итоге я использовал данные только за сезон 2021 года из-за того, сколько времени ушло на экспорт книг Excel для каждой страницы данных, возвращенных Stathead Baseball.

Я экспортировал файл как книгу Excel и создал сводную таблицу для данных. Вот диаграмма, показывающая количество игр, сыгранных каждым игроком с первой базы в 2021 году, когда погода была выше 70 градусов:

Я отфильтровал данные в Excel, чтобы найти количество сыгранных игр, и построил график выше.

В 2021 году Фредди Фриман сыграл больше игр, чем любой другой игрок с первой базы в таких условиях. Давайте посмотрим на его средний wOBA во время этих игр по сравнению с другими игроками.

Примечание: столбцы Юрия Гурриэля возвращают значение N/A, когда я вычисляю среднее значение wOBA, поэтому пока лучше исключить его из группы.

мое невежество показывает

Пытаясь добавить столбец во фрейм данных, я перепробовал так много вещей. Наконец-то я понял, что, вероятно, могу просто включить существующий столбец, добавив его в функцию списка. Это сработало. Вот код:

groupedwoba <- wobadata %>%
  group_by(Player) %>%
  summarise_at(vars(wOBA),
               list(avgwOBA = mean, PA = sum)) %>%
  arrange(desc(avgwOBA)) %>%
  filter(Player=="Freddie Freeman" | Player=="Pete Alonso" | Player=="Paul Goldschmidt" | Player=="Matt Olson" | Player=="Yuli Gurriel" | Player=="Carlos Santana" | Player=="José Abreu" | Player=="Vladimir Guerrero Jr." | Player=="Joey Votto" | Player=="Anthony Rizzo")

Вот вывод приведенного выше кода:

Я не уверен, почему данные Юлия Гурриэля вернулись как N/A. Это оставляет работу на другой раз. В любом случае, выше приведен список лучших игроков первой базы MLB 2021 года по версии avgwOBA во время игр, где температура была ≥ 70 градусов по Фаренгейту.

Подведение итогов

Результаты (наконец-то) готовы, и похоже, что Фредди Фриман не был лучшим игроком с первой базы по среднему показателю wOBA во время игр, когда в 2021 году погода была выше 70 градусов.

Вот график, отображающий результаты:

Вот код, который создал приведенный выше график:

testgraph <- ggplot(groupedwoba, aes(x = PA, y = avgwOBA, fill=Player))+
  geom_bar(position="dodge", stat="identity")
testgraph

Интересно, что этот график включает то, что кажется правильным для Юлия Гурриэля. Ранее в проекте объект groupedwoba возвращал значения NA для его статистики. Странно, но график кажется правильным.

Заключение

Юлий Гурриэль, без сомнения, является одним из самых впечатляющих игроков первой базы 2021 года. Результаты показывают это. Они также показывают, что Фредди Фриман определенно не единственный, кто часто играет в 70-градусную погоду. Фриман по-прежнему показывает впечатляющие цифры, но он не лучший. Я думаю, можно с уверенностью сказать, что Фриман входит в пятерку лучших игроков с низов в теплую погоду, и я отвергаю свою первоначальную гипотезу.

Вот мой готовый файл R:

install.packages('tidyverse')
install.packages('readr')
install.packages('dplyr')
require(devtools)
require(dplyr)
library(readr)
library(readxl)
library(ggplot2)
savant_data_12_7 <- read_excel("savant_data_12_7.xlsx")
mydata <- savant_data_12_7[, c(3, 1, 11)]
mydata
ggplot(savant_data_12_7, aes(woba, pitches)) + geom_point() + geom_smooth()
library(readxl)
sportsref_download <- read_excel("sportsref_download.xlsx", 
                                 col_types = c("numeric", "text", "date", 
                                               "text", "text", "text", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "numeric", "numeric", "numeric", 
                                               "text", "numeric", "numeric"))
wobadata <- sportsref_download %>% select(Player, HBP, H, `2B`, `3B`, HR, AB, BB, IBB, SF,PA) %>%
  mutate(wOBA=((.69*(BB-IBB)+(.72*HBP)+(.89*H)+(1.27*`2B`)+(1.62*`3B`)+(2.1*HR))/(AB+BB-IBB+SF+HBP)))
wobadata
groupedwoba <- wobadata %>%
  group_by(Player) %>%
  summarise_at(vars(wOBA),
               list(avgwOBA = mean, PA = sum)) %>%
  arrange(desc(avgwOBA)) %>%
  filter(Player=="Freddie Freeman" | Player=="Pete Alonso" | Player=="Paul Goldschmidt" | Player=="Matt Olson" | Player=="Yuli Gurriel" | Player=="Carlos Santana" | Player=="José Abreu" | Player=="Vladimir Guerrero Jr." | Player=="Joey Votto" | Player=="Anthony Rizzo")
testgraph <- ggplot(groupedwoba, aes(x = PA, y = avgwOBA, fill=Player))+
  geom_bar(position="dodge", stat="identity")
testgraph

Вы можете найти больше кода здесь: https://github.com/spotswoodb/weathered_hitting

Будущие улучшения

В этом пространстве больше места для анализа. Я хотел бы регрессировать некоторые числа, такие как wOBA, в зависимости от появления тарелок в теплых играх и в холодных играх, или среднее расстояние попадания в зависимости от температуры игры.

Надеюсь, вам понравилась эта история. Спасибо за чтение и двойное спасибо, если вы прочитали все это. Я ценю ваше время больше, чем вы думаете. Я так многому научился в этом проекте и с тех пор, как вчера начал изучать R. Я надеюсь, что вы тоже. Возможности безграничны.

Бейсбол Савант

Как погода должна влиять на ваши решения по бейсбольному составу

Статхед Бейсбол

Влияние температуры на Высшую лигу бейсбола