library(rtauargus) library(dplyr)
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.
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
.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 \ref{sec:args_template}. 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.
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 \ref{sec:crea_meta}.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.format_template
\label{sec:args_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).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.
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()
.
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.
library(rtauargus) library(igraph)
## ## 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
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.