Afficher le code R
recoder_9899 <- function(x) {
dplyr::case_when(
x %in% c(98, 99) ~ NA_real_,
TRUE ~ as.numeric(x)
)
}Une analyse est-elle vraiment reproductible si le code fonctionne, mais que personne ne sait d’où viennent les données, quelles décisions ont été prises, ni ce qui peut être partagé sans exposer les personnes ?
À la fin de ce chapitre, vous saurez :
{renv} ;Quatre dimensions sont utiles à distinguer.
| Dimension | Question |
|---|---|
| Reproductibilité computationnelle | avec les mêmes données et le même environnement, retrouve-t-on les mêmes résultats ? |
| Traçabilité analytique | peut-on expliquer comment les sources sont devenues le fichier d’analyse ? |
| Provenance | sait-on quelle version de la source, du questionnaire, des poids et des métadonnées a été utilisée ? |
| Ouverture / partage | quels objets peuvent être communiqués, à qui et sous quelles conditions ? |
Un projet confidentiel peut être très reproductible dans un environnement sécurisé. À l’inverse, un dépôt public contenant des fichiers sans dictionnaire ni chaîne de transformation peut être très ouvert mais difficilement reproductible.
La science ouverte ne signifie pas « tout mettre en ligne ». Elle consiste notamment à rendre accessibles les objets qui peuvent l’être, tout en respectant les droits des personnes, les règles du producteur de données, les engagements de collecte et les contraintes institutionnelles.
Une architecture simple suffit souvent :
projet/
├── README.md
├── projet.Rproj
├── renv.lock
├── data/
│ ├── raw/ # sources inchangées
│ ├── derived/ # données reconstruites par script
│ └── documentation/
├── R/ # scripts et fonctions
├── outputs/ # résultats exportés
├── figures/
├── report.qmd
└── .gitignore
La question décisive est :
Si je supprime les fichiers dérivés, tableaux et figures, puis-je les reconstruire à partir des sources autorisées et du code ?
Si la réponse est non, une partie de l’analyse dépend probablement d’une manipulation manuelle, d’un objet caché ou d’une décision non documentée.
data/raw/ devrait idéalement contenir des copies de travail inchangées des sources autorisées. Nettoyer « directement dans Excel » puis enregistrer par-dessus le fichier d’origine rend les transformations difficiles à auditer.
Une règle simple est :
Cette règle ne résout pas tous les problèmes de provenance, mais elle élimine une grande partie des opérations invisibles.
Une fonction peut réduire la répétition. Elle ne doit pas effacer la signification des recodages.
recoder_9899 <- function(x) {
dplyr::case_when(
x %in% c(98, 99) ~ NA_real_,
TRUE ~ as.numeric(x)
)
}Testons-la sur un cas minimal :
x_test <- c(1, 2, 98, 99, NA)
tibble::tibble(
Valeur = x_test,
Après = recoder_9899(x_test)
) |>
knitr::kable()| Valeur | Après |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 98 | NA |
| 99 | NA |
| NA | NA |
Une fonction générique qui applique silencieusement la même règle à vingt variables peut être moins reproductible qu’un code légèrement plus long mais accompagné du dictionnaire qui justifie chaque traitement. Factoriser le code est utile lorsque la logique reste visible.
{renv}Un script correct aujourd’hui peut changer de comportement si les versions de packages évoluent. {renv} crée un environnement de projet et enregistre les dépendances dans renv.lock (Ushey et Wickham 2026).
# À exécuter une fois dans un nouveau projet
# renv::init()
# Lorsque l'environnement est stabilisé
# renv::snapshot()
# Sur une autre machine
# renv::restore()Le lockfile n’est pas une sauvegarde des données ni de R lui-même. Il documente principalement les packages R et leurs versions. Pour une reproduction à long terme, il est utile de noter également la version de R, de Quarto et, lorsque pertinent, du système ou des dépendances externes.
Git est particulièrement utile pour :
Mais un secret ou une donnée personnelle commité puis supprimé peut rester dans l’historique.
.gitignore avant le premier commit# Environnement local
.Rhistory
.RData
.Rproj.user/
# Rendu Quarto
_book/
.quarto/
_freeze/
# Données confidentielles locales
data/private/
data/raw_confidential/
# Secrets
.env
*.key
Les règles de versionnage et d’accès doivent être définies avant d’introduire des microdonnées, des clés, des jetons ou des tables de correspondance. « Je supprimerai le fichier avant de publier » n’est pas une stratégie de sécurité fiable.
Quarto associe code, texte, tableaux et figures (Posit Software, PBC 2026). Cela réduit les copier-coller manuels et permet à une modification de données ou de modèle de mettre à jour le résultat affiché.
La condition importante est que le document puisse être rendu depuis une session propre.
tibble::tibble(
Élément = c("R", "survey", "dplyr", "ggplot2", "gtsummary"),
Version = c(
paste(R.version$major, R.version$minor, sep = "."),
as.character(utils::packageVersion("survey")),
as.character(utils::packageVersion("dplyr")),
as.character(utils::packageVersion("ggplot2")),
if (requireNamespace("gtsummary", quietly = TRUE)) as.character(utils::packageVersion("gtsummary")) else "non installé"
)
) |>
knitr::kable()| Élément | Version |
|---|---|
| R | 4.4.1 |
| survey | 4.5 |
| dplyr | 1.2.1 |
| ggplot2 | 4.0.2 |
| gtsummary | 2.5.0 |
Avant diffusion :
Une analyse qui ne fonctionne que parce qu’un objet persiste dans .GlobalEnv n’est pas reproductible.
Le code montre comment une opération est réalisée. Il ne dit pas nécessairement :
Un projet d’enquête devrait donc conserver, lorsque disponible :
Une table de décisions est souvent plus utile qu’un long commentaire perdu dans un script.
journal <- tibble::tribble(
~date, ~objet, ~decision, ~justification,
"2026-08-14", "age", "999 -> NA", "code spécial documenté",
"2026-08-14", "taille_menage", "valeurs hors plage -> NA", "contrainte du questionnaire",
"2026-08-14", "sport_regulier", "seuil >= hebdomadaire", "définition analytique annoncée"
)
knitr::kable(journal)| date | objet | decision | justification |
|---|---|---|---|
| 2026-08-14 | age | 999 -> NA | code spécial documenté |
| 2026-08-14 | taille_menage | valeurs hors plage -> NA | contrainte du questionnaire |
| 2026-08-14 | sport_regulier | seuil >= hebdomadaire | définition analytique annoncée |
Pour une équipe, on peut ajouter auteur, ticket, commit ou note méthodologique. L’objectif n’est pas la bureaucratie : il est de rendre explicites les choix qui pourraient sinon être oubliés au moment de la rédaction.
Une vraie enquête peut rester constituée de données personnelles après suppression du nom et de l’adresse. La CNIL distingue :
Ainsi, remplacer nom par id = 10428 ne suffit pas à qualifier un fichier d’anonyme.
Une combinaison peut devenir distinctive :
Le risque vient souvent de la combinaison, pas d’une colonne isolée.
Lorsqu’une table de correspondance est nécessaire, elle doit être séparée et protégée. La pseudonymisation réduit le risque et facilite la gouvernance, mais les données restent personnelles (CNIL 2022a).
La minimisation consiste à traiter ce qui est adéquat, pertinent et nécessaire à la finalité. Elle intervient à plusieurs moments :
Une variable « peut-être utile plus tard » n’est pas automatiquement nécessaire au projet présent.
Selon le contexte, une organisation raisonnable peut inclure :
Ce chapitre fournit des principes généraux, pas une validation juridique d’un traitement particulier. Les règles de l’institution, du producteur et du cadre réglementaire applicable priment pour un projet réel.
| Niveau | Ce qui peut être partagé | Cas typique |
|---|---|---|
| 1. Code + métadonnées | scripts, protocole, dictionnaire expurgé, environnement | microdonnées non partageables |
| 2. Données synthétiques | fichier artificiel reproduisant la structure du workflow | enseignement, test de code |
| 3. Données anonymisées | données ayant fait l’objet d’une analyse de risque dédiée | diffusion ouverte possible selon contexte |
| 4. Accès contrôlé | microdonnées détaillées sous conditions | données utiles mais sensibles |
Le choix peut différer entre données, code et sorties. On peut par exemple publier le code et les métadonnées tout en conservant les données sous accès contrôlé.
enqueter est entièrement synthétique et ne représente personne. Dans des projets réels, une méthode de synthèse peut en revanche être construite à partir de données sensibles. Il faut alors examiner :
Une base synthétique est un excellent support de reproductibilité du pipeline ; elle n’est pas automatiquement une réplique substantielle des résultats confidentiels.
Même si le fichier brut reste protégé, un tableau ou une figure peut révéler un profil rare.
cellules <- enqueter |>
filter(!is.na(territoire_f), !is.na(age_classe_f), !is.na(sexe_f)) |>
count(territoire_f, age_classe_f, sexe_f, name = "n")
cellules |>
arrange(n) |>
slice_head(n = 10) |>
rename(
Territoire = territoire_f,
`Classe d'âge` = age_classe_f,
`Sexe / genre` = sexe_f,
Effectif = n
) |>
knitr::kable()| Territoire | Classe d’âge | Sexe / genre | Effectif |
|---|---|---|---|
| Île-de-France | 18-29 | Autre / non-binaire | 1 |
| Île-de-France | 60-79 | Autre / non-binaire | 1 |
| Nord-Ouest | 45-59 | Autre / non-binaire | 1 |
| Sud-Est | 30-44 | Autre / non-binaire | 1 |
| Nord-Est | 18-29 | Autre / non-binaire | 2 |
| Sud-Ouest | 18-29 | Autre / non-binaire | 2 |
| Sud-Ouest | 30-44 | Autre / non-binaire | 2 |
| Sud-Est | 45-59 | Autre / non-binaire | 2 |
| Île-de-France | 45-59 | Autre / non-binaire | 3 |
| Nord-Ouest | 18-29 | Autre / non-binaire | 3 |
ggplot(cellules, aes(x = n)) +
geom_histogram(
binwidth = 5,
boundary = 0,
fill = couleurs_enqueter[["principal"]],
alpha = .82
) +
geom_vline(
xintercept = 10,
linetype = 2,
colour = couleurs_enqueter[["alerte"]]
) +
labs(
x = "Effectif non pondéré de la cellule",
y = "Nombre de cellules",
title = "Croiser des variables crée rapidement des sous-groupes rares",
subtitle = "Le seuil n = 10 est un repère visuel pédagogique, pas une règle universelle",
caption = "Données synthétiques EnquêteR."
) +
theme_enqueter()
Le risque dépend du contenu, de la rareté du profil dans le monde extérieur, des informations auxiliaires accessibles et des règles de diffusion. Aucune valeur universelle de n ne transforme automatiquement une sortie en objet sans risque.
Plusieurs sorties apparemment sûres peuvent parfois être combinées. Par exemple, publier successivement :
peut permettre de déduire indirectement une petite cellule. C’est le principe général des attaques par différenciation ou par recoupement.
La revue de confidentialité doit donc porter sur l’ensemble des sorties diffusées, pas uniquement sur chaque tableau séparément.
audit_projet <- tibble(
Élément = c(
"Configuration Quarto", "Bibliographie", "Données brutes",
"Données dérivées", "Dictionnaire", "Script de reconstruction",
"Script d'initialisation", "Style analytique"
),
Chemin = c(
"_quarto.yml", "references.bib", "data/raw/enqueter_brut.csv",
"data/derived/enqueter_clean.csv", "data/documentation/dictionnaire_variables.xlsx",
"R/01-construire-enqueter-clean.R", "R/04-initialiser-analyse.R",
"R/05-style-enqueter.R"
)
) |>
mutate(
Présent = if_else(file.exists(Chemin), "Oui", "Non")
)
knitr::kable(audit_projet)| Élément | Chemin | Présent |
|---|---|---|
| Configuration Quarto | _quarto.yml | Oui |
| Bibliographie | references.bib | Oui |
| Données brutes | data/raw/enqueter_brut.csv | Oui |
| Données dérivées | data/derived/enqueter_clean.csv | Oui |
| Dictionnaire | data/documentation/dictionnaire_variables.xlsx | Oui |
| Script de reconstruction | R/01-construire-enqueter-clean.R | Oui |
| Script d’initialisation | R/04-initialiser-analyse.R | Oui |
| Style analytique | R/05-style-enqueter.R | Oui |
Cette vérification ne prouve pas la reproductibilité scientifique. Elle rend simplement plusieurs dépendances explicites et permet d’échouer tôt lorsqu’un élément fondamental manque.
Classez les situations suivantes en « reproductibilité », « confidentialité », ou « les deux » :
C:/Users/Marie/Desktop/fichier.csv ;Créez un .gitignore adapté à un projet contenant data/private/, des sorties Quarto et un fichier .env. Vérifiez que les données privées ne sont pas suivies.
Une équipe souhaite diffuser une enquête contenant âge exact, petite commune, profession détaillée et opinions politiques. Proposez au moins trois stratégies de diffusion graduée et expliquez les compromis entre utilité scientifique et risque.
Faites l’audit d’un de vos projets selon quatre axes : reconstructibilité, provenance, confidentialité des données, confidentialité des sorties. Produisez un plan d’action priorisé en trois niveaux : critique, important, amélioration.
{renv} aide à rendre l’environnement logiciel explicite.Pour la reproductibilité technique, voir la documentation de {renv} (Ushey et Wickham 2026) et de Quarto (Posit Software, PBC 2026). Pour les données personnelles et la recherche scientifique en France, les ressources de la CNIL sur anonymisation, pseudonymisation et sécurité constituent des points de départ à consulter dans leur version à jour (CNIL 2020, 2022a, 2022b).