knitr::opts_chunk$set(
  fig.dpi = 96,
  fig.height = 3.5,
  fig.width = 7,
  collapse = TRUE,
  comment = "#>"
)
# devtools::load_all()
library(ACC)
library(tidyverse)
library(BARIS)

Ce package a pour objectif d'accéder et d'analyser les données publiques d'accidents de la circulation.

Téléchargement des données

Ces données sont disponibles sur la plateforme open data data.gouv.fr.

Le package BARIS permet de faire le lien vers l'API data.gouv.fr. On peut ainsi obtenir la présentation du dataset à l'aide de BARIS_explain.

id_donnees <- "53698f4ca3a729239d2036df"
BARIS_explain(id_donnees) 

Ce jeu de données est divisé en 4 parties CARACTÉRISTIQUES, LIEUX, USAGERS, VÉHICULES. Il existe un lot de ces 4 fichiers par année entre 2005 et 2019

Un fichier descriptif accompagne ces données, et on reprend ici brièvement les définitions données dans ce document.

  1. La rubrique CARACTERISTIQUES qui décrit les circonstances générales de l’accident
  2. La rubrique LIEUX qui décrit le lieu principal de l’accident même si celui-ci s’est déroulé à une intersection
  3. La rubrique VEHICULES impliqués
  4. La rubrique USAGERS impliqués

Export rapide des données 2019

ressources <- BARIS_resources(id_donnees) #Tibble avec les URL
data_2019 <- ressources %>% 
  filter(str_detect(title,"2019"),format=="csv") #On garde les fichiers csv de 2019

# if(!dir.exists("data-raw"))
  # dir.create("data-raw")
# Commenté pour ne pas re-télécharger les données systématiquement
# for(i in 1:nrow(data_2019)){
#   tmp_df <- data_2019[i,]
#   download.file(url = tmp_df$url, 
#                 destfile = paste0("data-raw/",tmp_df$title),overwrite = T)
# }

Exploration des données de la table Caractéristiques

# caractéristiques générales de la table
caracteristiques <- dl_caracteristiques(2019L)
# caracteristiques <- read.table(here::here("data-raw","caracteristiques-2019.csv"),sep=";",header = T)
# data("caracteristiques", package = "ACC")
summary(caracteristiques)
names(caracteristiques)
nrow(caracteristiques) #58 840
caracteristiques %>% head(10)
# variable lum = Conditions d eclairage

caracteristiques %>%
  group_by(lum) %>%
  summarise(n = n(),
            prop = n / nrow(caracteristiques)) 

hist(caracteristiques$lum, main = "Répartition de la variable Conditions d eclairage", col = "firebrick")

# on pourrait regrouper les modalités 3 et 4 en "sans éclairage"
# variable agg = Localisation

caracteristiques %>%
  group_by(agg) %>%
  summarise(n = n(),
            prop = n / nrow(caracteristiques)) 

hist(caracteristiques$agg, main = "Répartition de la variable Localisation", col = "firebrick")
# variable int = Intersection

caracteristiques %>%
  group_by(int) %>%
  summarise(n = n(),
            prop = n / nrow(caracteristiques)) 

hist(caracteristiques$int, main = "Répartition de la variable Intersection", col = "firebrick")

# on pourrait créer une modalité "intersection" à partir des modalités (2, 3, 4, 5, 9)
# variable atm = Conditions atmosphériques

caracteristiques %>%
  group_by(atm) %>%
  summarise(n = n(),
            prop = n / nrow(caracteristiques)) 

hist(caracteristiques$atm, main = "Répartition de la variable Conditions atmosphériques", col = "firebrick")

# on pourrait créer une modalité "intersection" à partir des modalités 2 et 3 et créer une modalité autre à partir des modalités (-1, 4, 5, 6, 7, 8, 9)
# variable col = Type de collision

caracteristiques %>%
  group_by(col) %>%
  summarise(n = n(),
            prop = n / nrow(caracteristiques)) 

hist(caracteristiques$col, main = "Répartition de la variable Type de collision", col = "firebrick")

# on pourrait créer une modalité "3 et +" à partir des modalités 4 et 5

Insertion des libellés dans la table CARACTERISTIQUES

