diff --git a/M2/Data Visualisation/tp2/tp2.rmarkdown b/M2/Data Visualisation/tp2/tp2.rmarkdown deleted file mode 100644 index f5b1e49..0000000 --- a/M2/Data Visualisation/tp2/tp2.rmarkdown +++ /dev/null @@ -1,470 +0,0 @@ ---- -title: "Manipulation des graphiques" -author: "Quentin Guibert" -date: "Année 2025-2026" -institute: "Université Paris-Dauphine | Master ISF" -lang: fr -link-citations: true -output: - rmdformats::robobook: - highlight: kate - use_bookdown: true - css: style.css - lightbox : true - gallery: true - code_folding: show - theme: flatly - toc_float: - collapsed: no -editor_options: - markdown: - wrap: 72 ---- - -```{r setup, include=FALSE} -## Global options -knitr::opts_chunk$set( - cache = FALSE, - warning = FALSE, - message = FALSE, - fig.retina = 2 -) -options(encoding = "UTF-8") -``` - -```{r, echo = FALSE, fig.keep= 'none'} -# Chargement des librairies graphiques -library(lattice) -library(grid) -library(ggplot2) -require(gridExtra) -library(locfit) -library(scales) -library(formattable) -library(RColorBrewer) -library(plotly) -library(dplyr) -library(tidyr) -library(rmarkdown) -library(ggthemes) -library(cowplot) -``` - -# Objectifs du TP - -L'objectif de ce TP vise à manipuler et utiliser à bon escient les -différents types de graphiques du package **ggplot2** (et éventuellement -des packages associés). - ------------------------------------------------------------------------- - -# Prérequis - -- Avoir installer `R` [ici](https://www.r-project.org/). -- Avoir installer un IDE, par exemple `RStudio` - [ici](https://www.rstudio.com/). -- Créer un nouveau projet (`File`, puis `New Projet`) dans un dossier - sur votre ordinateur. -- Télécharger [ici](https://moodle.psl.eu/course/view.php?id=21176) - les fichiers nécessaires au TD. - -Vous pouvez ensuite écrire vos codes soit : - -- En ouvrant un nouveau script `.R` ; -- En ouvrant le ouvrant le rapport Rmarkdown - `4-td_graphiques - enonce`. Certains codes sont partiels et sont à - compléter (indication `???`). N'oubliez pas de modifier l'option - `eval = TRUE` pour que les calculs puissent être réalisés. - ------------------------------------------------------------------------- - -# Analyse du lien espérance de vie et GDP - -Dans ce TP, le jeu de données utilisé est le jeu `gapminder` du package -**gapminder**. Il comprend des séries de données de PIB par habitant et -d'espérance de vie par pays sur la période 1952-1990. Les observations -ont lieu tous les 5 ans. - -## Données - -Dans un premier temps, il faut installer le package et le charger. - -```{r} -# install.packages("gapminder") -library(gapminder) -``` - -Ce jeu de données contient 1706 observations où chaque ligne correspond -à un pays `country` pour une année d'observation `year`. - -```{r} -paged_table(gapminder, options = list(rows.print = 15)) -``` - -On se concentre plus particulièrement sur les variables suivantes : - -- `lifeExp` : l'espérance de vie ; -- `gdpPercap` : le PIB par habitant en dollars (conversion sur - base 2005) ; -- `pop` : la taille de la population ; -- `continent` : le continent d'appartenance. - -Pour plus détails, voir l'aide `?gapminder`. - -## But de la visualisation - -Dans ce TP, on cherche un ensemble de visualisations permettant de -commenter le lien entre GDP et espérance de vie, globalement et à -différents échelles géographiques : - -- est-ce que les pays les plus développés en termes de PIB par - habitant ont la meilleure espérance de vie ? -- peut-on identifier des dynamiques différentes en fonction des pays - ou des continents ? -- quels facteurs influencent également cette relation ? - -**En vous répartissant en groupes de 3-4 étudiant.e.s.**, choisissez -pour chaque groupe, une des 4 visualisations suivantes : - -- visualisations utilisant des dot points. -- visualisations permettant de présenter une distribution. -- visualisations utilisant des cartes. - -## Différentes visualisations - -### Dot points - -::: exercise-box -En partant de cette visualisation, construire une ou plusieurs -visualisations permettant d'analyser et de commenter les liens que vous -pouvez observer entre `gdpPercap` et `lifeExp`. -::: - -```{r} -ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) + - geom_point() -``` - -### Distributions - -::: exercise-box -En partant de cette visualisation, analyser et commenter les écarts -d'espérance de vie sur la planète. Vous pourrez aussi adopter d'autres -visualisations permettant de comparer des distributions. -::: - -```{r} -ggplot(data = gapminder, aes(x = lifeExp)) + - geom_density() -``` - -```{r} -ggplot(data = gapminder, aes(x = lifeExp)) + - geom_histogram(aes(y = ..density..), bins = 30) + - geom_density() -``` - -### Cartes - -Afin de visualiser plus précisément les caractéristiques régionales de -l'espérance de vie et du PIB par habitant, nous décidons de faire des -cartes. - -Il faut au préalable récupérer un fond de carte (ici de l'année 2016). -Nous prenons les données `gapminder` de 2007. - -```{r} -library(giscoR) -library(sf) - -world <- gisco_countries -world <- subset(world, NAME_ENGL != "Antarctica") # Remove Antartica - -# Merge data -world_df <- gapminder |> - filter(year == "2007") -world_df <- world |> - left_join(world_df, by = c("NAME_ENGL" = "country")) - -ggplot(world_df) + - geom_sf(color = "black", fill = "lightgreen") + - theme_void() -``` - -::: exercise-box -En partant de la visualisation et des données ci-dessus, représenter et -analyser les disparités d'espérance de vie et de revenus. -::: - ------------------------------------------------------------------------- - -# Analyse des accidents à vélo en France - -Dans ce TP, nous nous intéressons aux accidents corporels survenus sur -une voie ouverte à la circulation publique, impliquant au moins un -véhicule et ayant fait au moins une victime ayant nécessité des soins) -pour la période 2005-2021. - -L'objectif est de créer un ensemble de visualisations qui permettront de -mieux comprendre accidentologie des cyclistes, ce qui trouve de -nombreuses sources d'applications notamment en assurance. - -Les données et documentation de ces données sont disponibles -[ici](https://www.data.gouv.fr/fr/datasets/bases-de-donnees-annuelles-des-accidents-corporels-de-la-circulation-routiere-annees-de-2005-a-2021/). - -## Données - -Pour récupérer les données : - -1. récupérer le fichier zippé "data_velo.zip". -2. créer un dossier "data" à la racine de votre projet. -3. placer y le contenu du dossier zippé. - -Les données se chargent avec la commande suivante. - -```{r} -library(readxl) -library(readr) -library(tidyverse) - -# main data -path <- getwd() -accidents <- read_csv( - paste0( - path, - "/data/accidentsVelo.csv" - ), - col_types = cols(Num_Acc = col_double(), date = col_date(format = "%Y-%m-%d")) -) - -# few ajustements -accidents <- accidents |> - mutate( - mois = factor(mois), - jour = factor(jour), - dep = factor(dep), - agg = factor(agg), - grav = factor(grav), - situ = factor(situ) - ) - -# correct some issues with variables `hrmn` -issue <- which(str_length(accidents$hrmn) == 4) -correct <- accidents$hrmn[issue] -correct <- paste0( - "0", - str_sub(correct, 1, 1), - ":", - str_sub(correct, 2, 2), - str_sub(correct, 4, 4) -) -accidents$hrmn[issue] <- correct - -# Extract hour -accidents <- accidents |> - mutate(hour = paste(date, hrmn, sep = " ")) |> - mutate(hour = strptime(hour, "%Y-%m-%d %H:%M")$hour) - -# mapping table for french departments -departements_francais <- read_excel( - paste0( - path, - "/data/departements-francais.xlsx" - ), - col_types = c("text", "text", "text") -) -``` - -Ce jeu de données contient 74758 observations où chaque ligne correspond -à un accident. - -```{r} -paged_table(accidents, options = list(rows.print = 15)) -``` - -On se concentre plus particulièrement sur les variables suivantes : - -- `date`, `an`, `mois`, `jour`, `hour`, : la date, année, mois, jour - et heure de l'accident ; -- `dep` : le département ; -- `agg` : la location (1 = "hors agglomération", 2 = "en - agglomération") ; -- `lat` : latitude (pas toujours renseignée) ; -- `long` : longitude (pas toujours renseignée) ; -- `situ` : la situation de l'accident (-1 = Non renseigné, 0 = Aucun, - 1 = Sur chaussée, 2 = Sur bande d’arrêt d’urgence, 3 = Sur - accotement, 4 = Sur trottoir, 5 = Sur piste cyclable, 6 = Sur autre - voie spéciale, 8 = Autres) ; -- `grav` : la gravité (1 = Indemne, 2 = Tué, 3 = Blessé hospitalisé, 4 - = Blessé léger). - -D'autres variables intéressantes pourraient être étudiées, mais nous -nous limitons à celle-ci dans ce TP. - -## But de la visualisation - -Dans ce TP, on cherche à réaliser une analyse exploratoire du jeu de -données afin d'identifier les relations importantes entre le nombre -d'accidents et ses déterminants : - -- est-ce que les accidents sont plus situés en agglomération ? -- comment les accidents se répartissent dans l'espace et dans le temps - ? -- quels impacts ont les situations de circulation sur la gravité des - accidents ? - -En vous répartissant en groupes de 3-4 étudiant.e.s., choisissez pour -chaque groupe, une des 4 visualisations suivantes : - -- visualisations utilisant des cartes statiques ou dynamiques. -- visualisations utilisant des bar plots. - -L'anayse a réalisé ici est préliminaire, d'autres informations -intéressantes sont à extraire de ce jeu de données. - -## Différentes visualisations - -### Carte - -#### Carte dynamique {.unnumbered} - -::: exercise-box -1. Tracer une carte dynamique représentant la location des accidents - (latitude, longitude) en France sur toute la période en modulant la - gravité. - -```{r} -library(mapview) -library(sf) - -## Remove NA -df_map_dyn <- accidents |> - filter(!is.na(lat) & !is.na(long)) |> - mutate( - lat = as.numeric(str_replace_all(str_trim(lat), ",", ".")), - long = as.numeric(str_replace_all(str_trim(long), ",", ".")) - ) |> - filter(!is.na(lat) & !is.na(long)) - -# Make map and print it -mymap <- st_as_sf(df_map_dyn[1:5000, ], coords = c("long", "lat"), crs = 4326) -mapview( - mymap, - cex = 2, - legend = TRUE, - layer.name = "Gravité", - zcol = "grav", - map.types = "OpenStreetMap" -) -``` - -2. Faire deux variantes de cette carte, selon le caractère urbain ou - non des accidents. - -```{r} -# Map for urban accidents -df_map_urban <- df_map_dyn |> - mutate( - agg = dplyr::if_else( - agg == 1, - "urbanisation", - "agglomération", - missing = NA_character_ - ) - ) - -# Make map and print it -mymap_urban <- st_as_sf(df_map_urban, coords = c("long", "lat"), crs = 4326) -mapview( - mymap_urban, - cex = 2, - legend = TRUE, - layer.name = "Urbanisation", - zcol = "agg" -) -``` - -3. Commenter ces figures. - -4. Quelles limites voyez-vous à cette représentation ? -::: - -Voici un premier code à trou pour vous aider. Pour alléger les temps de -production afficher uniquement quelques points. Vous pourrez ajouter -l'ensemble du jeu de données quand votre code sera finalisé. - -#### Carte choroplèthe {.unnumbered} - -::: exercise-box -1. Tracer une carte statistique de type chonoplèthe et représenter le - nombre d'accidents par département. - -2. Faire plusieurs variantes de cette carte selon la gravité des - accidents. -::: - -Voici un premier code à trou pour vous aider. - -```{r} -# get french map - level nuts3 -fr <- gisco_get_nuts(resolution = "20", country = "FRA", nuts_level = 3) |> - mutate(res = "20M") - -# Remove white-space to avoid errors. -library(stringr) -departements_francais <- departements_francais |> - mutate(dep_name = str_trim(dep_name)) - -fr <- fr |> - mutate(NUTS_NAME = str_trim(NUTS_NAME)) - -# Merge and remove departements outside metropolitan France -fr_map <- fr |> - left_join(departements_francais, by = c("NUTS_NAME" = "dep_name")) |> - filter(!dep %in% c("971", "972", "973", "974", "976")) - -# count the number of accidents -df_acc <- accidents |> - filter(!is.na(dep)) |> - group_by(dep) |> - summarise(n = n()) - -# merge statistics with the map -map_acc <- fr_map |> - left_join(df_acc, by = c("dep" = "dep")) - -# map with all accidents -g_map_acc <- ggplot(map_acc) + - geom_sf(aes(fill = n)) + - scale_fill_viridis_c(option = "viridis") + - labs( - title = "Carte des accidents de vélo", - subtitle = "Année 2005-2021", - fill = "Nombre d'accidents" - ) + - theme_void() -g_map_acc -``` - -### Bar plots - -::: exercise-box -1. On s'intéresse à la répartition par mois et horaires des accidents - (variable `an`, `hour`, `mois`). Tracer des bar plots permettant de - montrer la répartition temporelle des accidents. - -2. On s'intéresse à l'impact des situations de circulation. Tracer des - bar plots permettant de montrer la répartition de la gravité des - accidents selon ces situations. - -3. Voyez-vous une évolution sur la période 2005-2021 ? - -4. Réfléchir à des représentations alternatives pour les phénomènes - périodiques. -::: - -# Informations de session {.unnumbered} - -```{r} -sessionInfo() -```