Моделирование Результатов в Гольфе с Помощью Цепей Маркова

Мотивация

С тех пор, как мне исполнилось девять лет, в моей жизни было лишь два занятия, которые меня по-настоящему интересовали. К ним относились мой любимый спорт и учёба. Я совмещала игру в гольф за сборную команду России с учёбой на отличные оценки в инженерном классе Московской школы. По окончанию школы, моим следующим шагом было поступление в университет США, где программа student-athlete очень сильно развита. Тебе дают возможность получать высшее образование, а также быть частью спортивной команды, которая соревнуется с командами других университетов в течении всего учебного года. И вот, прошло уже три с половиной года с тех пор, как я стала частью этой команды, а значит, остался один семестр до того, как я надену мантию. И по случаю завершения моей карьеры, в моей голове возник вопрос, а есть ли что-то, что связывает студенческий гольф и знания, которые я приобрела.

Введение

В студенческом гольфе, как и в любом другом спортивном туре, есть разные виды турниров, а конкретнее: Regular Season Tournaments — где твоя команда соревнуется с 10–20 другими, в зависимости от бюджета университета, местоположения университета и уровня игроков, таких турниров каждая команда играет четыре осенью, и шесть весной; Conference Championship — где твоя команда соревнуется с уже определенными командами, которые исторически входят в состав вашей конференции, проходит в апреле; и Post Season Tournaments, куда проходят только команды выигрывавшие Conference Championship, а также команды, входящие в топ-50 рейтинга по результатам Regular Season (всего в дивизионе за который я играю около 250 команд), проходит в два этапа, Regionals и Nationals, и оба проходят в мае. 

Несложно догадаться, что основное внимание каждой команды лежит на Conference Championship, все силы и подготовка направлены туда. И вот, готовясь к моей последней Конференции, я задала себе вопрос, а можно ли математически предсказать вероятность победы моей команды? Об этом я и расскажу, но начнём с теории о статистическом методе, который я выбрала для оценки вероятности выигрыша. А именно, с Марковских Цепей. 

Теория Метода

Цепь Маркова — последовательность случайных событий с конечным или счетным числом исходов, где вероятность наступления каждого события зависит только от состояния, достигнутого в предыдущем событии. Характеризуется тем свойством, что, говоря нестрого, при текущем настоящем состоянии системы, её будущее состояние не зависит от прошлого. Названа в честь А.А. Маркова, который впервые ввёл это понятие в работе 1906 года. [1]

Создаётся переходная матрица на n-шаге

P(n) = P_{ij} (n) = P(X_{n+1}=j | X_{n}=i)

А вектор

p=(p_1,p_2,...)^T, p_i=P(X_0=i)

является начальным распределением цепи Маркова.

Матрица является стохастической, так как сумма вероятностей в каждом ряду равна единице. 

Пример

Давайте поработаем с примером (все цифры выдуманные). И так, у нас есть три вида погоды, которые могут наступить завтра: дождь, солнце и ветер. Если сегодня был дождь, то вероятность того, что завтра снова будет дождь 60%, вероятность того, что будет ветер 30%, и вероятность того, что будет солнце 10%. Если сегодня было солнце, то вероятность того, что завтра будет солнце 70%, вероятность того, что будет ветер 10%, и вероятность того, что будет дождь 20%. Ну, а если сегодня был ветер, то вероятность того, что завтра сохраниться ветреная погода будет равна 60%, вероятность того, что будет солнце 15% и вероятность дождя 25%. Там самым, создается переходная матрица, где n-шаг это один день, а состояния квадратной матрицы — дождь, солнце, ветер. 

Дождь

Солнце

Ветер

Дождь

0,6

0,1

0,3

Солнце

0,2

0,7

0,1

Ветер

0,25

0,15

0,6

Тем самым, если сегодня 14 декабря, и сегодня идет дождь, то вероятность солнца 15 декабря будет равна 10%. Ну, а если мы хотим рассчитать вероятность солнца 16 декабря, то тогда мы возводим матрицу во вторую степень, так как теперь, n-шаг это два дня, вместо одного, а результаты 14 декабря никак не влияют на погоду 16-го, по Марковским цепям. 

Гольф Команды

