Visualisez les données de la carte Yugioh avec Python --Yugiou Data Science 1. EDA Edition

introduction

Il s'agit de la série "Yugio DS (Data Science)" qui analyse diverses données de cartes Yugioh en utilisant Python. L'article aura lieu quatre fois au total, et enfin nous mettrons en œuvre un programme qui prédit les attributs offensifs et défensifs des noms de cartes par traitement du langage naturel + apprentissage automatique. De plus, la connaissance de Yugioh par l'auteur s'est arrêtée aux alentours de E ・ HERO. Je suis désolé que les cartes et la science des données soient des amateurs, mais veuillez rester en contact.

No. Le titre de l'article Keyword
0 Obtenir des informations sur la carte de la base de données Yugioh-Yugioh DS 0.Grattage beautifulsoup
1 Visualisez les données de la carte Yugioh avec Python-Yugioh DS 1.Édition EDA pandas, seaborn Cet article!
2 Traitez le nom de la carte Yugioh en langage naturel-Yugioh DS 2.Édition PNL wordcloud, word2vec, doc2vec, t-SNE
3 Prédire les attributs offensifs et défensifs à partir du nom de la carte Yugioh-Yugioh DS 3.Apprentissage automatique lightgbm etc.

Objectif de cet article

Cela fait plus de 10 ans que j'ai arrêté de voir la carte Yugioh, et je ne suis pas sûr du type de carte que j'ai actuellement. Dans ce premier article, nous examinerons tous les aspects des données avec ** Exploratory Data Analysis (EDA) **. De plus, le thème technique de cet article est la visualisation «seaborn». J'essaierai de trouver une méthode de visualisation appropriée et une méthode marine en fonction de la nature de chaque donnée.

Explication des prérequis (environnement d'utilisation, données, politique d'analyse)

environnement d'utilisation

Si ʻAnaconda` est inclus, cela devrait fonctionner. Python==3.7.4 seaborn==0.10.0

Les données

Les données acquises dans cet article sont récupérées avec un code fait à la main de la Yugio OCG Card Database. .. Il s'agit du dernier en juin 2020. Différents blocs de données sont utilisés en fonction du graphique à afficher, mais tous les blocs de données contiennent les colonnes suivantes.

No. Nom de colonne Nom de colonne(日本語) échantillon Supplément
1 name nom de la carte Jaune Ojama
2 kana Lire le nom de la carte Jaune Ojama
1 rarity Rareté Ordinaire Pour faciliter l’acquisition, des informations telles que «restriction» et «interdiction» sont également incluses.
1 attr attribut 光attribut Pour les non-monstres, entrez "magie" et "piège"
1 effect effet NaN Contient les types de cartes magie / piège tels que «permanent» et «équipement». NaN pour les monstres
1 level niveau 2 Entrez "Rang 2" pour les monstres de rang
1 species Course Tribu de la bête
1 attack Puissance offensive 0
1 defence Puissance défensive 1000
1 text Texte de la carte Un membre du trio jama dont on dit qu'il jammera par tous les moyens. Quand quelque chose se passe quand nous sommes tous les trois ensemble...
1 pack Nom du pack d'enregistrement EXPERT Expert EDITION Edition Volume Volume 2
1 kind type - Dans le cas d'une carte monstre, des informations telles que la fusion et le rituel sont saisies

Politique de dessin

Toutes les fonctionnalités (colonnes) peuvent être classées en tant que données catégorielles (catégorielles) ou numériques (numériques). De plus, lorsque vous dessinez certaines données sous forme de graphique, le nombre maximal d'entités (colonnes) pouvant être exprimées en même temps est d'environ trois. On peut dire que le dessin d'un graphique consiste à sélectionner les caractéristiques de l'ensemble des données et à sélectionner une méthode d'expression appropriée en fonction de chaque type (catégorie / valeur numérique). Dans le chapitre de visualisation des implémentations suivantes, le graphique sera divisé en 6 sections selon le nombre d'entités sélectionnées à la fois et le type (catégorie / valeur numérique) de chaque entité.

No. Nombre de fonctionnalités combinaison utilisationseabornméthode de
1 1 Données de catégorie sns.barplot,sns.countplot
2 2 Données numériques x Données numériques sns.jointplot
3 2 Données de catégorie x données numériques sns.barplot,sns.boxplot
4 2 Données de catégorie x données de catégorie sns.heatmap
5 3 Données de catégorie x données de catégorie x données numériques sns.catplot
6 3 Données de catégorie x données numériques x données numériques sns.lmplot

la mise en oeuvre

1. Importation de package

Importez les packages requis.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
sns.set(font="IPAexGothic") #Le soutien japonais pour Seaborn

2. Importation de données

Importez les quatre ensembles de données que vous souhaitez utiliser. La méthode d'acquisition de chaque jeu de données est décrite dans 0. Scraping (pas d'article en juin 2020).

all_data = pd.read_csv("./input/all_data.csv") #Ensemble de données pour toutes les cartes (les cartes portant le même nom ont des packs d'enregistrement en double)
print("all_data: {}rows".format(all_data.shape[0]))

cardlist = pd.read_csv("./input/cardlist.csv") #Jeu de données pour toutes les cartes (pas de duplication)
print("cardlist: {}rows".format(cardlist.shape[0]))

monsters = pd.read_csv("./input/monsters.csv") #Carte Monstre uniquement
print("monsters: {}rows".format(monsters.shape[0]))

monsters_norank = pd.read_csv("./input/monsters_norank.csv") #Retirer les monstres de rang des cartes monstre
print("monsters_norank: {}rows".format(monsters_norank.shape[0]))
all_data: 21796rows
cardlist: 10410rows
monsters: 6913rows
monsters_norank: 6206rows

3. Visualisation

3-1. Données de catégorie

Sélectionnez et visualisez uniquement les données de catégorie. De base, l'axe horizontal est la catégorie et l'axe vertical est le nombre. Dans «seaborn», il peut être exprimé par «sns.barplot» ou «sns.countplot».

3-1-1. Classement du nombre d'enregistrements

Le nombre d'enregistrements est affiché jusqu'à la 50e place dans le classement pour toutes les cartes ʻall_data`. L'enregistrement numéro un est "Cyclone", et vous pouvez voir qu'il a été enregistré 45 fois. Il semble qu'il soit souvent inclus dans le kit de démarrage (un ensemble que vous pouvez habiter immédiatement si vous l'achetez).

