18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

遊戯王データセット解析

Last updated at Posted at 2019-06-18

Kaggleに遊戯王のデータセットが公開されたのでGoogle Colaboratryを用いて解析してみました.

データセットはYu-Gi-Oh! Trading Cards Datasetから取得しました.

ポケモンデータ解析.pyを拝見し,遊戯王バーションも作ってみようと思い,Google Colabolatoryでの操作の練習がてら3時間で作成しました.

進捗があり次第どんどん追加していきたいと思います.

データの読み込み

Google Colaboratory Googleドライブからcsvデータの読み込みを参照

colab
from google.colab import drive
drive.mount('/content/drive/')
colab
!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)
colab
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行を表示
スクリーンショット 2019-06-18 14.35.57.png

データの説明

このデータセットには、トレーディングカードゲーム遊戯王の6534種類のデータが含まれています。
データには次の列があります。

Name:カード名
Type:カードの種類(モンスターカード/罠カード/魔法カードなど)
Level:モンスターのレベル(魔法,罠カードにはない)
Race:カードの種族(戦士、ドラゴン、スペルキャスターなど)
Attribute:属性(水,炎,風など)
ATK:攻撃力
DEF:防御力

モジュールのインポート

colab
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 と呼ぶ。

数字の大きさに応じて棒グラフを作成

colab
df.head(30).style.bar(subset=['Level','ATK','DEF'])
スクリーンショット 2019-06-18 14.35.29.png
colab
df.describe() # 平均値、標準偏差、最小値、25%四分値、中央値、75%四分値、最大値をまとめて表示
スクリーンショット 2019-06-18 14.37.16.png

4275種類のモンスターカードについて調べていきます.

colab
df.info() #データの情報を見る
スクリーンショット 2019-06-18 14.38.07.png

6534種類のうちモンスターの数は4275だと分かります.

colab
df.isnull().sum()
スクリーンショット 2019-06-18 14.39.03.png

欠損があるのは2259行です.

colab
np.set_printoptions(threshold=np.inf)
np.column_stack(df) #列名を全て取得
スクリーンショット 2019-06-18 14.39.47.png

散布図行列

colab
pg = sns.pairplot(df.iloc[:,[2,5,6]])
スクリーンショット 2019-06-18 14.41.21.png

レベル,攻撃力,防御力の関係が見えてきました.

レベルが高いほど攻撃力は高く
攻撃玉が高いほど防御力は高い

といった傾向が見えます.

しかし,これだけでははっきりとは言えません.
相関係数も見てみましょう.【相関分析】相関係数行列の算出→ヒートマップ化を参照

相関係数行列

colab
corr_mat = df.iloc[:,[2,5,6]].corr(method='pearson')
# method='spearman'でスピアマン、'kendall'でケンドールも指定可能
corr_mat
スクリーンショット 2019-06-18 14.42.13.png
colab
#ヒートマップ化

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() 
スクリーンショット 2019-06-18 14.42.42.png

全ての変数間に正の相関が確認出来ます.

特にレベル&攻撃力,レベル&防御力は相関係数が大きいです

それを確認する前にまず,タイプ,種族,属性が何種類ずつあるか確認します.

属性との関係を見る前に,魔法・罠が含まれたデータセットからモンスターカードのみ取り出します.
欠損値を含むデータが魔法・罠だったので,これを除外したものがモンスターカードのみのデータになります.

colab
df_monster = df.dropna()
df_monster.head(10)
スクリーンショット 2019-06-18 14.43.42.png

これに対して分析を進めていきます.

一応,pandasでユニークな要素の個数、頻度(出現回数)をカウントを参考にデータの確認をします.

colab
df_monster.astype('str').describe()

スクリーンショット 2019-06-18 18.00.43.png

Typeは21種類,カードの種族は24種,属性は7種類ということが分かりました.

タイプ

タイプについて見てみます.

colab
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)

スクリーンショット 2019-06-18 18.02.55.png

最も多いのが予想通り効果モンスター2494体ですね.

ノーマルモンスター533体,チューナーモンスター234体もいるのに驚きです.

Fusion Monsterは融合モンスターのことでしょうか?
この辺は後で確認が必要ですね.

種族

次に種族についてみてみます.

colab
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)

スクリーンショット 2019-06-18 18.03.17.png

戦士とマシンが多いですね.意外とドラゴンが上位5位でした.もっといる印象でしたが.

属性

次に,属性について見てみます.

colab
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)

スクリーンショット 2019-06-18 18.03.40.png

属性は多い順に闇,地,光,水,風,火,占いという結果になりました.

闇と地がやはり多いですね.

ここで,最も攻撃力が高い傾向にある属性が気ります。

先ほどの散布図行列に色をつけてみます

colab
df_monster.head()

スクリーンショット 2019-06-18 18.05.49.png

colab
Attributes = list(set(list(df_monster['Attribute'])))
print(len(Attributes), type)


今回は基礎集計を中心にやりました.
Google Colaboratoryでの操作の練習になったのでこれからも続けていきたいとおもいます.
これからはさらに分析を進めていきたいと思います.

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?