You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
669 lines
25 KiB
669 lines
25 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_2-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"toc_visible": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
|
|
"translation_date": "2025-09-04T01:38:13+00:00",
|
|
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
|
|
"language_code": "fr"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Construire un modèle de régression : préparer et visualiser les données\n",
|
|
"\n",
|
|
"## **Régression linéaire pour les citrouilles - Leçon 2**\n",
|
|
"#### Introduction\n",
|
|
"\n",
|
|
"Maintenant que vous disposez des outils nécessaires pour commencer à construire des modèles de machine learning avec Tidymodels et le Tidyverse, vous êtes prêt à poser des questions à vos données. Lorsque vous travaillez avec des données et appliquez des solutions de machine learning, il est crucial de savoir poser les bonnes questions pour exploiter pleinement le potentiel de votre jeu de données.\n",
|
|
"\n",
|
|
"Dans cette leçon, vous apprendrez :\n",
|
|
"\n",
|
|
"- Comment préparer vos données pour la construction de modèles.\n",
|
|
"\n",
|
|
"- Comment utiliser `ggplot2` pour la visualisation des données.\n",
|
|
"\n",
|
|
"La question à laquelle vous souhaitez répondre déterminera le type d'algorithmes de machine learning que vous utiliserez. Et la qualité de la réponse que vous obtiendrez dépendra fortement de la nature de vos données.\n",
|
|
"\n",
|
|
"Voyons cela à travers un exercice pratique.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/unruly_data.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Illustration par @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--<br>Illustration par \\@allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Pg5aexcOPqAZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Importer les données sur les citrouilles et invoquer le Tidyverse\n",
|
|
"\n",
|
|
"Nous aurons besoin des packages suivants pour découper et analyser cette leçon :\n",
|
|
"\n",
|
|
"- `tidyverse` : Le [tidyverse](https://www.tidyverse.org/) est une [collection de packages R](https://www.tidyverse.org/packages) conçue pour rendre la science des données plus rapide, plus facile et plus amusante !\n",
|
|
"\n",
|
|
"Vous pouvez les installer avec la commande suivante :\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\"))`\n",
|
|
"\n",
|
|
"Le script ci-dessous vérifie si vous avez les packages nécessaires pour compléter ce module et les installe pour vous si certains sont manquants.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "dc5WhyVdXAjR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"pacman::p_load(tidyverse)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "GqPYUZgfXOBt"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Maintenant, lançons quelques packages et chargeons les [données](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) fournies pour cette leçon !\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kvjDTPDSXRr2"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load the core Tidyverse packages\n",
|
|
"library(tidyverse)\n",
|
|
"\n",
|
|
"# Import the pumpkins data\n",
|
|
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
|
|
"\n",
|
|
"\n",
|
|
"# Get a glimpse and dimensions of the data\n",
|
|
"glimpse(pumpkins)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print the first 50 rows of the data set\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n =50)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "VMri-t2zXqgD"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Un rapide `glimpse()` montre immédiatement qu'il y a des valeurs manquantes et un mélange de chaînes de caractères (`chr`) et de données numériques (`dbl`). La colonne `Date` est de type caractère, et il y a aussi une colonne étrange appelée `Package` où les données sont un mélange de `sacks`, `bins` et d'autres valeurs. En réalité, les données sont un peu en désordre 😤.\n",
|
|
"\n",
|
|
"En fait, il est assez rare de recevoir un jeu de données complètement prêt à l'emploi pour créer un modèle de machine learning directement. Mais ne vous inquiétez pas, dans cette leçon, vous apprendrez à préparer un jeu de données brut en utilisant des bibliothèques R standard 🧑🔧. Vous découvrirez également différentes techniques pour visualiser les données. 📈📊\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> Un rappel : L'opérateur pipe (`%>%`) permet d'effectuer des opérations dans une séquence logique en passant un objet à une fonction ou une expression d'appel. Vous pouvez considérer l'opérateur pipe comme signifiant \"et ensuite\" dans votre code.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "REWcIv9yX29v"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. Vérifier les données manquantes\n",
|
|
"\n",
|
|
"L'un des problèmes les plus courants auxquels les data scientists doivent faire face est celui des données incomplètes ou manquantes. R représente les valeurs manquantes ou inconnues avec une valeur sentinelle spéciale : `NA` (Non Disponible).\n",
|
|
"\n",
|
|
"Alors, comment savoir si le tableau de données contient des valeurs manquantes ?\n",
|
|
"<br>\n",
|
|
"- Une méthode simple serait d'utiliser la fonction de base R `anyNA`, qui retourne les objets logiques `TRUE` ou `FALSE`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Zxfb3AM5YbUe"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"pumpkins %>% \n",
|
|
" anyNA()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "G--DQutAYltj"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Super, il semble qu'il manque certaines données ! C'est un bon point de départ.\n",
|
|
"\n",
|
|
"- Une autre méthode consisterait à utiliser la fonction `is.na()` qui indique quels éléments individuels d'une colonne sont manquants avec une valeur logique `TRUE`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "mU-7-SB6YokF"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"pumpkins %>% \n",
|
|
" is.na() %>% \n",
|
|
" head(n = 7)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "W-DxDOR4YxSW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"D'accord, c'est fait, mais avec un grand tableau de données comme celui-ci, il serait inefficace et pratiquement impossible de vérifier toutes les lignes et colonnes individuellement 😴.\n",
|
|
"\n",
|
|
"- Une méthode plus intuitive serait de calculer la somme des valeurs manquantes pour chaque colonne :\n"
|
|
],
|
|
"metadata": {
|
|
"id": "xUWxipKYY0o7"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"pumpkins %>% \n",
|
|
" is.na() %>% \n",
|
|
" colSums()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "ZRBWV6P9ZArL"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Bien mieux ! Il manque des données, mais peut-être que cela n'aura pas d'importance pour la tâche en cours. Voyons ce que l'analyse supplémentaire peut révéler.\n",
|
|
"\n",
|
|
"> En plus des ensembles impressionnants de packages et de fonctions, R dispose d'une très bonne documentation. Par exemple, utilisez `help(colSums)` ou `?colSums` pour en savoir plus sur la fonction.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "9gv-crB6ZD1Y"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Dplyr : Une grammaire pour manipuler les données\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/dplyr_wrangling.png\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>Illustration par @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--<br/>Illustration par \\@allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "o4jLY5-VZO2C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`dplyr`](https://dplyr.tidyverse.org/), un package du Tidyverse, est une grammaire de manipulation de données qui offre un ensemble cohérent de verbes pour vous aider à résoudre les défis les plus courants en matière de manipulation de données. Dans cette section, nous allons explorer certains des verbes de dplyr !\n"
|
|
],
|
|
"metadata": {
|
|
"id": "i5o33MQBZWWw"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::select()\n",
|
|
"\n",
|
|
"`select()` est une fonction du package `dplyr` qui vous aide à choisir les colonnes à conserver ou à exclure.\n",
|
|
"\n",
|
|
"Pour rendre votre data frame plus facile à manipuler, supprimez plusieurs de ses colonnes en utilisant `select()`, en ne gardant que les colonnes dont vous avez besoin.\n",
|
|
"\n",
|
|
"Par exemple, dans cet exercice, notre analyse portera sur les colonnes `Package`, `Low Price`, `High Price` et `Date`. Sélectionnons ces colonnes.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "x3VGMAGBZiUr"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Select desired columns\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" select(Package, `Low Price`, `High Price`, Date)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print data set\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "F_FgxQnVZnM0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::mutate()\n",
|
|
"\n",
|
|
"`mutate()` est une fonction du package `dplyr` qui vous permet de créer ou de modifier des colonnes, tout en conservant les colonnes existantes.\n",
|
|
"\n",
|
|
"La structure générale de `mutate` est :\n",
|
|
"\n",
|
|
"`data %>% mutate(new_column_name = what_it_contains)`\n",
|
|
"\n",
|
|
"Explorons `mutate` en utilisant la colonne `Date` pour effectuer les opérations suivantes :\n",
|
|
"\n",
|
|
"1. Convertir les dates (actuellement de type caractère) en un format de mois (ce sont des dates américaines, donc le format est `MM/DD/YYYY`).\n",
|
|
"\n",
|
|
"2. Extraire le mois des dates dans une nouvelle colonne.\n",
|
|
"\n",
|
|
"En R, le package [lubridate](https://lubridate.tidyverse.org/) facilite le travail avec les données de type Date-heure. Utilisons donc `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` pour atteindre les objectifs ci-dessus. Nous pouvons supprimer la colonne Date, car nous n'en aurons plus besoin dans les opérations suivantes.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "2KKo0Ed9Z1VB"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load lubridate\n",
|
|
"library(lubridate)\n",
|
|
"\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" # Convert the Date column to a date object\n",
|
|
" mutate(Date = mdy(Date)) %>% \n",
|
|
" # Extract month from Date\n",
|
|
" mutate(Month = month(Date)) %>% \n",
|
|
" # Drop Date column\n",
|
|
" select(-Date)\n",
|
|
"\n",
|
|
"# View the first few rows\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 7)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "5joszIVSZ6xe"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Youpi ! 🤩\n",
|
|
"\n",
|
|
"Ensuite, créons une nouvelle colonne `Price`, qui représente le prix moyen d'une citrouille. Maintenant, prenons la moyenne des colonnes `Low Price` et `High Price` pour remplir la nouvelle colonne Price. \n",
|
|
"<br>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "nIgLjNMCZ-6Y"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Create a new column Price\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
|
|
"\n",
|
|
"# View the first few rows of the data\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "Zo0BsqqtaJw2"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ouiii !💪\n",
|
|
"\n",
|
|
"\"Mais attendez !\", direz-vous après avoir parcouru rapidement l'ensemble des données avec `View(pumpkins)`, \"Il y a quelque chose d'étrange ici !\"🤔\n",
|
|
"\n",
|
|
"Si vous regardez la colonne `Package`, les citrouilles sont vendues dans de nombreuses configurations différentes. Certaines sont vendues en mesures de `1 1/9 boisseau`, d'autres en mesures de `1/2 boisseau`, certaines à l'unité, d'autres au poids, et certaines dans de grandes caisses de largeurs variables.\n",
|
|
"\n",
|
|
"Vérifions cela :\n"
|
|
],
|
|
"metadata": {
|
|
"id": "p77WZr-9aQAR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Verify the distinct observations in Package column\n",
|
|
"pumpkins %>% \n",
|
|
" distinct(Package)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "XISGfh0IaUy6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Incroyable !👏\n",
|
|
"\n",
|
|
"Les citrouilles semblent être très difficiles à peser de manière cohérente, alors filtrons-les en sélectionnant uniquement les citrouilles contenant le mot *bushel* dans la colonne `Package` et mettons cela dans un nouveau cadre de données `new_pumpkins`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "7sMjiVujaZxY"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::filter() et stringr::str_detect()\n",
|
|
"\n",
|
|
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html) : crée un sous-ensemble des données ne contenant que les **lignes** qui remplissent vos conditions, dans ce cas, les citrouilles ayant le mot *bushel* dans la colonne `Package`.\n",
|
|
"\n",
|
|
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html) : détecte la présence ou l'absence d'un motif dans une chaîne de caractères.\n",
|
|
"\n",
|
|
"Le package [`stringr`](https://github.com/tidyverse/stringr) fournit des fonctions simples pour les opérations courantes sur les chaînes de caractères.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "L8Qfcs92ageF"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Retain only pumpkins with \"bushel\"\n",
|
|
"new_pumpkins <- pumpkins %>% \n",
|
|
" filter(str_detect(Package, \"bushel\"))\n",
|
|
"\n",
|
|
"# Get the dimensions of the new data\n",
|
|
"dim(new_pumpkins)\n",
|
|
"\n",
|
|
"# View a few rows of the new data\n",
|
|
"new_pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "hy_SGYREampd"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Vous pouvez voir que nous avons réduit à environ 415 lignes de données contenant des citrouilles par boisseau.🤩\n",
|
|
"<br>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "VrDwF031avlR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::case_when()\n",
|
|
"\n",
|
|
"**Mais attendez ! Il y a encore une chose à faire**\n",
|
|
"\n",
|
|
"Avez-vous remarqué que la quantité par boisseau varie selon les lignes ? Vous devez normaliser les prix afin d'afficher le prix par boisseau, et non par 1 1/9 ou 1/2 boisseau. Il est temps de faire quelques calculs pour standardiser cela.\n",
|
|
"\n",
|
|
"Nous allons utiliser la fonction [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) pour *modifier* la colonne Price en fonction de certaines conditions. `case_when` permet de vectoriser plusieurs instructions `if_else()`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "mLpw2jH4a0tx"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Convert the price if the Package contains fractional bushel values\n",
|
|
"new_pumpkins <- new_pumpkins %>% \n",
|
|
" mutate(Price = case_when(\n",
|
|
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
|
|
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
|
|
" TRUE ~ Price))\n",
|
|
"\n",
|
|
"# View the first few rows of the data\n",
|
|
"new_pumpkins %>% \n",
|
|
" slice_head(n = 30)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "P68kLVQmbM6I"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Nous pouvons maintenant analyser le prix par unité en fonction de leur mesure en boisseaux. Toute cette étude des boisseaux de citrouilles, cependant, montre à quel point il est `important` de `comprendre la nature de vos données` !\n",
|
|
"\n",
|
|
"> ✅ Selon [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), le poids d'un boisseau dépend du type de produit, car il s'agit d'une mesure de volume. \"Un boisseau de tomates, par exemple, est censé peser 56 livres... Les feuilles et les légumes verts occupent plus d'espace avec moins de poids, donc un boisseau d'épinards ne pèse que 20 livres.\" Tout cela est assez compliqué ! Ne nous embêtons pas à convertir les boisseaux en livres, et fixons plutôt les prix par boisseau. Toute cette étude des boisseaux de citrouilles, cependant, montre à quel point il est important de comprendre la nature de vos données !\n",
|
|
">\n",
|
|
"> ✅ Avez-vous remarqué que les citrouilles vendues au demi-boisseau sont très chères ? Pouvez-vous deviner pourquoi ? Indice : les petites citrouilles coûtent beaucoup plus cher que les grosses, probablement parce qu'il y en a beaucoup plus par boisseau, étant donné l'espace inutilisé occupé par une grosse citrouille creuse pour tarte.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "pS2GNPagbSdb"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Maintenant, pour le simple plaisir de l'aventure 💁♀️, déplaçons également la colonne Mois à la première position, c'est-à-dire avant la colonne `Package`.\n",
|
|
"\n",
|
|
"`dplyr::relocate()` est utilisé pour modifier la position des colonnes.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "qql1SowfbdnP"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Create a new data frame new_pumpkins\n",
|
|
"new_pumpkins <- new_pumpkins %>% \n",
|
|
" relocate(Month, .before = Package)\n",
|
|
"\n",
|
|
"new_pumpkins %>% \n",
|
|
" slice_head(n = 7)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "JJ1x6kw8bixF"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Bon travail !👌 Vous avez maintenant un ensemble de données propre et bien organisé sur lequel vous pouvez construire votre nouveau modèle de régression !\n"
|
|
],
|
|
"metadata": {
|
|
"id": "y8TJ0Za_bn5Y"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 4. Visualisation des données avec ggplot2\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/data-visualization.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infographie par Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"600\"}-->\n",
|
|
"\n",
|
|
"Il existe un *sage* dicton qui dit ceci :\n",
|
|
"\n",
|
|
"> \"Le simple graphique a apporté plus d'informations à l'esprit de l'analyste de données que tout autre outil.\" --- John Tukey\n",
|
|
"\n",
|
|
"Une partie du rôle du data scientist est de démontrer la qualité et la nature des données avec lesquelles il travaille. Pour ce faire, il crée souvent des visualisations intéressantes, ou des graphiques, diagrammes et courbes, montrant différents aspects des données. De cette manière, il peut mettre en évidence visuellement des relations et des lacunes qui seraient autrement difficiles à détecter.\n",
|
|
"\n",
|
|
"Les visualisations peuvent également aider à déterminer la technique d'apprentissage automatique la plus appropriée pour les données. Un nuage de points qui semble suivre une ligne, par exemple, indique que les données sont un bon candidat pour un exercice de régression linéaire.\n",
|
|
"\n",
|
|
"R propose plusieurs systèmes pour créer des graphiques, mais [`ggplot2`](https://ggplot2.tidyverse.org/index.html) est l'un des plus élégants et des plus polyvalents. `ggplot2` vous permet de composer des graphiques en **combinant des composants indépendants**.\n",
|
|
"\n",
|
|
"Commençons par un simple nuage de points pour les colonnes Price et Month.\n",
|
|
"\n",
|
|
"Dans ce cas, nous commencerons avec [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), fournirons un jeu de données et une correspondance esthétique (avec [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)), puis ajouterons des couches (comme [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) pour les nuages de points.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "mYSH6-EtbvNa"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Set a theme for the plots\n",
|
|
"theme_set(theme_light())\n",
|
|
"\n",
|
|
"# Create a scatter plot\n",
|
|
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
|
|
"p + geom_point()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "g2YjnGeOcLo4"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Est-ce un graphique utile 🤷 ? Y a-t-il quelque chose qui vous surprend ?\n",
|
|
"\n",
|
|
"Ce n'est pas particulièrement utile, car tout ce qu'il fait est de montrer vos données sous forme de dispersion de points pour un mois donné. \n"
|
|
],
|
|
"metadata": {
|
|
"id": "Ml7SDCLQcPvE"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### **Comment le rendre utile ?**\n",
|
|
"\n",
|
|
"Pour afficher des graphiques avec des données pertinentes, il est généralement nécessaire de regrouper les données d'une certaine manière. Par exemple, dans notre cas, calculer le prix moyen des citrouilles pour chaque mois fournirait davantage d'informations sur les tendances sous-jacentes de nos données. Cela nous amène à une autre fonctionnalité essentielle de **dplyr** :\n",
|
|
"\n",
|
|
"#### `dplyr::group_by() %>% summarize()`\n",
|
|
"\n",
|
|
"L'agrégation par groupes en R peut être facilement réalisée avec :\n",
|
|
"\n",
|
|
"`dplyr::group_by() %>% summarize()`\n",
|
|
"\n",
|
|
"- `dplyr::group_by()` modifie l'unité d'analyse, passant de l'ensemble du jeu de données à des groupes individuels, comme par exemple par mois.\n",
|
|
"\n",
|
|
"- `dplyr::summarize()` crée un nouveau tableau de données avec une colonne pour chaque variable de regroupement et une colonne pour chaque statistique récapitulative que vous avez spécifiée.\n",
|
|
"\n",
|
|
"Par exemple, nous pouvons utiliser `dplyr::group_by() %>% summarize()` pour regrouper les citrouilles en fonction de la colonne **Month**, puis calculer le **prix moyen** pour chaque mois.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "jMakvJZIcVkh"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Find the average price of pumpkins per month\r\n",
|
|
"new_pumpkins %>%\r\n",
|
|
" group_by(Month) %>% \r\n",
|
|
" summarise(mean_price = mean(Price))"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "6kVSUa2Bcilf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Succinct!✨\n",
|
|
"\n",
|
|
"Les caractéristiques catégoriques comme les mois sont mieux représentées à l'aide d'un diagramme en barres 📊. Les couches responsables des graphiques en barres sont `geom_bar()` et `geom_col()`. Consultez `?geom_bar` pour en savoir plus.\n",
|
|
"\n",
|
|
"Créons-en un !\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Kds48GUBcj3W"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
|
|
"new_pumpkins %>%\r\n",
|
|
" group_by(Month) %>% \r\n",
|
|
" summarise(mean_price = mean(Price)) %>% \r\n",
|
|
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
|
|
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
|
|
" ylab(\"Pumpkin Price\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "VNbU1S3BcrxO"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"🤩🤩 Voici une visualisation des données plus utile ! Cela semble indiquer que le prix le plus élevé des citrouilles se produit en septembre et octobre. Est-ce que cela correspond à vos attentes ? Pourquoi ou pourquoi pas ?\n",
|
|
"\n",
|
|
"Félicitations pour avoir terminé la deuxième leçon 👏 ! Vous avez préparé vos données pour la construction du modèle, puis découvert davantage d'informations grâce aux visualisations !\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zDm0VOzzcuzR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
|
|
]
|
|
}
|
|
]
|
|
} |