# carac <- read.csv(here::here("data-raw","caracteristiques-2019.csv"),sep=";",header=T)
# carac <- caracteristiques
# Ajout des libellés relatifs à la luminosité avec regroupement des modalités 3 et 4
caracteristiques <- caracteristiques %>% 
  select(-gps) %>% 
  mutate(lum=case_when(
                            lum==1 ~ "Plein jour",
                            lum==2 ~ "Crépuscule ou aube",
                            lum %in% c(3,4) ~ "Nuit sans éclairage",
                            TRUE ~ "Nuit avec éclairage public")
        ) %>%
# Ajout des libellés relatifs à l'agglomération
  mutate(agg=ifelse(agg==1,"Hors agglomération","En agglomération")) %>%
# Ajout des libellés relatifs aux types d'intersection avec regroupement des variables 2, 3, 4, 5 et 9 en "Intersection"
  mutate(intersection=case_when(
                            int==1 ~ "Hors intersection", 
                            int %in% c(2:5,9) ~ "Intersection",
                            int==6 ~ "Giratoire",
                            int==7 ~ "Place",
                            TRUE ~ "Passage à niveau")
        ) %>% select(-`int`) %>% 
# Ajout des libellés relatifs aux conditions atmosphériques
  mutate(atm=case_when(
                            atm==1 ~ "Normale",
                            atm==2 ~ "Pluie légère",
                            atm==3 ~ "Pluie forte",
                            atm==4 ~ "Neige - grêle",
                            atm==5 ~ "Brouillard - fumée",
                            atm==6 ~ "Vent fort - tempête",
                            atm==7 ~ "Temps éblouissant",
                            atm==8 ~ "Temps couvert",
                            TRUE ~ "Autre")
        ) %>%
# Ajout des libellés relatifs au nombre de véhicules impliqués dans la collision avec regroupement des modalités 4 et 5
  mutate(col=case_when(
                            col=='-1' ~ "Non Renseigné",
                            col==1 ~ "2 véhicules - frontale",
                            col==2 ~ "2 véhicules - par l'arrière",
                            col==3 ~ "2 véhicules - par le côté",
                            col %in% c(4,5) ~ "3 véhicules et plus",
                            col==6 ~ "Autre collision",
                            TRUE~ "Sans collision")
        ) %>% 
  # Date de l'accident
  mutate(
    annee = ifelse(an<2000L, an+2000, an),
    date_acc = lubridate::ymd(paste(annee, mois, jour, sep = '-'))
  ) %>% select(-an, -annee, -jour, -mois)

coord_gps_code_commune <- BARIS::BARIS_resources("545b55e1c751df52de9b6045") %>%
  dplyr::filter(stringr::str_detect(title,"Base off")) %>% 
  dplyr::pull(id) %>% 
  BARIS::BARIS_extract(format = "csv") %>%
  dplyr::filter(coordonnees_gps!="") %>% 
  dplyr::distinct(code_commune_insee, coordonnees_gps) %>% 
  tidyr::separate(coordonnees_gps, sep = ",", into = c('lat','long'))

caracteristiques_avec_gps <- filter(caracteristiques, !is.na(lat))
caracteristiques_sans_gps <- filter(caracteristiques, is.na(lat)) %>% select(-lat,-long) %>%
  left_join(coord_gps_code_commune, by = c("com"="code_commune_insee"))
caracteristiques <- bind_rows(caracteristiques_avec_gps, caracteristiques_sans_gps)

caracteristiques

Exploration des données de la table Lieux

#lieux <- read.table(here::here("data-raw","lieux-2019.csv"),sep=";",header = T)
lieux <- dl_lieux(2019L)
# data(lieux)
summary(lieux)
names(lieux)
nrow(lieux) #58 840
lieux %>% head(10)
# variable catr = Catégorie de la route

lieux %>%
  group_by(catr) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$catr, main = "Répartition de la variable Catégorie de la route", col = "lightblue")

# on pourrait garder les modalités 1, 2, 3 et 4 et regrouper les modalités 5 à 9 en 'autres'
# variable circ = Régime de circulation

lieux %>%
  group_by(circ) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$circ, main = "Répartition de la variable Régime de circulation", col = "lightblue")

# on pourrait garder les modalités 1, 2 et 3 et regrouper les modalités -1 et 4 en 'autres/non renseigné'
# variable nbv = Nombre total de voies de circulation

lieux %>%
  group_by(nbv) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$nbv, main = "Répartition de la variable Nombre total de voies de circulation", col = "lightblue")

# on pourrait garder les modalités 1, 2 et créer la modalité "3 et +" et créer la modalité "non renseigné" pour les valeurs (-1,0)
# variable prof = Profil de la route

