<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Back to data again
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 ;)
Step1:  Titanic dataset 
Step2:  Analyse data 
Step3:  Pour regarder les données 
Step4:  Signification des colonnes 
Step5:  2) Connaitre les type des colonnes 
Step6:  3) Connaitre la distribution des nos données 
Step7:  Uniquement que pour les données numériques
Analyse par colonnes 
Step8:  Embarked 
Step9:  Il semble qu'il manque quelques valeurs pour Embarked et on déteste les valeurs absentes...
Step10:  On sait que la valeurs la plus présente (largement) est "S". On va donc remplir les données vide par "S"
Step11:  On regarde si "Embarked" est lié à la survie des passagers 
Step12:  Fare 
Step13:  Le prix est il lié à la survie ?
Step14:  Sexe des passagers 
Step15:  Pclass des passagers 
Step16:  Age des passagers 
Step17:  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 
Step18:  24 est la valeurs la plus présente
Step19:  Connaitre la moyenne d'age des passagers 
Step20:  Créer une série de données qui respecte la distribution d'origine 
Step21:  La dernière méthode est la plus respectueuse des donnnées
Step22:  La famille 
Step23:  Analyse général des données
<ASSISTANT_TASK:>
Python Code:
Image(url="http://i.giphy.com/LY1DH1AMbG0tq.gif")
Explanation: Back to data again
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 ;)
End of explanation
Image(url="http://i.giphy.com/12eayhW3TRPCjS.gif")
Explanation: Titanic dataset :
On va analyser un jeu de données sur les passagers du Titanic, et comme vous devez le savoir (Spoiler) y'a eu un petit soucis...
Télécharger le fichier train.csv dans le répertoire data*
End of explanation
# Charger la lib
import pandas as pd
#Afficher l'aide
#pd.read_csv?
data = pd.read_csv('data/train.csv')   # Chargement des données.
Explanation: Analyse data :
Petits rappels
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).
End of explanation
data.head()
data.tail()
Explanation: Pour regarder les données :
 - .head() -> affiche les 5 premières lignes
 - .tail() -> affiche les 5 dernières lignes
 - .head(15) -> affiche les 15 premères lignes
End of explanation
data.shape
Explanation: Signification des colonnes :
Survived : indique la mort ou la survie du passager pour les données d'apprentissage. C'est ce que l'on doit prédire sur fichier test. Cette valeur est booléene (0 ou 1) : 1 pour survie, 0 pour la mort
Pclass : La classe des chambres du navire (3 niveaux), 1 étant la meilleure classe et 3 la classe "éco". C'est une variable texte qui va falloir transformer en faisant attention car il y a une notion d'ordre.
Name : Nom de la personne
Sex : Sexe du passager
Age : âge du passager
SisbSp : (Sibling and Spouse) : le nombre de membres de la famille du passager de type frère, soeur, demi-frère, demi-soeur, époux, épouse...
Parch : (Parent and Child) : le nombre de membres de la famille du passager du type père, mère, fils, fille, beau-fils, etc...
Ticket : Numéro du ticket
Fare : le prix du ticket
Cabin : numéro de cabine
Embarked : le port d'embarquement du passager : C -> Cherbourg; Q -> Queenstown; S -> Southampton
Analyse Maccro des données
1) Connaitre les nombres de lignes et colonnes :
End of explanation
data.dtypes
Explanation: 2) Connaitre les type des colonnes :
End of explanation
data.describe()
Explanation: 3) Connaitre la distribution des nos données :
End of explanation
data.head()
Explanation: Uniquement que pour les données numériques
Analyse par colonnes :
End of explanation
data.info()
data.Embarked.value_counts(normalize=True)
Explanation: Embarked :
End of explanation
Image(url="http://i.giphy.com/I3wsrN9ndx11m.gif")
# Voir le mask des données absente sur une colonne
pd.isnull(data.Embarked)
#Connaitre les lignes ou il y a des données absentes
data[pd.isnull(data.Embarked)]  # On affiche notre dataframe avec une condition
Explanation: Il semble qu'il manque quelques valeurs pour Embarked et on déteste les valeurs absentes...
End of explanation
data["Embarked"] = data["Embarked"].fillna("S") 
data[pd.isnull(data.Embarked)] # Il n'y a plus de données absentes
data.head()
Explanation: On sait que la valeurs la plus présente (largement) est "S". On va donc remplir les données vide par "S"
End of explanation
sns.barplot(x='Survived', y="Embarked", data=data)#, order=[1,0])
# Quelle est la survie moyenne selon les valeurs "Embarked"
Embarked_group = data[["Embarked", "Survived"]].groupby(['Embarked'], as_index=False).mean()
Embarked_group
# Graphique
sns.barplot(x='Embarked', y='Survived', data=Embarked_group)
Explanation: On regarde si "Embarked" est lié à la survie des passagers :
End of explanation
data.Fare.describe()
sns.boxplot(data.Fare)
Explanation: Fare : Prix du voyage
Analyse d'une données continue
End of explanation
sns.factorplot(x="Survived", y="Fare",
                   data=data, kind="box")
