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. |
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.
Si ʻAnaconda` est inclus, cela devrait fonctionner. Python==3.7.4 seaborn==0.10.0
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 |
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 | utilisationseaborn mé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 |
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
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
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».
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
#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);
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
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
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
df4visual = monsters_norank
#Après 3-1-Omis car c'est presque le même que 2.
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
df4visual = all_data
#Après 3-1-Omis car c'est presque le même que 2.
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
df4visual = monsters
#Après 3-1-Omis car c'est presque le même que 2.
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
df4visual = monsters
#Après 3-1-Omis car c'est presque le même que 2.
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.
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
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)
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.
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
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)
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
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']]
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
df4visual = monsters_norank
#Après 3-3-Omis car c'est presque le même que 2.
J'omettrai l'interprétation.
eda3-3-4
df4visual = monsters
#Après 3-3-Omis car c'est presque le même que 2.
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.
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
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)
Il semble qu'il existe de nombreuses cartes avec des méthodes d'invocation inhabituelles pour les attributs clairs et sombres.
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.
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.
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-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.
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-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)
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.
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
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
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)
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
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.
Recommended Posts