Ну вот, когда мы разобрались с теорией, пора вернуться обратно к гольфу. И так, напомню, что цель этой статьи, рассчитать вероятность победы каждой команды, которая будет соревноваться в Conference Championship вместе со мной. Команд всего девять:

  • Калифорнийский Государственный Университет, Лонг Бич (Long Beach State University = LBSU) *моя команда

  • Калифорнийский Государственный Университет, Фуллертон (California State University Fullerton = CSUF)

  • Калифорнийский Государственный Университет, Нортридж (California State University Northridge = CSUN)

  • Калифорнийский Государственный Университет, Бэйкерсфилд (California State University Bakersfield = CSUB)

  • Университет Калифорнии, Ирвайн (University of California Irvine = UCI)

  • Университет Калифорнии, Риверсайд (University of California Riverside = UCR)

  • Университет Калифорнии, Дэвис (University of California Davis = UCD)

  • Калифорнийский Политехнический Университет, Сан Луис Обиспо (California Polytechnic University San Luis Obispo = Cal Poly SLO)

  • Университет Гавайев (University of Hawaii = UHawaii)

И так, как проводятся соревнования по гольфу в целом. Каждая команда состоит из пяти человек. Каждый турнир состоит из трех раундов по 18 лунок. Результат каждого раунда считается как сумма четырех из пяти лучших (наименьших) результатов. 

Для анализа, я собрала результаты каждой из девяти команды на всех турнирах, проведенных осенью 2024 года. Все команды сыграли по четыре разных турнира. Поскольку команды играли в неравных условиях, а в гольфе, на результат сильно оказывают влияния такие факторы как погода, сложность поля и уровень соперников, я также учла корректировку — очки рейтинга, которые предоставлены на официальном сайте подсчета счетов в университетском спорте [2]. 

С помощью таблицы в Microsoft Excel, я смогла посчитать счет каждой команды в каждом раунде, а также средний счет (с учетом очков рейтинга) за осенний сезон.

41cd8ed22110d05fe4135dc0bcbe8a8b.png6769ccaf1a8c1cb28e30011c9453b8f8.png

Использование Метода

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

  • Вероятность того, что команда сохранит свою позицию в рейтинге больше, чем вероятность того, что команда её поменяет, так как один раунд это очень короткий промежуток времени

  • Упасть в рейтинге легче, чем подняться, так как в гольфе нельзя сыграть лучше определенного счета, но можно сыграть неограниченно плохо

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

Средний счет (с учетом очков рейтинга) за осенний сезон помог создать начальное распределение цепи:

  1. UCD 250,51

  2. LBSU 262,3

  3. CSUF 266,92

  4. UCI 267,05

  5. Cal Poly Slo 272,46

  6. UCR 274,78

  7. UHawaii 289,82

  8. CSUN 291,48

  9. CSUB 294,08

И так, имея всю нужную информацию, можно приступать к написанию кода для выведения матрицы и последующей работы с ней.

teams <- c("UC Davis", "Long Beach State", "Cal State Fullerton",
           "UC Irvine", "Cal Poly Slo", "UC Riverside",
           "U of Hawaii", "Cal State Northridge", "Cal State Bakersfield")
scores <- c(250.51, 262.3, 266.92, 267.05, 272.46, 274.78, 289.82, 291.48, 294.08)
n <- length(scores)
P <- matrix(0, nrow = n, ncol = n)
for (i in 1:n) {
  for (j in 1:n) {
    if (i == j) {
      P[i, j] <- 0.7
    } else if (abs(i - j) == 1) {
      if (j > i) {
        P[i, j] <- -0.09
      } else {
        P[i, j] <- 0.14
      }
    } else if (abs(i - j) == 2) {
      if (j > i) {
        P[i, j] <- -0.04
      } else {
        P[i, j] <- 0.07
      }
    } else if (abs(i - j) == 3) {
      if (j > i) {
        P[i, j] <- -0.02
      } else {
        P[i, j] <- 0.06
      }
    } else {
      P[i, j] <- 0.01 / abs(i - j)
    }
  }
  if (i <= 6) {
    P[i, 7:n] <- 0
  } else {
    P[i, 1:6] <- 0
  }
  P[i, ] <- P[i, ] / sum(P[i, ])
}
print(round(P, 3))

результат прогонки кода

результат прогонки кода

