Когда я выбирал тему для проекта, мне хотелось взять что-то, где есть понятные данные, и при этом тема была связана с 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 выше среднего значения, а какие — ниже. Использование единого нейтрального цвета для точек подчёркивает, что целью графика является анализ общей зависимости между показателями, а не сравнение отдельных категорий героев.