lieux %>%
  group_by(prof) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$prof, main = "Répartition de la variable Profil de la route", col = "lightblue")

# on pourrait garder les modalités 1, 2 et regrouper les modalités -1, 3 et 4 en 'autres/non renseigné'
# variable plan = Tracé de la route

lieux %>%
  group_by(plan) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$plan, main = "Répartition de la variable Tracé de la route", col = "lightblue")

# il y a une modalité 4 non cité dans la doc... La modalité 4 est "en S" mais citée sur la même ligne que la modalité 3 dans la doc.
# on pourrait créer une variable binaire : rectiligne/non rectiligne
# variable larrout = Largeur de la chaussée

summary(lieux$larrout)
# 58 468 valeurs manquantes => donnée inexploitable
# variable surf = Etat de la surface

lieux %>%
  group_by(surf) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$surf, main = "Répartition de la variable Etat de la surface", col = "lightblue")

# surtout les modalités 1 et 2 => je ne sais pas si on regroupe 2, 3 et 4 pour "mouillée" et on fait une modalité autres pour le reste ou alors on ne fait que 2 modalités : normale/pas normale
# variable infra = Aménagement - Infrastructure

lieux %>%
  group_by(infra) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$infra, main = "Répartition de la variable Aménagement - Infrastructure", col = "lightblue")

# je ne sais pas trop pour les regroupements possibles
# variable situ = Situation de l’accident

lieux %>%
  group_by(situ) %>%
  summarise(n = n(),
            prop = n / nrow(lieux)) 

hist(lieux$situ, main = "Répartition de la variable Situation de l accident", col = "lightblue")

# a minima on pourrait regrouper les modalités -1, 6 et 8 en "autres"

Insertion des libellés dans la table LIEUX

# Ajout des libellés relatifs à la catégorie de route avec regroupement les madalités 5 à 9 en "Autre"
# data("lieux",package = "ACC")
lieux <- lieux %>% 
  select(-larrout, -lartpc, -env1, -v1, -v2, -vosp, -pr, -pr1) %>% #On retire la variable larrout, lartpc, env1 (non ducmentée)
  mutate(catr=case_when(
                          catr==1 ~ "Autoroute",
                          catr==2 ~ "Route Nationale",
                          catr==3 ~ "Route Départementale",
                          catr==4 ~ "Voie Communale",
                          TRUE  ~  "Autre")
        ) %>%
# Ajout des libellés relatifs au régime de circulation avec regroupement des modalités -1 et 4 en "Autre/Non Renseigné"
 mutate(circ=case_when(
                          circ==1 ~ "A sens unique", 
                          circ==2 ~ "Bidirectionnelle",
                          circ==3 ~ "A chaussées séparées",
                          TRUE ~ "Autre/Non Renseigné")
        ) %>%
# Ajout des libellés relatifs au nombre de voies de circulation avec regroupement des modalités 3 et plus en une seule modalité et regroupement des modalités -1 et 0 en "Non Renseigné"
  mutate(nbv=ifelse(
                      nbv %in% c(1,2),nbv,
                      ifelse(
                            nbv >=3, "3 et plus","Non Renseigné"
                            )
                    )
        ) %>%
# Ajout des libellés relatifs au profil de la route avec regroupement des modalités -1, 3 et 4 en "Autre/Non Renseigné"
   mutate(prof=case_when(
                            prof==1 ~ "Plat",
                            prof==2 ~ "Pente",
                            TRUE ~ "Autre/Non Renseigné")
        ) %>%
# Ajout des libellés relatifs au tracé de la route dans une variable binaire "Rectiligne/Non rectiligne"
  mutate(plan=case_when(
                          plan==1 ~ "Rectiligne",
                          plan %in% c(2,3,4) ~ "Non Rectiligne",
                          TRUE ~ "Non Renseigné")
         ) %>%
# Ajout des libellés relatifs à la surface en faisant 2 modalités : Normale et Anormale. 
  mutate(surf=case_when(
                          surf==1 ~ "Normale",
                          surf %in% c(2:9) ~ "Anormale",
                          TRUE ~ "Non Renseigné")
         ) %>%
# Ajout des libellés relatifs à la présence d'un aménagement ou d'une infrastructure, regroupement en 3 modalités "Oui/Non/Non Renseigné"
  mutate(infra=case_when(
                          infra==0 ~ "Non",
                          infra %in% c(1:9) ~ "Oui",
                          TRUE ~ "Non Renseigné")
         ) %>%
