Как считаются графики в моих обзорах матчей

Я собираю визуальную аналитику к обзорам FA13 — карты ударов, теплокарты, формы команд, пробеги, xG, территорию. Эта страница о том, как всё устроено внутри. Без громких слов про «настоящую статистику»: это модель по координатам, и я предпочитаю, чтобы её можно было перепроверить.

В основе

С чем я работаю

FA13-видеоотчёт — это не ролик. Внутри лежит позиционная разметка: координаты игроков и мяча по кадрам плюс список событий — удары, голы, ключевые моменты. То есть у меня на руках не запись с трибуны, а таблица того, кто где был в каждый момент.

Дальше всё рисуется из этих данных. Руками я картинки не подкручиваю — это принципиально. Если на диаграмме что-то выглядит не так, странность сидит либо в данных, либо в формуле, и её всегда можно показать пальцем.

Сразу оговорюсь. Это дополнительная визуализация, а не официальная статистика FA13, и подменять её я не собираюсь. Формулы ниже открыты намеренно — чтобы любой результат можно было пересчитать и поспорить со мной по существу.
Опорная метрика

xG и угол удара

Что такое ожидаемые голы, объяснять не буду — вы и так в курсе. Скажу про свою реализацию. Модель логистическая, на трёх признаках: дистанция до ворот, угол их видимости и тип удара. Пенальти стоит особняком.

xG = 1 / (1 + e^(−logit)) logit = −2.3286 − 0.0685·distance + 2.2529·angle − 1.0051·header

distance — калиброванная дистанция в метрах, angle — угол видимости ворот в радианах, header — флаг удара головой. Удар с точки через формулу я не гоняю: ставлю фиксированный xG 0.76.

ПараллельНа больших выборках реальных ударов дистанция и угол — два самых сильных признака, на них держится почти любая базовая xG-модель. Удар головой из той же точки конвертируется хуже — отсюда отдельный отрицательный член. А 0.76 для пенальти — это не подгонка под FA13: в живых лигах с точки забивают примерно 75–79%.
ворота 7.32 м точка удара S C — центр ворот angle distance dx dy Как строится угол для xG Угол идёт из точки удара к обеим штангам. Шире сектор — выше шанс гола.
S — точка удара, C — центр ворот, оранжевые линии тянутся к штангам. Зелёный пунктир — дистанция до центра, серые пунктиры — dx и dy. Пропорции даны для dx ≈ 11 м, dy ≈ 5.5 м и ширины ворот 7.32 м.
angle = atan2(goalWidth·dx, dx² + dy² − (goalWidth / 2)²)

dx — расстояние вдоль поля до линии ворот, dy — смещение от центра, goalWidth — 7.32 м. Чтобы было видно, как угол сжимается с дистанцией и смещением, пара ориентиров:

Точка удараУгол ≈Поведение модели
5 м, по центру~72°Сектор широкий, distance мал — xG близок к максимуму.
11 м, по центру~37°Геометрия точки пенальти, но через формулу не считается: фикс 0.76.
16 м, по центру~26°Угол ещё приличный, но дистанция уже ощутимо давит вниз.
8 м, острый уголсектор схлопываетсяБлизко к воротам, но angle мал — xG скромный, как и должно быть.
Под капотом

Как считается каждый показатель

Дальше — по одному блоку на показатель. Везде стараюсь дать не только «что рисую», но и почему именно так, и где спрятаны калибровки. Цифры в формулах — рабочие константы пайплайна; там, где они подобраны под конкретный матч, я это отмечаю.

01Стартовая расстановка

Это стартовая позиция прямо из официального отчёта матча — расстановку я не трогаю. К каждому игроку добавляю только силу и установку, чтобы состав читался быстрее и удобнее.

из отчёта: Каси, ЦФ → на картинке: Каси, ЦФ · сила 54.4 · установка «с+»
Пример стартовой расстановки из отчёта
Пример из отчёта — открыть в полном размере

02GIF голов

По каждому голу беру окно кадров вокруг события: подводку и развязку. Поле рендерю в headless-браузере тем же плеером, что и на сайте, и склеиваю эпизоды в один GIF, чтобы гол можно было пересмотреть прямо в статье. Кадров «до» заметно больше, чем «после» — интересна атака, а не повтор сетки.

окно: 14 кадров до · 5 после · 8 кадр/с · пауза между голами 900 мс
Пример GIF голов из отчёта
Пример из отчёта — открыть в полном размере

03Точка удара

Координату удара событие FA13 даёт грубо, поэтому я её уточняю. Иду назад по кадрам и беру тот, где мяч ещё не пересёк линию, а рядом есть атакующий — обычно ближайший к мячу игрок бьющей команды. Если подходящего кадра не нашлось, переключаюсь на запасной признак: резкое ускорение мяча в створ.

поиск назад ≈ 25 кадров · для гола — до 28 кадров
Пример карты ударов с точками ударов
Пример из отчёта — точки ударов на карте

04Дистанция и калибровка