eda3-1-1.png

eda3-1-1


#Classement des fréquences d'enregistrement
df4visual = df.groupby("name").count().sort_values(by="kana", ascending=False).head(50)

f, ax = plt.subplots(figsize=(20, 10))
ax = sns.barplot(data=df4visual, x=df4visual.index, y="kana")
ax.set_ylabel("frequency")
ax.set_title("Classement des fréquences d'enregistrement")

for i, patch in enumerate(ax.patches):
    ax.text(i, patch.get_height()/2, int(patch.get_height()), ha='center')

plt.xticks(rotation=90);

3-1-2. Nombre de feuilles (par attribut)

La répartition des attributs est de 1946 avec les meilleures cartes magiques. En ce qui concerne les cartes monstre, la 1ère place est l'attribut obscurité, et il y a plus de 3 fois le nombre de l'attribut flamme 6ème place. Pourquoi y a-t-il 6 attributs divins? J'ai pensé, mais maintenant il y a des oiseaux immortels et des formes sphériques du dragon du dieu aile de Ra. Je ne savais pas.

eda3-1-2.png

eda3-1-2


df4visual = cardlist

f, ax = plt.subplots(figsize=(20, 10))
ax = sns.countplot(data=df4visual, x=df4visual.attr, order=df4visual['attr'].value_counts().index)

for i, patch in enumerate(ax.patches):
    ax.text(i, patch.get_height()/2, int(patch.get_height()), ha='center')

ax.set_ylabel("frequency")
ax.set_title("Nombre de feuilles (par attribut)");

plt.savefig('./output/eda3-1-2.png', bbox_inches='tight', pad_inches=0)

python


print(cardlist.query("attr == 'Attribut de Dieu'")["name"])
3471 Horakuti, le créateur de la lumière
4437 Ra's Wing God Dragon-Immortal Bird
5998 Ra's Wing God Dragon-Sphérique
6677 Soldat géant d'Oberisk
8747 Dragon céleste d'Osiris
9136 Dragon dieu de l'aile de Ra
Name: name, dtype: object

