Я всегда любил аниме.

И покемоны были тем, что привело меня в аниме в детстве.

От коллекционных карточек до аниме, видеоигр и даже фигурок! Я бы пообщался с ними всеми.

Я любил покемонов.

До сих пор, если уж на то пошло. Однако теперь разница в том, что я могу использовать всю мощь визуализации данных!

И именно об этом этот пост в блоге.

Да, кстати, спасибо тем, кто выложил набор данных — найдите его здесь! — https://www.kaggle.com/abcsds/pokemon/version/2

В поисках лучших покемонов!

Давайте начнем! Теперь поиск лучших покемонов — это широкая и неопределенная цель.

Есть много способов определить «лучший». Макс ХП? Максимальная сила? Максимальная атака?

Начнем с атаки!

Каково среднее распределение физической силы среди покемонов?

Визуализация этого дает следующий результат:

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

Но что это?

Давайте увеличим четкость нашей гистограммы, добавив больше линий и раздвинув ее, чтобы лучше видеть.

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

Но что-то странное торчит.

Разрыв между 150 и 200 и внезапный небольшой пик на правом краю.

Что это говорит нам? Я думаю, что это лига легендарных покемонов.

Явно классом выше.

На визуализацию здоровья!

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

Планируя наше распределение, мы видим -

Вау.

Есть выброс около 250?!

Давайте внесем ясность.

Ага. Есть два исключения с HP 250 и 255.

Что это за покемоны?

Давайте разберемся.

>>> [pokemons['Name'][i] for i in range(len(pokemons)) if (pokemons['HP'][i] > 200)]
 
['Chansey', 'Blissey']

Ой. Ченси и Блисси. Я думаю, это тоже имеет смысл, потому что Блисси — это то, во что эволюционирует Ченси — но это ОГРОМНАЯ разница в HP, которой обладают эти двое, по сравнению со средним покемоном или даже легендарным покемоном!

Ну, по крайней мере, теперь я точно знаю, какой покемон ДОЛЖЕН быть в моей команде в следующей видеоигре про покемонов, в которую я буду играть.

Нападение против защиты

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

Являются ли более сильные покемоны атакующими? Или лучше защищаться?

Или мы могли бы ожидать увидеть что-то вроде законов природы, где хищники и жертвы четко определены, специализируясь либо на нападении, либо на защите?

Давайте разберемся!

import matplotlib.pyplot as plt 
import brewer2mpl 
import numpy as np 
import pandas as pd 
set2 = brewer2mpl.get_map('Set2', 'qualitative', 8).mpl_colors 
fig, ax = plt.subplots(1) 
pokemons = pd.read_csv('Pokemon.csv') 
x = pokemons['Attack'] 
y = pokemons['Defense'] 
color = set2[0] 
ax.scatter(x, y, label=str(i), color=color) 
plt.xlabel('Attack') 
plt.ylabel('Defense')

Вот что мы получаем!

Несколько аутсайдеров. Давайте пометим наши точки, чтобы мы знали, какой покемон находится в какой координате.

for i, txt in enumerate(pokemons['Name']): 
    ax.annotate(txt, (pokemons['Attack'][i], pokemons['Defense'][i]))

И- Ой. Это очень много имен.

Но теперь мы знаем наши выбросы.

В верхнем левом углу Шакл — покемон с самым высоким соотношением защиты и атаки.

А в правом нижнем углу у нас есть Deoyxs, легендарный покемон с самым высоким соотношением атаки и защиты.

Также неудивительно, что многие «мега» покемоны также соседствуют с легендарными покемонами.

Кроме того, Блисси и Ченси находятся внизу слева на графике!

Посмотри на это! Наши танки HP очень слабы в бою.

Неудивительно, что они не вымерли. Топовая игра HP.

Элементы!

Интересно, какие виды пар элементов наиболее распространены. Какие из них самые редкие?

Есть ли какие-нибудь, которые объединяются, чтобы сделать полностью подавленного покемона?

Давайте посчитаем, сколько покемонов связано со всеми возможными сочетаниями элементов.

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

typetoint = dict() 
inttotype = dict() 
ct = 0 
for i in set(pokemons['Type 1']).union(pokemons['Type 2']): 
    i = str(i) 
    typetoint[i] = ct 
    inttotype[ct] = i 
    ct += 1

Теперь пришло время объявить мой 2D-массив тепловой карты и выполнить итерацию по моему набору данных.

heatmap = [[0 for i in range(len(set(pokemons['Type 2'])))] for j in range(len(set(pokemons['Type 2'])))] 
for index, pokemon in pokemons.iterrows(): 
    t1 = str(pokemon['Type 1']) 
    t2 = str(pokemon['Type 2']) 
    heatmap[typetoint[t1]][typetoint[t2]] += 1   
    heatmap[typetoint[t2]][typetoint[t1]] += 1

