IT Blog

Интересные факты из аналитики, разработки, автоматизации и AI

← Все статьи

Статистика хоккея: почему аутсайдер побеждает фаворита чаще, чем в баскетболе

«В хоккее возможно всё» — расхожая фраза, которую обычно объясняют характером и удачей одного вратаря. У неё есть куда менее романтичное и куда более проверяемое объяснение: голы в хоккее — редкое событие, а чем реже событие, определяющее исход матча, тем больше в этом исходе случайности и тем меньше — разницы в классе команд. Это не наблюдение из раздевалки, а прямое следствие того, как устроено распределение Пуассона, — и его можно честно посчитать на Python.

Чем меньше событий решает исход игры, тем больше в счёте шума — и тем меньше в нём сигнала о том, кто сильнее.

Голы — редкое событие, очки — нет

Команда НХЛ в среднем забрасывает около 3 шайб за матч — событие, которое за 60 минут игрового времени случается считаные разы. Команда НБА за сопоставимое по продолжительности время набирает около 110 очков, то есть счёт двигается почти непрерывно. Оба процесса можно приближённо описать распределением Пуассона: число редких, примерно независимых друг от друга событий за фиксированное время с единственным параметром λ — средним числом событий. Разница между хоккеем и баскетболом не в природе игры, а в том, насколько велико это λ.

У распределения Пуассона дисперсия равна самому λ, поэтому стандартное отклонение — √λ, а относительная изменчивость счёта (коэффициент вариации) — 1/√λ. При λ ≈ 3 (хоккей) это около 58 %, при λ ≈ 110 (баскетбол) — около 10 %. Другими словами, при одном и том же относительном разрыве в классе команд абсолютный счёт в хоккее «дрожит» вокруг ожидаемого значения в разы сильнее, чем в баскетболе, — просто потому, что событий, из которых складывается счёт, на порядок меньше.

Считаем: один и тот же разрыв в классе, разный счёт

Зафиксируем разрыв в классе команд как отношение 8:7 — фаворит забрасывает и набирает в среднем на 14,3 % больше, чем аутсайдер. Применим это отношение к характерным для каждого вида спорта средним: 3,2 и 2,8 шайбы в хоккее, 125,7 и 110 очков в баскетболе. Дальше просто перемножаем распределения Пуассона обеих команд и суммируем вероятность по всем исходам, где фаворит выигрывает, проигрывает или сравнивает счёт.

import numpy as np
from scipy.stats import poisson

def match_probs(lam_fav, lam_dog, max_goals=250):
    k = np.arange(max_goals)
    p_fav = poisson.pmf(k, lam_fav)
    p_dog = poisson.pmf(k, lam_dog)
    joint = np.outer(p_fav, p_dog)       # joint[i, j] = P(фаворит=i, аутсайдер=j)
    win = np.tril(joint, k=-1).sum()     # фаворит забросил больше
    tie = np.trace(joint)
    lose = np.triu(joint, k=1).sum()     # аутсайдер забросил больше
    return win, tie, lose

# Тот же относительный разрыв в классе (8:7), разный масштаб счёта
lam_fav_h, lam_dog_h = 3.2, 2.8                      # хоккей: шайбы за матч
lam_dog_b = 110.0
lam_fav_b = lam_dog_b * (lam_fav_h / lam_dog_h)      # баскетбол: очки за матч

for sport, lf, ld in [('Хоккей', lam_fav_h, lam_dog_h),
                       ('Баскетбол', lam_fav_b, lam_dog_b)]:
    win, tie, lose = match_probs(lf, ld)
    p_fav = win + tie / 2   # ничья снимается овертаймом/буллитами - монеткой
    cv = ld ** 0.5 / ld     # коэффициент вариации счёта аутсайдера
    print(f'{sport:10s}  λ = {lf:.1f} : {ld:.1f}   '
          f'P(фаворит) = {p_fav:.1%}   P(аутсайдер) = {1 - p_fav:.1%}   '
          f'CV = {cv:.1%}')
Хоккей      λ = 3.2 : 2.8   P(фаворит) = 56.4%   P(аутсайдер) = 43.6%   CV = 59.8%
Баскетбол   λ = 125.7 : 110.0   P(фаворит) = 84.7%   P(аутсайдер) = 15.3%   CV = 9.5%

Ничья в основное время разрешается овертаймом и буллитами; в модели это упрощённо — честная монета, разыгранная отдельно от того, кто забивал результативнее 60 минут до этого. С учётом этого при одинаковом относительном разрыве в классе фаворит побеждает в отдельном матче в 56,4 % случаев в хоккее — против 84,7 % в баскетболе. У аутсайдера в хоккее почти 44 шанса из 100 забрать игру; в баскетболе — только 15.

Вид спорта λ фаворит : аутсайдер P (победа фаворита) P (победа аутсайдера) CV аутсайдера
Хоккей 3,2 : 2,8 56,4 % 43,6 % 59,8 %
Баскетбол 125,7 : 110,0 84,7 % 15,3 % 9,5 %

Один матч — это одно, а серия до четырёх побед — совсем другое

Плей-офф решает не один матч, а серия до четырёх побед — и разница усиливается ещё сильнее, потому что каждая дополнительная игра даёт разнице в классе больше шансов себя проявить. Подтвердим вероятность отдельного матча независимой Monte Carlo симуляцией и посчитаем, как она превращается в вероятность выигрыша серии.