Далее, используя полученную матрицу, я смоделировала движение между рейтингами для каждой команды в течении следующих 18 раундов — именно столько раундов осталось до старта Конференции -, а также, посчитала средний рейтинг для каждой команды. Здесь я предоставлю код, написанный для моей команды, но для моделирования остальных, приходилось менять лишь строку «current rank» и название+цвет графика.

tm <- matrix(c(
  0.820, 0.105, 0.047, 0.023, 0.003, 0.002, 0.000, 0.000, 0.000,
  0.141, 0.705, 0.091, 0.040, 0.020, 0.003, 0.000, 0.000, 0.000,
  0.066, 0.132, 0.660, 0.085, 0.038, 0.019, 0.000, 0.000, 0.000,
  0.055, 0.064, 0.127, 0.636, 0.082, 0.036, 0.000, 0.000, 0.000,
  0.002, 0.056, 0.066, 0.032, 0.659, 0.085, 0.000, 0.000, 0.000,
  0.000, 0.000, 0.000, 0.144, 0.717, 0.000, 0.000, 0.000, 0.000,
  0.000, 0.000, 0.000, 0.000, 0.844, 0.108, 0.048, 0.000, 0.000,
  0.000, 0.000, 0.000, 0.000, 0.000, 0.151, 0.752, 0.097, 0.000,
  0.000, 0.000, 0.000, 0.000, 0.000, 0.077, 0.154, 0.769
), byrow = TRUE, nrow = 9)
current_rank <- 2
trajectory <- numeric(18)
trajectory[1] <- current_rank
for (round in 2:18) {
  current_rank <- sample(1:9, size = 1, prob = tm[current_rank, ])
  trajectory[round] <- current_rank
}
average_rank <- mean(trajectory)
plot(1:18, trajectory, type = "o", col = "gold", pch = 16,
     xlab = "Round", ylab = "Rank", main = "Trajectory of Long Beach State Over 18 Rounds",
     ylim = c(9, 1), yaxt = "n")
axis(2, at = 1:9, labels = 1:9)
grid()
segments(x0 = 0, y0 = average_rank, x1 = 18, y1 = average_rank, col = "black", lty = 2)
text(x = 10, y = 5, labels = paste("Avg Rank:", round(average_rank, 2)), col = "black", pos = 4)

результат прогонки кода

результат прогонки кода

Ну и для сравнения, хочу показать результат прогонки кода для трех других команд — одной из высшего звена, одной из среднего и одной из низшего.

команда высшего звена

команда высшего звена

команда среднего звена

команда среднего звена

команда низшего звена

команда низшего звена

В итоге, средний рейтинг каждой команды получился таким:

  1. UCD 2,44

  2. LBSU 2,94

  3. CSUF 3,28

  4. UCI 4,06

  5. Cal Poly Slo 4,28

  6. UCR 5,61

  7. UHawaii 8,22

  8. CSUB 8,28

  9. CSUN 8,33

С помощью алгебры, я перевела средний рейтинг команды в вероятность выигрыша и получила следующие результаты

total_probability <- 1 / 2.44 + 1 / 2.94 + 1 / 3.28 + 1 / 4.06 + 1 / 4.28 + 1 / 5.61
print(UC_Davis <- (1 / 2.44) / total_probability)
print(Long_Beach_State <- (1 / 2.94) / total_probability)
print(Cal_State_Fullerton <- (1 / 3.28) / total_probability)
print(UC_Irvine <- (1 / 4.06) / total_probability)
print(Cal_Poly_Slo <- (1 / 4.28) / total_probability)
print(UC_Riverside <- (1 / 5.61) / total_probability)
print(U_Hawaii <- 0)
print(Cal_State_Bakersfield <- 0)
print(Cal_State_Northridge <- 0)
  1. UCD 23,9%

  2. LBSU 19,9%

  3. CSUF 17,8%

  4. UCI 14,4%

  5. Cal Poly Slo 13,6%

  6. UCR 10.4%

  7. UHawaii 0%

  8. CSUB 0%

  9. CSUN 0%

Заключение

И хотя прогнозируемым победителем оказался Университет Калифорнии, Дэвис, я и мои товарищи по команде сделаем все возможное, чтобы доказать, что статистика неверена, и стать чемпионами второй раз подряд!

Список Литературы

[1] https://ru.wikipedia.org/wiki/Цепь_Маркова

[2] https://scoreboard.clippd.com/rankings

© Habrahabr.ru