3-1-3. Nombre de feuilles (par niveau)

L'interprétation est divisée selon que le niveau est une valeur numérique ou une catégorie, mais ici il est interprété comme une échelle ordinale (l'ordre a un sens, mais l'intervalle n'a pas de sens). Les monstres de rang sont exclus et le nombre de cartes par niveau est affiché. D'une manière ou d'une autre, je pensais intuitivement: "Il y a moins de cartes de niveau impair que de cartes de niveau pair." Il y a toujours 1 <2, 3 <4, ....

eda3-1-3.png

eda3-1-3


df4visual = monsters_norank
#Après 3-1-Omis car c'est presque le même que 2.

3-1-4. Nombre de feuilles (par rareté)

Il y a pas mal de raretés que je ne connais pas (Millennium, etc.). Gardez à l'esprit que le dénominateur utilise ʻall_data`, car chaque pack d'enregistrement a des raretés différentes. Les interdictions / restrictions peuvent inclure la duplication.

eda3-1-4.png

eda3-1-4


df4visual = all_data
#Après 3-1-Omis car c'est presque le même que 2.

3-1-5. Nombre de feuilles (par course)

J'avais l'image qu'il y avait beaucoup de sorcières et de dragons, mais étonnamment, il y avait beaucoup de guerriers et de machines. Est-ce parce qu'il existe de nombreuses séries ("E ・ HERO" ou nostalgique)?

eda3-1-5.png

eda3-1-5


df4visual = monsters
#Après 3-1-Omis car c'est presque le même que 2.

3-1-5. Nombre de feuilles (par type)

Je ne sais pas quel genre de fusion, de rituel, etc. est, mais il y a beaucoup de mots que je ne connais pas.

eda3-1-6.png

eda3-1-6


df4visual = monsters
#Après 3-1-Omis car c'est presque le même que 2.

3-2. Données numériques x Données numériques

Dans de nombreux cas, les axes x et y ont leurs valeurs numériques respectives et sont représentés par un diagramme de dispersion. Dans seaborn, vous pouvez dessiner un diagramme de dispersion en utilisant sns.jointplot, sns.regplot et sns.lmplot. L'utilisation est légèrement différente, mais veuillez vous référer au document officiel pour plus de détails.

3-2-1. Répartition de la puissance offensive x puissance défensive

Pour chaque carte monstre, un diagramme de dispersion est dessiné avec la puissance offensive sur l'axe des x et la puissance défensive sur l'axe des y. Vous pouvez voir que de nombreuses cartes sont densément emballées en dessous de la gamme 3000. De plus, lorsque l'on considère la division par la ligne «y = x», la plupart des cartes semblent généralement avoir un pouvoir offensif> un pouvoir défensif car le coin inférieur droit est plus sombre.

eda3-2-1.png

eda3-2-1


df4visual = monsters

g = sns.jointplot(data=df4visual, x="attack", y="defence", height=10, alpha=0.3)
plt.subplots_adjust(top=0.9)
plt.suptitle('Répartition de la puissance offensive x puissance défensive')
plt.savefig('./output/eda3-2-1.png', bbox_inches='tight', pad_inches=0)

3-3. Données de catégorie x données numériques

Un modèle est imaginable dans lequel chaque catégorie est sur l'axe des x, et les données numériques pour chaque catégorie et ses résultats d'agrégation (total, moyen, maximum ...) sont sur l'axe des y.

3-3-1. Classement de puissance offensive / défensive

Le nom de la carte est considéré comme une catégorie, et la puissance d'attaque et la puissance de défense sont affichées sous la forme sns.barplot dans l'ordre décroissant. Il semble qu'il n'y ait toujours pas de cartes de puissance offensive ou défensive dont la valeur d'origine dépasse 5000.

eda3-3-1.png

eda3-3-1


df4visual = monsters
df4visual_atk = df4visual.sort_values("attack", ascending=False).head(50)
df4visual_def = df4visual.sort_values("defence", ascending=False).head(50)

