1 Introduction

Les données sur les accidents auto corporels sont disponibles sur le site de data gouv.

Pour la visualisation géogrpahique des accidents, on peut utiliser le package R leaflet.

2 Géolocalisation des adresses

#### constitution de base ####

caracteristiques=data.table()
vehicules=data.table()
usagers=data.table()
lieux=data.table()

for (annee in seq(2010,2014,1)){
  caracteristiques <- rbind(caracteristiques,
                                data.table(read.csv(paste0("caracteristiques_",annee,".csv"))))
#   vehicules <- rbind(vehicules,
#                          data.table(read.csv(paste0("vehicules_",annee,".csv"))))
#   usagers <- rbind(usagers,
#                        data.table(read.csv(paste0("usagers_",annee,".csv"))))
#   lieux <- rbind(lieux,
#                      data.table(read.csv(paste0("lieux_",annee,".csv"))))
}

caracteristiques$lat[caracteristiques$lat == 0] <- NA
caracteristiques$lat <- caracteristiques$lat/100000
caracteristiques$lat <- as.double(caracteristiques$lat)

caracteristiques$long[caracteristiques$long == 0] <- NA
caracteristiques$long <- caracteristiques$long/100000
caracteristiques$long <- as.double(caracteristiques$long)

geoloc=data.table(lat=caracteristiques$lat,
                  long=caracteristiques$long,
                  dep=caracteristiques$dep)

geoloc=geoloc[is.na(lat)==FALSE,]
geoloc=geoloc[is.na(long)==FALSE,]
geoloc=geoloc[geoloc$long<1000,]

nrow(geoloc)/nrow(caracteristiques)
## [1] 0.339456

Dans un premier temps, on doit nettoyager la base de données :

adr1=geocode(paste0(caracteristiques[1,]$adr,",",caracteristiques[1,]$com,"000"))
## Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=71%20RUE%20JEAN%20JAURES,52000&sensor=false
m <- leaflet(width="100%") %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=adr1$lon, lat=adr1$lat)
m  # Print the map

3 Visualisation des points individuels

Comme le nombre total de points est important, on choisit de visualiser les points individuels du déppartement 92 et 93.

geoloc92=geoloc[geoloc$dep==920,]

m <- leaflet(width="100%") %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addCircleMarkers(lng=geoloc92$long, lat=geoloc92$lat,radius=1)
m  # Print the map
geoloc93=geoloc[geoloc$dep==930,]

m <- leaflet(width="100%") %>%
  addTiles() %>%
  addCircleMarkers(lng=geoloc93$long, lat=geoloc93$lat,radius=1)
m 

4 Visualisation avec un maillage

On peut construire un maillage pour repérer les endroits où les accidents sont fréquents.

h2d=function(x, y, pas,
             na.rm = TRUE, 
             FUN = base::length) {
  x.cuts <- seq(from = -5, to = 8.5, by = pas)
  y.cuts <- seq(from = 42, to = 51.5, by = pas)
  index.x <- cut(x, x.cuts, include.lowest = TRUE)
  index.y <- cut(y, y.cuts, include.lowest = TRUE)
  m <- tapply(x, list(index.x, index.y), FUN)
  if (identical(FUN, base::length)) 
    m[is.na(m)] <- 0
  midpoints <- function(x) (x[-1] + x[-length(x)])/2
  retval <- list()
  retval$counts <- m
  retval$x.breaks = x.cuts
  retval$y.breaks = y.cuts
  retval$x = midpoints(x.cuts)
  retval$y = midpoints(y.cuts)
  retval$nobs = length(x)
  retval
}


pas=0.002

haccid=h2d(x=geoloc$long,y=geoloc$lat,pas=pas)

mmm=cbind(rep(haccid$x,each=1,time=length(haccid$y)),
          rep(haccid$y,each=length(haccid$x),time=1),
          as.vector(haccid$counts))

pts=data.table(mmm)
names(pts)=c("x","y","freq")
maille=pts[pts$freq>10,]

pal <- colorNumeric(
  palette = "Spectral",
  domain = maille$freq
)
m=leaflet(data=maille) %>% 
  addTiles() %>% 
  addRectangles(
    lng1=~x-pas/2, lat1=~y-pas/2,
    lng2=~x+pas/2, lat2=~y+pas/2,
    color=~pal(freq),
    popup=~as.character(freq))%>% 
  addMarkers(lng=~x, lat=~y,popup=~as.character(freq))
m

5 Heatmap

Grâce au package rMaps, on peut voir tous les points sous forme de heatmap.

L2 <- Leaflet$new()
L2$setView(c(46,  3), 5)
L2$tileLayer(provider = "MapQuestOpen.OSM")

L2$addAssets(jshead = c(
  "http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
))


# Add javascript to modify underlying chart
L2$setTemplate(afterScript = sprintf("
<script>
  var addressPoints = %s
  var heat = L.heatLayer(addressPoints).addTo(map)           
</script>
", rjson::toJSON(geolocj)
))

L2$save("heatmap_accidents_auto.html")

6 Pour aller plus loin

D’autres visualisations sur la base d’accidents auto corporels :

Pour une étude plus approfondie sur la géolocalisation :

Copyright © 2016 Blog de Kezhan Shi