# Ajout des libellés relatifs à la situation de l'accident en regroupant les modalités -1, 6 et 8 en "Autre/Non Renseigné"
  mutate(situ=case_when(
                          situ==0 ~ "Aucun",
                          situ==1 ~ "Sur chaussée",
                          situ==2 ~ "Sur bande d'arrêt d'urgence",
                          situ==3 ~ "Sur accotement",
                          situ==4 ~ "Sur trottoir",
                          situ==5 ~ "Sur piste cyclable",
                          TRUE  ~  "Autre/Non Renseigné")
        )
lieux

Exploration des données de la table Véhicules

# data("vehicules",package = "ACC")
# vehicules <- read.table(here::here("data-raw","vehicules-2019.csv"),sep=";",header = T)
vehicules <- dl_vehicules(2019L)
# data(vehicules)
summary(vehicules)
names(vehicules)
nrow(vehicules) #100710
vehicules %>% head(10)
# variable senc = Sens de circulation

vehicules %>%
  group_by(senc) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules)) 

hist(vehicules$senc, main = "Répartition de la variable Sens de circulation", col = "forestgreen")

# pas convaincue par l'intérêt de cette variable
# variable catv = Catégorie du véhicule

vehicules %>%
  group_by(catv) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules)) %>%
  arrange(desc(prop))

hist(vehicules$catv, main = "Répartition de la variable Catégorie du véhicule", col = "forestgreen")

# on pourrait commencer les données à partir de 2006 car cela supprimerait déjà 9 modalités
# variable obs = Obstacle fixe heurté

vehicules %>%
  group_by(obs) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules))  %>%
  arrange(desc(prop))

hist(vehicules$obs, main = "Répartition de la variable Obstacle fixe heurté", col = "forestgreen")

# on pourrait créer une variable binaire : oui/non
# variable obsm = Obstacle mobile heurté

vehicules %>%
  group_by(obsm) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules))  %>%
  arrange(desc(prop))

hist(vehicules$obsm, main = "Répartition de la variable Obstacle mobile heurté", col = "forestgreen")

# on pourrait regrouper les modalités en : aucun/piéton/véhicules/animal/autre
# variable choc = Point de choc initial

vehicules %>%
  group_by(choc) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules))  %>%
  arrange(desc(prop))

hist(vehicules$choc, main = "Répartition de la variable Point de choc initial", col = "forestgreen")

# Fait-on des regroupements du style : avant/arrière/côté et aucun ?
# variable manv = Manoeuvre principale avant l’accident

vehicules %>%
  group_by(manv) %>%
  summarise(n = n(),
            prop = n / nrow(vehicules))  %>%
  arrange(desc(prop))

hist(vehicules$manv, main = "Répartition de la variable Manoeuvre principale avant l’accident", col = "forestgreen")

# Vu les résultats de la répartition, pas convaincue de l'intérêt de la variable
# variable occutc = Nombre d’occupants dans le transport en commun

summary(vehicules$occutc)
# 99 818 valeurs manquantes => donnée inexploitable

Insertion des libellés dans la table VEHICULES

# Ajout des libellés relatifs à la catégorie de véhicules 
 vehicules <- vehicules %>% 
  select(-c(senc,manv,occutc)) %>% # On retire les variables inexploitables
  mutate(catv=case_when(
                        catv==1 ~ "Bicyclette",
                        catv %in% c(2,30:34) ~ "2 roues motorisé",
                        catv==7 ~ "VL seul",
                        catv==10 ~ "VU seul",
                        catv %in% c(13:15) ~ "Poids lourd",
                        catv %in% c(16:17,20:21) ~ "Engin agricole",
                        catv %in% c(37,38) ~ "Bus",
                        catv==39 ~ "Train",
                        catv==40 ~ "Tramway",
                        catv %in% c(35,36) ~ "Quad",
                            TRUE ~ "Autre")
        ) %>%
# Ajout d'une variable binaire "Oui/Non" si un obstacle fixe a été heurté
  mutate(obs=case_when(
                        obs==0 ~ "Non",
                        obs %in% c(1:17) ~ "Oui",
                        TRUE ~ "Non Renseigné")
        ) %>%
