Kaggleに遊戯王のデータセットが公開されたのでGoogle Colaboratryを用いて解析してみました.
データセットはYu-Gi-Oh! Trading Cards Datasetから取得しました.
ポケモンデータ解析.pyを拝見し,遊戯王バーションも作ってみようと思い,Google Colabolatoryでの操作の練習がてら3時間で作成しました.
進捗があり次第どんどん追加していきたいと思います.
データの読み込み
Google Colaboratory Googleドライブからcsvデータの読み込みを参照
from google.colab import drive
drive.mount('/content/drive/')
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# check auth
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
downloaded = drive.CreateFile({'id':'1P...'})
# Download the file to a local disk as 'sample.csv'.
downloaded.GetContentFile('card_data.csv')
import pandas as pd
df = pd.read_csv('card_data.csv',encoding='CP932')
df.head(10) #先頭10行を表示
データの説明
このデータセットには、トレーディングカードゲーム遊戯王の6534種類のデータが含まれています。
データには次の列があります。
Name:カード名
Type:カードの種類(モンスターカード/罠カード/魔法カードなど)
Level:モンスターのレベル(魔法,罠カードにはない)
Race:カードの種族(戦士、ドラゴン、スペルキャスターなど)
Attribute:属性(水,炎,風など)
ATK:攻撃力
DEF:防御力
モジュールのインポート
import re
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_squared_log_error
import matplotlib as mpl
from sklearn import linear_model
import pickle
import pdvega
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix, classification_report
# Jupyter 上で絵を表示するためのマジックコマンド
%matplotlib inline
import matplotlib.pyplot as plt # matplotlib.pyplot をインポートし、以下 plt と呼ぶ。
数字の大きさに応じて棒グラフを作成
df.head(30).style.bar(subset=['Level','ATK','DEF'])
df.describe() # 平均値、標準偏差、最小値、25%四分値、中央値、75%四分値、最大値をまとめて表示
4275種類のモンスターカードについて調べていきます.
df.info() #データの情報を見る
6534種類のうちモンスターの数は4275だと分かります.
df.isnull().sum()
欠損があるのは2259行です.
np.set_printoptions(threshold=np.inf)
np.column_stack(df) #列名を全て取得
散布図行列
pg = sns.pairplot(df.iloc[:,[2,5,6]])
レベル,攻撃力,防御力の関係が見えてきました.
レベルが高いほど攻撃力は高く
攻撃玉が高いほど防御力は高い
といった傾向が見えます.
しかし,これだけでははっきりとは言えません.
相関係数も見てみましょう.【相関分析】相関係数行列の算出→ヒートマップ化を参照
相関係数行列
corr_mat = df.iloc[:,[2,5,6]].corr(method='pearson')
# method='spearman'でスピアマン、'kendall'でケンドールも指定可能
corr_mat
#ヒートマップ化
sns.heatmap(corr_mat,
vmin=-1.0,
vmax=1.0,
center=0,
annot=True, # True:格子の中に値を表示
fmt='.1f',
xticklabels=corr_mat.columns.values,
yticklabels=corr_mat.columns.values
)
plt.show()
全ての変数間に正の相関が確認出来ます.
特にレベル&攻撃力,レベル&防御力は相関係数が大きいです
それを確認する前にまず,タイプ,種族,属性が何種類ずつあるか確認します.
属性との関係を見る前に,魔法・罠が含まれたデータセットからモンスターカードのみ取り出します.
欠損値を含むデータが魔法・罠だったので,これを除外したものがモンスターカードのみのデータになります.
df_monster = df.dropna()
df_monster.head(10)
これに対して分析を進めていきます.
一応,pandasでユニークな要素の個数、頻度(出現回数)をカウントを参考にデータの確認をします.
df_monster.astype('str').describe()
Typeは21種類,カードの種族は24種,属性は7種類ということが分かりました.
タイプ
タイプについて見てみます.
Type1 = pd.DataFrame(df_monster["Type"])
Type2 = pd.DataFrame(Type1["Type"].value_counts())
Type3 = Type2.reset_index()
Type4 = Type3.sort_values("index")
Type5 = Type4.rename(columns={"index":"Type","Type":"cnt"})
Type6 = Type5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Type",data =Type6)
最も多いのが予想通り効果モンスター2494体ですね.
ノーマルモンスター533体,チューナーモンスター234体もいるのに驚きです.
Fusion Monsterは融合モンスターのことでしょうか?
この辺は後で確認が必要ですね.
種族
次に種族についてみてみます.
Race1 = pd.DataFrame(df_monster["Race"])
Race2 = pd.DataFrame(Race1["Race"].value_counts())
Race3 = Race2.reset_index()
Race4 = Race3.sort_values("index")
Race5 = Race4.rename(columns={"index":"Race","Race":"cnt"})
Race6 = Race5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Race",data =Race6)
戦士とマシンが多いですね.意外とドラゴンが上位5位でした.もっといる印象でしたが.
属性
次に,属性について見てみます.
Attribute1 = pd.DataFrame(df_monster["Attribute"])
Attribute2 = pd.DataFrame(Attribute1["Attribute"].value_counts())
Attribute3 = Attribute2.reset_index()
Attribute4 = Attribute3.sort_values("index")
Attribute5 = Attribute4.rename(columns={"index":"Attribute","Attribute":"cnt"})
Attribute6 = Attribute5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Attribute",data =Attribute6)
属性は多い順に闇,地,光,水,風,火,占いという結果になりました.
闇と地がやはり多いですね.
ここで,最も攻撃力が高い傾向にある属性が気ります。
先ほどの散布図行列に色をつけてみます
df_monster.head()
Attributes = list(set(list(df_monster['Attribute'])))
print(len(Attributes), type)
今回は基礎集計を中心にやりました.
Google Colaboratoryでの操作の練習になったのでこれからも続けていきたいとおもいます.
これからはさらに分析を進めていきたいと思います.