In [1]:
import pandas as pd
# Lib de visualition
import seaborn as sns
import matplotlib.pyplot as plt
# Pour que les graphique s'affichent dans le notebook
%matplotlib inline
# Pour afficher des images (pas besoin de taper cet import)
from IPython.display import Image
In [2]:
# Chargement du fichier
data = pd.read_csv("../data/pokemon_data/pokemon.csv")
In [3]:
# Détail sur le fichier
data.shape
Out[3]:
In [4]:
# On affiche le fichier
data
Out[4]:
On va donc crée une nouvelle variable qui aura uniquement les pokémons de "Generation" = 1
In [5]:
pokemon = data[data.Generation == 1].copy()
In [11]:
Image(url="http://i.giphy.com/yidUzHnBk32Um9aMMw.gif")
Out[11]:
In [12]:
pokemon
Out[12]:
Regardons les stats de Pikachu maintenant. Pour afficher les données, on n'a pas besoin de créer une nouvelle variable. Tout dépend de l'analyse que vous voulez faire par la suite
In [13]:
# Afficher les données de Pikachu :
pokemon[pokemon.Name == 'Pikachu']
Out[13]:
In [28]:
# Creer une variable de attribut de Pikachu
Pikachu = pokemon[pokemon.Name == 'Pikachu']
Pikachu
Out[28]:
In [16]:
Image(url="http://i.giphy.com/xuXzcHMkuwvf2.gif")
Out[16]:
Pandas dispose de fonctions simples et user-friendly. Pour trouver le maximum, il suffit de donner :
In [ ]:
In [ ]:
In [17]:
# le plus grand nombre d'HP dans le DataFrame pokemon
pokemon['HP'].max()
Out[17]:
In [18]:
# Si l'on souhaite trouver le pokemon en question il suffit de faire comme pour la sélection de Pikachu :
pokemon[pokemon['HP'] == 250]
Out[18]:
In [19]:
# On peux très bien le faire de façon dynamique :
pokemon[pokemon['HP'] == pokemon['HP'].max()]
Out[19]:
In [20]:
# On affiche un graphique HP/Attack :
pokemon.plot(x='HP', y='Attack', kind='scatter')
# On indique quelle mesure on désire pour l'axe "x" et "y" ainsi que le type de graphique
Out[20]:
Si l'on souhaite regarder plus de 2 mesures, on utilise ".boxplot()" de Seaborn :
In [21]:
sns.boxplot(data=pokemon)
Out[21]:
Le problème ici c'est que Total est beaucoup plus grand que les autres mesures. De plus "#" ne sert pas à grand chose non plus
On va donc sélection uniquement les colonnes qui sont interessantes ('HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def','Speed')
In [22]:
sns.boxplot(data=pokemon[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def','Speed']])
Out[22]:
On retrouve notre "Chansey" tout en haut sur la variable "HP"
In [23]:
pokemon.describe()
Out[23]:
l'Attack et la Defence doivent jouer un grand role (avis aux pro-gamer Pokemon GO !)
Les additionner nous permettrais d'avoir une nouvelle vision sur nos pokémons
In [6]:
pokemon['Att_Def'] = pokemon['Attack'] + pokemon['Defense']
In [7]:
pokemon.head()
Out[7]:
In [8]:
pokemon['my_def'] = pokemon['HP'] + pokemon['Defense']
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [27]:
pokemon.plot(x='my_def', y='Att_Def', kind='scatter')
Out[27]:
In [29]:
#pokemon.head()
Un message en rouge (warning) apparait , don't worry. Pandas vous indique que le DataFrame pokemon provient d'un autre DataFrame (data) et que ces 2 DataFrame n'aurons plus la même structure.
In [30]:
sns.boxplot(pokemon.Att_Def)
Out[30]:
Il y a un point particulier a plus de 280 ;)
In [31]:
pokemon[pokemon.Att_Def >= 280]
Out[31]:
In [32]:
pokemon.sort_values('Att_Def', ascending=0).head(8)
Out[32]:
In [33]:
Image(url="http://i.giphy.com/gPjzE0ivYud5C.gif")
Out[33]:
Amuser vous à faire des graphique grâce à la fonction de Seaborn ".lmplot(...)"
Cette fonction prend en argument (pour plus de détail tapez "sns.lmplot?" ) :
In [12]:
sns.lmplot(x='Attack', y='Sp. Atk', data=pokemon)
Out[12]:
Seaborn fait automatiquement une regression sur ces 2 mesures. C'est à dire qu'il essait de tiret un trait qui va minimiser l'erreur avec les points
In [38]:
pokemon[(pokemon['Sp. Atk'] >= 180)]
Out[38]:
Les points qui sont au dessus peuvent etre considérés comme supérieur et sont en dessous comme inférieur.
In [39]:
# De façon écrite :
pokemon['Type 1'].value_counts()
Out[39]:
In [13]:
# par un graphique :
sns.countplot(pokemon['Type 1'])
Out[13]:
Le graphique est un peu trop petit et on ne peux pas distinger les types
In [41]:
# On prend l'ensemble des type 1 possible en valeurs
list_type_1 = pokemon['Type 1'].unique() # Comme une liste de toutes les valeurs possible de "Type 1"
# Un peu de custom dans nos graphiques :
plt.figure(figsize=(12,8)) # Tu vas créer un graphique de taille un peu plus grand
graph = sns.countplot(pokemon['Type 1']) # Notre graphique que l'on met en variable
graph.set_xticklabels(list_type_1, rotation=20) # On dit qu'il faut faire une rotation de nos valeur "Type 1"
Out[41]:
In [42]:
# Vous pouvez copier / coller le code au dessous en changeant "Type 1" -> "Type 2"
# On prend l'ensemble des type 1 possible en valeurs
list_type_2 = pokemon['Type 2'].unique() # Comme une liste de toutes les valeurs possible de "Type 1"
# Un peu de custom dans nos graphiques :
plt.figure(figsize=(12,8)); # Tu vas créer un graphique de taille un peu plus grand
graph = sns.countplot(pokemon['Type 2']) # Notre graphique que l'on met en variable
graph.set_xticklabels(list_type_2, rotation=20) # O
Out[42]:
On reprend donc nos DataFrame "data" pour analyser l'évolution des Generation
In [22]:
generation = data.groupby('Generation').mean()
generation
Out[22]:
On souhaite supprimer les mesures "#", "Total" et "Legendary" qui ne servent pas à grand chose ici...
In [23]:
# Help fonction drop
#generation.drop?
In [24]:
generation = generation.drop(['#', 'Total', 'Legendary'], axis=1) # axis = 1 sont les colonnes / 0 sont les lignes
In [25]:
generation
Out[25]:
In [27]:
generation.plot(figsize=(10, 8)) # figsize permet de choisir la taille du graphique
Out[27]:
In [21]:
generation.plot(figsize=(10, 6)) # figsize permet de choisir la taille du graphique
Out[21]:
Vous pouvez changer l'analyse en utilisant autre chose que la moyenne ".mean()" et regarder comment cela évolue à travers les différentes générations de pokémon
In [ ]: