statistics
March 6

На низком Старте с Предметами

Давненько я не добавлял какие-то крупные фичи в спектральные отчеты, да? Ну, присаживайся удобнее, дорогой, и добро пожаловать на мою техническо-статистическо-дотерскую сессию.

English version

Было несколько причин для такого провала с фичами, главные из которых — моя работа с Tundra Esports в течение последних нескольких лет до конца TI12, технические проблемы с внедрением некоторых новых функций и общая нехватка времени. Об этом я расскажу как-нибудь позже, а сейчас я хочу поговорить об одной функции, над которой я работал уже очень давно: Стартовые предметы и расходники.

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

Так что давайте погрузимся в историю этой фичи, как пользоваться, что можно найти и что можно улучшить.

...изначально этот пост планировалось опубликовать немного раньше, но я решил, что лучше подождать до выхода 7.38 и когда всё немного утихнет.

Почему и Как

На "Почему" ответить достаточно просто. Сначала я хотел добавить стартовые предметы в свои сборки, основанные на статистике, но не мог найти ничего, что рассматривало бы стартовые предметы так, как мне было бы хотелось: полные сборки и оценку в контексте лайнинга.

А побочным продуктом стал раздел статистики расходников. Его основная идея заключалась в том, чтобы расширить статистику лайнинга и посмотреть, как различные игроки на ролях ведут себя с точки зрения расходных материалов на разных этапах игры (например, сколько регена предпочитает тот или иной игрок по сравнению с другими и как команда в целом ведет себя в плане привычек на лайнинге).

Только заняла работа немного больше времени, чем я ожидал.

Точнее, технически я не так уж долго над ней работал. Основной прототип был создан где-то в конце весны 2022 года (а для расходников — в конце лета), затем представлен команде, с которой я пробовал сотрудничать во время TI11. После этого он был заброшен на какое-то время. Летом 2023 года я снова взялся за него, но потом отложил до окончания TI12, чтобы собрать новую партию данных после исправления проблем с их обработкой. Затем, в начале 2024 года, я потратил время на полировку этой фичи и различные оптимизации, готовясь к выпуску весной, но пришлось отложить из-за личных обстоятельств. И наконец, я вновь вернулся к ней во время зимних каникул.

Так что, хоть работа над ней шла долго, за последние два года она особо не менялась и была доступна как функция Раннего Доступа. Даже код обработки данных почти не изменился после первой версии. Поэтому секции стартовых предметов, билдов и расходников поддерживаются во всех Трендах Титанов начиная с 7.35d и некоторых соревновательных событиях до и после него (правда, качество данных может различаться).

Были две основные проблемы: (1) устаревшие компоненты, замедляющие просчёт данных, и (2) проблемы с источниками данных.

Первая проблема проявлялась во время длинных патчей и в основном была связана с тем, как я настроил систему еще семь (ОФИГЕТЬ!) лет назад (когда мой хаб статистики был просто сборником моих постов «Competitive Meta Trends» для /r/dota2). Но была и другая причина: инфляция MMR на ранге Immortal (из-за множества факторов, включая Double Down токены), увеличившая количество матчей на этом ранге (после фильтрации матчмейкинг-абузеров и ботов) с ~7k до ~20k в день, что значительно увеличило объем данных. К счастью, мне удалось обуздать этот рост благодаря некоторым хитрым хакам и регулярному мониторингу в 2024 году.

Вторая проблема была иного характера. Для соревновательных матчей я использую комбинацию OpenDota и API Valve, но для рейтинговых матчей я полагаюсь на Stratz. Их API стал настоящим спасением, давая возможность делать все эти эксперименты все эти годы. Но они столкнулись с чем-то вроде атак и злоупотреблением API, что в итоге привело к снижению допустимой сложности запросов. Это затронуло и некоторые мои вызовы.

Большая проблема возникла из-за Immortal Draft: когда игроки «назначаются» на свои слоты, иногда происходит путаница, что сказалось на качестве данных от Stratz. Я заметил это только в конце 2023 года, когда готовил эту фичу к релизу. Грубо говоря, это означало, что стартовые покупки (то есть стартовые предметы) записывались к неправильным игрокам, по сути превращая данные в мусор. А так как в 2023 году этот режим драфта был относительно новым и до этого все работало нормально, мне пришлось срочно искать способ реконструировать стартовые покупки.

Выбранный мной подход — использовать снепшот инвентаря игроков на нулевой минуте. Однако из-за проблем с API Stratz пришлось исключить некоторые данные из запросов — это затронуло слоты рюкзака и информацию о зарядах в инвентаре, что означает, что фиксируется максимум шесть предметов, а многократные покупки стакающихся предметов записываются как одна.

