Open data - Mobilité

Par Rémi Julien | October 16, 2018

Orléans Métropole - Open data

La Métropole d’Orléans s’engage dans la dynamique Open Data actée par la loi République Numérique en ouvrant l’accès à toutes ses données, dans toutes ses compétences, dans des formats facilement exploitables : transports, environnement, urbanisme, sport, eau, déchets, tourisme…
Plus d’infos sur data.orleans-metropole.fr.

Le jeu de données :
Issu des jeux de données ouverts par la Métropole d’Orléans, le jeu de données analysé concerne la mobilité profesionnelle en 2015 et plus particulièrment les déplacements domicile - lieu de travail.

La dataviz :
Le choix est fait ici de représenter le parcours des travailleurs dans un repère de points cardinaux vis-à-vis d’un point de référence qui est la ville d’Orléans.
La dataviz est réalisée grâce au logiciel R accompagné de la librairie chorddiag pour une visualisation interactice (d3js).
Toujours dans un esprit Open Data, le code source est fourni en bas de page pour réutilisation et amélioration.

Visualisation interactive des flux de travailleurs sur le département du Loiret en 2015

Interprétations :
* Une majorité d’Orléanais réside et travaille dans la commune.
* Orléans capte une grande partie du flux de voyageurs et notammant ceux habitant le nord-ouest de la métropole.
* Le flux de travailleurs est très limité vers les communes du sud de la métropole.

Code : chargement des librairies et du jeu de données

# Chargement des librairies necessaires au traitement et dataviz
library(tidyverse) # pour la manipulation des données
library(scales) # pour la selection des couleurs
library(chorddiag) # la dataviz basee sur la librairie de visualisation d3js


# Chargement du jeu de donnees de mobilite 2015 (encodage 'UTF-8' pour gérer les accents de la langue francaise)
data.brut <- read.csv("data mobilites pro 2015.csv", header=TRUE, sep=";", encoding="UTF-8") %>%
  purrr::set_names(., c("code_residence", "commune_residence", "code_travail", "commune_travail", "nb_flux", "coord_residence", "coord_travail"))


# Affichage des premieres lignes du jeu de donnees
head(data.brut)


Code : traitement du jeu de données

# Nettoyage des donnees : suppression des informations partielles et travailleurs à l'etranger
data <- data.brut %>%
  slice(- which(nchar(as.character(data.brut$coord_travail)) == 0))


# Conversion des champs coordonnees en champs latitude et longitude
data <- data %>%
  mutate(lat_residence = as.numeric(unlist(strsplit(x=as.character(coord_residence), split=","))[c(T,F)]),
         lon_residence = as.numeric(sub(" ", "", unlist(strsplit(x=as.character(coord_residence), split=","))[c(F,T)])),
         lat_travail = as.numeric(unlist(strsplit(x=as.character(coord_travail), split=","))[c(T,F)]),
         lon_travail = as.numeric(sub(" ", "", unlist(strsplit(x=as.character(coord_travail), split=","))[c(F,T)])))


# Changement de repere par translation des coordonnees par rapport aux coordonnees d'Orleans (pour meilleure lisibilite de la dataviz)
lat_Orleans <- 47.8828634214
lon_Orleans <- 1.91610357477
data <- data %>%
  mutate(lat_residence = lat_residence - lat_Orleans,
         lon_residence = lon_residence - lon_Orleans,
         lat_travail = lat_travail - lat_Orleans,
         lon_travail = lon_travail - lon_Orleans)


# Calcul de l'orientation et du point cardinal de chaque commune par rapport à Orleans
data <- data %>%
  mutate(radius_residence = atan2(lon_residence, lat_residence),
         radius_travail = atan2(lon_travail, lat_travail)) %>%
  mutate(cardinal_residence = ifelse(radius_residence >= 0 & radius_residence < pi/8, "1.Nord",
                                     ifelse(radius_residence >= pi/8 & radius_residence < 3*pi/8, "2.Nord-Est",
                                            ifelse(radius_residence >= 3*pi/8 & radius_residence < 5*pi/8, "3.Est",
                                                   ifelse(radius_residence >= 5*pi/8 & radius_residence < 7*pi/8, "4.Sud-Est",
                                                          ifelse(radius_residence >= 7*pi/8 | radius_residence < -7*pi/8, "5.Sud",
                                                                 ifelse(radius_residence >= -7*pi/8 & radius_residence < -5*pi/8, "6.Sud-Ouest",
                                                                        ifelse(radius_residence >= -5*pi/8 & radius_residence < -3*pi/8, "7.Ouest",
                                                                               ifelse(radius_residence >= -3*pi/8 & radius_residence < -pi/8, "8.Nord-Ouest", "1.Nord"))))))))) %>%
  mutate(cardinal_travail = ifelse(radius_travail >= 0 & radius_travail < pi/8, "1.Nord",
                                   ifelse(radius_travail >= pi/8 & radius_travail < 3*pi/8, "2.Nord-Est",
                                          ifelse(radius_travail >= 3*pi/8 & radius_travail < 5*pi/8, "3.Est",
                                                 ifelse(radius_travail >= 5*pi/8 & radius_travail < 7*pi/8, "4.Sud-Est",
                                                        ifelse(radius_travail >= 7*pi/8 | radius_travail < -7*pi/8, "5.Sud",
                                                               ifelse(radius_travail >= -7*pi/8 & radius_travail < -5*pi/8, "6.Sud-Ouest",
                                                                      ifelse(radius_travail >= -5*pi/8 & radius_travail < -3*pi/8, "7.Ouest",
                                                                             ifelse(radius_travail >= -3*pi/8 & radius_travail < -pi/8, "8.Nord-Ouest", "1.Nord"))))))))) %>%
  mutate(cardinal_residence = ifelse(commune_residence == "Orléans", "0.Orléans", cardinal_residence),
         cardinal_travail = ifelse(commune_travail == "Orléans", "0.Orléans", cardinal_travail))


# Resume statistique (somme) du flux de travailleurs
data <- data %>%
  group_by(cardinal_residence, cardinal_travail) %>%
  summarise(total_flux = sum(nb_flux))


# Verification de l'existence de toutes les combinaisons possibles
cardinal <- c("0.Orléans", "1.Nord", "2.Nord-Est", "3.Est", "4.Sud-Est", "5.Sud", "6.Sud-Ouest", "7.Ouest", "8.Nord-Ouest")
all.combin <- expand.grid(cardinal_residence = cardinal,
                          cardinal_travail = cardinal)
data.flux <- left_join(x=all.combin, y=data.stat, by=c("cardinal_residence", "cardinal_travail")) %>%
  arrange(cardinal_residence, cardinal_travail)


# Realisation de la matrice d'adjacence
matrix.adj <- round(matrix(data.flux$total_flux,
                           byrow = TRUE,
                           nrow = length(cardinal), ncol = length(cardinal)), 0)


# Definition des labels de la matrice
dimnames(matrix.adj) <- list(from = cardinal, to = cardinal)


Code : représentation graphique des données

# Dataviz: representation graphique des flux de travailleurs dans et autour de l'agglomeration d'Orleans Metropole
myColors <- rev(hue_pal()(9))
chorddiag(matrix.adj,
          width = 800,
          height = 800, 
          groupColors = myColors,
          groupnamePadding = 20,
          showTicks = F,
          tooltipFontsize = 14,
          tooltipUnit = " pers.",
          fadeLevel = 0.2,
          margin = 120)
comments powered by Disqus