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

В нашем последнем посте на Medium мы взяли набор данных League of Legends с kaggle, который содержит записи о более чем 50 000 рейтинговых матчей. Каждая запись имеет ряд функций, включая команду-победителя, чемпионов, используемых для каждой команды, количество башен и другие глобальные цели, которые каждая команда взяла, и многое другое. Мы проанализировали некоторые из этих данных, чтобы понять, какие глобальные цели могут повысить шансы команд на победу в игре.

Из нашего анализа выяснилось, что команды выиграли 80% игр, когда они взяли первый ингибитор, и более 70% игр, когда они взяли первую башню.

Теперь мы рассмотрим особенности, связанные с составом обеих команд, чтобы понять, сыграл ли состав команды роль в победе в игре. Полный код можно найти по адресу:



Разработка функций

Каждая запись содержит по одному столбцу для каждого игрока в игре, то есть 10, и чемпиона, с которым они играли. Я думаю, что более эффективным способом оценки данных о чемпионах является объединение этих столбцов в столбцы «Команда 1» и «Команда 2». Эти столбцы будут содержать список чемпионов, которых использовала каждая команда. Вместо того, чтобы смотреть на 10 разных столбцов, чтобы понять данные, теперь мы можем просто посмотреть на 2.

Для этого я создал еще один фрейм данных, названный total_team, выбрав столбцы, которые я хотел агрегировать. Затем я создал два новых столбца с именами Team_1 и Team_2, в которых будет список, содержащий состав команды и победителя. Лучше всего создать функцию для объединения этих столбцов на тот случай, если я захочу снова использовать этот блок кода, что привело к разработке следующего алгоритма:

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

После удаления ненужных столбцов, содержащих отдельных чемпионов, наш новый фрейм данных выглядит следующим образом:

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

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

  • Прокрутите список для каждой строки и команды.
  • Сохраняет идентификатор, рейтинг выбора и процент побед для каждого чемпиона.

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

{'champion:{'picked':x,'won':y}}

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

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

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

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

Как мы визуализируем эти данные?

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

Эта часть была сложной, потому что мне нужно было выяснить, как преобразовать идентификаторы чемпионов в имена чемпионов из файла JSON, который был предоставлен со всеми данными. Файлы JSON содержат словарь Python с идентификаторами чемпионов и их соответствующими именами.

Первой гистограммой, которую я создал, была сортировка чемпионов по проценту побед:

Я выбрал только 20 лучших винрейтов в отсортированном списке. Оглядываясь назад, возможно, я мог бы создать много разных сюжетов, чтобы показать остальных чемпионов, но существует более 100 уникальных рекордов. Однако есть некоторые интересные данные об этих первых 20 чемпионах. Многие из чемпионов не имеют высокой скорости выбора, кроме Жанны и Твитча. На мой взгляд, это говорит о том, что люди, выбравшие этих чемпионов, могут на самом деле специализироваться на них. Это дает этому человеку преимущество, потому что у него есть мастерство чемпиона, которое используется не очень часто.

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

Теперь давайте посмотрим на чемпионов, которых выбирали чаще всего, и их процент побед.

Как обычно, лучшие чемпионы играют роль ADC, потому что с ними обычно интересно играть, и они важны для переноса игр. Проценты побед немного колеблются, чего я не ожидал. Это может быть связано с небольшим размером выборки, около 36 000 игр из миллионов сыгранных игр. Еще один ответ на колеблющийся винрейт заключается в том, что этими чемпионами часто играют. Поскольку с этими чемпионами играют часто, у вражеской команды может быть понимание того, как играть против определенных командных составов. С этими чемпионами часто играют, потому что они сильны, но на самом деле это может быть их падением.

Что мы узнали из этого набора данных?

В League of Legends глобальные цели чрезвычайно важны. Они увеличивают ваши шансы на победу, предоставляя баффы или золото всей команде. В частности, команды 1 и 2 выиграли 80% игр, когда они взяли первый ингибитор, и 70% игр, когда они взяли первую башню.

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

Напротив, у чемпионов, которых выбирали чаще всего, процент побед колебался. Этих чемпионов выбирают чаще всего, потому что они на данный момент сильны в командных составах. Однако, поскольку они выбираются с высокой скоростью, вражеской команде будет легче понять, как противостоять определенным чемпионам.

Чему я научился в этом проекте?

Это был мой первый проект по науке о данных, вдохновленный моей страстью к видеоиграм. Это не было частью конкурса kaggle, но набор данных был найден там. Анализ был сделан из моего собственного любопытства и предварительных знаний о League of Legends. В частности, я узнал:

  • Как создавать гистограммы для визуализации категорийных данных
  • Как создавать и перебирать словари
  • Все функции и алгоритмы были созданы на моей доске. Этот проект научил меня думать об основных структурах данных и создавать функции для конкретных целей. Использование белой доски определенно облегчило мне обработку моих идей и превращение их в код.
  • Было много гугления, и это научило меня задавать правильные вопросы.

Что дальше?

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

Спасибо за настройку!