Хотя это не идеальное решение, в целом оно рабочее. Кроме того, соревновательная статистика осталась практически незатронутой. Позже я вернусь к этому вопросу, когда речь пойдёт об улучшениях, а пока…

Основная идея

И что тут такого особенного?

Давайте для начала посмотрим, что там в разделе со стартовыми предметами, так как это что-то более-менее знакомое.

Все новые разделы поддерживают разные роли и общие показатели для всех героев на роли (или на всех ролях). Подход для рассчёта матчей на роли тут чуть отличается от старых разделов, поэтому могут быть небольшие расхождения (но обычно они совсем-совсем небольшие).

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

Каждый предмет имеет число матчей, в которых он был куплен, общую частоту покупки, винрейт, а также винрейт на линии (помогает оценить средний импакт на линии). Можно переключать фильтры, чтобы убрать дополнительные покупки предметов или предметы с низким количеством матчей.

В большинстве случаев в Трендах Титанов есть ограничительные значения, чтобы отфильтровать предметы с низкой частотой покупки (которые скорее всего будут инфошумом, багом реплея или и тем, и другим).

Еще одно интересное место — Начальные сборки. Основная идея заключается в том, чтобы брать полные сборки и сравнивать их, поскольку иногда начальная сборка — это не про отдельный предмет, а про идею, которая связывает всё вместе. В качестве приятного бонуса есть возможность посмотреть общие цифры для данной роли и узнать "среднюю" сборку.

Те же данные также доступны для отдельных игроков (в нерейтинговых отчетах) и даже целых команд.

Наблюдения

Здесь должен был быть какой-то блок наблюдений, но, честно говоря, мне кажется тут сложно сказать о чём-то новом.

Самое интересное для меня лично — это мета для каждой роли в целом.

Главное — это подтверждение трендов, которые мы уже наблюдали довольно долгое время. Для Лёгкой линии уже было довольно распространено брать полный Magic Wand, и он все еще держится на вершине с 17% покупок и впечатляющим 56% винрейтом на лайне. Полный Wraith Band (49.79%), Gloves (51.13%), Blood Grenade (50.45%) и Orb of Venom (47.54%) являются, с другой стороны, одними из худших предметов в этом отношении, с Orb of Frost (53.45%) лишь немного выше, хотя все же с впечатляющим винрейтом на лайне.

