Меня всегда интересовали прогнозное моделирование и статистика. Прежде чем заняться программированием, я изучал финансы, поэтому познакомился со многими статистическими концепциями, но в основном через призму портфельной теории. Однако для большинства людей (включая меня) статистика и ее важность гораздо лучше усваиваются в мире спорта. Баскетбол, в частности, все еще находится в середине аналитической революции, и контент по расширенной статистике доступен как никогда раньше. Какое-то время у меня была идея создать какую-то модель в глубине души, но раньше я мог построить что-то только с помощью Excel, что было бы не так удовлетворительно, как пытаться создать что-то с реальным кодом. Теперь, когда я действительно могу писать код — для этого первого поста — я решил посмотреть, что я могу сделать на Ruby с нуля — начав с поиска фреймворка статистики для баскетбола, а затем посмотрев, смогу ли я воссоздать некоторое подобие это внутри программы.

Итак, какие статистические данные особенно полезны в качестве предикторов успеха команды? Есть ли неэффективность, которую рынок не учел? Очевидно, что этот вопрос бесконечно глубок, поэтому для начала я хотел посмотреть, смогу ли я найти какую-то общепринятую структуру, которая не была бы слишком сложной для таких людей, как я, которые не полностью разбираются в мире продвинутой статистики. Я наткнулся на Четыре фактора баскетбольного успеха Дина Оливера (подробнее о них можно прочитать здесь: https://www.basketball-reference.com/about/factors.html).

Четыре фактора определяют четыре области, в которых выигрывают баскетбольные матчи, взвешенные по их значимости. Факторы таковы:

Стрельба (40%), измеренная с eFG%

Оборот (25%) – измерено с учетом TOV%

Отскок (20%) - измерено с ORB% И DRB%

Штрафные броски (15%) - ставка рассчитывается по FT/FGA.

(обратите внимание: «четыре» фактора на самом деле состоят из восьми различных характеристик, измеряемых как для нападения, так и для защиты. Подборы в защите (DRB%) — это единственная явно отличающаяся характеристика между нападением и защитой)

Таким образом, с этой структурой следующим шагом было получение некоторых данных для работы. Я не смог найти бесплатный API, предоставляющий всю необходимую мне статистику, поэтому я обратился к данным Basketball Reference (https://www.basketball-reference.com/) — замечательному источнику информации. каждая статистика, которую вы могли бы придумать на 50+ лет назад. Еще лучше — они фактически предоставляют таблицу Разная статистика, которая конкретно включает четыре фактора. Я экспортировал таблицу в формате CSV и прочитал ее в Ruby, а также создал метод для извлечения заголовков столбцов из таблицы и использования их для создания хэша всей статистики с их метками.

Теперь, как эти данные моделируются? Можем ли мы проверить, действительно ли эти четыре фактора являются законным способом взглянуть на то, как выигрываются игры? Я собираюсь повторить здесь, что я никоим образом не статистик, поэтому я еще раз проконсультировался в Интернете, чтобы найти пример четырех факторов в действии, и наткнулся на другой блог, в котором демонстрировались некоторые математические расчеты, используемые в статистическом анализе. (все кредиты Джастину Джейкобсу https://squared2020.com/2017/09/05/introduction-to-olivers-four-factors/). Пост предоставил отличный пример того, как попытаться использовать данные, выполнив линейную регрессию для моделирования взаимосвязи между факторами и общим количеством побед команды. Имея представление о том, где взять данные, я попытался затем продублировать результат в Ruby.

Для начала я нарисовал новую таблицу, используя данные сезона 2016-17, чтобы сравнить с блогом Джастина. Я сократил данные в своем хеше только до тех, которые относятся к четырем факторам, а также добавил данные для общего выигрыша, а затем нашел жемчужину под названием eps (https://github.com/ankane/eps). это позволило бы мне выполнить линейную регрессию в Ruby. Я провел регрессию для своего хэша, используя выигрыши в качестве зависимой переменной, и получил данные, которые были почти идентичны цифрам Джастина (небольшие отклонения из-за незначительных различий в используемых данных). Подводя итоги, можно сказать, что все коэффициенты указывали в правильном направлении (т. е. набранные очки в атаке положительно повлияли на победу, а потери повлияли отрицательно), а r² составил 0,896, что указывает на довольно высокую корреляцию между четырьмя факторами и общим количеством побед команды. сведите все к самому основному моменту - модель действительно отражала реальность (но серьезно - прочитайте сообщение в блоге, если что-то из этого вас интересует, для гораздо более подробного описания с показанными фактическими графиками и математикой).

Чтобы завершить это с некоторыми заключительными мыслями:

  • Было унизительно погрузиться в мир такой статистики и увидеть, насколько глубокими могут быть даже самые «простые» статистические данные и фреймворки. Реальность этой аналитики во многом схожа с фондовым рынком: каждый ищет любую неэффективность, будь то кто-то из аналитического отдела команды, принимающий решение о выборе команды на драфте, или профессионал, который лучше ищет возможности в линиях. Точно так же, как кодирование/разработка, это одна из тех тем, которые кажутся бесконечно глубокими, но попытка преодолеть разрыв и воплотить модель в реальность с помощью моего собственного кода была очень забавной — лучше, но есть место для улучшения — даже в этой крошечной вещи. Я построил. Через несколько недель я оглянусь на это и смогу сделать гораздо больше.
  • Я не думаю, что я следующий Билли Бин, и я, конечно, не стал бы рисковать тем, что выдает эта модель (она даже ничего не ДЕЛАЕТ!) использование этого определенно то, над чем я планирую работать больше в будущем. Только в этом упражнении я наткнулся на так много новых концепций, которые хотел бы изучить и реализовать (например, машинное обучение). Но это в другой раз — я обязательно вернусь к этому не позднее, чем через несколько недель, и у меня будут готовы улучшения.

Спасибо за чтение

-Логан