Мой 2D-массив heatmap теперь хранит частоту каждой пары типов элементов.

Пора доставать инструменты построения графика. Теперь я обозначу ось X и ось Y соответствующим образом.

fig, ax = plt.subplots() 
ax.set_xticks(np.arange(len(inttotype))) ax.set_yticks(np.arange(len(inttotype))) 
ax.set_xticklabels(typetoint) 
ax.set_yticklabels(typetoint) 
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

А теперь запишу в тепловую карту, собственно частоты.

for i in range(len(typetoint)): 
    for j in range(len(typetoint)): 
        text = ax.text(j, i, heatmap[i][j], ha="center", va="center", color="w")

Давайте покажем наш окончательный результат.

ax.set_title('Type Pairings') 
ax.imshow(heatmap, cmap='plasma', interpolation='nearest') 
plt.show()

Ура!

Лига Легенд

Нет, не игра. Давайте взглянем на легендарных покемонов. Я предполагаю, что у них уровень мощности… БОЛЕЕ 900 — упс, неправильное аниме.

Отбросим мое плохое чувство юмора.

Давайте проверим их «Общую мощность», под этим я подразумеваю суммирование их HP, Attack, Defense, Sp. Атака и Сп. Защита.

Я представляю, как они полностью вытирают пол вместе с остальными здесь.

Посмотрим.

for i in range(len(total)): 
    if legendary[i] == True: 
        legendline.append(total[i]) 
    else: 
        normalline.append(total[i])

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

plt.plot([i for i in range(len(normalline))], normalline) 
plt.plot([i for i in range(len(legendline))], legendline) 
plt.legend(('Normal Pokemon', 'Legendary Pokemon')) 
plt.xlabel('Pokemons') plt.ylabel('Total Power')

Запускаем plt.show(), получаем -

Ага. Неудивительно, что большинство легендарных покемонов намного опережают обычных покемонов, хотя очевидно, что самые слабые легендарные покемоны слабее, чем более сильные нелегендарные покемоны.

Давайте узнаем, какие нелегендарные покемоны могут сразиться с самыми слабыми из легендарных -

Итак, теперь у нас есть самый слабый уровень мощности легендарного покемона.

>>> [i for i in range(len(pokemons)) if legendary[i]==False and total[i]>580] 
[3, 7, 8, 12, 71, 87, 102, 124, 137, 141, 154, 161, 165, 196, 224, 229, 232, 248, 267, 268, 271, 275, 279, 283, 306, 313, 333, 366, 408, 409, 412, 413, 493, 494, 498, 511, 527, 546, 548, 696, 715, 716, 717, 776]

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

>>> names = list(pokemons['Name']) 
>>> arr = [i for i in range(len(pokemons)) if legendary[i]==False and total[i]>580] 
>>> for i in arr: 
        print(names[i])

Это даст нам список всех нелегендарных покемонов, которые могут идти нога в ногу с легендарными.

И этот список…

VenusaurMega Venusaur 
CharizardMega Charizard X 
CharizardMega Charizard Y 
BlastoiseMega Blastoise 
AlakazamMega Alakazam 
SlowbroMega Slowbro 
GengarMega Gengar 
KangaskhanMega Kangaskhan 
PinsirMega Pinsir 
GyaradosMega Gyarados 
AerodactylMega Aerodactyl 
Dragonite 
Mew 
AmpharosMega Ampharos 
SteelixMega Steelix 
ScizorMega Scizor 
HeracrossMega Heracross 
HoundoomMega Houndoom 
Tyranitar 
TyranitarMega Tyranitar 
Celebi 
SceptileMega Sceptile 
BlazikenMega Blaziken 
SwampertMega Swampert 
GardevoirMega Gardevoir 
Slaking 
AggronMega Aggron 
AltariaMega Altaria 
Salamence 
SalamenceMega Salamence 
Metagross 
MetagrossMega Metagross 
Garchomp 
GarchompMega Garchomp 
LucarioMega Lucario 
AbomasnowMega Abomasnow 
GalladeMega Gallade 
Cresselia 
Manaphy 
Hydreigon 
MeloettaAria Forme 
MeloettaPirouette Forme 
Genesect 
Goodra

И вот оно!

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

Понравился мой пост в блоге? Следуйте и свяжитесь со мной, чтобы узнать больше!

Гитхаб | https://github.com/RameshAditya

Линкедин | https://linkedin.com/in/AdityaRamesh1998

Твиттер | https://twitter.com/@adityaramesh98

Блог | https://blogarithms.github.io

Первоначально опубликовано на https://blogarithms.github.io/