mirror of
https://github.com/ArthurDanjou/ArtStudies.git
synced 2026-01-14 18:59:59 +01:00
Add initial project files and styles for data visualization
- Created a new Excel file: `departements-francais.xlsx` for data storage. - Added a CSS file: `style.css` with custom styles for various mathematical environments including boxes for lemmas, theorems, definitions, and more, complete with automatic numbering. - Initialized R project file: `tp2.Rproj` with default settings for workspace management and LaTeX integration.
This commit is contained in:
@@ -297,8 +297,8 @@ On présente ci-dessous un aperçu des données.
|
||||
fold <- getwd()
|
||||
|
||||
# Load data
|
||||
# load(paste0(fold, "/data/datafreMPTL.RData"))
|
||||
load(paste0(fold, "/M2/Data Visualisation/tp1", "/data/datafreMPTL.RData"))
|
||||
load(paste0(fold, "/data/datafreMPTL.RData"))
|
||||
# load(paste0(fold, "/M2/Data Visualisation/tp1", "/data/datafreMPTL.RData"))
|
||||
paged_table(dat, options = list(rows.print = 15))
|
||||
```
|
||||
|
||||
@@ -427,24 +427,24 @@ d’observations avec 0 sinistre, 1 sinistre, …
|
||||
:::
|
||||
|
||||
```{r}
|
||||
dat %>%
|
||||
group_by(ClaimNb) %>%
|
||||
summarise(n = n(), Exposure = round(sum(Exposure), 0)) %>%
|
||||
dat |>
|
||||
group_by(ClaimNb) |>
|
||||
summarise(n = n(), Exposure = round(sum(Exposure), 0)) |>
|
||||
kable(
|
||||
col_names = c(
|
||||
"Nombre de sinistres",
|
||||
"Nombres d'observations",
|
||||
"Exposition totale"
|
||||
)
|
||||
) %>%
|
||||
kable_styling(full_width = F)
|
||||
) |>
|
||||
kable_styling(full_width = FALSE)
|
||||
```
|
||||
|
||||
```{r}
|
||||
pf_freq <- round(sum(dat$ClaimNb) / sum(dat$Exposure), 4)
|
||||
pf_freq
|
||||
``
|
||||
`
|
||||
```
|
||||
|
||||
Ce calcul de fréquence sera ensuite utile pour l'affichage des
|
||||
résultats.
|
||||
|
||||
@@ -469,47 +469,45 @@ package **ggplot2**.
|
||||
```{r, eval = FALSE}
|
||||
# On regroupe selon les modalites de la DrivAge
|
||||
# l'exposition, le nombre de sinistres et la frequence
|
||||
df_plot <- dat %>%
|
||||
group_by(DrivAge) %>%
|
||||
summarize(exp = Exposure, nb_claims = ClaimNb, freq = nb_claims / exp)
|
||||
df_plot <- dat |>
|
||||
group_by(DrivAge) |>
|
||||
summarize(
|
||||
exp = sum(Exposure),
|
||||
nb_claims = sum(ClaimNb),
|
||||
freq = sum(ClaimNb) / sum(Exposure)
|
||||
)
|
||||
|
||||
# Histogramme exposition
|
||||
ggplot(df_plot) +
|
||||
geom_bar(
|
||||
aes(x = DrivAge, y = exp),
|
||||
stat = "identity",
|
||||
fill = "lightblue",
|
||||
color = "blue"
|
||||
) +
|
||||
labs(
|
||||
title = "Exposition par âge du conducteur",
|
||||
x = "Âge du conducteur",
|
||||
y = "Exposition"
|
||||
) +
|
||||
theme_minimal()
|
||||
p1 <- ggplot(df_plot, aes(x = DrivAge, y = exp)) +
|
||||
geom_bar(stat = "identity", fill = "grey", color = "black", alpha = 0.5) +
|
||||
labs(x = "Age du conducteur", y = "Exposition en années") +
|
||||
theme_bw()
|
||||
|
||||
# Histogramme frequence
|
||||
ggplot(df_plot) +
|
||||
geom_bar(
|
||||
aes(x = DrivAge, y = freq),
|
||||
stat = "identity",
|
||||
fill = "lightblue",
|
||||
color = "blue"
|
||||
) +
|
||||
labs(
|
||||
title = "Fréquence par âge du conducteur",
|
||||
x = "Âge du conducteur",
|
||||
y = "Fréquence"
|
||||
) +
|
||||
theme_minimal()
|
||||
# Histogramme frequence
|
||||
p2 <- ggplot(df_plot, aes(x = DrivAge, y = freq)) +
|
||||
geom_bar(stat = "identity", fill = "grey", color = "black", alpha = 0.5) +
|
||||
labs(x = "Age du conducteur", y = "Frequence") +
|
||||
theme_bw()
|
||||
|
||||
plot_grid(p1, p2, labels = c('A', 'B'), label_size = 12)
|
||||
```
|
||||
|
||||
```{r}
|
||||
df_plot <- dat |>
|
||||
group_by(DrivAge) |>
|
||||
summarize(
|
||||
exp = sum(Exposure),
|
||||
nb_claims = sum(ClaimNb),
|
||||
freq = sum(ClaimNb) / sum(Exposure)
|
||||
)
|
||||
|
||||
# Scatter plot frequence
|
||||
|
||||
# A compléter
|
||||
|
||||
p3 <- ggplot(df_plot, aes(x = DrivAge, y = freq)) +
|
||||
geom_point() +
|
||||
geom_smooth() +
|
||||
labs(x = "Age du conducteur", y = "Frequence") +
|
||||
theme_bw()
|
||||
p3
|
||||
```
|
||||
|
||||
### Etape 4 : Examiner l'intéraction avec une autre variable {.unnumbered}
|
||||
@@ -525,9 +523,20 @@ améliorations en modifiant les variables `DrivAge` et `BonusMalus`.
|
||||
```{r}
|
||||
# On regroupe selon les modalites de la DrivAge et de Area
|
||||
# l'exposition, le nombre de sinistres et la frequence
|
||||
df_plot <- dat |>
|
||||
group_by(DrivAge, BonusMalus) |>
|
||||
summarize(
|
||||
exp = sum(Exposure),
|
||||
nb_claims = sum(ClaimNb),
|
||||
freq = sum(ClaimNb) / sum(Exposure)
|
||||
)
|
||||
|
||||
# A compléter
|
||||
|
||||
p4 <- ggplot(df_plot, aes(x = DrivAge, y = freq, color = BonusMalus)) +
|
||||
geom_point() +
|
||||
geom_smooth() +
|
||||
labs(x = "Age du conducteur", y = "Frequence", color = "Bonus-Malus") +
|
||||
theme_bw()
|
||||
p4
|
||||
```
|
||||
|
||||
On propose 4 ajustements :
|
||||
@@ -543,18 +552,29 @@ On propose 4 ajustements :
|
||||
lim_classes <- c(50, 75, 100, 125, Inf)
|
||||
|
||||
# Exclusion des donnees "extremes" et faire les regroupement
|
||||
df_plot <- dat %>%
|
||||
filter(DrivAge <= 85, BonusMalus <= 125) %>%
|
||||
df_plot <- dat |>
|
||||
filter(DrivAge <= 85, BonusMalus <= 125) |>
|
||||
# regroupement en classes d'ages de 5 ans
|
||||
mutate(DrivAge = ceiling(pmin(DrivAge, 85) / 5) * 5) %>%
|
||||
mutate(BonusMalus = cut(BonusMalus,
|
||||
breaks = lim_classes, include.lowest = TRUE))
|
||||
mutate(DrivAge = ceiling(pmin(DrivAge, 85) / 5) * 5) |>
|
||||
mutate(BonusMalus = cut(BonusMalus, breaks = lim_classes, include.lowest = TRUE))
|
||||
|
||||
# On regroupe selon les modalites de la DrivAge et de Area
|
||||
# l'exposition, le nombre de sinistres et la frequence
|
||||
df_plot <- df_plot |>
|
||||
group_by(DrivAge, BonusMalus) |>
|
||||
summarize(
|
||||
exp = sum(Exposure),
|
||||
nb_claims = sum(ClaimNb),
|
||||
freq = sum(ClaimNb) / sum(Exposure)
|
||||
)
|
||||
|
||||
# A compléter
|
||||
|
||||
# Scatter plot frequence
|
||||
p5 <- ggplot(df_plot, aes(x = DrivAge, y = freq, color = BonusMalus)) +
|
||||
geom_point() +
|
||||
geom_smooth() +
|
||||
labs(x = "Age du conducteur", y = "Frequence", color = "Bonus-Malus") +
|
||||
theme_bw()
|
||||
p5
|
||||
```
|
||||
|
||||
### Conclure {.unnumbered}
|
||||
@@ -565,8 +585,28 @@ bonus-malus.
|
||||
:::
|
||||
|
||||
```{r, fig.height = 6, fig.width = 12}
|
||||
# Histogramme plot frequence
|
||||
p6 <- ggplot(df_plot, aes(x = DrivAge, y = exp, fill = BonusMalus)) +
|
||||
geom_bar(stat = "identity", color = "black", alpha = 0.5) +
|
||||
scale_x_continuous(breaks = seq(20, 85, 20), limits = c(20, 85)) +
|
||||
labs(x = "Age du conducteur", y = "Exposition en années") +
|
||||
theme_bw()
|
||||
|
||||
# A compléter
|
||||
|
||||
# Ajustement des legendes pour faire un graphique multiple
|
||||
p5 <- p5 +
|
||||
theme(
|
||||
legend.position = "bottom"
|
||||
) +
|
||||
labs(color = "BonusMalus")
|
||||
p6 <- p6 +
|
||||
theme(
|
||||
legend.position = "bottom"
|
||||
) +
|
||||
labs(fill = "BonusMalus")
|
||||
|
||||
# Creation d'un graphique avec deux figures et une légende commune
|
||||
plot_grid(p6, p5, ncol = 2)
|
||||
```
|
||||
|
||||
### Bonus - Analyse des couples {.unnumbered}
|
||||
@@ -579,7 +619,7 @@ les couples de variables.
|
||||
Compléter pour cela la fonction suivante et appliquer la à différents
|
||||
couples.
|
||||
|
||||
```{r, eval = F}
|
||||
```{r}
|
||||
# Fonction d'analyse bivariée
|
||||
# df : nom du data.frame
|
||||
# var1 : nom de la variable explicative 1
|
||||
@@ -591,39 +631,48 @@ plot_pairwise_disc <- function(df, var1, var2)
|
||||
# replace variable vname by the binning variable
|
||||
if(is.numeric(df$varx))
|
||||
{
|
||||
df <- df %>%
|
||||
df <- df |>
|
||||
mutate(varx = ntile(varx, 5))
|
||||
}
|
||||
|
||||
if(is.numeric(df$vary))
|
||||
{
|
||||
df <- df %>%
|
||||
df <- df |>
|
||||
mutate(vary = ntile(vary, 5),
|
||||
vary = factor(vary))
|
||||
}
|
||||
|
||||
df %>%
|
||||
group_by(??) %>%
|
||||
summarize(exp = ??,
|
||||
nb_claims = ??,
|
||||
freq = ??,
|
||||
.groups = "drop") %>%
|
||||
ggplot(aes(x = ??,
|
||||
y = ??,
|
||||
colour = ??,
|
||||
group = vary),
|
||||
alpha = 0.3) +
|
||||
df |>
|
||||
group_by(varx, vary) |>
|
||||
summarize(exp = sum(Exposure),
|
||||
nb_claims = sum(ClaimNb),
|
||||
freq = sum(ClaimNb) / sum(Exposure), .groups = "drop") |>
|
||||
ggplot(aes(x = varx,
|
||||
y = freq,
|
||||
colour = vary,
|
||||
group = vary), alpha = 0.3) +
|
||||
geom_point() + geom_line() + theme_bw() +
|
||||
labs(x = var1, y = "Frequence", colour = var2)
|
||||
}
|
||||
`
|
||||
``
|
||||
```
|
||||
|
||||
```{r}
|
||||
p1 <- plot_pairwise_disc(dat, "DrivAge", "BonusMalus")
|
||||
p2 <- plot_pairwise_disc(dat, "VehAge", "BonusMalus")
|
||||
p3 <- plot_pairwise_disc(dat, "BonusMalus", "VehBrand")
|
||||
p4 <- plot_pairwise_disc(dat, "VehBrand", "Area")
|
||||
p5 <- plot_pairwise_disc(dat, "BonusMalus", "VehGas")
|
||||
p6 <- plot_pairwise_disc(dat, "BonusMalus", "Area")
|
||||
p7 <- plot_pairwise_disc(dat, "DrivAge", "Area")
|
||||
p8 <- plot_pairwise_disc(dat, "VehPower", "VehGas")
|
||||
grid.arrange(p1, p2, p3, p4, p5, p6, p7, p8, ncol = 2)
|
||||
```
|
||||
:::
|
||||
|
||||
# Informations de session {.unnumbered}
|
||||
|
||||
```{r}
|
||||
sessionInfo()
|
||||
```
|
||||
|
||||
# Références
|
||||
# Références
|
||||
:::
|
||||
File diff suppressed because one or more lines are too long
413
M2/Data Visualisation/tp2/4-td_graphiques - enonce.Rmd
Normal file
413
M2/Data Visualisation/tp2/4-td_graphiques - enonce.Rmd
Normal file
@@ -0,0 +1,413 @@
|
||||
---
|
||||
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()
|
||||
```
|
||||
|
||||
|
||||
### 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 = "grey") +
|
||||
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
|
||||
accidents <- read_csv("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("data/departements-francais.xlsx")
|
||||
```
|
||||
|
||||
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 {-}
|
||||
|
||||
::: 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é.
|
||||
|
||||
2. Faire deux variantes de cette carte, selon le caractère urbain ou non des accidents.
|
||||
|
||||
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é.
|
||||
|
||||
```{r, eval = F}
|
||||
library(mapview)
|
||||
library(sf)
|
||||
|
||||
## Remove NA
|
||||
df_map_dyn <- accidents %>%
|
||||
filter(???) %>%
|
||||
na.omit()
|
||||
|
||||
# Make map and print it
|
||||
mymap <- st_as_sf(???)
|
||||
mapview(mymap, cex = 2, layer.name = "Gravité",
|
||||
zcol = "grav",legend = TRUE )
|
||||
```
|
||||
|
||||
|
||||
#### Carte choroplèthe {-}
|
||||
|
||||
::: 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, eval = F}
|
||||
# get french map - level nuts2
|
||||
fr <- gisco_get_nuts(resolution = "20", country = ???, nuts_level = ???) %>%
|
||||
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(???) %>%
|
||||
filter(! dep %in% c("971", ???) )
|
||||
|
||||
# count the number of accidents
|
||||
df_acc <- ???
|
||||
|
||||
# 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(???) +
|
||||
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 {-}
|
||||
```{r}
|
||||
sessionInfo()
|
||||
```
|
||||
4694
M2/Data Visualisation/tp2/4-td_graphiques---enonce.html
Normal file
4694
M2/Data Visualisation/tp2/4-td_graphiques---enonce.html
Normal file
File diff suppressed because one or more lines are too long
2054
M2/Data Visualisation/tp2/data/accidents-velos-schema.json
Normal file
2054
M2/Data Visualisation/tp2/data/accidents-velos-schema.json
Normal file
File diff suppressed because it is too large
Load Diff
243
M2/Data Visualisation/tp2/data/accidents-velos-tableschema.json
Normal file
243
M2/Data Visualisation/tp2/data/accidents-velos-tableschema.json
Normal file
@@ -0,0 +1,243 @@
|
||||
{
|
||||
"fields": [
|
||||
{
|
||||
"name": "Num_Acc",
|
||||
"title": "Identifiant accident ",
|
||||
"type": "integer",
|
||||
"description": "Numéro d'identification de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "date",
|
||||
"title": "Date de l'accident ",
|
||||
"type": "string",
|
||||
"description": "Date de l'accident",
|
||||
"rdfType": "http://schema.org/Date"
|
||||
},
|
||||
{
|
||||
"name": "an",
|
||||
"title": "Année de l'accident",
|
||||
"type": "integer",
|
||||
"description": "Année de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "mois",
|
||||
"title": "Mois de l'accident",
|
||||
"type": "string",
|
||||
"description": "Mois de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "jour",
|
||||
"title": "Jour de l'accident",
|
||||
"type": "string",
|
||||
"description": "Jour de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "hrmn",
|
||||
"title": "Heure de l'accident ",
|
||||
"type": "string",
|
||||
"description": "Heure de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "dep",
|
||||
"title": "Département ",
|
||||
"type": "string",
|
||||
"description": "Département de l'accident",
|
||||
"rdfType": "http://rdf.insee.fr/def/geo#codeDepartement"
|
||||
},
|
||||
{
|
||||
"name": "com",
|
||||
"title": "Code commune ",
|
||||
"type": "string",
|
||||
"description": "code commune de l'accident",
|
||||
"rdfType": "http://rdf.insee.fr/def/geo#codeCommune"
|
||||
},
|
||||
{
|
||||
"name": "lat",
|
||||
"title": "Latitude ",
|
||||
"type": "number",
|
||||
"description": "Latitude de l'accident",
|
||||
"rdfType": "http://schema.org/latitude"
|
||||
},
|
||||
{
|
||||
"name": "long",
|
||||
"title": "Longitude ",
|
||||
"type": "number",
|
||||
"description": "Longitude de l'accident",
|
||||
"rdfType": "http://schema.org/longitude"
|
||||
},
|
||||
{
|
||||
"name": "agg",
|
||||
"title": "agglomération",
|
||||
"type": "integer",
|
||||
"description": "Accident en agglomération ou hors agglomération"
|
||||
},
|
||||
{
|
||||
"name": "int",
|
||||
"title": "Type d'intersection ",
|
||||
"type": "integer",
|
||||
"description": "Type d'intersection de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "col",
|
||||
"title": "Type de collision ",
|
||||
"type": "integer",
|
||||
"description": "Type de collision de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "lum",
|
||||
"title": "Luminosité ",
|
||||
"type": "integer",
|
||||
"description": "Luminosité durant l'accident"
|
||||
},
|
||||
{
|
||||
"name": "atm",
|
||||
"title": "Conditions atmosphériques ",
|
||||
"type": "integer",
|
||||
"description": "Conditions atmosphériques durant l'accident"
|
||||
},
|
||||
{
|
||||
"name": "catr",
|
||||
"title": "Catégorie route ",
|
||||
"type": "integer",
|
||||
"description": "Catégorie de route de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "circ",
|
||||
"title": "Circulation ",
|
||||
"type": "integer",
|
||||
"description": "Circulation durant l'accident"
|
||||
},
|
||||
{
|
||||
"name": "nbv",
|
||||
"title": "Nombre de voies ",
|
||||
"type": "integer",
|
||||
"description": "Nombre de voies de circulation de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "prof",
|
||||
"title": "Profil en long ",
|
||||
"type": "integer",
|
||||
"description": "Profil en long de la route de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "plan",
|
||||
"title": "Tracé en plan ",
|
||||
"type": "integer",
|
||||
"description": "Tracé en plan de la route de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "lartpc",
|
||||
"title": "Largeur du TPC ",
|
||||
"type": "number",
|
||||
"description": "Largeur du terre-plein central (TPC) s'il existe (en m)"
|
||||
},
|
||||
{
|
||||
"name": "larrout",
|
||||
"title": "Largeur de la chaussée ",
|
||||
"type": "number",
|
||||
"description": "Largeur de la chaussée affectée à la circulation du sens de l'accident (en m)"
|
||||
},
|
||||
{
|
||||
"name": "surf",
|
||||
"title": "Etat de la surface ",
|
||||
"type": "integer",
|
||||
"description": "Etat de la surface de la route de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "infra",
|
||||
"title": "Aménagement - Infrastructure ",
|
||||
"type": "integer",
|
||||
"description": "Infrastructure de la route de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "situ",
|
||||
"title": "Situation ",
|
||||
"type": "integer",
|
||||
"description": "Situation de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "grav",
|
||||
"title": "Gravité ",
|
||||
"type": "string",
|
||||
"description": "Gravité de l'accident"
|
||||
},
|
||||
{
|
||||
"name": "sexe",
|
||||
"title": "Sexe ",
|
||||
"type": "integer",
|
||||
"description": "Sexe de la victime"
|
||||
},
|
||||
{
|
||||
"name": "age",
|
||||
"title": "Age ",
|
||||
"type": "integer",
|
||||
"description": "Age de la victime"
|
||||
},
|
||||
{
|
||||
"name": "trajet",
|
||||
"title": "Motif de déplacement ",
|
||||
"type": "integer",
|
||||
"description": "Trajet de la victime"
|
||||
},
|
||||
{
|
||||
"name": "secuexist",
|
||||
"title": "Usage de sécurité",
|
||||
"type": "integer",
|
||||
"description": "Critère indiquant si la visctime utilisait un équipement de sécurité"
|
||||
},
|
||||
{
|
||||
"name": "equipement",
|
||||
"title": "Equipement ",
|
||||
"type": "string",
|
||||
"description": "Equipement de la victime"
|
||||
},
|
||||
{
|
||||
"name": "obs",
|
||||
"title": "Obstacle fixe heurté",
|
||||
"type": "integer",
|
||||
"description": "Obstacle fixe heurté durant l'accident (si obstacle fixe heurté)"
|
||||
},
|
||||
{
|
||||
"name": "obsm",
|
||||
"title": "Obstacle mobile heurté",
|
||||
"type": "integer",
|
||||
"description": "Obstacle mobile heurté durant l'accident (si obstacle mobile heurté)"
|
||||
},
|
||||
{
|
||||
"name": "choc",
|
||||
"title": "Choc subi",
|
||||
"type": "integer",
|
||||
"description": "Description du choc subi (si choc)"
|
||||
},
|
||||
{
|
||||
"name": "manv",
|
||||
"title": "Manoeuvre avant l'accident",
|
||||
"type": "integer",
|
||||
"description": "Manoeuvre du véhicule avant l'accident (si manoeuvre)"
|
||||
},
|
||||
{
|
||||
"name": "vehiculeid",
|
||||
"title": "Identifiant du véhicule",
|
||||
"type": "string",
|
||||
"description": "Identifiant du véhicule lié à l'accident, (format : id accident + id véhicule)"
|
||||
},
|
||||
{
|
||||
"name": "typevehicules",
|
||||
"title": "Type des autres véhicules",
|
||||
"type": "string",
|
||||
"description": "Type des véhicules liés à l'accident"
|
||||
},
|
||||
{
|
||||
"name": "manoeuvehicules",
|
||||
"title": "Manoeuvre du véhicule lié à l'accident",
|
||||
"type": "string",
|
||||
"description": "Manoeuvre des véhicules lié à l'accident (si manoeuvre)"
|
||||
},
|
||||
{
|
||||
"name": "numVehicules",
|
||||
"title": "Nombre d'autres véhicules",
|
||||
"type": "integer",
|
||||
"description": "Nombre d'autres véhicules lié à l'accident"
|
||||
}
|
||||
]
|
||||
}
|
||||
74759
M2/Data Visualisation/tp2/data/accidentsVelo.csv
Normal file
74759
M2/Data Visualisation/tp2/data/accidentsVelo.csv
Normal file
File diff suppressed because it is too large
Load Diff
BIN
M2/Data Visualisation/tp2/data/departements-francais.xlsx
Normal file
BIN
M2/Data Visualisation/tp2/data/departements-francais.xlsx
Normal file
Binary file not shown.
198
M2/Data Visualisation/tp2/style.css
Normal file
198
M2/Data Visualisation/tp2/style.css
Normal file
@@ -0,0 +1,198 @@
|
||||
.infobox {
|
||||
padding: 1em 1em 1em 4em;
|
||||
margin-bottom: 10px;
|
||||
border: 2px solid orange;
|
||||
border-radius: 10px;
|
||||
background: #f5f5f5 5px center/3em no-repeat;
|
||||
}
|
||||
|
||||
/* Custom box styles for math environments */
|
||||
|
||||
/* Lemma Box */
|
||||
.lemma-box {
|
||||
border: 2px solid #3c8dbc;
|
||||
background-color: #e6f7ff;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Theorem Box */
|
||||
.theorem-box {
|
||||
border: 2px solid #2ca02c;
|
||||
background-color: #eaffea;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Corollary Box */
|
||||
.corollary-box {
|
||||
border: 2px solid #2ca02c;
|
||||
background-color: #eaffea;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Proposition Box */
|
||||
.proposition-box {
|
||||
border: 2px solid #ff7f0e;
|
||||
background-color: #fff3e6;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Conjecture Box */
|
||||
.conjecture-box {
|
||||
border: 2px solid #9467bd;
|
||||
background-color: #f5e6ff;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Definition Box */
|
||||
.definition-box {
|
||||
border: 2px solid #d62728;
|
||||
background-color: #ffe6e6;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Example Box */
|
||||
.example-box {
|
||||
border: 2px solid #17becf;
|
||||
/* background-color: #e6f7ff;*/
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Exercise Box */
|
||||
.exercise-box {
|
||||
border: 2px solid #1f77b4;
|
||||
background-color: #e6f7ff;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Hypothesis Box */
|
||||
.hypothesis-box {
|
||||
border: 2px solid #e377c2;
|
||||
background-color: #ffe6f5;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Remark Box */
|
||||
.remark-box {
|
||||
border: 2px solid #7f7f7f;
|
||||
background-color: #f2f2f2;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Proof Box */
|
||||
.proof-box {
|
||||
border: 2px solid #bcbd22;
|
||||
background-color: #fafad2;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Hint Box */
|
||||
.hint-box {
|
||||
border: 2px solid #7f7f7f;
|
||||
background-color: #f2f2f2;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
|
||||
/* Numérotation automatique */
|
||||
|
||||
|
||||
.lemma-box::before {
|
||||
counter-increment: lemma-counter;
|
||||
content: "Lemme " counter(lemma-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.theorem-box::before {
|
||||
counter-increment: theorem-counter;
|
||||
content: "Théorème " counter(theorem-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.corollary-box::before {
|
||||
counter-increment: corollary-counter;
|
||||
content: "Corollaire " counter(corollary-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.proposition-box::before {
|
||||
counter-increment: proposition-counter;
|
||||
content: "Proposition " counter(proposition-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.conjecture-box::before {
|
||||
counter-increment: conjecture-counter;
|
||||
content: "Conjecture " counter(conjecture-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.definition-box::before {
|
||||
counter-increment: definition-counter;
|
||||
content: "Définition " counter(definition-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.example-box::before {
|
||||
counter-increment: example-counter;
|
||||
content: "Exemple " counter(example-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
.exercise-box::before {
|
||||
counter-increment: exercise-counter;
|
||||
content: "Question " counter(exercise-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hypothesis-box::before {
|
||||
counter-increment: hypothesis-counter;
|
||||
content: "Hypothèse " counter(hypothesis-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.remark-box::before {
|
||||
counter-increment: remark-counter;
|
||||
content: "Remarque " counter(remark-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.proof-box::before {
|
||||
counter-increment: proof-counter;
|
||||
content: "Preuve " counter(proof-counter) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hint-box::before {
|
||||
content: "Indice." ;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Initialisation des compteurs */
|
||||
body {
|
||||
counter-reset: lemma-counter corollary-counter proposition-counter conjecture-counter definition-counter example-counter exercise-counter hypothesis-counter remark-counter proof-counter;
|
||||
}
|
||||
17
M2/Data Visualisation/tp2/tp2.Rproj
Normal file
17
M2/Data Visualisation/tp2/tp2.Rproj
Normal file
@@ -0,0 +1,17 @@
|
||||
Version: 1.0
|
||||
|
||||
RestoreWorkspace: Default
|
||||
SaveWorkspace: Default
|
||||
AlwaysSaveHistory: Default
|
||||
|
||||
EnableCodeIndexing: Yes
|
||||
UseSpacesForTab: Yes
|
||||
NumSpacesForTab: 2
|
||||
Encoding: UTF-8
|
||||
|
||||
RnwWeave: Sweave
|
||||
LaTeX: pdfLaTeX
|
||||
|
||||
BuildType: Website
|
||||
|
||||
SpellingDictionary: fr_FR
|
||||
Reference in New Issue
Block a user