knitr::opts_chunk$set(echo = TRUE)
On trouve ici le catalogue DIDO : https://www.statistiques.developpement-durable.gouv.fr/catalogue?page=explore&type=dataset&pagination=1&sortField=last_modified&sortOrder=desc
DIDO propose aujourd'hui (23/02/2023) Une vingtaine de jeux de données (dataset) et environ 120 fichiers de données (datafile).
1 ou plusieurs fichiers de données sont inclus dans un jeu de données. Chaque jeu de données contient des fichiers d'annexes.
La logique est donc la suivante : on explore DIDO en commençant par chercher le dataset qui nous intéresse, puis on trouve la donnée en explorant les datafiles avec l'aide des annexes. Ces annexes commentent et précisent la nature des informations contenues dans les datafiles qui constituent un ensemble logique d'informations : le dataset exploré.
{didor} est un package R https://github.com/MTES-MCT/didor
qui propose une documentation de prise en main :
https://mtes-mct.github.io/didor/articles/premiers_pas.html
Il va nous falloir des fonctions du tidyverse
library(tidyverse)
tbl_dataset <- didor::datasets()
knitr::kable(tbl_dataset[,c("title","spatial_granularity")] %>% head(5), format="html")
Disons que je m'interesse à ce jeu de donnée :
Indicateurs territoriaux de développement durable (ITDD)
J'ai envie d'écrire cela :
tbl_datafile_itdd <- tbl_dataset %>% didor::datafiles()
knitr::kable(tbl_datafile_itdd[,c("title","description")] %>% head(5), format="html")
Trop de résultats au milieu de tous les fichiers de données ! Les infos des fichiers de données ne permettent pas de filtrer sur les jeux de données auxquels ils appartiennent.
Il faut donc d'abord sélectionner le jeu de données qui nous intéresse :
brutalement par exemple :
tbl_dataset <- didor::datasets() %>% dplyr::filter(title %in% c("Indicateurs territoriaux de développement durable (ITDD)"))
knitr::kable(tbl_dataset[,c("title","spatial_granularity")], format="html")
ou avec la fonction dido_search :
tbl_dataset <- didor::datasets() %>% didor::dido_search("ITDD")
knitr::kable(tbl_dataset[,c("title","spatial_granularity")], format="html")
Peu importe le moyen, on peut maintenant chercher les fichiers contenus dans le jeu de données :
tbl_datafile_itdd <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::datafiles()
knitr::kable(tbl_datafile_itdd[,c("title","description")] %>% head(5), format="html")
Même ainsi, il y a du choix !
Donc on en sélectionne un :
tbl_datafile_itdd <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::datafiles() %>% didor::dido_search("Bourgogne-Franche-Comté")
knitr::kable(tbl_datafile_itdd[,c("title","description")], format="html")
Et on le récupère : on le met dans un tibble.
C'est quoi un tibble ?
https://tibble.tidyverse.org/
Il est donc chargé en mémoire dans R.
tbl_datafile_itdd <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::datafiles() %>% didor::dido_search("Bourgogne-Franche-Comté") %>% didor::get_data(query = c( columns = "CODGEO_CODE,CODGEO_LIBELLE,A2019,A2018,A2017", # NO_INDIC ="eq:i021", VARIABLE = "eq:ESO_PES_NB_TOT_CLAS4", NO_INDIC ="eq:i034b" ))
knitr::kable(tbl_datafile_itdd %>% head(30) , format="html")
{didor} ne fait rien d'autre que proposer les mêmes outils que ceux dont on dispose dans le catalogue :
didor::get_data() peut prendre un paramètre query et ce n'est qu'une requête écrite et passée à l'API.
On trouve donc des informations qui permettent de s'y retrouver dans la documentation de l'API du fichier de données :
Dans l'onglets métadonnées du fichier de données ou après les fichiers de données, dans le jeu de données.
On peut les consulter en ligne ou directement les récupérer via didor::attachments()
tbl_attachment <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::attachments() %>% didor::dido_search("6.01") %>% didor::get_attachments(dest = tempdir())
Les données sont toutes en chr : pour les manipuler ce n'est pas forcément pratique. C'est néanmoins nécessaire, pourquoi ?
Dans un datafile, une variable (colonne) numérique contient une valeur qui peut être manquante. Le producteur de la donnée peut, s'il le souhaite, préciser la raison de l'absence. "secret" indiquera que la valeur sous secret statistique
Donc dans DIDO, (numérique) est équivalent à (type numérique de R union "secret") Bref, en utilisant la fonction convert(), on supprime tout cela et on peut effectuer des opérations mathématiques.
str(tbl_datafile_itdd)
Il suffit de les convertir avec la fonction convert()
tbl_datafile_itdd <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::datafiles() %>% didor::dido_search("Bourgogne-Franche-Comté") %>% didor::get_data(query = c( columns = "CODGEO_CODE,CODGEO_LIBELLE,A2019,A2018,A2017", # NO_INDIC ="eq:i021", VARIABLE = "eq:ESO_PES_NB_TOT_CLAS4", NO_INDIC ="eq:i034b" )) %>% didor::convert()
str(tbl_datafile_itdd)
Par exemple, entre la participation au présidentielles 2022 et le taux de 20/24 ans sortis non diplomés
result <- didor::datasets() %>% didor::dido_search("ITDD") %>% didor::datafiles() %>% didor::dido_search("Bourgogne-Franche-Comté") %>% didor::get_data(query = c( columns = "VARIABLE,CODGEO_CODE,CODGEO_LIBELLE,A2022,A2019,A2017,A2013,A2012,A2007,A2002", # NO_INDIC ="eq:i021", # VARIABLE = "eq:taux_participation" VARIABLE = "in:part_20_24_sortis_nondip,taux_participation" #NO_INDIC ="eq:i110" )) %>% didor::convert() %>% dplyr::select(CODGEO_CODE,A2022,A2019) %>% group_by(CODGEO_CODE) %>% summarise_at(c("A2022","A2019"),sum,na.rm=T)
knitr::kable(result %>% head(5) , format="html")
En en faisant un nuage de points :
ggplot(result, aes(x=A2022, y=A2019)) + geom_point()
Les données sont récupérées, et transitent donc sur le réseau lorsqu'on fait un
get_data()
et les paramètres de la 'query' du get_data()
filtrent et
sélectionnent les données qui sont transférées.
Le filtrage/sélection s'effectue dans DiDo.
Si on avait tout récupéré sans filtrer/sélectionner on aurait envoyé environ 20 millions de lignes et un bon paquet de colonnes au travers du réseau, ça aurait pris du temps... probablement planté... et consommé plein de ressources inutiles...
Bref, filtrer/sélectionner au plus près de DIDO, c'est mieux !
On peut utiliser {didor} dans une appli {shiny} un exemple avec les données NAMEA d'emission de GES
library(shiny) library(didor) library(stringr) code_nace <- datasets() %>% dido_search('NAMEA') %>% datafiles() %>% get_data( query = c(columns = "CODE_NACE_REV2_ET_MENAGES,LIBELLE_NACE_ET_MENAGES") ) shinyApp( # Define UI for application that draws a histogram ui <- fillPage( tags$style(HTML(' body { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 7px; line-height: 1.42857143; color: #333; background-color: #fff; } ')), # Application title titlePanel("{didor}+{shiny}"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( selectInput( inputId = "nace", label = "code nace", choices = unique(code_nace$LIBELLE_NACE_ET_MENAGES) ), width=2 ), mainPanel( tableOutput("table"), width=10 ) ) ), # Define server logic required to draw a histogram server <- function(input, output) { code_nace_select <- reactive({ str_c( "in:", as.character( dplyr::filter( unique( code_nace ), LIBELLE_NACE_ET_MENAGES %in% c(input$nace))[1]) ) }) data <- reactive({ datasets() %>% dido_search('NAMEA') %>% datafiles() %>% get_data( query = c(SUBSTANCE="in:GES",CODE_NACE_REV2_ET_MENAGES=code_nace_select()) ) }) output$table <- renderTable(data()) }, options = list(width = "100%",height = 500) ) # Run the application shinyApp(ui = ui, server = server)
Merci à Nicolas Chuche pour la construction de {didor} et merci à vous de vos retours sur son utilisation : nous vous invitons à ouvrir des issues dans github afin de nous permettre d'améliorer ce package : https://github.com/MTES-MCT/didor/issues
(et merci à Olivier Chantrel pour ce tutoriel !)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.