
Когда я выбирал тему для проекта, мне хотелось взять что-то, где есть понятные данные, и при этом тема была связана с Dota 2. Поэтому я решил посмотреть, как меняется winrate героев в матчах крупного турнира (TI 2023) и как winrate соотносится с популярностью героев.
Почему эта тема оказалась удобной для анализа: данные по матчам Dota 2 находятся в открытом доступе и могут быть получены через сервис OpenDota. Формат данных позволяет достаточно быстро получить большое количество строк и на их основе построить статистику, пригодную для анализа. Результат матча (победа или поражение) легко переводится в числовой вид, благодаря чему его удобно использовать для расчёта winrate. Кроме того, герои в Dota 2 — удобная основа для визуализаций, таких как топ-10 по популярности или распределения показателей.

Данные с сайта OpenDota с сортировкой по League
Цветовая палитра


Код палитры и стиля

Палитра подобрана в соответствии с цветами игры
Нормализация исхода матча
В ходе анализа я обнаружил, что столбец win в исходных данных представлен в разных форматах, включая логические, числовые и строковые значения, что затрудняет дальнейшую обработку и расчёт статистических показателей.
Чтобы привести данные к единому виду, я реализовал функцию normalize_win_col, которая преобразует все возможные варианты записи исхода матча в бинарный формат, где победа обозначается единицей, а поражение — нулём.
Функция автоматически учитывает тип данных столбца и корректно обрабатывает логические, числовые и строковые значения. В случае если некоторое значение не удаётся однозначно интерпретировать, функция сообщает об ошибке и выводит примеры проблемных данных. В результате в таблице создаётся столбец win_num, который используется для дальнейшего анализа и расчёта winrate героев.
Нормализация исхода матча
Загрузка и сопоставление названий героев
В ходе анализа мне было важно обеспечить читаемость итоговых таблиц и визуализаций, поэтому я сопоставил числовые идентификаторы героев с их реальными названиями.
Я использовал открытое API OpenDota, которое предоставляет актуальный список героев и их идентификаторов.
Чтобы избежать повторных запросов к API и снизить зависимость от сетевого соединения, я реализовал механизм локального кэширования: при первом запуске данные загружаются из API и сохраняются в JSON-файл, а при последующих запусках считываются напрямую из него.
Загрузка и сопоставление названий героев
В процессе обработки я формирую словарь id_to_name, в котором каждому hero_id соответствует локализованное имя героя. Если локализованное название отсутствует, используется альтернативное имя или автоматически сгенерированное обозначение. Такой подход позволяет использовать понятные названия героев во всех дальнейших расчётах и визуализациях и значительно упрощает интерпретацию результатов анализа.
Таблица статистики по героям
После подготовки данных я сформировал итоговую таблицу статистики по героям. Для этого я привёл столбец hero_id к числовому формату и исключил некорректные значения, после чего сгруппировал данные по героям. Для каждого героя было рассчитано количество игр, количество побед и winrate как отношение побед к общему числу игр.
Таблица статистики по героям
Чтобы уменьшить влияние случайных результатов, я ввёл минимальный порог по количеству игр (MIN_GAMES) и учитывал только тех героев, которые встретились в данных достаточное число раз. На завершающем этапе я сопоставил идентификаторы героев с их названиями, получив итоговую таблицу hero_stats, которая использовалась для дальнейшего анализа и визуализации.
Визуализация популярности героев
На данном графике представлена десятка самых популярных героев по количеству сыгранных матчей в рамках анализируемой выборки. По оси X указаны названия героев, а по оси Y — количество игр, в которых каждый из них участвовал. Столбчатый формат визуализации позволяет наглядно сравнить частоту выбора героев между собой.
Визуализация популярности героев
Из графика видно, что Muerta заметно выделяется среди остальных героев и имеет наибольшее количество игр, что может указывать на высокий приоритет этого героя в матчах турнира. Остальные герои из топ-10 имеют близкие значения по количеству игр, что говорит о сравнительно равномерном распределении популярности внутри основной группы часто выбираемых героев. Такой график позволяет зафиксировать мета-пул героев и служит отправной точкой для дальнейшего анализа их эффективности и winrate.
Столбчатая диаграмма
Зависимость популярности героев и winrate
Для анализа взаимосвязи между популярностью героев и их эффективностью я использовал диаграмму рассеяния. По оси X на графике отложено количество сыгранных матчей, которое отражает популярность героя в рамках выборки, а по оси Y — его winrate. Каждая точка соответствует одному герою и показывает, как часто он выбирался и насколько успешно при этом выступал.
Зависимость популярности героев и winrate
На график была добавлена горизонтальная пунктирная линия на уровне 50%, обозначающая условный баланс между победами и поражениями. Эта линия служит визуальным ориентиром и позволяет быстро определить, какие герои имеют winrate выше среднего значения, а какие — ниже. Использование единого нейтрального цвета для точек подчёркивает, что целью графика является анализ общей зависимости между показателями, а не сравнение отдельных категорий героев.
По результатам визуализации можно заметить, что большинство героев, независимо от их популярности, располагаются вблизи отметки 50% winrate. Это указывает на относительную сбалансированность соревновательной среды.
При этом высокая популярность героя не гарантирует высокий winrate: среди часто выбираемых героев встречаются как эффективные, так и менее успешные варианты. Одновременно с этим можно наблюдать героев с небольшим количеством игр, но высоким winrate, однако такие случаи требуют осторожной интерпретации из-за ограниченной выборки.
Диаграмма рассеяния
В целом данный график показывает, что выбор героев в матчах определяется не только их статистической эффективностью, но и другими факторами, такими как удобство использования, командные стратегии и особенности текущей меты.
Распределение показателя winrate среди героев
В этом графике я анализирую распределение показателя winrate среди героев. Для этого используется гистограмма, которая показывает, сколько героев попадает в разные диапазоны значений winrate. В анализ включены только герои с достаточным числом матчей, чтобы исключить искажения из-за малого объёма данных.
Распределение показателя winrate среди героев
Вертикальная линия на уровне 50% обозначает условный баланс и служит точкой сравнения для оценки того, насколько winrate отдельных героев отклоняется от среднего значения. Основная масса значений сосредоточена вблизи этого уровня, что указывает на относительный баланс героев в рамках выбранного датасета.
Гистограмма распределения
Гистограмма позволяет быстро оценить общую картину распределения winrate и понять, являются ли высокие или низкие показатели редким исключением или распространённым явлением.
Обобщённый анализ распределения winrate
В данном фрагменте кода используется ящиковая диаграмма для обобщённого анализа распределения winrate. Этот тип графика позволяет быстро оценить типичное значение, разброс и общий диапазон показателя без детального рассмотрения каждого отдельного героя.
Обобщённый анализ распределения winrate
Для построения берётся заранее подготовленный столбец winrate, отфильтрованный по минимальному числу матчей, что снижает влияние случайных результатов. Основной диапазон значений выделен нейтральным цветом, а медиана подчеркнута акцентным цветом, так как именно она отражает центральное значение winrate в выборке.
Ящиковая диаграмма
Заключение
В ходе анализа я изучил популярность героев и их winrate на основе матчей с достаточным числом игр, чтобы избежать случайных искажающих значений. Визуализация показала, что большинство героев имеет winrate, близкий к 50%, что указывает на общий баланс игры.
Также видно, что высокая популярность героя не означает автоматически высокий winrate: часто выбираемые герои могут показывать как успешные, так и слабые результаты. Гистограмма и ящиковая диаграмма подтверждают, что крайние значения winrate встречаются редко, а основная масса результатов сосредоточена в среднем диапазоне.
В целом анализ подтверждает, что эффективность героев в Dota 2 определяется не только их популярностью, а баланс игры остаётся достаточно стабильным.
Для улучшения кода и визуализаций применялся ChatGPT.