In [8]:
# 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
On a commencé à analyser les données de Pokemons et à afficher plusieurs graphiques pour avoir une vision de nos données. Le problème avec les données c'est que dans la vrai vie, les données ne sont pas propre (dirty data)...
Par contre, comme l'on sait déja manier un peu les DataFrames et les graphiques on peux plus facilement arriver à détecter ces petits problèmes ;)
In [9]:
Image(url="http://i.giphy.com/LY1DH1AMbG0tq.gif")
Out[9]:
In [10]:
Image(url="http://i.giphy.com/12eayhW3TRPCjS.gif")
Out[10]:
Pour lire un fichier .csv on utilise la fonction de read_csv de la librairie Pandas. Si vous voulez connaitre l'ensemble de paramètres de la fonction : read_csv? (une fenêtre d'aide s'ouvrira).
In [11]:
# Charger la lib
import pandas as pd
In [12]:
#Afficher l'aide
#pd.read_csv?
In [13]:
data = pd.read_csv('data/train.csv') # Chargement des données.
Pour regarder les données :
In [14]:
data.head()
Out[14]:
In [15]:
data.tail()
Out[15]:
1) Connaitre les nombres de lignes et colonnes :
In [16]:
data.shape
Out[16]:
2) Connaitre les type des colonnes :
In [17]:
data.dtypes
Out[17]:
3) Connaitre la distribution des nos données :
In [18]:
data.describe()
Out[18]:
In [19]:
data.head()
Out[19]:
In [20]:
data.info()
In [21]:
data.Embarked.value_counts(normalize=True)
Out[21]:
Il semble qu'il manque quelques valeurs pour Embarked et on déteste les valeurs absentes...
In [22]:
Image(url="http://i.giphy.com/I3wsrN9ndx11m.gif")
Out[22]:
In [23]:
# Voir le mask des données absente sur une colonne
pd.isnull(data.Embarked)
Out[23]:
In [24]:
#Connaitre les lignes ou il y a des données absentes
data[pd.isnull(data.Embarked)] # On affiche notre dataframe avec une condition
Out[24]:
On sait que la valeurs la plus présente (largement) est "S". On va donc remplir les données vide par "S"
In [25]:
data["Embarked"] = data["Embarked"].fillna("S")
In [26]:
data[pd.isnull(data.Embarked)] # Il n'y a plus de données absentes
Out[26]:
In [27]:
data.head()
Out[27]:
On regarde si "Embarked" est lié à la survie des passagers :
In [28]:
sns.barplot(x='Survived', y="Embarked", data=data)#, order=[1,0])
Out[28]:
In [29]:
# Quelle est la survie moyenne selon les valeurs "Embarked"
Embarked_group = data[["Embarked", "Survived"]].groupby(['Embarked'], as_index=False).mean()
Embarked_group
Out[29]:
In [30]:
# Graphique
sns.barplot(x='Embarked', y='Survived', data=Embarked_group)
Out[30]:
Analyse d'une données continue
In [31]:
data.Fare.describe()
Out[31]:
In [32]:
sns.boxplot(data.Fare)
Out[32]:
Le prix est il lié à la survie ?
In [33]:
sns.factorplot(x="Survived", y="Fare",
data=data, kind="box")
Out[33]:
In [34]:
# Analyse de la distribution du prix des billets
sns.distplot(data.Fare)
Out[34]:
In [35]:
fare_survived = data[data.Survived == 1]
fare_not_survived = data[data.Survived == 0]
fare_not_survived.head()
Out[35]:
In [36]:
plt.figure(figsize=(12,5)) # Agrandir le graphique
sns.distplot(fare_survived.Fare, label="Survived") # Survived
sns.distplot(fare_not_survived.Fare, label="Dead") # Dead
plt.legend() # On affiche la légende
Out[36]:
In [37]:
data.Sex.value_counts()
Out[37]:
In [38]:
sns.countplot(data.Sex)
Out[38]:
In [39]:
# Moyenne de survie suivant le sexe du passager
grp_sex = data[["Sex", "Survived"]].groupby(['Sex'],as_index=False).mean()
grp_sex
Out[39]:
In [40]:
sns.barplot(x='Sex', y='Survived', data=grp_sex)
Out[40]:
In [41]:
sns.countplot(data.Pclass)
Out[41]:
In [42]:
# Moyenne de survie suivant la classe du passager
grp_class = data[["Pclass", "Survived"]].groupby(['Pclass'],as_index=False).mean()
sns.barplot(x='Pclass', y='Survived', data=grp_class)
Out[42]:
In [43]:
data.info()
In [44]:
sns.boxplot(data.Age)
Out[44]:
In [45]:
data[pd.isnull(data.Age)].head()
Out[45]:
In [46]:
len(data[pd.isnull(data.Age)]) # Nombre de ligne ou il n'y a pas d'age...
Out[46]:
Lorsqu'il y a une absence non négligeable de données (pour les données continues), il y a plusieurs possibilité afin de résoudre le problème :
- Prendre la valeurs la plus présente
- Prendre la moyenne
- prendre la médianne
- Créer des données qui respecte les données d'origine
In [47]:
data.Age.value_counts()
Out[47]:
24 est la valeurs la plus présente
In [48]:
data_age_1 = data.copy() # On fait une copie de notre DataFrame original
In [49]:
data_age_1['Age'] = data_age_1['Age'].fillna(24)
In [50]:
# Distribution de l'age de nos données d'origine (Age n'est pas vide)
sns.distplot(data[~pd.isnull(data.Age)]['Age'])
Out[50]:
In [51]:
# Distribution de l'age de nos données lorque l'on remplie les données manquantes par la plus présente
sns.distplot(data_age_1.Age)
Out[51]:
In [52]:
moyenne_age = data.Age.mean()
moyenne_age
Out[52]:
In [53]:
data_age_2 = data.copy() # On fait une copie de notre DataFrame original
data_age_2['Age'] = data_age_2['Age'].fillna(moyenne_age)
sns.distplot(data_age_2.Age)
Out[53]:
In [54]:
#### Connaitre la médianne d'age des passagers :
In [55]:
median_age = data.Age.median()
median_age
Out[55]:
In [56]:
data_age_3 = data.copy() # On fait une copie de notre DataFrame original
data_age_3['Age'] = data_age_3['Age'].fillna(median_age)
sns.distplot(data_age_3.Age)
Out[56]:
Une série de données continue est caractérisé par ça moyenne et écart-type
In [57]:
mean_age = data["Age"].mean()
std_age = data["Age"].std()
nbr_age_nan = data["Age"].isnull().sum()
print "Moyenne est " + str(mean_age) + " avec un écart-type de " + str(std_age) + " et " + str(nbr_age_nan) + " valeurs sont absentes"
In [58]:
# Lib de calcul
import numpy as np
In [59]:
np.random.randint(1, 10, 1)
Out[59]:
In [60]:
#(mean - std) & (mean + std)
new_age = np.random.randint(mean_age - std_age, mean_age + std_age, size = nbr_age_nan)
In [61]:
new_age
Out[61]:
In [62]:
new_age.mean()
Out[62]:
In [63]:
data_age_4 = data.copy() # On fait une copie de notre DataFrame original
# Remplir les valeurs d'age manquantes par notre nouvelle série de données :
data_age_4.loc[pd.isnull(data_age_4['Age']), 'Age'] = new_age
In [64]:
# Simulation d'une nouvelle série d'age
sns.distplot(data_age_4.Age)
Out[64]:
In [65]:
# Données d'origine :
sns.distplot(data[~pd.isnull(data.Age)]['Age'])
Out[65]:
La dernière méthode est la plus respectueuse des donnnées
In [66]:
#Relation entre l'age et la survie des passagers
# On transforme l'age en int
data_age_4['Age'] =data_age_4['Age'].astype('int')
# On prend la moyenne de survie par age
grp_age = data_age_4[["Age", "Survived"]].groupby(['Age'], as_index=False).mean()
plt.figure(figsize=(15,5)) # Agrandir le graphique
sns.barplot(x='Age', y='Survived', data=grp_age)
Out[66]:
In [158]:
age_survived = data_age_4[data_age_4.Survived == 1]
age_not_survived = data_age_4[data_age_4.Survived == 0]
plt.figure(figsize=(15,5)) # Agrandir le graphique
sns.kdeplot(age_survived['Age'], label="Survived") # Survived
sns.kdeplot(age_not_survived['Age'], label="Dead") # Dead
plt.legend() # On affiche la légende
Out[158]:
In [180]:
sns.lmplot('Age','Survived',hue='Pclass',data=data_age_4)
Out[180]:
In [153]:
# Réaction des spé Big data qui veulent up leurs scores sur Kaggle ;)
Image(url="http://i.giphy.com/xTiTnnLkYTDWSOWSHK.gif")
Out[153]:
In [169]:
data[['Parch', 'SibSp']].describe()
Out[169]:
In [170]:
data['Family'] = data["Parch"] + data["SibSp"]
In [172]:
data.Family.value_counts()
Out[172]:
In [176]:
# Est ce que la personne à de la famille (oui ou non) --> Booléen
data['is_Family'] = 0 # On initialise notre nouvelle colonne
data.loc[data['Family'] > 0, 'is_Family'] = 1
data.loc[data['Family'] == 0, 'is_Family'] = 0
In [177]:
data.is_Family.value_counts()
Out[177]:
In [178]:
sns.countplot(x='is_Family', data=data)
Out[178]:
In [179]:
grp_is_family = data[["is_Family", "Survived"]].groupby(['is_Family'],as_index=False).mean()
sns.barplot(x='is_Family', y='Survived', data=grp_is_family)
Out[179]:
In [183]:
sns.factorplot('is_Family', data=data,hue='Sex', kind='count')
Out[183]:
In [184]:
sns.factorplot('Pclass', data=data,hue='Sex', kind='count')
Out[184]:
In [195]:
fig = sns.FacetGrid(data, row="Sex", col='Pclass')
fig.map(sns.barplot,'is_Family', 'Survived')
Out[195]:
In [197]:
fig = sns.FacetGrid(data, row="Sex", col='Pclass')
fig.map(sns.kdeplot,'Age')
Out[197]:
In [ ]: