Skip to contents

Introduction

Avant de faire appel aux fonctions permettant la pose du secret il est nécessaire d’analyser les tableaux que l’on souhaite protéger. En effet,les tableaux diffusés sont différents des tableaux à protéger. Cela est expliqué en détail au chapitre 3 du Manuel de protection des tableaux. Cette phase d’analyse des marges communes entre les différents tableaux peut s’avérer complexe. Ainsi, des fonctions ont été développées dans rtauargus pour faciliter ce travail.

Comment fonctionne l’analyse automatique automatique des métadonnées ?

Création des métadonnées

Les métadonnées doivent respecter un format spécifique. Une ligne représente un tableau et pour chaque tableau il faut préciser :

  • table_name : le nom du tableau ;
  • field : le champ (souvent, zone géographique, population étudiée, millésime) ;
  • hrc_field : s’il existe ou non un lien hiérarchique entre ce champ et un autre champ. S’il n’y a pas de lien hiérarchique cette case vaut NA. Si au contraire, un lien hiérarchique existe, il faut donner un nom à ce lien et réécrire ce même nom dans les autres tableaux ;
  • indicator : le nom de l’indicateur du tableau. Il s’agit du nom de la variable de ce qui est compté dans chaque cellule du tableau. Par exemple, si mon tableau présente le chiffre d’affaire des entreprises ma variable sera sans doute “CA”. Le mieux est de bien utiliser le nom de la variable tel que décrit dans les données ;
  • hrc_indicator : s’il existe ou non un lien hiérarchique entre cet indicateur et un autre indicateur. S’il n’y a pas de lien hiérarchique cette case vaut NA. Si au contraire, un lien hiérarchique existe, il faut donner un nom à ce lien et réécrire ce même nom dans les autres tableaux ;
  • spanning_1 : le nom de la première variable de croisement. On ajoute une colonne par variable de croisement en suivant le nommage : spanning_1, spanning_2, spanning_3, etc ;
  • hrc_spanning_1 : s’il existe ou non un lien hiérarchique entre cette variable de croisement et une autre variable de croisement. S’il n’y a pas de lien hiérarchique cette case vaut NA. Si au contraire, un lien hiérarchique existe, il faut donner un nom à ce lien et réécrire ce même nom dans les autres tableaux. On ajoute une colonne par variable de croisement en suivant le nommage : hrc_spanning_1, hrc_spanning_2, hrc_spanning_3, etc. N.B. il faut autant de colonnes spanning_X que de colonnes hrc_spanning_X.

Input formaté : templates Eurostat

Lorsque les tableaux à traiter sont des tableaux Eurostat alors on peut créer automatiquement le fichier de métadonnées à partir du template des cellules publiées. En effet, pour les publications Eurostat les INS doivent livrer un template regroupant les cellules publiées.

Pour cela, il faut tout de même bien comprendre chaque colonne du template. Déterminer pour chacune d’entre elles s’il s’agit de la variable réponse / indicateur, d’une variable de croisement ou d’un champ, afin de pouvoir le préciser dans les arguments de la fonction . Il faut notamment vérifier que le template respecte bien : une variable de croisement = une colonne du template, et donc un supertotal. En effet, si une colonne regroupe plusieurs variables de croisement, alors il faut créer autant de colonnes que de variables de croisement.

Les arguments de analyse_metadata

args(analyse_metadata)
## function (df_metadata, verbose = FALSE) 
## NULL

Les arguments de la fonction sont les suivants :

  • df_metadata : un dataframe structuré comme précisé dans la section .
  • verbose : une variable de type logical, si TRUE la fonction retourne une liste avec les différentes étapes de l’analyse, si FALSE elle retourne juste le dataframe final avec l’indicatrice de cluster.

Les arguments de format_template

args(format_template)
## function (data, indicator_column, spanning_var_tot, field_columns) 
## NULL

Les arguments de la fonction sont les suivants :

  • data : dataframe du template Eurostat contenant toutes les cellules publiées.
  • indicator_column : nom de la colonne dans laquelle se trouvent les indicateurs.
  • spanning_var_tot : liste nommée des variables de croisements et de leurs totaux.
  • field_columns : vecteur de toutes les colonnes représentant des champs (ex : millésime).

Exemples

Cas où l’input sont les métadonnées

Dans cet exemple on part d’un fichier de métadonnées présentant 12 tableaux à publier sur les chiffres d’affaires de ventes de pizzas et de salades.

str(metadata_pizza_lettuce)
## 'data.frame':    12 obs. of  9 variables:
##  $ table_name    : chr  "T1" "T2" "T3" "T4" ...
##  $ field         : chr  "france_entreprises_2023" "france_entreprises_2023" "france_entreprises_2023" "france_entreprises_2023" ...
##  $ hrc_field     : logi  NA NA NA NA NA NA ...
##  $ indicator     : chr  "to_pizza" "to_pizza" "to_pizza" "to_pizza" ...
##  $ hrc_indicator : chr  NA NA NA NA ...
##  $ spanning_1    : chr  "nuts2" "nuts3" "a10" "a10" ...
##  $ hrc_spanning_1: chr  "hrc_nuts" "hrc_nuts" "hrc_naf" "hrc_naf" ...
##  $ spanning_2    : chr  "size" "size" "nuts2" "nuts3" ...
##  $ hrc_spanning_2: chr  NA NA "hrc_nuts" "hrc_nuts" ...

Exemple de code :

library(rtauargus)

data(metadata_pizza_lettuce)

# Analyse complète, avec les étapes
detailed_analysis <- analyse_metadata(metadata_pizza_lettuce, verbose = TRUE)

# Output simplifié, uniquement le dataframe avec l'indicatrice de cluster
cluster_id_dataframe <- analyse_metadata(metadata_pizza_lettuce, verbose = FALSE)

On obtient un dataframe nous présentant la façon de traiter les tableaux pour la pose du secret.

cluster_id_dataframe
## # A tibble: 4 x 10
## # Groups:   table_name [4]
##   cluster table_name field indicator spanning_1 spanning_2 spanning_3 hrc_spanning_1 hrc_spanning_2
##   <chr>   <chr>      <chr> <chr>     <chr>      <chr>      <chr>      <chr>          <chr>         
## 1 france~ T10.T12.T8 fran~ LETTUCE   HRC_NAF    cj         HRC_LETTU~ hrc_naf        <NA>          
## 2 france~ T11.T7.T9  fran~ LETTUCE   HRC_NAF    size       HRC_LETTU~ hrc_naf        <NA>          
## 3 france~ T1.T2      fran~ to_pizza  HRC_NUTS   size       <NA>       hrc_nuts       <NA>          
## 4 france~ T3.T4.T5.~ fran~ to_pizza  HRC_NAF    HRC_NUTS   <NA>       hrc_naf        hrc_nuts      
## # i 1 more variable: hrc_spanning_3 <chr>

Pour les 12 tableaux à publier il suffit de protéger 4 tableaux. Ces tableaux sont repartis dans deux clusters différents. Il faudra donc faire appel deux fois à tab_multi_manager(). On remarque une nouvelle variable de croisement HRC_LETTUCE^h. I s’agit d’une variable qui prend pour modalités batavia et arugula et a pour total lettuce. L’indicateur LETTUCE renvoie ici au “turnover” (to) ou “chiffre d’affaires” de la vente de salades. Par exemple, le tableau T10.T12.T8 présente le chiffre d’affaires de la vente de salades en fonction de l’activité et de la catégorie de l’entreprise ainsi que du type de salade.

Si l’on souhaite avoir plus d’informations sur l’analyse de la demande, on peut spécifier l’argument verbose = TRUE. Ainsi, l’objet renvoyé par la fonction sur une liste des différentes étapes de l’analyse.