Сырые координаты перевожу в нормальное поле 105 × 68 м. Дальше нюанс: сырая дистанция систематически выходит короче расстояний, которые FA13 пишет в текстовом отчёте. Поэтому домножаю её на калибровочный коэффициент (порядка 1.2), подобранный сверкой с этими текстовыми расстояниями. Коэффициент — это про согласование двух источников, а не про «подкрутить xG повыше».

Из-за этого мои координаты могут немного расходиться с официальным отчётом. Так и задумано: все показатели — дистанции, карты ударов, теплокарты, формы — считаются в одной системе, от единого знаменателя. Это важнее точного совпадения с отчётом до сантиметра, потому что только так картинки между собой честно сравнимы.

distance = √(dx² + dy²) · k, k ≈ 1.20
Таблица ударов с дистанцией, углом и xG
Пример из отчёта — дистанция, угол и xG по ударам

05Накопительный xG

После каждого удара прибавляю его xG к сумме команды — получается привычная xG-гонка по минутам. Параллельно считаю крупные шансы отдельной линией: это удары с xG не ниже 0.35. Порог удобен тем, что отсекает «выстрелы ради статистики» и оставляет реальные подходы к голу.

cumXG(team, t) = Σ xG ударов команды до минуты t · крупный шанс: xG ≥ 0.35
Пример графика накопительного xG
Пример из отчёта — открыть в полном размере

06Тепловая карта

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

heat += exp(−d² / (2·σ²)), σ ≈ 2.8 ячейки, радиус пятна ≈ 7 ячеек
Пример тепловой карты за тайм
Пример из отчёта — тепловая карта тайма

07Пробеги

Суммирую перемещение игрока между соседними кадрами, отбрасывая телепорты: скачок больше 260 игровых единиц — это сбой трекинга, а не рывок. Сырой пробег затем масштабирую к живому ориентиру — около 100 км на команду без вратаря. Множитель подбирается под матч и обычно держится в районе 3.8–4.

teamKm = scale · Σ |Δpos|, scale = 100 / средний сырой пробег (≈ 3.8)
ПараллельПолевой в напряжённом матче набегает 10–13 км, вратарь — заметно меньше. Десять полевых дают примерно сотню километров на команду — отсюда и ориентир. И знакомый сюжет: команда, которая отыгрывается и больше обороняется, нередко набегивает больше — догонять физически дороже, чем вести игру.
Пример таблицы пробегов команды
Пример из отчёта — пробеги по игрокам

08Форма команды

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

phaseWeight = 0.2 + 3·t², t = clamp((depth − 220) / 380, 0, 1)
Пример карты формы команды по фазам
Пример из отчёта — форма команды за тайм

09Атакующий импульс

Матч режется на пятиминутные окна, и в каждом считается давление одной команды: выходы в финальную треть, входы в штрафную, удары, xG и голы — со своими весами. Получается привычный momentum-график давления: видно, когда команда реально возила соперника, а когда просто катала мяч.

score = 0.025·финТреть + 0.08·штрафная + 2.2·удары + 8·xG + 2.5·голы
Пример графика атакующего импульса
Пример из отчёта — открыть в полном размере

10Территория атаки

Беру кадры, где владелец мяча определяется как ближайший к мячу игрок в пределах 70 игровых единиц, затем оставляю только кадры в финальной трети и смотрю долю каждой команды. Это field tilt — метрика, которой пользуются и публичные аналитики; она ближе к вопросу «кто диктует территорию», чем сухое владение в процентах.

fieldTilt = кадры_команды_с_мячом_в_финальной_трети / такие_кадры_обеих_команд
Пример диаграммы территории атаки
Пример из отчёта — открыть в полном размере

11Смена сторон

После перерыва команды меняются воротами. На картах по таймам я сохраняю физический вид поля — как в плеере, — а не «разворачиваю всё в одну сторону атаки». Так диаграмма совпадает с тем, что видно в отчёте, и читателю не нужно держать в голове лишнее зеркало. Цена решения — таймы нельзя складывать в одну картинку, но это честнее.

1-й тайм: halfK = +1 · 2-й тайм: halfK = −1
Пример карты второго тайма с другой стороной атаки
Пример из отчёта — второй тайм, ворота уже с другой стороны
Честно о границах

Где модель молчит

Это модель по координатам. Она хорошо ловит геометрию моментов, территорию и динамику давления — и принципиально не видит части футбола: тип передачи, давление защитника в спину, качество первого касания, замысел эпизода. Координаты не расскажут, был ли пас рискованным или удар наносился в борьбе.

Поэтому к графикам я отношусь как к подсказке для глаза, а не как к вердикту. Они помогают быстрее прочитать матч и зацепиться за закономерность. Но если картинка спорит с тем, что вы видели своими глазами, — верьте матчу, а мне напишите.

Обратная связь

Если что-то не сходится

Заметили промах в точке удара, спорный xG, опечатку в подписи или у вас есть идея новой диаграммы — напишите. Мне важно, чтобы графики можно было перепроверять, а не принимать на веру. Удобнее всего — в личку или в официальном телеграм-чате FA13.