概要#
今日は kaggle で面白いデータセットを見つけました。これはモバイルゲーム「ポケモン」に登場する 721 匹のポケモンの基本データを収録しており、id、名前 (name)、種類 (type1)、二次分類 (type2)、基本属性 (HP: 血量,Attack: 攻撃力,Defense: 防御力,Special Attack: 魔攻,Special Defense: 魔防,Speed: 速度) が含まれています。
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()
# 最後の2列は意味がないので、削除します
data_df = data_df.drop(['Generation', 'Legendary'], 1)
data_df.describe()
# まずHPとAttackの関連性を見てみましょう
sns.jointplot(x="HP", y="Attack", data=data_df);
plt.show()
# 各ポケモンの総数の分布を見てみましょう
sns.boxplot(y="Total", data=data_df)
plt.show()
# idとTotalは属性研究には無意味なので、削除します
data_df_2 = data_df.drop(['#', 'Total'], 1)
sns.boxplot(data=data_df_2)
plt.show()
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()
# 各属性間の関連性を再確認します
data_df_2.corr()
ポケモンの種類がその属性に与える影響の探求#
# ポケモンの種類を統計します
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()
# まず箱ひげ図で各種類のポケモンの数の分布を観察します
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()
# ドラゴンタイプの平均数が他のタイプよりも遥かに高いことがわかります
data_type1 = pd.melt(data_df_2, id_vars=["Name", "Type 1", "Type 2"], var_name="Stat")
data_type1.head()
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()
# 箱ひげ図で各種類のポケモンの属性値をより直感的に観察します
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()
# ドラゴンタイプのポケモンは攻撃力が最も高く、鋼タイプのポケモンは防御力が最も強く、飛行タイプのポケモンは速度が最も速いことがわかります。
# 箱ひげ図は四分位数の位置を示し、バイオリンプロットは任意の位置の密度を示します。
# ここで、上記のデータをバイオリンプロットで示すと、より直感的になります。
# すべてのポケモンの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()
# すべてのポケモンの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()
# すべてのポケモンの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()
# すべてのポケモンの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()
# すべてのポケモンの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()
# すべてのポケモンの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()