names(detailed_analysis)
## [1] "identify_hrc"        "info_var"            "split_in_clusters"   "create_edges"       
## [5] "grp_tab_names"       "grp_tab_in_clusters" "tab_to_treat"        "df_tab_to_treat"

On retrouve le dataframe avec l’indicatrice du cluster df_tab_to_treat. On a le même résultat mais en format liste : chaque élément de la liste est un cluster indépendant tab_to_treat. Mais aussi les 6 étapes de l’analyse.

Cas où l’input est un template Eurostat

La fonction format_template() permet de créer les métadonnées à mettre en input de analyse_metadata() à partir du template Eurostat des cellules publiées.

data(enterprise_template)

str(enterprise_template)
## 'data.frame':    3168 obs. of  5 variables:
##  $ TIME_PERIOD: int  2022 2022 2022 2022 2022 2022 2022 2022 2022 2022 ...
##  $ INDICATOR  : chr  "SAL" "SAL" "SAL" "SAL" ...
##  $ ACTIVITY   : chr  "B" "B" "B" "B" ...
##  $ NUMBER_EMPL: chr  "E0" "E1T4" "E5T9" "EGE10" ...
##  $ LEGAL_FORM : chr  "_T" "_T" "_T" "_T" ...
template_formatted <- format_template(
  data = enterprise_template,
  indicator_column = "INDICATOR",
  spanning_var_tot = list(
    ACTIVITY = "BTSXO_S94",
    NUMBER_EMPL = "_T",
    LEGAL_FORM = "_T"),
  field_columns = c("TIME_PERIOD")
)

template_formatted$metadata
##             table_name field indicator spanning_1  spanning_2   hrc_spanning_1    hrc_spanning_2
## 1 table_2021_SAL_DTH_1  2021   SAL_DTH   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 2 table_2021_SAL_DTH_2  2021   SAL_DTH   ACTIVITY NUMBER_EMPL hrc_activity_131 hrc_number_empl_4
## 3     table_2022_SAL_1  2022       SAL   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 4     table_2022_SAL_2  2022       SAL   ACTIVITY NUMBER_EMPL hrc_activity_131 hrc_number_empl_4
## 5 table_2022_SAL_DTH_1  2022   SAL_DTH   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 6 table_2022_SAL_DTH_2  2022   SAL_DTH   ACTIVITY NUMBER_EMPL hrc_activity_131 hrc_number_empl_4

On voit qu’il y a 6 tableaux à publier.

Remarque : format_template() ne construit pas la colonne hrc_indicator car les informations contenues dans le template ne permettent pas de la déterminer. Ainsi, il faut la créer soit-même en fonction des informations que l’ont a sur les indicateurs.

Ici, il n’y a pas de lien hiérarchique entre SAL (effectifs salariés des entreprises actives) et SAL_DTH (effectifs salariés dans les décès).

# cas où il n'y a aucune hiérarchie sur les indicateurs
metadata_template <- template_formatted$metadata %>% 
  mutate(hrc_indicator = NA) %>% 
  select(table_name,field,indicator,hrc_indicator, everything())

metadata_template
##             table_name field indicator hrc_indicator spanning_1  spanning_2   hrc_spanning_1
## 1 table_2021_SAL_DTH_1  2021   SAL_DTH            NA   ACTIVITY  LEGAL_FORM hrc_activity_131
## 2 table_2021_SAL_DTH_2  2021   SAL_DTH            NA   ACTIVITY NUMBER_EMPL hrc_activity_131
## 3     table_2022_SAL_1  2022       SAL            NA   ACTIVITY  LEGAL_FORM hrc_activity_131
## 4     table_2022_SAL_2  2022       SAL            NA   ACTIVITY NUMBER_EMPL hrc_activity_131
## 5 table_2022_SAL_DTH_1  2022   SAL_DTH            NA   ACTIVITY  LEGAL_FORM hrc_activity_131
## 6 table_2022_SAL_DTH_2  2022   SAL_DTH            NA   ACTIVITY NUMBER_EMPL hrc_activity_131
##      hrc_spanning_2
## 1  hrc_legal_form_3
## 2 hrc_number_empl_4
## 3  hrc_legal_form_3
## 4 hrc_number_empl_4
## 5  hrc_legal_form_3
## 6 hrc_number_empl_4