f, ax = plt.subplots(2, 1, figsize = (20, 15), gridspec_kw=dict(hspace=0.8))
f.subplots_adjust(hspace=2.0)
ax[0] = sns.barplot("name", "attack", data=df4visual_atk, ax=ax[0])
ax[0].tick_params(axis='x', labelrotation=90, labelsize = 9)
ax[0].set_xlabel("");
ax[1] = sns.barplot("name", "defence", data=df4visual_def, ax=ax[1])
ax[1].tick_params(axis='x', labelrotation=90, labelsize = 9)

plt.suptitle('Classement de puissance offensive / défensive')
plt.savefig('./output/eda3-3-1.png', bbox_inches='tight', pad_inches=0)

3-3-2. Puissance d'attaque / répartition de la puissance de défense (par attribut)

La puissance offensive et défensive de chaque attribut est représentée par un diagramme à barbe. Le diagramme des moustaches est un graphique montrant cinq statistiques récapitulatives (valeur minimale, premier quadrant, médiane, troisième quadrant, maximum). Les lignes horizontales de chaque case correspondent à leurs statistiques respectives. En termes de puissance d'attaque, la valeur médiane de l'attribut lumière et du troisième quadrant est plus élevée que les autres, donc on peut voir que de nombreux monstres ont une puissance d'attaque relativement élevée dans l'attribut lumière. Puisque la puissance défensive est la même, l'attribut léger semble être excellent en ne regardant que l'attaque et la défense.

eda3-3-2.png

eda3-3-2


df4visual = monsters

f, ax = plt.subplots(2, 1, figsize = (20, 10))
ax[0] = sns.boxplot("attr", "attack", data=df4visual, ax=ax[0])
ax[1] = sns.boxplot("attr", "defence", data=df4visual, ax=ax[1])

ax[0].set_xticks([])
ax[0].set_xlabel("")

ax[0].set_title("Répartition de la puissance d'attaque (par attribut)")
ax[1].set_title("Distribution d'énergie défensive (par attribut)");

plt.savefig('./output/eda3-3-1.png', bbox_inches='tight', pad_inches=0)
monsters.groupby("attr").describe()[['attack', 'defence']]

image.png

3-3-3. Puissance d'attaque / répartition de la puissance de défense (par niveau)

Le niveau et la valeur médiane de chaque valeur semblent avoir une belle corrélation positive. De plus, en particulier au niveau 1, vous pouvez voir qu'il existe plusieurs monstres avec une puissance offensive et défensive de 2000 ou plus.

eda3-3-3.png

eda3-3-3


df4visual = monsters_norank
#Après 3-3-Omis car c'est presque le même que 2.

image.png

3-3-4. Puissance d'attaque / répartition de la puissance de défense (par race)

J'omettrai l'interprétation.

eda3-3-4.png

eda3-3-4


df4visual = monsters
#Après 3-3-Omis car c'est presque le même que 2.

image.png

3-4. Données de catégorie x Données de catégorie

Prenez des catégories à la fois sur l'axe des x et sur l'axe des y, et vérifiez les statistiques récapitulatives (montant total, moyenne, ..., etc.) des données appartenant aux deux catégories. Dans cette analyse, nous envisagerons d'utiliser sns.heatmap pour représenter le nombre de cartes appartenant aux deux catégories dans une carte thermique.

3-4-1. Nombre de feuilles (attribut x race)

La combinaison avec le plus grand nombre de cartes semble être les ténèbres x les démons. S'il ne s'agit que de la race, le nombre de guerriers et de machines est plus grand, mais après tout l'obscurité est le plus dans la combinaison des démons. Ignorant les attributs et races rares, il semble qu'il n'y ait pas encore d'attributs de flamme x poisson, d'attributs de flamme x tonnerre, etc.

eda3-4-1.png

eda3-4-1


df4visual = pd.pivot_table(monsters, index="species", columns="attr", aggfunc="count", values='name').fillna(0).astype("int")
f, ax = plt.subplots(figsize = (20, 10))
ax = sns.heatmap(data=df4visual, cmap="YlGnBu", annot=True, fmt="d")
ax.set_title("Nombre de feuilles (attribut x race)")