# Ajout des libellés relatifs à l'obstale mobile heurté avec regroupement en Aucun/Piéton/Véhicule/Animal/Autre
    mutate(obsm=case_when(
                          obsm==0 ~ "Aucun",
                          obsm==1 ~ "Piéton",
                          obsm %in% c(2,4) ~ "Véhicule",
                          obsm %in% c(5,6) ~ "Animal",
                          TRUE ~ "Autre")
        ) %>%
# Ajout des libellés relatifs au point de choc initial avec regroupement Avant/Arrière/Côté/Aucun
  mutate(choc=case_when(
                        choc==0 ~ "Aucun",
                        choc %in% c(1:3) ~ "Avant",
                        choc %in% c(4:6) ~ "Arrière",
                        choc %in% c(7,8) ~ "Côté",
                        choc==9 ~ "Chocs multiples (tonneaux)",
                        TRUE ~ "Non Renseigné")
        )
vehicules

Exploration des données de la table usagers

# usagers <- read.table(here::here("data-raw","usagers-2019.csv"),sep=";",header = T)
# usagers <- data("usagers",package = "ACC")
usagers <- dl_usagers(2019L)
# data(usagers)
summary(usagers)
names(usagers)
nrow(usagers) #132977
usagers %>% head(10)
# variable place = Place occupée dans le véhicule

usagers %>%
  group_by(place) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$place, main = "Répartition de la variable Place occupée dans le véhicule", col = "orange")

# pas convaincue de son apport par rapport à la variable catu
# variable catu = Catégorie d'usager

usagers %>%
  group_by(catu) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$catu, main = "Répartition de la variable Catégorie d'usager", col = "orange")

# on garde telle quelle
# variable grav = Gravité de blessure de l'usager

usagers %>%
  group_by(grav) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$grav, main = "Répartition de la variable Gravité de blessure de l'usager", col = "orange")

# on garde telle quelle
# variable -    an_nais = Année de naissance 

summary(usagers$an_nais)
hist(usagers$an_nais, main = "Répartition des accidentés selon leur année de naissance", col = "orange")

# à voir si on fait des classes
# variable trajet = Motif du déplacement au moment de l’accident

usagers %>%
  group_by(trajet) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$trajet, main = "Répartition de la variable Motif du déplacement au moment de l’accident", col = "orange")

# les modalités non renseigné ou autre représentent 33 % => pas convaincue de son intérêt
# variable locp = Localisation du piéton

usagers %>%
  group_by(locp) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$locp, main = "Répartition de la variable Localisation du piéton", col = "orange")

# les modalités non renseigné ou sans objet représentent 92 % => pas convaincue de son intérêt sauf si on fait un zoom sur les accidents avec piétons
# variable actp = Action du piéton

usagers %>%
  group_by(actp) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(as.numeric(usagers$actp), main = "Répartition de la variable Action du piéton", col = "orange")

# idem variable locp
# variable etatp = Accompagnants du piéton

usagers %>%
  group_by(etatp) %>%
  summarise(n = n(),
            prop = n / nrow(usagers))  %>%
  arrange(desc(prop))

hist(usagers$etatp, main = "Répartition de la variable Accompagnants du piéton", col = "orange")

# idem variable locp

Insertion des libellés dans la table USAGERS

# Ajout des libellés relatifs à la catégorie d'usager
usagers <- usagers %>% 
  select(-c(place,trajet,locp,actp,etatp)) %>% # On retire les variables inexploitables
  mutate(catu=case_when(
                        catu==1 ~ "Conducteur",
                        catu==2 ~ "Passager",
                        catu==3 ~ "Piéton")
        ) %>%
# Ajout des libellés relatifs à la gravité de blessure de l'usager
  mutate(grav=case_when(
                        grav==1 ~ "Indemne",
                        grav==2 ~ "Tué",
                        grav==3 ~ "Blessé hospitalisé",
                        grav==4 ~ "Blessé léger")
        ) %>%
# Ajout des libellés relatifs au sexe de l'usager
    mutate(sexe=case_when(
                          sexe==1 ~ "Masculin",
                          sexe==2 ~ "Féminin")
        )
usagers

Jointure des tables

accidents <- usagers %>% 
  left_join(vehicules %>% distinct(Num_Acc, num_veh, catv),
            by = c("Num_Acc", "num_veh")) %>% 
  left_join(caracteristiques, by = c("Num_Acc")) %>% 
  left_join(lieux,by = c("Num_Acc"))


ACCCertDS/ACC documentation built on Dec. 17, 2021, 6:40 a.m.