Files
ENI-Jupyter/M03_TP01_Exercice.ipynb
johanleroy 299e16576d TP1
2025-09-15 12:15:13 +02:00

563 lines
18 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "55d19678",
"metadata": {},
"source": [
"# TP1 du module 3 : les librairies Python pour le ML\n",
"\n",
"Dans ce TP, nous allons explorer les quatre librairies présentées dans le cours. Objectifs :\n",
"* Savoir créer et récupérer des données avec Numpy et Pandas\n",
"* Savoir interroger les données avec Pandas\n",
"* Savoir calculer des statistiques de base\n",
"* Produire des visualisations avec Matplotlib et Seaborn"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4ceeadf3",
"metadata": {},
"outputs": [],
"source": [
"# Insérer ici l'import des librairies dont vous avez besoin\n"
]
},
{
"cell_type": "markdown",
"id": "06617af8",
"metadata": {},
"source": [
"## Première partie : s'échauffer avec Numpy\n",
"Commencons avec quelques exercices sur Numpy, qui vous permettront également de réviser certaines fonctionnalités de Python. Pour rappel, toute la documentation Numpy est disponible en cliquant sur ce [lien](https://numpy.org/doc/stable/user/index.html)\n",
"\n",
"**Question 1 :** créer une matrice `mat` 3*3 contenant tous les chiffres de 1 à 9, à l'aide des méthodes `arange` et `reshape`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f4bbe51d",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "b7a6cbc4",
"metadata": {},
"source": [
"**Question 2 :** écrire une fonction prenant en paramètre une matrice carré (de taille n*n, où n est un entier), et qui renvoie sa trace (la somme des nombres sur la diagonale de la matrice), sans utiliser la méthode `trace` de numpy. Appliquez votre fonction à la matrice `mat` créée à la question précédente, et comparez le résultat avec la méthode `trace` de numpy pour valider votre fonction."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f646cc15",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "05c9d50e",
"metadata": {},
"source": [
"**Question 3 :** créez une deuxième matrice `mat2`, de dimension 3*3 également, qui ne contient que des 1."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d09bc99f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "81406a80",
"metadata": {},
"source": [
"**Question 4 :** créez la matrice `vert`, qui consiste à empiler verticalement `mat` sur `mat2`. Résultat attendu :\n",
"\n",
"| | | |\n",
"|---|---|---|\n",
"| 1 | 2 | 3 |\n",
"| 4 | 5 | 6 |\n",
"| 7 | 8 | 9 |\n",
"| 1 | 1 | 1 |\n",
"| 1 | 1 | 1 |\n",
"| 1 | 1 | 1 |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e79b59fd",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "4d168af1",
"metadata": {},
"source": [
"**Question 5 :** créez la matrice `hori`, qui consiste à coller horizontalement `mat` à `mat2`. Résultat attendu :\n",
"\n",
"| | | | | | |\n",
"|---|---|---|---|---|---|\n",
"| 1 | 2 | 3 | 1 | 1 | 1 |\n",
"| 4 | 5 | 6 | 1 | 1 | 1 |\n",
"| 7 | 8 | 9 | 1 | 1 | 1 |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "041d438b",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "c37d28f6",
"metadata": {},
"source": [
"**Question 5 :** écrire une fonction qui prend en paramètre une matrice et un nombre, et qui renvoie le nombre d'éléments de la matrice qui sont strictement inférieurs à ce nombre. Vous pouvez utiliser la méthode `count_nonzero` de numpy."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f916be17",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "a6a6b43b",
"metadata": {},
"source": [
"## Partie 2 : manipuler un jeu de données\n",
"Après cet échauffement, nous allons passer à la manipulation d'un jeu de données, pour en commencer l'analyse, et pour produire des visualisations.\n",
"\n",
"### Présentation du jeu de données\n",
"Pour ce TP (et les suivants), nous allons analyser les données d'un jeu de données sur les passagers du Titanic. Pour rappel, le RMS Titanic est un paquebot transatlantique britannique qui fait naufrage dans l'océan Atlantique Nord en 1912 à la suite d'une collision avec un iceberg, lors de son voyage inaugural de Southampton à New York. Entre 1 490 et 1 520 personnes trouvent la mort, ce qui fait de cet événement l'une des plus grandes catastrophes maritimes survenues en temps de paix et la plus grande pour l'époque. \n",
"\n",
"![Le Titanic à Southampton le 10 avril 1912. ](https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/RMS_Titanic_3.jpg/420px-RMS_Titanic_3.jpg)\n",
"\n",
"Ce jeu de données est assez utilisé pour débuter dans le machine learning. Nous irons plus loin sur le prochain TP (module 4) dans son analyse, sur cette partie l'objectif est simplement de prendre en main Pandas, Matplotlib et Seaborn.\n",
"\n",
"Les données contiennent un ensemble d'information sur ces passages (genre, age, etc), ainsi qu'un atribut sépcifiant s'ils ont ou non survécu au naufrage. Pour vous aider, voilà un bref descriptifs des attributs du jeu de données : \n",
"\n",
"| Attribut | Explication | \n",
"| ------------- |:-------------: | \n",
"| Survived | 0 = Décédé, 1 = Survivant| \n",
"| PClass | 1 = cabine 1ere classe, 2= cabine 2e classe, 3=cabine 3e classe | \n",
"| Sex | 0=femme, 1=homme |\n",
"| sibsp | Nombre de frères, soeurs, et/ou conjoint à bord |\n",
"|parch | Nombre de parents et/ou enfants à bord |\n",
"| ticket | Numéro du ticket |\n",
"|cabin | Numéro de cabine |\n",
"|embarked | Port d'embarquement (C = Cherbourg; Q = Queenstown; S = Southampton) |"
]
},
{
"cell_type": "markdown",
"id": "5e1c586f",
"metadata": {},
"source": [
"### Pandas\n",
"Dans cette partie, chaque question ne nécessite qu'une seule ligne de code. \n",
"\n",
"**Question 1 :** charger le jeu de données dans un Dataframe depuis l'adresse suivante : https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "96ab19ad",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "539c23f2",
"metadata": {},
"source": [
"**Question 2 :** combien de lignes comporte ce dataset ? Combien de colonnes ? Contient-il des valeurs nulles dans certaines colonnes ?"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "72c8a945",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "292c712a",
"metadata": {},
"source": [
"**Question 3 :** calculez les statistiques de base sur les colonnes numériques ce jeu de données"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b8aea3e",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "805559e2",
"metadata": {},
"source": [
"**Question 4 :** sélectionnez uniquement les colonnes `Survived` et `Age`"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b984a966",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "899df8dc",
"metadata": {},
"source": [
"**Question 5 :** sélectionner les informations sur le passager ayant occupé la cabine B78. Résultat attendu : \n",
"\n",
"| | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |\n",
"|---:|------------:|---------:|-------:|-----------------------------------------------:|-------:|----:|------:|------:|---------:|---------:|------:|---------:|\n",
"| 31 | 32 | 1 | 1 | Spencer, Mrs. William Augustus (Marie Eugenie) | female | NaN | 1 | 0 | PC 17569 | 146.5208 | B78 | C |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4f6fd760",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "3c6ac11b",
"metadata": {},
"source": [
"**Question 6 :** Sélectionnez uniquement les passagers âgés de plus de 30 ans (strictement), qui sont des femmes, qui voyageaient en première classe, et qui n'ont pas survécu.\n",
"\n",
"Résultat attendu :\n",
"\n",
"| | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |\n",
"|----:|------------:|---------:|-------:|---------------------------:|-------:|-----:|------:|------:|---------:|--------:|------:|---------:|\n",
"| 177 | 178 | 0 | 1 | Isham, Miss. Ann Elizabeth | female | 50.0 | 0 | 0 | PC 17595 | 28.7125 | C49 | C |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a7da8b14",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "5fbf471a",
"metadata": {},
"source": [
"**Question 7 :** trouver le nom des passagers qui sont montés à Cherbourg ou à Queenstown, qui voyageaient en 1e classe, avec au moins deux frère/soeurs/conjoints? Résultat attendu :\n",
"\n",
"| | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |\n",
"|----:|------------:|---------:|-------:|--------------------------------------:|-------:|-----:|------:|------:|---------:|--------:|----------------:|---------:|\n",
"| 245 | 246 | 0 | 1 | Minahan, Dr. William Edward | male | 44.0 | 2 | 0 | 19928 | 90.000 | C78 | Q |\n",
"| 311 | 312 | 1 | 1 | Ryerson, Miss. Emily Borie | female | 18.0 | 2 | 2 | PC 17608 | 262.375 | B57 B59 B63 B66 | C |\n",
"| 742 | 743 | 1 | 1 | Ryerson, Miss. Susan Parker \"Suzette\" | female | 21.0 | 2 | 2 | PC 17608 | 262.375 | B57 B59 B63 B66 | C |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "eb6cf581",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "ec2f5672",
"metadata": {},
"source": [
"**Question 8 :** compter le nombre de femmes et d'hommes ayant survécu. (rappel : en une seule ligne de code !). Résultat attendu :\n",
"\n",
"| Sex | |\n",
"|-------------:|----:|\n",
"| female | 233 |\n",
"| male | 109 |\n",
"| dtype: int64 | |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bfeb02c2",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "48f48106",
"metadata": {},
"source": [
"**Question 9** : pour chaque classe, calculer la moyenne d'âge. Résultat attendu :\n",
"\n",
"| Pclass | |\n",
"|:-------------------------:|----------:|\n",
"| 1 | 38.233441 |\n",
"| 2 | 29.877630 |\n",
"| 3 | 25.140620 |\n",
"| Name: Age, dtype: float64 | |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bd7b6d5c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "78cd99eb",
"metadata": {},
"source": [
"**Question 10 :** ajouter une colonne au datframe contenant les données du titanic, qui représente le nombre total de personnes accompagnant chaque passager (somme de `SibSp` et `Parch`)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "722450a8",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "10c01d50",
"metadata": {},
"source": [
"### Matplotlib\n",
"Il est à présent temps de proposer quelques visualisations sur ce jeu de données. Pour les questions suivantes, il vous est demandé d'utiliser uniquement matplotlib (pyplot), même si des équivalences peuvent exister avec seaborn.\n",
"\n",
"La documentation matplotlib est accessible à l'adresse suivante : https://matplotlib.org/stable/index.html\n",
"\n",
"**Question 1 :** afficher un graphe, de type scatterplot, affichant l'âge des passagers en fonction du prix de leur ticket. Pensez à bien afficher un texte sur chaque axe, et ajouter un titre."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "34f1fe70",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "92a0c112",
"metadata": {},
"source": [
"**Question 2 :** afficher un histogramme (barplot) montrant, pour chaque classe (1e, 2e et 3e), le nombre de passagers à bord du bateau. Pensez à nommer vos axes et votre figure. Sur l'abscisse, seules les classes 1, 2 et 3 doivent apparaitre (pas de nombre décimal) : si nécessaire, regarder dans la documention comment utiliser `xticks`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b5c4552f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "6f811c0d",
"metadata": {},
"source": [
"**Question 3 :** proposez un graphique similaire au précédent, en représentant séparement pour chaque classe le nombre d'hommes et le nombre de femmes, sur deux barres côte à côte. Pensez à nommer vos axes, votre figure, et à afficher une légende expliquant quelle couleur représente les hommes, et laquelle représente les femmes."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5e32ab09",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "aed1e423",
"metadata": {},
"source": [
"**Question 4 :** proposez un scatterplot montrant le nombre total de membres de la famille voyageant avec le passsagers (calculé à la question 10 de la section sur pandas), en fonction du prix du ticket (sur l'axe y, ordonnée). Colorez chaque point du graphique en fonction de si le passager a survécu ou non. Affichez une légende expliquant ce code couleur, donnez un titre à vos axes, et ajoutez un titre à votre graphique."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ab3e1e93",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "35d5fe49",
"metadata": {},
"source": [
"**Question 5 :** proposez une figure composée de six sous-graphes, répartis sur deux lignes et 3 colonnes. Chaque colonne représente un port d'embarquement. Sur la première, pour chaque port, représentez sur un scatterplot l'âge des passagers (abscisse) en fonction du prix de leur billet (ordonnée). Sur la deuxième ligne, pour chaque port, représentez un barplot représentant le nombre de passagers de chaque genre."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1f3662f1",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "d2845c23",
"metadata": {},
"source": [
"### Seaborn\n",
"\n",
"Vous allez cette fois générer des visualisations uniquement avec Seaborn. La documentation est accessible à l'adresse suivante : https://seaborn.pydata.org/api.html\n",
"\n",
"\n",
"**Question 1 :** proposez un scatterplot de l'âge des passagers en fonction du prix de leur ticket. Colorez chaque point en fonction du port dans lequel le passager à embarqué. Affichez une légende, nommez vos axes, et affichez un titre pour votre graphique."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0068c9f7",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "565aad2c",
"metadata": {},
"source": [
"**Question 2 :** faire un barplot représentant le nombre de passagers par genre. Indice : utilisez un `histplot`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c8cb3730",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "a12b94fb",
"metadata": {},
"source": [
"**Question 3 :** reproduire l'histogramme de la question 3 de la partie matplot lib - histogramme du nombre et de femmes pour chaque classe."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f58d3ff7",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "5dbf5040",
"metadata": {},
"source": [
"**Question 4 :** proposer un pairplot pour les colonnes suivantes : Age et Fare. Colorer chaque point en fonction de si le passager a survécu ou non."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2cfc979b",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "8a3e5008",
"metadata": {},
"source": [
"**Question 5 :** en utilisant la fonction `corr` de pandas, et la fonction `heatmap` de seaborn, proposez une *heatmap* représentant la corrélation entre les attributs suivants : Survived, Age, Pclass, FamilyMembers(calculé par vos soins dans la partie pandas), et Fare."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "862165a1",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "e0735b47",
"metadata": {},
"source": [
"# Fin du TP !"
]
}
],
"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.9.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}