plt.savefig('./output/eda3-4-1.png', bbox_inches='tight', pad_inches=0)

3-4-2. Nombre de feuilles (attribut x race)

Il semble qu'il existe de nombreuses cartes avec des méthodes d'invocation inhabituelles pour les attributs clairs et sombres.

eda3-4-2.png

eda3-4-1


df4visual = pd.pivot_table(monsters.query("kind != '-'"), index="kind", columns="attr", aggfunc="count", values='name').fillna(0).astype("int")
#Après 3-4-Omis car il est presque identique à 1.

3-5. Données de catégorie x Données de catégorie x Données numériques

Pour représenter la distribution d'un certain nombre, nous utilisons deux données catégoriques pour les regrouper. Il existe deux façons de se diviser en groupes: (1) l'axe des x et (2) la couleur. Sns.catplot est utile pour montrer la relation entre les données numériques et deux ou plusieurs données de catégorie. Les valeurs numériques peuvent être segmentées de différentes manières à l'aide des données de catégorie, telles que le codage couleur, la division dans les axes et la division pour chaque tableau.

3-5-1. Puissance d'attaque / répartition de la puissance de défense (par attribut / niveau)

Les données suivantes sont appliquées à la couleur, à l'axe des x et à l'axe des y du graphique. Il n'y a aucune information sur la répartition horizontale de chaque donnée dans l'axe.

--Couleur: Niveau (données de catégorie)

Puisque la couleur du niveau dessine une belle gradation, on peut voir que la hauteur du niveau et la hauteur de la puissance offensive et défensive ont une corrélation positive même au sein de chaque attribut.

eda3-5-1a.png eda3-5-1b.png

eda3-5-1


df4visual = monsters_norank
g1 = sns.catplot(x="attr", y="attack", data=df4visual, aspect=3, hue="level")
g1.ax.set_title("Répartition de la puissance d'attaque (par attribut / niveau)")
plt.savefig('./output/eda3-5-1a.png', bbox_inches='tight', pad_inches=0)

g2 = sns.catplot(x="attr", y="attack", data=df4visual, aspect=3, hue="level")
g2.ax.set_title("Distribution d'énergie défensive (par attribut / niveau)")
plt.savefig('./output/eda3-5-1b.png', bbox_inches='tight', pad_inches=0)

De plus, les résultats de l'échange des couleurs et de l'axe des x des deux catégories sont les suivants. Les moustaches de la boîte de ʻEda3-3-3` ne montraient pas, par exemple, les monstres avec une puissance d'attaque de 2000 ou plus au niveau 1 sont occupés par les attributs d'obscurité et de vent, et le niveau 11 a un petit nombre en premier lieu. Tu peux le prendre.

eda3-5-2c.png eda3-5-2d.png

3-5-1. Puissance d'attaque / répartition de la puissance de défense (par race / attribut)

Les données utilisées sont les suivantes. De nombreux attributs tels que l'attribut sur lequel chaque race est biaisée (eda3-4-1), le nombre de feuilles par race (eda3-1-5), la répartition de la puissance offensive et défensive par race (eda3-3-4), etc. Les informations peuvent être lues à partir d'un seul graphique.

--Couleur: Attribut (données de catégorie) --x axe: Race (données de catégorie)

eda3-5-2a.png eda3-5-2b.png

eda3-5-2


df4visual = monsters
g1 = sns.catplot(x="species", y="attack", data=df4visual, aspect=4, hue="attr")
g1.ax.set_title("Répartition de la puissance d'attaque (par race / attribut)")
g1.ax.tick_params(axis='x', labelrotation=90)
plt.savefig('./output/eda3-5-2a.png', bbox_inches='tight', pad_inches=0)

g2 = sns.catplot(x="species", y="defence", data=df4visual, aspect=4, hue="attr")
g2.ax.set_title("Distribution de puissance défensive (par race / attribut)")
g2.ax.tick_params(axis='x', labelrotation=90)
plt.savefig('./output/eda3-5-2b.png', bbox_inches='tight', pad_inches=0)

3-6. Données de catégorie x données numériques x données numériques

Pour les données numériques x données numériques en 3-2., Nous avons utilisé un diagramme de dispersion qui peut prendre des valeurs numériques à la fois sur l'axe des x et sur l'axe des y. Ici, nous ajouterons plus d'informations en colorant le diagramme de dispersion par catégorie.

3-6-1. Répartition de la puissance offensive et défensive (par niveau)

Le nuage de points offensif et défensif (eda3-2-1) est coloré par niveau. Vous pouvez voir que plus le niveau est élevé, plus le niveau est élevé.

--Couleur: Niveau (données de catégorie)

eda3-6-1a.png

eda3-6-1a


df4visual = monsters_norank
g = sns.lmplot("attack","defence",data=df4visual, fit_reg=False, hue="level", height=10)
g.ax.set_title("Puissance d'attaque / répartition de la puissance de défense (par niveau)")
plt.savefig('./output/eda3-6-1a.png', bbox_inches='tight', pad_inches=0)

Puisque les données de niveau prennent des valeurs discrètes même s'il s'agit de données catégorielles, il est possible de les interpréter comme des données numériques et de dessiner des données numériques x des données numériques x des données numériques. Utilisez mplot3d pour dessiner un graphique 3D qui prend 3 axes. Cependant, les graphiques 3D ne sont pas très visibles sauf s'ils sont interactifs et peuvent être déplacés.

eda3-6-1b.png

eda3-6-1b


from mpl_toolkits import mplot3d
df4visual = monsters_norank
f = plt.figure(figsize = (20, 10))
ax = plt.axes(projection = '3d')
ax.scatter3D(df4visual.attack, df4visual.defence, df4visual.level, c=df4visual.level)
plt.gca().invert_xaxis()

ax.set_xlabel=('attack')
ax.set_ylabel=('defence')
ax.set_zlabel=('level')
plt.suptitle("Puissance offensive / puissance défensive / répartition des niveaux")

plt.savefig('./output/eda3-6-1b.png', bbox_inches='tight', pad_inches=0)

Résumé

Merci d'avoir lu jusqu'ici. En utilisant les données de la carte Yugioh, j'ai écrit différentes façons de penser lors de la création de graphiques et comment utiliser seaborn.

Plus vous sélectionnez de fonctionnalités à la fois, plus vous pouvez transmettre d'informations dans une seule figure, mais il devient difficile de restreindre le message de ce graphique. Je voudrais garder à l'esprit une simple sélection de fonctionnalités et une visualisation qui n'exprime qu'un seul message que je veux transmettre (bien que si vous regardez le message approprié lui-même, il se peut que vous deviez vraiment garder à l'esprit lorsque vous écrivez des phrases. ・ ・).

Aussi, bien que je ne l'ai pas mentionné dans chaque graphique, j'ai ajouté divers conseils utiles de seaborn à chaque code. Il peut être étonnamment difficile de faire des choses facilement avec Excel ou Tableau, comme attacher une étiquette de valeur à chaque barre ou changer le nom de l'axe. J'espère que vous le trouverez utile.

Voir aussi cet article → N'abandonnez pas les beaux ajustements de seaborn

Aperçu de la prochaine fois

Nous prévoyons de réaliser une analyse basée sur le thème du traitement en langage naturel des noms de cartes auquel nous n'avons pas accordé beaucoup d'attention cette fois. Je souhaite effectuer une analyse morphologique avec MeCab, visualiser avec WordCloud et calculer la similitude avec Word2Vec / Doc2Vec. image.png

Recommended Posts

Visualisez les données de la carte Yugioh avec Python --Yugiou Data Science 1. EDA Edition
Visualisez les données d'infection corona à Tokyo avec matplotlib
Visualisez de manière interactive les données avec Treasure Data, Pandas et Jupyter.
Folium: Visualisez les données sur une carte avec Python
Apprenez la science des données
Prédire les attributs offensifs et défensifs à partir du nom de la carte Yugioh --Yugiou Data Science 3. Machine Learning
Visualisez les données d'itinéraires ferroviaires sous forme de graphique avec Cytoscape 2
Challenge classification des images par TensorFlow2 + Keras 3 ~ Visualiser les données MNIST ~
[Bases de la science des données] Collecte de données depuis RSS avec python