Introduction

Nous allons travailler sur la base (open data) des accidents corporels de la circulation. Voici le descriptif disponible sur la page “https://www.data.gouv.fr/fr/datasets/base-de-donnees-accidents-corporels-de-la-circulation/

Description des données

Données brutes

Pour chaque accident corporel (soit un accident survenu 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), des saisies d’information décrivant l’accident sont effectuées par l’unité des forces de l’ordre (police, gendarmerie, etc.) qui est intervenue sur le lieu de l’accident. Ces saisies sont rassemblées dans une fiche intitulée bulletin d’analyse des accidents corporels. L’ensemble de ces fiches constitue le fichier national des accidents corporels de la circulation dit " Fichier BAAC " administré par l’Observatoire national interministériel de la sécurité routière “ONISR”.

Les bases de données, extraites du fichier BAAC, répertorient l’intégralité des accidents corporels de la circulation intervenus durant une année précise en France métropolitaine ainsi que les départements d’Outre-mer (Guadeloupe, Guyane, Martinique, La Réunion et Mayotte depuis 2012) avec une description simplifiée. Cela comprend des informations de localisation de l’accident, telles que renseignées ainsi que des informations concernant les caractéristiques de l’accident et son lieu, les véhicules impliqués et leurs victimes.

[…] Les bases de données de 2005 à 2017 sont désormais annuelles et composées de 4 fichiers (Caractéristiques, Lieux, Véhicules, Usagers ) au format csv.

Données étudiées

Les données ont été préparées pour le TP :

  • seuls les accidents en Ile-de-France sont été considérés

  • chaque ligne correspond à un individu impliqué dans un accident

accidents = read_csv("./data_TP/data_to_clean.csv")
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   Num_Acc = col_double(),
##   place = col_double(),
##   an_nais = col_double(),
##   occutc = col_double(),
##   date = col_datetime(format = ""),
##   lat = col_double(),
##   long = col_double(),
##   dep = col_double(),
##   v1 = col_double(),
##   nbv = col_double(),
##   pr = col_double(),
##   pr1 = col_double(),
##   lartpc = col_double(),
##   larrout = col_double()
## )
## See spec(...) for full column specifications.

Nettoyage des données

  • Créer à partir de la variable date une variable monthet une variable year et une variable day
accidents = accidents %>% mutate(month = factor(lubridate::month(date)),year = lubridate::year(date),day = factor(lubridate::wday(date))) %>% select(-date)
  • Quelle est la proportion de lignes contenant au moins une valeur manquante ?
sum(accidents %>% is.na %>% rowSums>0) / nrow(accidents)
## [1] 1
  • Enlever toutes les colonnes qui contiennent plus de 5% de NA
prop_missing = accidents %>% summarise_all(funs(sum(is.na(.)))) /nrow(accidents)
colonnes_a_enlever = colnames(accidents)[prop_missing>0.05]
colonnes_a_enlever
##  [1] "place"  "trajet" "secup"  "secuu"  "locp"   "actp"   "etatp" 
##  [8] "senc"   "obs"    "obsm"   "choc"   "manv"   "gps"    "lat"   
## [15] "long"   "voie"   "v1"     "v2"     "circ"   "pr"     "pr1"   
## [22] "vosp"   "plan"   "infra"
accidents = accidents %>% select(-colonnes_a_enlever)
  • Quelle est maintenant la proportion de lignes contenant au moins une valeur manquante ? et quelles sont les colonnes qui contiennent des NA ?
sum(accidents %>% is.na %>% rowSums>0) / nrow(accidents)
## [1] 0.1331421
col_missing = accidents %>% summarise_all(funs(sum(is.na(.)))) %>% gather(variable,n_missing) %>% filter(n_missing >0)
print(col_missing)
## # A tibble: 14 x 2
##    variable n_missing
##    <chr>        <int>
##  1 an_nais        307
##  2 int            198
##  3 atm              8
##  4 col              1
##  5 com              6
##  6 adr           8979
##  7 catr             2
##  8 nbv           1261
##  9 prof         22436
## 10 lartpc       14861
## 11 larrout      14708
## 12 surf         16323
## 13 situ         25703
## 14 env1           870
  • Imputer les valeurs manquantes suivant la règle suivante : si la variable est factorielle remplacer la valeur manquante par le mode, si la variable est continue remplacer par la médiane
col_missing_class = col_missing %>% left_join(accidents %>% summarise_all(class) %>% gather(variable,class))
## Joining, by = "variable"
print(col_missing_class)
## # A tibble: 14 x 3
##    variable n_missing class    
##    <chr>        <int> <chr>    
##  1 an_nais        307 numeric  
##  2 int            198 character
##  3 atm              8 character
##  4 col              1 character
##  5 com              6 character
##  6 adr           8979 character
##  7 catr             2 character
##  8 nbv           1261 numeric  
##  9 prof         22436 character
## 10 lartpc       14861 numeric  
## 11 larrout      14708 numeric  
## 12 surf         16323 character
## 13 situ         25703 character
## 14 env1           870 character
accidents_numeric = accidents %>% select_if(is.numeric)
medians = accidents_numeric %>% summarise_all(median,na.rm=T)
accidents_numeric = accidents_numeric %>% replace_na(as.list(medians))
sum(accidents_numeric %>% is.na %>% rowSums>0) / nrow(accidents_numeric)
## [1] 0
accidents_charac = accidents %>% select_if(is.character)
most_frequent = NULL
for (var in names(accidents_charac)){
  print(var)
  most_frequent = c(most_frequent,names(which.max(table(accidents_charac %>%select(var))))[1])
}
## [1] "catu"
## [1] "grav"
## [1] "sexe"
## [1] "num_veh"
## [1] "catv"
## [1] "lum"
## [1] "agg"
## [1] "int"
## [1] "atm"
## [1] "col"
## [1] "com"
## [1] "adr"
## [1] "catr"
## [1] "prof"
## [1] "surf"
## [1] "situ"
## [1] "env1"
names(most_frequent) = names(accidents_charac)
accidents_charac = accidents_charac %>% replace_na(as.list(most_frequent))
sum(accidents_charac %>% is.na %>% rowSums>0) / nrow(accidents_charac)
## [1] 0
accidents = bind_cols(accidents_numeric,accidents_charac)

On vérifie

sum(accidents %>% is.na %>% rowSums>0) / nrow(accidents)
## [1] 0

Création du label

  • Créer un nouvelle base en créant le label Y qui prend la valeur 0 si la variable grav prend les valeurs Indemne ou Blesse leger et la valeur 1 si elle prend les valeurs Blesse hospitalise ou Tue. Enlever la variable grav de cette nouvelle base
unique(accidents$grav)
## [1] "Blesse hospitalise" "Indemne"            "Blesse leger"      
## [4] "Tue"
accidents_label = mutate(accidents, Y = recode_factor(grav, 
                                      "Blesse hospitalise" = "1",
                                      "Indemne" = "0",
                                      "Blesse leger" = "0",
                                      "Tue" = "1")
                    )
accidents_label = select(accidents_label,-grav)
  • Exporter les tables accidents et accidents_label. Effacer la mémoire et recharger la table accidents_label dans un autre .Rmd
write_csv(accidents,"./data_TP/accidents.csv")
write_csv(accidents_label,"./data_TP/accidents_label.csv")

```