import random, math
from math import comb

random.seed(42)

def poisson_sample(lam):
    L, k, p = math.exp(-lam), 0, 1.0
    while True:
        k += 1
        p *= random.random()
        if p <= L:
            return k - 1

def simulate(lam_fav, lam_dog, n=500_000):
    fav_wins = ties = 0
    for _ in range(n):
        f, d = poisson_sample(lam_fav), poisson_sample(lam_dog)
        if f > d:
            fav_wins += 1
        elif f == d:
            ties += 1
    return fav_wins / n, ties / n

def series_win_prob(p, best_of=7):
    need = best_of // 2 + 1
    return sum(comb(need - 1 + l, l) * p**need * (1 - p)**l for l in range(need))

for sport, lf, ld in [('Хоккей', lam_fav_h, lam_dog_h),
                       ('Баскетбол', lam_fav_b, lam_dog_b)]:
    win, tie = simulate(lf, ld)
    p_game = win + tie / 2
    p_series = series_win_prob(p_game)
    print(f'{sport:10s}  MC P(фаворит, 1 матч) = {p_game:.1%}   '
          f'P(фаворит, серия до 4 побед) = {p_series:.1%}   '
          f'P(аутсайдер, серия) = {1 - p_series:.1%}')
Хоккей      MC P(фаворит, 1 матч) = 56.4%   P(фаворит, серия до 4 побед) = 63.7%   P(аутсайдер, серия) = 36.3%
Баскетбол   MC P(фаворит, 1 матч) = 84.8%   P(фаворит, серия до 4 побед) = 98.7%   P(аутсайдер, серия) = 1.3%

Даже при формально одинаковом относительном разрыве в классе за серию из семи матчей аутсайдер в хоккее забирает победу в 36,3 % случаев — то есть почти в каждой третьей серии. В баскетболе с тем же относительным разрывом у аутсайдера остаётся всего 1,3 % — то есть примерно одна серия из восьмидесяти. Это без всякой апелляции к характеру, удаче вратаря или «непредсказуемости» хоккея как игры — чистое следствие того, что голов за матч на порядок меньше, чем очков.

Это не абстрактная арифметика: тот, кто регулярно смотрит оба плей-офф, наверняка замечал, что команда с более низким посевом обыгрывает фаворита в первом раунде плей-офф в НХЛ заметно чаще, чем команда с таким же по номеру более низким посевом — в НБА. Сравнение ограничено именно первым раундом не случайно: только там пары посевов (1×8, 2×7, 3×6, 4×5) в обеих лигах формируются одинаково — напрямую по итогам регулярного сезона. Дальше сетка в каждом раунде перестраивается по результатам предыдущего, и «посев N против посева M» перестаёт означать одну и ту же ситуацию в НХЛ и НБА — поэтому сравнивать более поздние раунды между лигами таким же образом уже нельзя. За разницей в частоте сенсаций именно в первом раунде не обязательно стоит разница в характере видов спорта — вполне достаточно разницы в том, сколько именно событий за матч определяет счёт.

Где модель упрощает — и почему вывод от этого не рассыпается

Модель по пути огрубляет реальность в нескольких местах. Голы в хоккее не полностью независимы друг от друга: команда, ведущая в счёте, часто переходит к более осторожной игре, а отстающая — снимает вратаря в пустые ворота под конец матча, что меняет истинный темп по ходу игры. Ничья, разрешаемая честной монетой, — тоже упрощение: в реальном овертайме и серии буллитов более сильная команда обычно сохраняет небольшое преимущество, а не ровно 50 %. Ни одно из этих упрощений не работает в пользу вывода статьи — скорее наоборот, оба должны были бы немного увеличить точность прогноза для фаворита. То, что даже при таком упрощении разница между хоккеем и баскетболом остаётся настолько разительной, — само по себе аргумент в пользу того, что дело именно в редкости голов, а не в шуме модели.

Чек-лист

  1. Сравниваете разницу в счёте (сколько шайб или очков в среднем) или разницу в силе команд (во сколько раз одна результативнее другой)? Это разные вещи, и путать их — источник ложных выводов.
  2. Учли, что при малом числе голов за игру случайность влияет на итоговый счёт куда сильнее, чем при большом числе очков? Чем реже событие, тем больше в счёте шума — и меньше показателя настоящего мастерства.
  3. Проверили точный расчёт независимым случайным моделированием (Monte Carlo) — совпали ли цифры?
  4. Не путаете шанс выиграть один матч с шансом выиграть всю серию? Даже небольшое преимущество в одной игре в серии из нескольких матчей превращается в куда более решительный перевес, чем кажется на глаз.

Вывод

Разница в частоте сенсаций между хоккеем и баскетболом — не миф про непредсказуемость одного вида спорта и предсказуемость другого. Это прямое следствие того, что счёт в хоккее складывается из горстки редких событий, а в баскетболе — из сотни мелких. При абсолютно одинаковом относительном разрыве в классе команд именно это отличие превращает 15 % шансов аутсайдера в баскетболе в 44 % — в хоккее, а один шанс из восьмидесяти на победу в серии — в один из трёх.

Прежде чем объяснять исход игры характером или удачей, стоит спросить: а сколько вообще независимых событий определило счёт?
← Все статьи