# Analyse de la distribution du prix des billets
sns.distplot(data.Fare)
fare_survived = data[data.Survived == 1]
fare_not_survived = data[data.Survived == 0]
fare_not_survived.head()
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
Explanation: Le prix est il lié à la survie ?
End of explanation
data.Sex.value_counts()
sns.countplot(data.Sex)
# Moyenne de survie suivant le sexe du passager
grp_sex = data[["Sex", "Survived"]].groupby(['Sex'],as_index=False).mean()
grp_sex
sns.barplot(x='Sex', y='Survived', data=grp_sex)
Explanation: Sexe des passagers :
End of explanation
sns.countplot(data.Pclass)
# 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)
Explanation: Pclass des passagers :
End of explanation
data.info()
sns.boxplot(data.Age)
data[pd.isnull(data.Age)].head()
len(data[pd.isnull(data.Age)])  # Nombre de ligne ou il n'y a pas d'age...
Explanation: Age des passagers :
End of explanation
data.Age.value_counts()
Explanation: 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
Connaitre la valeurs la plus présente :
End of explanation
data_age_1 = data.copy()  # On fait une copie de notre DataFrame original
data_age_1['Age'] = data_age_1['Age'].fillna(24)
# Distribution de l'age de nos données d'origine (Age n'est pas vide)
sns.distplot(data[~pd.isnull(data.Age)]['Age'])
# 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)
Explanation: 24 est la valeurs la plus présente
End of explanation
moyenne_age = data.Age.mean()
moyenne_age
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)
#### Connaitre la médianne d'age des passagers : 
median_age = data.Age.median()
median_age
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)
Explanation: Connaitre la moyenne d'age des passagers :
End of explanation
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"
# Lib de calcul
import numpy as np
np.random.randint(1, 10, 1)
#(mean - std) & (mean + std)
new_age = np.random.randint(mean_age - std_age, mean_age + std_age, size = nbr_age_nan)
new_age
new_age.mean()
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
# Simulation d'une nouvelle série d'age
sns.distplot(data_age_4.Age)
# Données d'origine :
sns.distplot(data[~pd.isnull(data.Age)]['Age'])
Explanation: Créer une série de données qui respecte la distribution d'origine :
Une série de données continue est caractérisé par ça moyenne et écart-type
End of explanation
#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)
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
sns.lmplot('Age','Survived',hue='Pclass',data=data_age_4)
# Réaction des spé Big data qui veulent up leurs scores sur Kaggle ;)
Image(url="http://i.giphy.com/xTiTnnLkYTDWSOWSHK.gif")
Explanation: La dernière méthode est la plus respectueuse des donnnées
End of explanation
data[['Parch', 'SibSp']].describe()
data['Family'] =  data["Parch"] + data["SibSp"]
data.Family.value_counts()
# 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
data.is_Family.value_counts()
sns.countplot(x='is_Family', data=data)
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)
Explanation: La famille :
SisbSp : (Sibling and Spouse) : le nombre de membres de la famille du passager de type frère, soeur, demi-frère, demi-soeur, époux, épouse...
Parch : (Parent and Child) : le nombre de membres de la famille du passager du type père, mère, fils, fille, beau-fils, etc...
End of explanation
sns.factorplot('is_Family', data=data,hue='Sex', kind='count')
sns.factorplot('Pclass', data=data,hue='Sex', kind='count')
fig = sns.FacetGrid(data, row="Sex", col='Pclass')
fig.map(sns.barplot,'is_Family', 'Survived')
fig = sns.FacetGrid(data, row="Sex", col='Pclass')
fig.map(sns.kdeplot,'Age')
Explanation: Analyse général des données
End of explanation
<END_TASK>