Airing

Airing

哲学系学生 / 小学教师 / 程序员,个人网站: ursb.me
github
email
zhihu
medium
tg_channel
twitter_id

ポケモンの種類と属性値のデータ探索

概要#

今日は kaggle で面白いデータセットを見つけました。これはモバイルゲーム「ポケモン」に登場する 721 匹のポケモンの基本データを収録しており、id、名前 (name)、種類 (type1)、二次分類 (type2)、基本属性 (HP: 血量,Attack: 攻撃力,Defense: 防御力,Special Attack: 魔攻,Special Defense: 魔防,Speed: 速度) が含まれています。

image

kaggle のいくつかの記事を参考にして、ポケモンの種類がその基本属性に与える影響を分析していきます。

ポケモン基本データ概要#

import numpy as np
import pandas as pd
import seaborn as sns

import matplotlib.pyplot as plt

data_df = pd.read_csv("http://airing.ursb.me/data/Pokemon.csv")
data_df.head()

image

# 最後の2列は意味がないので、削除します
data_df = data_df.drop(['Generation', 'Legendary'], 1)
data_df.describe()

image

# まずHPとAttackの関連性を見てみましょう
sns.jointplot(x="HP", y="Attack", data=data_df);
plt.show()

png

# 各ポケモンの総数の分布を見てみましょう
sns.boxplot(y="Total", data=data_df)
plt.show()

png

# idとTotalは属性研究には無意味なので、削除します
data_df_2 = data_df.drop(['#', 'Total'], 1)
sns.boxplot(data=data_df_2)
plt.show()

png

var_int = data_df_2.dtypes[data_df.dtypes=='int64'].index
var_int = var_int[1:]
var_int
Index(['Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed'], dtype='object')
l_int = len(var_int)
fig = plt.figure(figsize=(13, 8))
for i, val in enumerate(var_int):
    fig.add_subplot(3, 3, i+1)
    plt.hist(data_df_2[val], bins=50)
    plt.title(val)

plt.show()

png

# 各属性間の関連性を再確認します
data_df_2.corr()

image

ポケモンの種類がその属性に与える影響の探求#

# ポケモンの種類を統計します
type1 = data_df['Type 1'].unique()
print(type1)

data_type1 = data_df.groupby('Type 1').count()['#']
data_type1.sort_values(ascending=False)
['Grass' 'Fire' 'Water' 'Bug' 'Normal' 'Poison' 'Electric' 'Ground' 'Fairy'
 'Fighting' 'Psychic' 'Rock' 'Ghost' 'Ice' 'Dragon' 'Dark' 'Steel' 'Flying']





Type 1
Water       112
Normal       98
Grass        70
Bug          69
Psychic      57
Fire         52
Rock         44
Electric     44
Ground       32
Dragon       32
Ghost        32
Dark         31
Poison       28
Steel        27
Fighting     27
Ice          24
Fairy        17
Flying        4
Name: #, dtype: int64
labels = ['Water', 'Normal', 'Grass', 'Bug', 'Psychic', 'Fire', 'Electric', 'Rock', 'Other']
sizes = [112, 98, 70, 69, 57, 52, 44, 44, 175]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral', 'yellow', 'lightgreen', 'silver', 'white', 'pink']
explode = (0, 0, 0, 0, 0, 0, 0, 0, 0.1) 

plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.title("ポケモンの異なる種類の割合")
plt.show()

png

# まず箱ひげ図で各種類のポケモンの数の分布を観察します
type_to_int_dict = { 'Grass': 0, 'Fire': 1, 'Water': 2, 'Bug': 3, 'Normal': 4, 
                    'Poison': 5, 'Electric': 6, 'Ground': 7, 'Fairy': 8, 'Fighting': 9,
                    'Psychic' : 10, 'Rock': 11, 'Ghost':12, 'Ice' : 13, 'Dragon': 14, 
                    'Dark': 15, 'Steel': 16, 'Flying': 17} 
        
