Analyse automatique des métadonnées


Package {rtauargus}
            
      
      Source : 

Package {rtauargus}
vignettes/auto_metadata_fr.Rmd
      auto_metadata_fr.RmdIntroduction
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 vautNA. 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 vautNA. 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 vautNA. 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 colonnesspanning_Xque de colonneshrc_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 typelogical, siTRUEla fonction retourne une liste avec les différentes étapes de l’analyse, siFALSEelle 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ù les métadonnées en input sont au bon format
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##                               cluster  table_name                   field indicator spanning_1 spanning_2    spanning_3 hrc_spanning_1 hrc_spanning_2
## 1 france_entreprises_2023.hrc_lettuce  T10.T12.T8 france_entreprises_2023   LETTUCE    HRC_NAF         cj HRC_LETTUCE^h        hrc_naf           <NA>
## 2 france_entreprises_2023.hrc_lettuce   T11.T7.T9 france_entreprises_2023   LETTUCE    HRC_NAF       size HRC_LETTUCE^h        hrc_naf           <NA>
## 3    france_entreprises_2023.to_pizza       T1.T2 france_entreprises_2023  to_pizza   HRC_NUTS       size          <NA>       hrc_nuts           <NA>
## 4    france_entreprises_2023.to_pizza T3.T4.T5.T6 france_entreprises_2023  to_pizza    HRC_NAF   HRC_NUTS          <NA>        hrc_naf       hrc_nuts
##   hrc_spanning_3
## 1    hrc_lettuce
## 2    hrc_lettuce
## 3           <NA>
## 4           <NA>
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. Il
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 est une liste des différentes
étapes de l’analyse.
names(detailed_analysis)## [1] "identify_hrc"        "info_var"            "split_in_clusters"   "create_edges"        "grp_tab_names"       "grp_tab_in_clusters" "tab_to_treat"       
## [8] "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 sous-liste tab_to_treat est un
cluster indépendant. Les autres éléments de la liste sont les é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.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
soi-même en fonction des informations que l’on 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    hrc_spanning_2
## 1 table_2021_SAL_DTH_1  2021   SAL_DTH            NA   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 2 table_2021_SAL_DTH_2  2021   SAL_DTH            NA   ACTIVITY NUMBER_EMPL hrc_activity_131 hrc_number_empl_4
## 3     table_2022_SAL_1  2022       SAL            NA   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 4     table_2022_SAL_2  2022       SAL            NA   ACTIVITY NUMBER_EMPL hrc_activity_131 hrc_number_empl_4
## 5 table_2022_SAL_DTH_1  2022   SAL_DTH            NA   ACTIVITY  LEGAL_FORM hrc_activity_131  hrc_legal_form_3
## 6 table_2022_SAL_DTH_2  2022   SAL_DTH            NA   ACTIVITY NUMBER_EMPL hrc_activity_131 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)## Error in check_column_names(df_metadata): Error: The dataframe is missing one or more required columns: table_name, field, hrc_field, indicator, hrc_indicator.
# Output simplifié, uniquement le dataframe avec l'indicatrice de cluster
cluster_id_dataframe <- analyse_metadata(metadata_template, verbose = FALSE)## Error in check_column_names(df_metadata): Error: The dataframe is missing one or more required columns: table_name, field, hrc_field, indicator, hrc_indicator.
# visualisation du résultat de l'analyse
cluster_id_dataframe##                               cluster  table_name                   field indicator spanning_1 spanning_2    spanning_3 hrc_spanning_1 hrc_spanning_2
## 1 france_entreprises_2023.hrc_lettuce  T10.T12.T8 france_entreprises_2023   LETTUCE    HRC_NAF         cj HRC_LETTUCE^h        hrc_naf           <NA>
## 2 france_entreprises_2023.hrc_lettuce   T11.T7.T9 france_entreprises_2023   LETTUCE    HRC_NAF       size HRC_LETTUCE^h        hrc_naf           <NA>
## 3    france_entreprises_2023.to_pizza       T1.T2 france_entreprises_2023  to_pizza   HRC_NUTS       size          <NA>       hrc_nuts           <NA>
## 4    france_entreprises_2023.to_pizza T3.T4.T5.T6 france_entreprises_2023  to_pizza    HRC_NAF   HRC_NUTS          <NA>        hrc_naf       hrc_nuts
##   hrc_spanning_3
## 1    hrc_lettuce
## 2    hrc_lettuce
## 3           <NA>
## 4           <NA>
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
## L'objet suivant est masqué depuis 'package:testthat':
## 
##     compare
## 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