Я собираю визуальную аналитику к обзорам FA13 — карты ударов, теплокарты, формы команд, пробеги, xG, территорию. Эта страница о том, как всё устроено внутри. Без громких слов про «настоящую статистику»: это модель по координатам, и я предпочитаю, чтобы её можно было перепроверить.
FA13-видеоотчёт — это не ролик. Внутри лежит позиционная разметка: координаты игроков и мяча по кадрам плюс список событий — удары, голы, ключевые моменты. То есть у меня на руках не запись с трибуны, а таблица того, кто где был в каждый момент.
Дальше всё рисуется из этих данных. Руками я картинки не подкручиваю — это принципиально. Если на диаграмме что-то выглядит не так, странность сидит либо в данных, либо в формуле, и её всегда можно показать пальцем.
Сразу оговорюсь. Это дополнительная визуализация, а не официальная статистика FA13, и подменять её я не собираюсь. Формулы ниже открыты намеренно — чтобы любой результат можно было пересчитать и поспорить со мной по существу.
Опорная метрика
xG и угол удара
Что такое ожидаемые голы, объяснять не буду — вы и так в курсе. Скажу про свою реализацию. Модель логистическая, на трёх признаках: дистанция до ворот, угол их видимости и тип удара. Пенальти стоит особняком.
distance — калиброванная дистанция в метрах, angle — угол видимости ворот в радианах, header — флаг удара головой. Удар с точки через формулу я не гоняю: ставлю фиксированный xG 0.76.
ПараллельНа больших выборках реальных ударов дистанция и угол — два самых сильных признака, на них держится почти любая базовая xG-модель. Удар головой из той же точки конвертируется хуже — отсюда отдельный отрицательный член. А 0.76 для пенальти — это не подгонка под FA13: в живых лигах с точки забивают примерно 75–79%.
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 мсПример из отчёта — открыть в полном размере
03Точка удара
Координату удара событие FA13 даёт грубо, поэтому я её уточняю. Иду назад по кадрам и беру тот, где мяч ещё не пересёк линию, а рядом есть атакующий — обычно ближайший к мячу игрок бьющей команды. Если подходящего кадра не нашлось, переключаюсь на запасной признак: резкое ускорение мяча в створ.
поиск назад ≈ 25 кадров · для гола — до 28 кадровПример из отчёта — точки ударов на карте
04Дистанция и калибровка
Сырые координаты перевожу в нормальное поле 105 × 68 м. Дальше нюанс: сырая дистанция систематически выходит короче расстояний, которые FA13 пишет в текстовом отчёте. Поэтому домножаю её на калибровочный коэффициент (порядка 1.2), подобранный сверкой с этими текстовыми расстояниями. Коэффициент — это про согласование двух источников, а не про «подкрутить xG повыше».
Из-за этого мои координаты могут немного расходиться с официальным отчётом. Так и задумано: все показатели — дистанции, карты ударов, теплокарты, формы — считаются в одной системе, от единого знаменателя. Это важнее точного совпадения с отчётом до сантиметра, потому что только так картинки между собой честно сравнимы.
distance = √(dx² + dy²) · k, k ≈ 1.20Пример из отчёта — дистанция, угол и xG по ударам
05Накопительный xG
После каждого удара прибавляю его xG к сумме команды — получается привычная xG-гонка по минутам. Параллельно считаю крупные шансы отдельной линией: это удары с xG не ниже 0.35. Порог удобен тем, что отсекает «выстрелы ради статистики» и оставляет реальные подходы к голу.
cumXG(team, t) = Σ xG ударов команды до минуты t · крупный шанс: xG ≥ 0.35Пример из отчёта — открыть в полном размере
06Тепловая карта
Собираю позиции игроков за тайм и в каждую точку добавляю гауссово пятно по соседним ячейкам сетки — так одиночные засветки превращаются в читаемые зоны. Чем плотнее точки, тем ярче. Таймы держу раздельно: смешивать их бессмысленно из-за смены сторон, об этом ниже.
Суммирую перемещение игрока между соседними кадрами, отбрасывая телепорты: скачок больше 260 игровых единиц — это сбой трекинга, а не рывок. Сырой пробег затем масштабирую к живому ориентиру — около 100 км на команду без вратаря. Множитель подбирается под матч и обычно держится в районе 3.8–4.
ПараллельПолевой в напряжённом матче набегает 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.