Ensuite, on utilise ce dataframe en input de la fonction d’analyse.

# Analyse complète, avec les étapes
detailed_analysis <- analyse_metadata(metadata_template, verbose = TRUE)

# Output simplifié, uniquement le dataframe avec l'indicatrice de cluster
cluster_id_dataframe <- analyse_metadata(metadata_template, verbose = FALSE)

# visualisation du résultat de l'analyse
cluster_id_dataframe
## # A tibble: 6 x 8
## # Groups:   table_name [6]
##   cluster      table_name       field indicator spanning_1 spanning_2 hrc_spanning_1 hrc_spanning_2
##   <chr>        <chr>            <chr> <chr>     <chr>      <chr>      <chr>          <chr>         
## 1 2021.SAL_DTH table_2021_SAL_~ 2021  SAL_DTH   HRC_ACTIV~ HRC_LEGAL~ hrc_activity_~ hrc_legal_for~
## 2 2021.SAL_DTH table_2021_SAL_~ 2021  SAL_DTH   HRC_ACTIV~ HRC_NUMBE~ hrc_activity_~ hrc_number_em~
## 3 2022.SAL     table_2022_SAL_1 2022  SAL       HRC_ACTIV~ HRC_LEGAL~ hrc_activity_~ hrc_legal_for~
## 4 2022.SAL     table_2022_SAL_2 2022  SAL       HRC_ACTIV~ HRC_NUMBE~ hrc_activity_~ hrc_number_em~
## 5 2022.SAL_DTH table_2022_SAL_~ 2022  SAL_DTH   HRC_ACTIV~ HRC_LEGAL~ hrc_activity_~ hrc_legal_for~
## 6 2022.SAL_DTH table_2022_SAL_~ 2022  SAL_DTH   HRC_ACTIV~ HRC_NUMBE~ hrc_activity_~ hrc_number_em~

Finalement, il y a 6 tableaux à traiter dans 3 clusters différents. Autrement dit, il faudra faire trois fois appel à tab_multi_manager().

Pour aller plus loin : visualiser les inclusions

L’étape create_edges de l’analyse des métadonnées identifie les tableaux inclus dans d’autres tableaux. Par exemple, XXXXX est inclus dans XXXXX. Le code suivant permet de visualiser ces inclusions à l’aide de graphes afin de mieux comprendre la procédure d’analyse.

## 
## Attachement du package : 'igraph'
## Les objets suivants sont masqués depuis 'package:dplyr':
## 
##     as_data_frame, groups, union
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     decompose, spectrum
## L'objet suivant est masqué depuis 'package:base':
## 
##     union
library(visNetwork)

graph_links_tab <- function(list_desc_links){
  list_desc_links %>% purrr::imap(function(ss_dem,i){
    if(!is.null(ss_dem)){
      nodes <- data.frame(id = unique(unlist(ss_dem)))
      visNetwork(nodes = nodes, edges = ss_dem, main = i) %>% 
        visIgraphLayout() %>% 
        visEdges(shadow = TRUE,
                 arrows =list(to = list(enabled = TRUE, scaleFactor = 0.5)),
                 color = list(color = "steelblue", highlight = "red")) %>% 
        visOptions(highlightNearest = list(enabled = T, hover = T), 
                   nodesIdSelection = T)
    }
  })
}

data(metadata_pizza_lettuce)
detailed_analysis <- analyse_metadata(metadata_pizza_lettuce, verbose = TRUE)

graph_links_tab(detailed_analysis$create_edges)
## $france_entreprises_2023.hrc_lettuce
## 
## $france_entreprises_2023.to_pizza