Dies ist die Serie "Yugio DS (Data Science)", die verschiedene Yugioh-Kartendaten mit Python analysiert. Der Artikel wird insgesamt viermal gehalten, und schließlich werden wir ein Programm implementieren, das offensive und defensive Attribute aus dem Kartennamen durch Verarbeitung natürlicher Sprache + maschinelles Lernen vorhersagt. Darüber hinaus hat das Wissen des Autors über Yugioh bei etwa E ・ HERO aufgehört. Es tut mir leid, dass sowohl Karten als auch Data Science Amateure sind, aber bitte bleiben Sie in Kontakt.
No. | Artikelüberschrift | Keyword | |
---|---|---|---|
0 | Holen Sie sich Karteninformationen aus der Yugioh-Datenbank-Yugioh DS 0.Schaben | beautifulsoup | |
1 | Visualisieren Sie Yugioh-Kartendaten mit Python-Yugioh DS 1.EDA-Ausgabe | pandas, seaborn | Dieser Beitrag! |
2 | Verarbeiten Sie den Namen der Yugioh-Karte in natürlicher Sprache-Yugioh DS 2.NLP-Ausgabe | wordcloud, word2vec, doc2vec, t-SNE | |
3 | Sagen Sie offensive und defensive Attribute anhand des Yugioh-Kartennamens voraus-Yugioh DS 3.Maschinelles Lernen | lightgbm etc. |
Es ist über 10 Jahre her, seit ich die Yugioh-Karte nicht mehr sehe, und ich bin mir nicht sicher, welche Art von Karte ich jetzt habe. In diesem ersten Artikel werden wir jeden Aspekt der Daten mit ** Exploratory Data Analysis (EDA) ** betrachten. Darüber hinaus ist das technische Thema dieses Artikels die "Seaborn" -Visualisierung. Ich werde versuchen, eine geeignete Visualisierungsmethode und Seaborn-Methode entsprechend der Art der einzelnen Daten zu finden.
Wenn "Anaconda" enthalten ist, sollte es funktionieren. Python==3.7.4 seaborn==0.10.0
Die in diesem Artikel erfassten Daten werden mit einem handgefertigten Code aus der Yugio OCG-Kartendatenbank erfasst. .. Es ist spätestens ab Juni 2020. Abhängig vom anzuzeigenden Diagramm werden verschiedene Datenrahmen verwendet, aber alle Datenrahmen enthalten die folgenden Spalten.
No. | Spaltenname | Spaltenname(日本語) | Stichprobe | Ergänzung |
---|---|---|---|---|
1 | name | Kartenname | Ojama Gelb | |
2 | kana | Kartennamen lesen | Ojama Gelb | |
1 | rarity | Seltenheit | normal | Zur Vereinfachung des Erwerbs sind auch Informationen wie "Einschränkung" und "Verbot" enthalten. |
1 | attr | Attribut | 光Attribut | |
1 | effect | NaN | ||
1 | level | 2 | ||
1 | species | Im Fall von Nicht-Monstern umfassen die Effekte, die in "Magie" und "Falle" eintreten, "permanent" und "Ausrüstung", die Arten von Magie- / Fallenkarten. NaN-Level für Monster Rassen, die für Monster "Rang 2" erreichen | Tierstamm | |
1 | attack | Offensivkraft | 0 | |
1 | defence | Verteidigungskraft | 1000 | |
1 | text | Kartentext | Ein Mitglied des Jama-Trios, das auf jeden Fall jammen soll. Wenn etwas passiert, wenn wir alle drei zusammen sind... | |
1 | pack | Name des Aufzeichnungspakets | EXPERT Expert EDITION Edition Band Band 2 | |
1 | kind | Art | - | Bei einer Monsterkarte werden Informationen wie Fusion und Ritual eingegeben |
Alle Features (Spalten) können entweder als kategoriale Daten (kategorisch) oder als numerische Daten (numerisch) kategorisiert werden. Wenn Sie bestimmte Daten als Diagramm zeichnen, beträgt die maximale Anzahl von Features (Spalten), die gleichzeitig ausgedrückt werden können, etwa drei. Das Zeichnen eines Diagramms kann als die Arbeit bezeichnet werden, Merkmale aus den gesamten Daten aufzunehmen und eine geeignete Ausdrucksmethode basierend auf jedem Typ (Kategorie / numerischer Wert) auszuwählen. Im Visualisierungskapitel in den folgenden Implementierungen wird das Diagramm entsprechend der Anzahl der gleichzeitig ausgewählten Features und dem Typ (Kategorie / numerischer Wert) jedes Features in 6 Abschnitte unterteilt.
No. | Anzahl der Funktionen | Kombination | verwendenseaborn Methode von |
---|---|---|---|
1 | 1 | Kategoriedaten | sns.barplot ,sns.countplot |
2 | 2 | Numerische Daten x Numerische Daten | sns.jointplot |
3 | 2 | Kategoriedaten x numerische Daten | sns.barplot ,sns.boxplot |
4 | 2 | Kategoriedaten x Kategoriedaten | sns.heatmap |
5 | 3 | Kategoriedaten x Kategoriedaten x numerische Daten | sns.catplot |
6 | 3 | Kategoriedaten x numerische Daten x numerische Daten | sns.lmplot |
Importieren Sie die erforderlichen Pakete.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
sns.set(font="IPAexGothic") #Japanische Unterstützung für Seaborn
Importieren Sie die vier Datensätze, die Sie verwenden möchten. Die Erfassungsmethode für jeden Datensatz ist in 0 beschrieben. Scraping (Kein Artikel ab Juni 2020).
all_data = pd.read_csv("./input/all_data.csv") #Datensatz für alle Karten (Karten mit demselben Namen haben doppelte Aufzeichnungspakete)
print("all_data: {}rows".format(all_data.shape[0]))
cardlist = pd.read_csv("./input/cardlist.csv") #Datensatz für alle Karten (keine Vervielfältigung)
print("cardlist: {}rows".format(cardlist.shape[0]))
monsters = pd.read_csv("./input/monsters.csv") #Nur Monsterkarte
print("monsters: {}rows".format(monsters.shape[0]))
monsters_norank = pd.read_csv("./input/monsters_norank.csv") #Entferne Rangmonster von Monsterkarten
print("monsters_norank: {}rows".format(monsters_norank.shape[0]))
all_data: 21796rows
cardlist: 10410rows
monsters: 6913rows
monsters_norank: 6206rows
Wählen Sie nur Kategoriedaten aus und visualisieren Sie sie. Grundsätzlich ist die horizontale Achse die Kategorie und die vertikale Achse die Anzahl. In "seaborn" kann es durch "sns.barplot" oder "sns.countplot" ausgedrückt werden.
Für alle Karten all_data
wird die Anzahl der Aufnahmen bis zum 50. Platz in der Rangliste angezeigt.
Die Nummer eins ist "Cyclone", und Sie können sehen, dass sie 45 Mal aufgenommen wurde.
Es scheint, dass es oft im Starter-Kit enthalten ist (ein Set, das Sie sofort kaufen können, wenn Sie es kaufen).
eda3-1-1
#Aufnahmefrequenz-Ranking
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("Aufnahmefrequenz-Ranking")
for i, patch in enumerate(ax.patches):
ax.text(i, patch.get_height()/2, int(patch.get_height()), ha='center')
plt.xticks(rotation=90);
Die Aufteilung der Attribute ist 1946 mit den Top-Magiekarten. Bei Monsterkarten ist der 1. Platz das Dunkelattribut und die Anzahl der Karten mehr als das Dreifache des Flammenattributs des 6. Platzes. Warum gibt es 6 göttliche Attribute? Ich dachte, aber jetzt gibt es unsterbliche Vögel und kugelförmige Formen von Ra's Flügelgott Drachen. Ich wusste es nicht.
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("Anzahl der Blätter (nach Attribut)");
plt.savefig('./output/eda3-1-2.png', bbox_inches='tight', pad_inches=0)
python
print(cardlist.query("attr == 'Gott Attribut'")["name"])
3471 Horakuti, der Schöpfer des Lichts
4437 Ra's Wing God Drachen-unsterblicher Vogel
5998 Ra's Wing God Dragon-Spherical
6677 Oberisk Riesensoldat
8747 Osiris Himmelsdrache
9136 Ra's Wing God Dragon
Name: name, dtype: object
Die Interpretation wird unterteilt, je nachdem, ob es sich bei der Ebene um einen numerischen Wert oder eine Kategorie handelt. Hier wird sie jedoch als Ordnungsskala interpretiert (Reihenfolge hat Bedeutung, Intervall hat jedoch keine Bedeutung). Rangmonster sind ausgeschlossen und die Anzahl der Karten nach Level wird angezeigt. Irgendwie dachte ich intuitiv: "Es gibt weniger Karten mit ungeraden Ebenen als Karten mit geraden Ebenen." Es gibt immer 1 <2, 3 <4, ....
eda3-1-3
df4visual = monsters_norank
#Nach 3-1-Ausgelassen, weil es fast dasselbe ist wie 2.
Es gibt einige Raritäten, die ich nicht kenne (Millennium usw.). Beachten Sie, dass der Nenner "all_data" verwendet, da die Seltenheit von Aufnahmepaket zu Aufnahmepaket variiert. Verbote / Einschränkungen können Vervielfältigungen beinhalten.
eda3-1-4
df4visual = all_data
#Nach 3-1-Ausgelassen, weil es fast dasselbe ist wie 2.
Ich hatte das Bild, dass es viele Hexen und Drachen gab, aber überraschenderweise gab es viele Krieger und Maschinen. Liegt es daran, dass es viele Serien gibt ("E ・ HERO" oder nostalgisch)?
eda3-1-5
df4visual = monsters
#Nach 3-1-Ausgelassen, weil es fast dasselbe ist wie 2.
Ich bin mir nicht sicher, was für eine Art von Fusion, Ritual usw. ist, aber es gibt viele Wörter, die ich nicht kenne.
eda3-1-6
df4visual = monsters
#Nach 3-1-Ausgelassen, weil es fast dasselbe ist wie 2.
In vielen Fällen haben die x-Achse und die y-Achse ihre jeweiligen numerischen Werte und werden durch ein Streudiagramm dargestellt.
In seaborn
können Sie ein Streudiagramm mit sns.jointplot
, sns.regplot
und sns.lmplot
zeichnen. Die Verwendung unterscheidet sich geringfügig, Einzelheiten entnehmen Sie bitte dem offiziellen Dokument.
Für jede Monsterkarte wird ein Streudiagramm mit der Angriffskraft auf der x-Achse und der Verteidigungskraft auf der y-Achse gezeichnet. Sie können sehen, dass viele Karten unterhalb des 3000-Bereichs dicht gepackt sind. Wenn man bedenkt, durch die Linie "y = x" zu teilen, scheinen die meisten Karten im Allgemeinen Offensivkraft> Defensivkraft zu haben, da die untere rechte Seite dunkler ist.
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('Verteilung der Offensivkraft x Defensivkraft')
plt.savefig('./output/eda3-2-1.png', bbox_inches='tight', pad_inches=0)
Es ist ein Muster denkbar, bei dem sich jede Kategorie auf der x-Achse befindet und die numerischen Daten für jede Kategorie und ihre Aggregationsergebnisse (gesamt, durchschnittlich, maximal ...) auf der y-Achse liegen.
Der Kartenname wird als Kategorie angesehen und die Angriffs- und Verteidigungskraft wird in absteigender Reihenfolge als "sns.barplot" angezeigt. Es scheint, dass es noch keine Karten mit offensiver oder defensiver Kraft gibt, deren ursprünglicher Wert 5000 überschreitet.
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('Offensives / defensives Power-Ranking')
plt.savefig('./output/eda3-3-1.png', bbox_inches='tight', pad_inches=0)
Die Offensiv- und Defensivkraft jedes Attributs wird durch ein Box-Bart-Diagramm dargestellt. Das Box-Whisker-Diagramm ist ein Diagramm mit fünf zusammenfassenden Statistiken (Minimalwert, erster Quadrant, Median, dritter Quadrant, Maximum). Die horizontalen Linien in jedem Feld entsprechen den jeweiligen Statistiken. In Bezug auf die Angriffskraft sind der Medianwert des Lichtattributs und des dritten Quadranten höher als bei anderen, so dass ersichtlich ist, dass viele Monster eine relativ hohe Angriffskraft im Lichtattribut haben. Da die Verteidigungskraft gleich ist, scheint das Lichtattribut ausgezeichnet zu sein, wenn man nur die Offensive und Verteidigung betrachtet.
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("Angriffskraftverteilung (nach Attribut)")
ax[1].set_title("Defensive Energieverteilung (nach Attribut)");
plt.savefig('./output/eda3-3-1.png', bbox_inches='tight', pad_inches=0)
monsters.groupby("attr").describe()[['attack', 'defence']]
Das Niveau und der Medianwert jedes Wertes scheinen eine schöne positive Korrelation zu haben. Außerdem kannst du besonders auf Stufe 1 sehen, dass es mehrere Monster mit einer Offensiv- und Defensivkraft von 2000 oder mehr gibt.
eda3-3-3
df4visual = monsters_norank
#Nach 3-3-Ausgelassen, weil es fast dasselbe ist wie 2.
Ich werde die Interpretation weglassen.
eda3-3-4
df4visual = monsters
#Nach 3-3-Ausgelassen, weil es fast dasselbe ist wie 2.
Nehmen Sie Kategorien sowohl auf der x-Achse als auch auf der y-Achse und überprüfen Sie die zusammenfassenden Statistiken (Gesamtmenge, Durchschnitt, ... usw.) der Daten, die zu beiden Kategorien gehören. In dieser Analyse werden wir die Verwendung von "sns.heatmap" in Betracht ziehen, um die Anzahl der Karten darzustellen, die zu beiden Kategorien in einer Heatmap gehören.
Die Kombination mit der größten Anzahl von Karten scheint Dunkelheit x Dämonen zu sein. Wenn es nur die Rasse ist, ist die Anzahl der Krieger und Maschinen größer, aber schließlich ist die Dunkelheit in der Kombination der Dämonen am größten. Wenn man die seltenen Attribute und Rassen ignoriert, scheint es noch keine Flammenattribute x Fisch, Flammenattribute x Donner usw. zu geben.
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("Anzahl der Blätter (Attribut x Rennen)")
plt.savefig('./output/eda3-4-1.png', bbox_inches='tight', pad_inches=0)
Es scheint, dass es viele Karten mit ungewöhnlichen Beschwörungsmethoden für helle und dunkle Attribute gibt.
eda3-4-1
df4visual = pd.pivot_table(monsters.query("kind != '-'"), index="kind", columns="attr", aggfunc="count", values='name').fillna(0).astype("int")
#Nach 3-4-Ausgelassen, weil es fast dasselbe ist wie 1.
Um die Verteilung einer bestimmten Zahl darzustellen, verwenden wir zwei kategoriale Daten, um sie zu gruppieren.
Es gibt zwei Möglichkeiten, in Gruppen zu unterteilen: (1) x-Achse und (2) Farbe.
Sns.catplot
ist nützlich, um die Beziehung zwischen numerischen Daten und zwei oder mehr Kategoriedaten anzuzeigen. Numerische Werte können mithilfe kategorialer Daten wie Farbcodierung, Aufteilung innerhalb der Achsen und Aufteilung für jede Tabelle auf verschiedene Arten segmentiert werden.
Die folgenden Daten werden auf die Farbe, die x-Achse und die y-Achse des Diagramms angewendet. Es gibt keine Informationen zur horizontalen Verteilung der einzelnen Daten in der Achse.
Da die Farbe des Levels eine schöne Abstufung aufweist, ist ersichtlich, dass die Höhe des Levels und die Höhe der Offensiv- und Defensivkraft selbst innerhalb jedes Attributs eine positive Korrelation aufweisen.
eda3-5-1
df4visual = monsters_norank
g1 = sns.catplot(x="attr", y="attack", data=df4visual, aspect=3, hue="level")
g1.ax.set_title("Angriffskraftverteilung (nach Attribut / Stufe)")
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("Defensive Energieverteilung (nach Attribut / Stufe)")
plt.savefig('./output/eda3-5-1b.png', bbox_inches='tight', pad_inches=0)
Darüber hinaus sind die Ergebnisse des Austauschs der Farben und der x-Achse der beiden Kategorien wie folgt. Was ich aus dem Box-Bart-Diagramm von "eda3-3-3" nicht verstehen konnte, zum Beispiel, dass das Dunkelattribut und das Windattribut die Monster mit Angriffskraft 2000 oder mehr auf Stufe 1 besetzen. Du kannst es haben.
Die verwendeten Daten sind wie folgt. Viele Attribute, wie z. B. welches Attribut jedes Rennen voreingenommen ist (eda3-4-1), die Anzahl der Blätter nach Rasse (eda3-1-5), die Verteilung der Offensiv- und Defensivkraft nach Rasse (eda3-3-4) usw. Informationen können aus einem einzelnen Diagramm gelesen werden.
eda3-5-2
df4visual = monsters
g1 = sns.catplot(x="species", y="attack", data=df4visual, aspect=4, hue="attr")
g1.ax.set_title("Angriffskraftverteilung (nach Rasse / 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("Defensive Kraftverteilung (nach Rasse / Attribut)")
g2.ax.tick_params(axis='x', labelrotation=90)
plt.savefig('./output/eda3-5-2b.png', bbox_inches='tight', pad_inches=0)
Für die numerischen Daten x numerische Daten in 3-2. Haben wir ein Streudiagramm verwendet, das numerische Werte sowohl auf der x-Achse als auch auf der y-Achse annehmen kann. Hier fügen wir weitere Informationen hinzu, indem wir das Streudiagramm nach Kategorien färben.
Das offensive und defensive Streudiagramm (eda3-2-1) ist nach Level gefärbt. Sie können sehen, dass je höher das Level, desto höher das Level.
eda3-6-1a
df4visual = monsters_norank
g = sns.lmplot("attack","defence",data=df4visual, fit_reg=False, hue="level", height=10)
g.ax.set_title("Angriffskraft / Verteidigungskraftverteilung (nach Level)")
plt.savefig('./output/eda3-6-1a.png', bbox_inches='tight', pad_inches=0)
Da die Ebenendaten diskrete Werte annehmen, obwohl es sich um kategoriale Daten handelt, ist es außerdem möglich, sie als numerische Daten zu interpretieren und numerische Daten x numerische Daten x numerische Daten zu zeichnen.
Verwenden Sie mplot3d
, um ein 3D-Diagramm mit 3 Achsen zu zeichnen.
3D-Diagramme sind jedoch nur sichtbar, wenn sie interaktiv sind und verschoben werden können.
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("Offensivkraft / Defensivkraft / Levelverteilung")
plt.savefig('./output/eda3-6-1b.png', bbox_inches='tight', pad_inches=0)
Vielen Dank, dass Sie so weit gelesen haben. Unter Verwendung der Daten der Yugioh-Karte schrieb ich verschiedene Denkweisen beim Erstellen von Grafiken und bei der Verwendung von "Seaborn".
Je mehr Funktionen Sie gleichzeitig auswählen, desto mehr Informationen können Sie in einer einzelnen Abbildung übermitteln. Es wird jedoch schwierig, die Meldung dieses Diagramms einzugrenzen. Ich möchte an eine einfache Funktionsauswahl und -visualisierung denken, die nur eine Nachricht ausdrückt, die ich übermitteln möchte (obwohl es sein kann, dass Sie beim Schreiben von Sätzen wirklich daran denken sollten, wenn Sie auf die entsprechende Nachricht selbst zurückblicken. ・ ・).
Obwohl ich es nicht in jedem Diagramm erwähnt habe, habe ich jedem Code verschiedene nützliche Tipps für "Seaborn" hinzugefügt. Es kann überraschend mühsam sein, Dinge mit Excel oder Tableau einfach zu erledigen, z. B. eine Wertbezeichnung an jeden Balken anzuhängen oder den Achsnamen zu ändern. Ich hoffe, Sie finden es hilfreich.
Siehe auch diesen Artikel → Geben Sie die gut aussehenden Anpassungen von Seaborn nicht auf
Wir planen eine Analyse zum Thema der Verarbeitung natürlicher Sprache für Kartennamen, die wir diesmal nicht besonders beachtet haben. Ich möchte eine morphologische Analyse mit MeCab durchführen, mit WordCloud visualisieren und die Ähnlichkeit mit Word2Vec / Doc2Vec berechnen.
Recommended Posts