knitr::opts_chunk$set(echo = TRUE)

DIDO

Catalogue

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

Des jeux de données et des fichiers de données

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é.

Que l'on peut aussi explorer directement avec R {didor}

{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

Explorons

Il va nous falloir des fonctions du tidyverse

library(tidyverse)

je voudrais la liste des jeux de données proposés

tbl_dataset <- didor::datasets()
knitr::kable(tbl_dataset[,c("title","spatial_granularity")] %>% head(5), format="html")

je voudrais la liste des fichiers de données proposés

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 !

je voudrais un fichier de données dans un dataframe

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")

Mais qu'est ce que c'est que ces paramètres dans get_data ?

{didor} ne fait rien d'autre que proposer les mêmes outils que ceux dont on dispose dans le catalogue :

paramètres

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 :


Les annexes

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())

typage

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) 

Cherchons une correlation

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()

eco-considérations

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 faire du {shiny} avec {didor}

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)

Crédits

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 !)



MTES-MCT/didor documentation built on April 7, 2023, 7:42 a.m.