Analyse automatique des métadonnées


Package {rtauargus}
Source: 

Package {rtauargus}
vignettes/auto_metadata_fr.Rmd
auto_metadata_fr.Rmd
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 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_X
que 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
, siTRUE
la fonction retourne une liste avec les différentes étapes de l’analyse, siFALSE
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.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