data_df['Int_Type1'] = data_df['Type 1'].map(type_to_int_dict).astype(int)

sns.set(style="ticks")
fig, ax = plt.subplots(figsize=(8,6))
sns.boxplot(ax = ax, x="Int_Type1", y="Total", data=data_df, palette="PRGn")
sns.despine(offset=10, trim=True)
plt.show()

# ドラゴンタイプの平均数が他のタイプよりも遥かに高いことがわかります

png

data_type1 = pd.melt(data_df_2, id_vars=["Name", "Type 1", "Type 2"], var_name="Stat")
data_type1.head()

image

plt.figure(figsize=(12,10))
plt.ylim(0, 275)
sns.swarmplot(x="Stat", y="value", data=data_type1, hue="Type 1", split=True, size=7)
plt.legend(bbox_to_anchor=(1, 1), loc=2, borderaxespad=0.)
plt.show()

png

# 箱ひげ図で各種類のポケモンの属性値をより直感的に観察します
fig = plt.figure(figsize=(13,24))
for i, col in enumerate(var_int[:6]):
    ax1 = fig.add_subplot(6, 1, i + 1)
    sns.boxplot(x=data_df['Type 1'], y=data_df_2[col], ax=ax1)       

plt.show()

png

# ドラゴンタイプのポケモンは攻撃力が最も高く、鋼タイプのポケモンは防御力が最も強く、飛行タイプのポケモンは速度が最も速いことがわかります。
# 箱ひげ図は四分位数の位置を示し、バイオリンプロットは任意の位置の密度を示します。
# ここで、上記のデータをバイオリンプロットで示すと、より直感的になります。

# すべてのポケモンのHPの分布
hp_data = data_df[['Name','Type 1','HP']]
hp_data = hp_data.pivot_table(values = 'HP',index = ['Name'],  columns = ['Type 1'])
hp_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=hp_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのHP")
sns.despine(left=True, bottom=True)

plt.show()

png

# すべてのポケモンのAttackの分布
attack_data = data_df[['Name','Type 1','Attack']]
attack_data = attack_data.pivot_table(values = 'Attack',index = ['Name'],  columns = ['Type 1'])
attack_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=attack_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのAttack")
sns.despine(left=True, bottom=True)

plt.show()

png

# すべてのポケモンのDefenseの分布
defense_data = data_df[['Name','Type 1','Defense']]
defense_data = defense_data.pivot_table(values = 'Defense',index = ['Name'],  columns = ['Type 1'])
defense_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=defense_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのDefense")
sns.despine(left=True, bottom=True)

plt.show()

png

# すべてのポケモンのSp.Attackの分布
sp_attack_data = data_df[['Name','Type 1','Sp. Atk']]
sp_attack_data = sp_attack_data.pivot_table(values = 'Sp. Atk',index = ['Name'],  columns = ['Type 1'])
sp_attack_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=sp_attack_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのSp.Attack")
sns.despine(left=True, bottom=True)

plt.show()

png

# すべてのポケモンのSp.Defenseの分布
sp_defense_data = data_df[['Name','Type 1','Sp. Def']]
sp_defense_data = sp_defense_data.pivot_table(values = 'Sp. Def',index = ['Name'],  columns = ['Type 1'])
sp_defense_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=sp_defense_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのSp.Defense")
sns.despine(left=True, bottom=True)

plt.show()

png

# すべてのポケモンのSpeedの分布
speed_data = data_df[['Name','Type 1','Speed']]
speed_data = speed_data.pivot_table(values = 'Speed',index = ['Name'],  columns = ['Type 1'])
speed_data.head()
f, ax = plt.subplots(figsize=(18, 6))
sns.violinplot(data=speed_data, palette="Set3", bw=.2, cut=1, linewidth=1)
ax.set(ylim=(0, 200))
ax.set_title("異なる種類のポケモンのSpeed")
sns.despine(left=True, bottom=True)

plt.show()

png

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。