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
+ 441
0
{
"cells": [
{
"cell_type": "markdown",
"id": "5b217d1d-8965-4a51-b1f6-63d9e0ed48a1",
"metadata": {},
"source": [
"# Une plongée au cœur du *Titanic*"
]
},
{
"cell_type": "markdown",
"id": "378fbce4-8168-4b0a-9dec-2e1d454fbd7f",
"metadata": {},
"source": [
"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.\n",
"\n",
"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.\n",
"\n",
"Pour rappel, la syntaxe générique d’une méthode appartenant à *Seaborn* est :\n",
"\n",
"```python\n",
"_ = sns.method(data=data_frame, x=\"column_x-axe\", y=\"column_y-axe\",\n",
" hue=\"column_to_distinguish_data\")\n",
"```\n",
"\n",
"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",
"metadata": {
"tags": []
},
"source": [
"## Contenu du jeu de données"
]
},
{
"cell_type": "markdown",
"id": "1919341f-5041-47e2-b2f4-8837e329d6e2",
"metadata": {},
"source": [
"Le fichier [*titanic.csv*](./files/titanic.csv) contient 891 observations décrites par 12 variables :\n",
"\n",
"|Variable|Définition|\n",
"|:-:|-|\n",
"|*PassengerId*|Identifiant numérique du passager.|\n",
"|*Survived*|Facteur à deux niveaux : 0 pour indiquer que le passager n’a pas survécu ; 1 sinon.|\n",
"|*Pclass*|Facteur à trois niveaux pour caractériser la classe de transport : 1e, 2e ou 3e classe|\n",
"|*Name*|Nom du passager ou de la passagère.|\n",
"|*Sex*|Facteur à deux niveaux pour le sexe du passager ou de la passagère : *male* ou *female*.|\n",
"|*Age*|Âge, en nombre d’années. En dessous de 1 an, l’âge est exprimé en fraction décimale.|\n",
"|*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*.|\n",
"|*Parch*|Nombre de parents et d’enfants embarqués sur le *Titanic*.|\n",
"|*Ticket*|Numéro de billet.|\n",
"|*Fare*|Tarif passager.|\n",
"|*Cabin*|Numéro de cabine.|\n",
"|*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",
"metadata": {
"tags": []
},
"source": [
"## Importer le jeu de données"
]
},
{
"cell_type": "markdown",
"id": "e05ec6ab-82b1-498f-b6b2-f44b04a86000",
"metadata": {},
"source": [
"Commencez par charger tous les modules nécessaires (*Matplotlib*, *Pandas* et *Seaborn*) :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ed45fcdd-ad3a-4eec-884e-7befdfc47f3e",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn as sns"
]
},
{
"cell_type": "markdown",
"id": "7f7fc16c-6f0f-4620-83eb-983d490e13d6",
"metadata": {},
"source": [
"À 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.\n",
"\n",
"**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",
"execution_count": null,
"id": "687a9895-5dec-42aa-9d8e-33b8a4b8a64f",
"metadata": {},
"outputs": [],
"source": [
"dtype = {\n",
" \"Pclass\": \"category\",\n",
" \"Sex\": \"category\",\n",
" \"Embarked\": \"category\",\n",
" \"Survived\": \"category\"\n",
"}\n",
"\n",
"# your code here\n",
"\n",
"df = pd.read_csv(\"./files/titanic.csv\", dtype=dtype)\n",
"df.info()"
]
},
{
"cell_type": "markdown",
"id": "72626132-ad90-4519-a99d-f6cb7d27c23d",
"metadata": {
"tags": []
},
"source": [
"## Définir les variables cible et explicatives"
]
},
{
"cell_type": "markdown",
"id": "914675eb-717f-4c59-b3c8-5a19b227c2e2",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "08f972cf-98d2-4cb5-ada1-2b2bbda6b8e8",
"metadata": {},
"outputs": [],
"source": [
"target = \"Survived\"\n",
"features = [\"Pclass\", \"Sex\", \"Age\", \"Fare\", \"Embarked\"]\n",
"\n",
"# a new data frame\n",
"data = pd.DataFrame( df[features + [target]] )\n",
"data.info()"
]
},
{
"cell_type": "markdown",
"id": "31a8b6d3-c6af-49e5-a30e-5da5002078ad",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "6ffaeda0-7256-43ee-81a0-7384cbf8c0e6",
"metadata": {},
"outputs": [],
"source": [
"data.dropna(inplace=True)\n",
"data.info()"
]
},
{
"cell_type": "markdown",
"id": "04b56774-5d92-4ee8-9b61-8ccb326e785e",
"metadata": {},
"source": [
"## En route pour l’exploration"
]
},
{
"cell_type": "markdown",
"id": "73f0235a-2b31-4d77-81f1-dc3a0f347f5a",
"metadata": {},
"source": [
"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.\n",
"\n",
"Avant toute chose, définissez le contexte d’affichage approprié pour un calepin électronique (*notebook*) :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "57da1fd3-54b8-4c65-974b-eda50f7103c3",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"sns.set_context('notebook')"
]
},
{
"cell_type": "markdown",
"id": "7a961d7a-4365-4bff-aa81-0ea778a4c9fe",
"metadata": {},
"source": [
"### Mieux comprendre la variable cible"
]
},
{
"cell_type": "markdown",
"id": "3cf821dd-c8d9-442c-a2c8-c60845fadef7",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "e3571310-eb5d-4b81-828d-f0b3b96b3f9c",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.countplot(data=data, x=target, palette=\"Paired\")"
]
},
{
"cell_type": "markdown",
"id": "8144c818-0f6f-4dfb-ad96-95ed3c263c92",
"metadata": {},
"source": [
"À 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",
"execution_count": null,
"id": "b83d61b4-5782-4d02-8e75-576d2d5a6457",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.pairplot(data=data, hue=target, palette=\"OrRd\")"
]
},
{
"cell_type": "markdown",
"id": "3fb7a9c1-b5ec-4156-93e6-a74631b2a253",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "edffd7b5-babd-47ea-bbf9-3fa2230781dd",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.barplot(data=df, x=\"Sex\", y=\"Fare\", hue=target, palette=\"Dark2\")"
]
},
{
"cell_type": "markdown",
"id": "6c47727f-e9c3-4a68-862b-98f03701458a",
"metadata": {},
"source": [
"### Équité tarifaire ?"
]
},
{
"cell_type": "markdown",
"id": "afd2064b-e1ac-4de4-8d07-b3d0af9d9c6a",
"metadata": {},
"source": [
"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* ?\n",
"\n",
"Avec la méthode `.barplot()`, regardez la répartition du prix payé en fonction du lieu d’embarquement :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1dc87f55-c711-42a1-a3ef-d4767b30b08c",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.barplot(data=data, x=\"Embarked\", y=\"Fare\", palette=\"Pastel1\")"
]
},
{
"cell_type": "markdown",
"id": "0c706282-37ed-473a-8f83-37bde6b8f10a",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "440aba08-e4ea-4ca0-a9e3-1381f79d51e0",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.countplot(data=data, x=\"Embarked\", hue=\"Sex\", palette=\"Pastel2\")"
]
},
{
"cell_type": "markdown",
"id": "3762828f-c9bb-43e5-adce-3c1b5c9ba762",
"metadata": {},
"source": [
"Finalement, les Irlandais·es ne sont qu’une poignée à avoir embarqué à bord du *Titanic*.\n",
"\n",
"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",
"execution_count": null,
"id": "130f9b4a-43a0-4f9d-90e6-3b64384d030c",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.barplot(data=data, x=\"Pclass\", y=\"Fare\", hue=\"Embarked\", palette=\"Set2\")"
]
},
{
"cell_type": "markdown",
"id": "193a2184-3922-43ad-af30-aed3c1b9c7dc",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "8c917289-ecd7-4400-a544-4b69ecf62ffd",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.boxplot(data=data, x=\"Pclass\", y=\"Fare\", hue=\"Embarked\", palette=\"Accent\")"
]
},
{
"cell_type": "markdown",
"id": "33406509-7838-4eb0-9e37-ad135bbc2e1d",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "78b159de-b7b8-4699-a438-22749e0b259a",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"_ = sns.regplot(data=df, x=\"Age\", y=\"Fare\", color=\"maroon\")"
]
},
{
"cell_type": "markdown",
"id": "541bd87b-c7c5-44de-b1b6-2016bacf2e26",
"metadata": {},
"source": [
"### Analyser la relation entre plusieurs variables en fonction de modalités"
]
},
{
"cell_type": "markdown",
"id": "06ca23b9-380a-470e-a666-d40815e54763",
"metadata": {},
"source": [
"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",
"execution_count": null,
"id": "980551c5-b160-46aa-a545-0e14d33be146",
"metadata": {},
"outputs": [],
"source": [
"# your code here\n",
"\n",
"figure = sns.FacetGrid(data=df, col=\"Pclass\", row=\"Sex\", hue=target, palette=\"Oranges\")\n",
"figure.map(sns.scatterplot, \"Age\", \"Fare\")\n",
"figure.add_legend()\n",
"\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading