Skip to content
Snippets Groups Projects

Exercise on dataviz

Merged Ghost User requested to merge develop into main
2 files
+ 483
0
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 257
0
%% Cell type:markdown id:5b217d1d-8965-4a51-b1f6-63d9e0ed48a1 tags:
# Une plongée au cœur du *Titanic*
%% Cell type:markdown id:378fbce4-8168-4b0a-9dec-2e1d454fbd7f tags:
Le RMS *Titanic* est un paquebot qui fit naufrage le 15 avril 1912 avec à son bord quelques 2400 passagers dont Rose, Jack et au moins un contrebassiste. *Titanic* est aussi le nom d’un jeu de données qui fait partie des incontournables du *machine learning* et qui nous intéressera pour ce TD.
Après avoir importé le jeu de données avec la librairie *Pandas*, vous utiliserez *Seaborn* pour explorer ses différentes variables et en obtenir un meilleur aperçu.
Pour rappel, la syntaxe générique d’une méthode appartenant à *Seaborn* est :
```python
_ = sns.method(data=data_frame, x="column_x-axe", y="column_y-axe",
hue="column_to_distinguish_data")
```
Il ne vous restera plus qu’à choisir le bon nom de méthode afin d’afficher les graphiques appropriés.
%% Cell type:markdown id:26ec3b2b-69fd-401d-8119-d2402d2174aa tags:
## Contenu du jeu de données
%% Cell type:markdown id:1919341f-5041-47e2-b2f4-8837e329d6e2 tags:
Le fichier [*titanic.csv*](./files/titanic.csv) contient 891 observations décrites par 12 variables :
|Variable|Définition|
|:-:|-|
|*PassengerId*|Identifiant numérique du passager.|
|*Survived*|Facteur à deux niveaux : 0 pour indiquer que le passager n’a pas survécu ; 1 sinon.|
|*Pclass*|Facteur à trois niveaux pour caractériser la classe de transport : 1e, 2e ou 3e classe|
|*Name*|Nom du passager ou de la passagère.|
|*Sex*|Facteur à deux niveaux pour le sexe du passager ou de la passagère : *male* ou *female*.|
|*Age*|Âge, en nombre d’années. En dessous de 1 an, l’âge est exprimé en fraction décimale.|
|*SibSp*|Nombre de frères et sœurs (ou beaux-frères, belles-sœurs) et de maris ou femmes embarqué·es aussi sur le *Titanic*.|
|*Parch*|Nombre de parents et d’enfants embarqués sur le *Titanic*.|
|*Ticket*|Numéro de billet.|
|*Fare*|Tarif passager.|
|*Cabin*|Numéro de cabine.|
|*Embarked*|Facteur à trois niveaux pour coder le port d’embarquement : *C* = Cherbourg, *Q* = Queenstown, *S* = Southampton|
%% Cell type:markdown id:db0e715a-80ee-4b5b-b960-de451b88dc99 tags:
## Importer le jeu de données
%% Cell type:markdown id:e05ec6ab-82b1-498f-b6b2-f44b04a86000 tags:
Commencez par charger tous les modules nécessaires (*Matplotlib*, *Pandas* et *Seaborn*) :
%% Cell type:code id:ed45fcdd-ad3a-4eec-884e-7befdfc47f3e tags:
``` python
# your code here
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
```
%% Cell type:markdown id:7f7fc16c-6f0f-4620-83eb-983d490e13d6 tags:
À présent, grâce à la méthode `.read_csv()` de *Pandas*, importez dans une variable `df` le fichier *titanic.csv* qui se trouve dans le sous-répertoire *files*, puis vérifiez avec `.info()` que l’opération s’est bien passée.
**Pour aller plus loin :** nous avons préalablement identifié les variables catégorielles dans l’objet `dtype` afin de typer correctement les données dès leur importation. Pensez à le renseigner avec le paramètre `dtype` de la méthode `.read_csv()`.
%% Cell type:code id:687a9895-5dec-42aa-9d8e-33b8a4b8a64f tags:
``` python
dtype = {
"Pclass": "category",
"Sex": "category",
"Embarked": "category",
"Survived": "category"
}
# your code here
df = pd.read_csv("./files/titanic.csv", dtype=dtype)
df.info()
```
%% Cell type:markdown id:72626132-ad90-4519-a99d-f6cb7d27c23d tags:
## Définir les variables cible et explicatives
%% Cell type:markdown id:914675eb-717f-4c59-b3c8-5a19b227c2e2 tags:
Pour les besoins du TD, nous allons établir une liste des variables qui nous intéresseraient dans le cadre d’une tâche banale de classification en apprentissage supervisé. Ici, nous formulons l’idée de prédire la survie d’un·e passager·ère en fonction de certains indicateurs. Il est d’usage de bien identifier les variables explicatives et la variable cible et de travailler sur une copie du fichier original qui restera toujours accessible dans `df` :
%% Cell type:code id:08f972cf-98d2-4cb5-ada1-2b2bbda6b8e8 tags:
``` python
target = "Survived"
features = ["Pclass", "Sex", "Age", "Fare", "Embarked"]
# a new data frame
data = pd.DataFrame( df[features + [target]] )
data.info()
```
%% Cell type:markdown id:31a8b6d3-c6af-49e5-a30e-5da5002078ad tags:
Le résultat de la méthode `.info()` nous informe qu’il existe une quantité non négligeable de données manquantes. Comme un jeu de données doit être complet avant d’entraîner un algorithme en vue d’un apprentissage supervisé, nous allons ici simplement nous en débarrasser :
%% Cell type:code id:6ffaeda0-7256-43ee-81a0-7384cbf8c0e6 tags:
``` python
data.dropna(inplace=True)
data.info()
```
%% Cell type:markdown id:04b56774-5d92-4ee8-9b61-8ccb326e785e tags:
## En route pour l’exploration
%% Cell type:markdown id:73f0235a-2b31-4d77-81f1-dc3a0f347f5a tags:
Il est temps de commencer votre voyage à l’intérieur du *Titanic*. Les manipulations qui suivent ne servant aucun but particulier sinon celui de vous familiariser un peu plus avec *Seaborn*, n’hésitez pas à exécuter vos propres instructions.
Avant toute chose, définissez le contexte d’affichage approprié pour un calepin électronique (*notebook*) :
%% Cell type:code id:57da1fd3-54b8-4c65-974b-eda50f7103c3 tags:
``` python
# your code here
sns.set_context('notebook')
```
%% Cell type:markdown id:7a961d7a-4365-4bff-aa81-0ea778a4c9fe tags:
### Mieux comprendre la variable cible
%% Cell type:markdown id:3cf821dd-c8d9-442c-a2c8-c60845fadef7 tags:
Notre but étant de prédire la survie d’un·e passager·ère, le premier réflexe est d’analyse la variable cible, contenue dans l’objet `target`. Grâce à la méthode `.countplot()`, affichez simplement la distribution des catégories (`0` a péri en mer ; `1` a survécu).
%% Cell type:code id:e3571310-eb5d-4b81-828d-f0b3b96b3f9c tags:
``` python
# your code here
_ = sns.countplot(data=data, x=target, palette="Paired")
```
%% Cell type:markdown id:8144c818-0f6f-4dfb-ad96-95ed3c263c92 tags:
À présent, grâce à la méthode `.pairplot()`, essayez de comprendre la relation entre les variables numériques en utilisant la variable cible pour mettre en évidence les points :
%% Cell type:code id:b83d61b4-5782-4d02-8e75-576d2d5a6457 tags:
``` python
# your code here
_ = sns.pairplot(data=data, hue=target, palette="OrRd")
```
%% Cell type:markdown id:3fb7a9c1-b5ec-4156-93e6-a74631b2a253 tags:
La représentation ne nous apprend rien : on aurait aimé, grâce à ce genre de graphique, isoler les deux groupes (`0` et `1`). Affichez plutôt un diagramme en barres d’une variable quantitative et d’une autre catégorielle en utilisant toujours la variable cible dans le paramètre `hue` :
%% Cell type:code id:edffd7b5-babd-47ea-bbf9-3fa2230781dd tags:
``` python
# your code here
_ = sns.barplot(data=df, x="Sex", y="Fare", hue=target, palette="Dark2")
```
%% Cell type:markdown id:6c47727f-e9c3-4a68-862b-98f03701458a tags:
### Équité tarifaire ?
%% Cell type:markdown id:afd2064b-e1ac-4de4-8d07-b3d0af9d9c6a tags:
Nous posons la question de savoir si le prix payé pour la traversée est fonction de la classe de transport. Après tout, nous sommes habitué·es aujourd’hui à l’idée qu’un même billet avec les mêmes prestations ne soit pas vendu au même tarif à deux personnes différentes, aussi qu’en était-il à bord du *Titanic* ?
Avec la méthode `.barplot()`, regardez la répartition du prix payé en fonction du lieu d’embarquement :
%% Cell type:code id:1dc87f55-c711-42a1-a3ef-d4767b30b08c tags:
``` python
# your code here
_ = sns.barplot(data=data, x="Embarked", y="Fare", palette="Pastel1")
```
%% Cell type:markdown id:0c706282-37ed-473a-8f83-37bde6b8f10a tags:
On remarque que les personnes ayant embarqué à Queenstown, l’actuelle ville de Cobh dans le sud-ouest de l’Irlande, ont en moyenne payé leur ticket moins cher que les autres. Peut-être étaient-ils plus nombreux à embarquer ? Vérifions cette hypothèse avec la méthode `.countplot()` afin de connaître la répartition des passagers et des passagères :
%% Cell type:code id:440aba08-e4ea-4ca0-a9e3-1381f79d51e0 tags:
``` python
# your code here
_ = sns.countplot(data=data, x="Embarked", hue="Sex", palette="Pastel2")
```
%% Cell type:markdown id:3762828f-c9bb-43e5-adce-3c1b5c9ba762 tags:
Finalement, les Irlandais·es ne sont qu’une poignée à avoir embarqué à bord du *Titanic*.
Une autre question, serait de savoir s’il n’existait pas une discrimination tarifaire en fonction du port d’embarquement. Pour en juger, affichez un nouveau diagramme en barres avec, en abscisses, la classe de transport, en ordonnées le tarif et le port d’embarquement comme discriminant (paramètre `hue`) :
%% Cell type:code id:130f9b4a-43a0-4f9d-90e6-3b64384d030c tags:
``` python
# your code here
_ = sns.barplot(data=data, x="Pclass", y="Fare", hue="Embarked", palette="Set2")
```
%% Cell type:markdown id:193a2184-3922-43ad-af30-aed3c1b9c7dc tags:
Une boîte à moustaches serait peut-être plus à même de nous renseigner sur les inégalités. Renseignez les mêmes paramètres à la méthode `.boxplot()` :
%% Cell type:code id:8c917289-ecd7-4400-a544-4b69ecf62ffd tags:
``` python
# your code here
_ = sns.boxplot(data=data, x="Pclass", y="Fare", hue="Embarked", palette="Accent")
```
%% Cell type:markdown id:33406509-7838-4eb0-9e37-ad135bbc2e1d tags:
Autre hypothèse, le prix payé augmente-t-il avec l’âge ? Une droite de régression permettrait de s’en assurer :
%% Cell type:code id:78b159de-b7b8-4699-a438-22749e0b259a tags:
``` python
# your code here
_ = sns.regplot(data=df, x="Age", y="Fare", color="maroon")
```
%% Cell type:markdown id:541bd87b-c7c5-44de-b1b6-2016bacf2e26 tags:
### Analyser la relation entre plusieurs variables en fonction de modalités
%% Cell type:markdown id:06ca23b9-380a-470e-a666-d40815e54763 tags:
Pour cette exercice, vous utiliserez la classe `FacetGrid()` avec, en colonne, la classe de transport (*Pclass*), en ligne, la variable *Sex* et, comme graphique pour visualiser la relation entre elles, un nuage de points de *Age* et *Fare* :
%% Cell type:code id:980551c5-b160-46aa-a545-0e14d33be146 tags:
``` python
# your code here
figure = sns.FacetGrid(data=df, col="Pclass", row="Sex", hue=target, palette="Oranges")
figure.map(sns.scatterplot, "Age", "Fare")
figure.add_legend()
plt.show()
```
Loading