Удивительно, но Blight Stone также очень высок в списке по винрейту на линии (интересно, это из-за Nature's Prophet?).

Еще один тренд для керри на лёгкой — брать несколько Circlet, причем любое их количество имеет как минимум 54% винрейта на линии. Мы уже видели тренд на Circlet какое-то время, но приятно иметь своего рода подтверждение.

Тренды на мидлайне немного другие. Отчасти потому, что обычно именно мидлайнеры виноваты в спаме покупок и искажении данных, что делает навигацию по их статистике немного… сложной.

В отличие от лёгкой, полная Magic Wand не так популярна, и Circlet не так сильны. Вместо этого их место занимают предметы с основными характеристиками (ну, кроме Mantle) с 55% винрейтом на лайне каждый. Худшие предметы для выбора — Quelling Blade (48.98), Mantle of Intelligence (46.68%), Orb of Venom (46.92%), Gloves (47.89), Wraith Band (48.03%), Null Talisman (48.98%).

Мета для оффлейна не сильно отличается от лёгкой, за исключением того, что винрейты на лайне ниже для всех предметов. Саппорты в целом похожи на оффлайнеров, но с такими предметами, как Smoke (56.22%), Mangoes (53.6%+), Blood Grenades (54.11%) и Magic Stick (54.95%), которые дают значительный буст.

Но что насчет полных начальных сборок?

Ну, начальные сборки с малым количеством покупок отфильтрованы, и все оставшиеся сборки для пятой позиции содержат Grenade, а для четвёрок есть пара Boots of Speed в качестве начального предмета, но в остальном картина та же. Тем не менее, самая успешная сборка, кажется, это Grenade-Stick-Circlet-Branch-Tango-Wards для любой из двух ролей.

Лучшие сборки для коров на боковых лайнах — это Wand + 3x Branches, за которыми следуют 2x Circlet + 3x Branches. Даже мидлайнеры каким-то образом все еще следуют этому тренду, хотя сборка с 2x Circlets ценится немного больше.

Расходники зашли в чат

Но это ещё не всё!

Раздел статистики по расходникам родился во время моего тестового периода во время TI11. Основная идея изначально была проста: посмотреть на конкретных игроков и их привычки на лайнинге: сколько регена они берут и как они обычно играют?

Теперь эти данные являются частью основных отчетов, наряду со всеми турнирами первого уровня. Хотя этот раздел все еще экспериментальный, и он включается только после завершения события (обработка расходников занимает много времени в сравнении). По той же причине расходники включаются для рейтинговых отчетов только после завершения патча.

Этот раздел всё ещё находится на ранней стадии, и я все еще ищу способы сделать его более полезным вне соревновательной среды, так как чувствую в нем большой потенциал. Думаю, он также хорошо бы работал с какой-то метрикой "агрессии".

Ещё немного наблюдений

Поскольку обновление статистики по расходникам занимает некоторое время, я буду использовать последний патч с полными данными в этом разделе — 7.37e (на момент написания 7.38 уже завершился, но данные еще не были полностью собраны).

С моим другом Casual (аналитиком команды Avulus) мы взглянули на винрейт на линии против среднего количества покупок предмета героем. Чтобы уменьшить количество сложных операций, мы использовали основную статистику по лайнингу героев (не разделенную по ролям), но все же отфильтровали героев с менее чем 5% их матчей на определенной роли, чтобы скрыть нерелевантные данные.

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

Больше таких графиков будет на моем Patreon/Boosty/Приватном чате, но вот парочка наиболее интересных.

Один интересный тренд: для позиций 1-3 нет четкой линии тренда для дополнительного регена, но для саппортов есть четкий тренд как для Tango, так и для Salve. Mango имеет несколько похожую картину, в то время как с Clarity не так всё ясно.

Коры, похоже, вообще не имеют значительного разброса в этом отношении.

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

Проблемные точки и что можно улучшить

Одна вещь, которая меня беспокоила, — злоупотребление командами статистикой по лайнингу, начальным предметам и сборкам, а также расходникам во время турниров. Поэтому эти разделы для тир-1 турниров недоступны без Раннего Доступа, пока не пройдет 2 недели после завершения.

Что же касается текущей реализации этих фич, с ними есть ряд проблем. У меня сейчас нет планов в срочном порядке заниматься этими фиксами, но думаю стоит обсудить подводные камни, которые есть.

Во-первых, в этом разделе гораздо больше "мусорных" данных, чем хотелось бы. Частично из-за проблем с парсингом реплеев (например, Tome of Knowledge просто появляется из ниоткуда), но более серьезной проблемой являются массовые покупки и продажа предметов сразу же. В идеале, мне нужно будет настроить фильтр для этого в будущем.

Ещё одна проблема — группировка очень похожих сборок. Я не совсем уверен, стоит ли это делать, но стоит хотя бы подумать на этот счёт.

Было бы неплохо иметь аспекты в этих разделах, но пока что включать их не очень хочется.

Источник данных для начальных предметов — это снепшот инвентаря от Stratz, ограниченный только первыми шестью слотами. Это означает, что слоты рюкзака недоступны для использования. Это также означает, что множественные покупки стакающихся предметов (например, Tango) будут "сливаться" в одну покупку. У меня есть хитрая идея, как решить проблему, но пока что не было времени проверить теорию.

Что до расходников, процесс обработки данных занимает много ресурсов и времени. Эта фича экспериментальная, так что наверное не так важно. Ну а пока я постараюсь оптимизировать ее еще больше. И также подумаю о том, как объединить раздел расходников с лайнинговой статистикой.

Но это ещё не всё!

Но это еще не все! С этим обновлением есть еще несколько крутых вещей:

  • Много оптимизаций для запросов к Stratz (для Трендов Титанов)
  • Встроенные фильтры поиска теперь поддерживают отрицание (добавьте минус перед словом), а также логическое "и" (добавьте "&" между двумя условиями, например, "core & offlane")
  • Добавлены маркеры разделов, чтобы показать, что нового/обновлено в отчетах по статистике
  • Украинская локализация для статистического хаба теперь на 100% завершена
  • Интерактивная карта, метаданные, иконки и прочие ресурсы в Курьере (включая большие иконки предметов) были обновлены для поддержки патча 7.38 (и 7.38b)

В качестве заключения

Ну вот и все!

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

В дополнение к этому, я стараюсь больше продвигать Patreon/Boosty/Telegram Tribute и публиковать больше эксклюзивного контента и материалов в приватных дискорд/телеграм чатах для платных подписчиков.

Я стараюсь всё делать публично доступным, так что не особо много вещей, которыми могу поделиться, но это хороший способ поддержать мою работу, или если вы хотите, получить прямую линию поддержки для моих API или получить ранний доступ к фичам.

Ну а пока — это всё! Не уверен, что будет следующей крутой функцией, которую я выпущу, но есть несколько многообещающих прототипов: начиная с MVP и кастомного рейтинга, заканчивая скилл билдами и трендами меты в Turbo.

Посмотрим, как все пойдёт!