Annexe E — Examens blancs et cas d’évaluation
Cette annexe propose trois sujets progressifs. Ils peuvent être utilisés en entraînement, en contrôle continu ou comme base pour construire une évaluation de M2.
Les données sont celles du jeu synthétique enqueter. Les étudiants peuvent disposer du dictionnaire de variables et du questionnaire.
F Examen blanc 1 — Préparation et description
Durée indicative : 1 h 30
Barème : 20 points
Objectif : vérifier la maîtrise du workflow import → diagnostic → nettoyage → description.
F.1 Situation
Vous recevez data/raw/enqueter_brut.csv. Votre responsable vous demande une courte note sur la satisfaction de vie et la pratique sportive.
F.2 Question 1 — Import et structure — 2 points
Importez le fichier avec {readr}. Donnez :
- le nombre de lignes et de colonnes ;
- le nombre d’identifiants distincts ;
- le type R de
age,sport_freqetrevenu_mensuel.
F.3 Question 2 — Doublons — 2 points
Identifiez les identifiants apparaissant plusieurs fois. Expliquez pourquoi distinct(id, .keep_all = TRUE) ne doit pas être appliqué sans avoir inspecté les lignes concernées.
F.4 Question 3 — Codes et valeurs impossibles — 4 points
À l’aide du dictionnaire :
- distinguez le code
age = 999d’un âge hors champ ; - repérez les âges hors 18–79, hors code spécial ;
- repérez les valeurs de
info_reseauxqui ne correspondent ni aux réponses attendues ni aux codes spéciaux.
Proposez un recodage approprié dans un nouvel objet.
F.5 Question 4 — Variable dérivée — 3 points
Créez sport_regulier :
- 1 si pratique une fois par semaine ou plus ;
- 0 si pratique moins souvent ou jamais ;
NApour les codes de non-réponse.
Montrez un tableau permettant de vérifier le recodage.
F.6 Question 5 — Description — 4 points
Sur le fichier nettoyé :
- calculez la moyenne et la médiane de l’âge ;
- calculez la proportion brute de
sport_regulier = 1; - décrivez les valeurs manquantes de
revenu_mensuel.
Rédigez trois phrases d’interprétation.
F.7 Question 6 — Graphique — 3 points
Produisez une figure montrant la pratique sportive régulière selon diplome_4 ou, si vous travaillez depuis le brut, selon une version regroupée du diplôme. Le graphique doit avoir des labels lisibles et un titre informatif.
F.8 Question 7 — Reproductibilité — 2 points
Expliquez pourquoi le fichier brut ne doit pas être modifié directement et proposez une arborescence minimale pour conserver le brut, le fichier dérivé, le script et la figure.
F.9 Corrigé — Examen 1
F.9.1 Q1
library(tidyverse)
brut <- read_csv(
"data/raw/enqueter_brut.csv",
show_col_types = FALSE
)
dim(brut)
n_distinct(brut$id)
class(brut$age)
class(brut$sport_freq)
class(brut$revenu_mensuel)Le fichier pédagogique contient 3 600 lignes et 36 colonnes, avec 3 592 identifiants uniques. Les variables codées numériquement ne doivent pas pour autant être interprétées toutes comme quantitatives.
F.9.2 Q2
brut %>%
count(id) %>%
filter(n > 1)Il faut comparer les lignes dupliquées avant de décider laquelle conserver. Un identifiant identique peut représenter un doublon exact, une mise à jour, une erreur d’identifiant ou plusieurs lignes légitimes selon l’unité d’analyse.
F.9.3 Q3
brut %>%
filter(age != 999, age < 18 | age > 79) %>%
select(id, age)
brut %>%
filter(!info_reseaux %in% c(0, 1, 8, 9)) %>%
select(id, info_reseaux)Puis, dans un nouvel objet :
propre <- brut %>%
distinct(id, .keep_all = TRUE) %>%
mutate(
age = case_when(
age == 999 ~ NA_real_,
age < 18 | age > 79 ~ NA_real_,
TRUE ~ as.numeric(age)
),
info_reseaux = case_when(
info_reseaux %in% c(8, 9) ~ NA_real_,
info_reseaux %in% c(0, 1) ~ as.numeric(info_reseaux),
TRUE ~ NA_real_
)
)La copie doit expliquer que les valeurs invalides et les non-réponses ont des origines différentes, même si elles deviennent toutes NA pour certains calculs.
F.9.4 Q4
propre <- propre %>%
mutate(
sport_freq = if_else(
sport_freq %in% c(8, 9),
NA_real_,
as.numeric(sport_freq)
),
sport_regulier = case_when(
sport_freq %in% c(3, 4) ~ 1,
sport_freq %in% c(0, 1, 2) ~ 0,
TRUE ~ NA_real_
)
)
with(propre, table(sport_freq, sport_regulier, useNA = "ifany"))F.9.5 Q5
propre %>%
summarise(
age_moyen = mean(age, na.rm = TRUE),
age_median = median(age, na.rm = TRUE),
sport = mean(sport_regulier, na.rm = TRUE),
taux_na_revenu = mean(revenu_mensuel %in% c(99997, 99998) | is.na(revenu_mensuel))
)L’interprétation doit distinguer description brute de l’échantillon et estimation de population ; les poids n’ont pas encore été mobilisés dans ce sujet.
F.9.6 Q6
Une solution possible :
ggplot(
propre %>% filter(!is.na(sport_regulier)),
aes(x = factor(diplome), fill = factor(sport_regulier))
) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
labs(
x = "Diplôme",
y = "Proportion",
fill = "Sport régulier"
) +
theme_minimal()Un bonus méthodologique peut être accordé à l’étudiant qui signale que le graphique brut n’est pas encore pondéré.
F.9.7 Q7
Arborescence attendue :
projet/
├── data/raw/
├── data/derived/
├── R/
└── figures/
Le fichier brut est une source. Les corrections doivent être reproductibles par script.
F.9.8 Barème détaillé — Examen 1
| Critère | Points |
|---|---|
| Import / dimensions / types | 2 |
| Diagnostic doublons | 2 |
| Codes et anomalies | 4 |
| Recodage contrôlé | 3 |
| Statistiques descriptives + interprétation | 4 |
| Graphique | 3 |
| Reproductibilité | 2 |
G Examen blanc 2 — Design, inférence et interprétation
Durée indicative : 2 h
Barème : 20 points
G.1 Situation
Vous travaillez cette fois sur data/derived/enqueter_clean.csv. Vous devez produire des estimations tenant compte du plan d’enquête.
G.2 Question 1 — Construire le design — 3 points
Construisez un objet survey.design utilisant psu, strate et poids_final. Expliquez en une phrase le rôle de chacun de ces éléments.
G.3 Question 2 — Moyenne et proportion — 4 points
Estimez :
- l’âge moyen ;
- la proportion pratiquant un sport au moins hebdomadaire ;
- leurs intervalles de confiance.
Comparez la moyenne d’âge pondérée à la moyenne brute.
G.4 Question 3 — Tableau croisé — 4 points
Étudiez l’association entre diplôme et pratique sportive régulière :
- proportions pondérées de sport régulier par diplôme ;
- test global d’association tenant compte du design ;
- commentaire de 5 à 8 lignes.
G.5 Question 4 — Comparaison de moyennes — 3 points
Comparez la satisfaction moyenne selon le sexe/genre déclaré. Présentez les estimations par groupe et proposez un test adapté au design.
G.6 Question 5 — Interpréter une p-value — 2 points
Expliquez pourquoi « p = 0,02 signifie qu’il y a 98 % de chances que l’hypothèse alternative soit vraie » est faux.
G.7 Question 6 — Plan et sous-population — 2 points
Vous souhaitez analyser uniquement les personnes en emploi. Expliquez pourquoi subset(design, en_emploi == 1) est préférable à une suppression des autres observations avant la construction du design.
G.8 Question 7 — Communication — 2 points
Rédigez une note de bas de tableau indiquant les éléments du plan pris en compte et distinguant effectif brut et estimations pondérées.
G.9 Corrigé — Examen 2
G.9.1 Q1
library(tidyverse)
library(survey)
enqueter <- read_csv(
"data/derived/enqueter_clean.csv",
show_col_types = FALSE
)
enqueter <- enqueter %>%
mutate(
sport_regulier = case_when(
sport_freq %in% c(3, 4) ~ 1,
sport_freq %in% c(0, 1, 2) ~ 0,
TRUE ~ NA_real_
)
)
design <- svydesign(
ids = ~psu,
strata = ~strate,
weights = ~poids_final,
data = enqueter,
nest = TRUE
)psu décrit l’unité primaire de tirage, strate la stratification et poids_final la contribution des unités aux estimations de population selon le dispositif pédagogique.
G.9.2 Q2
age_est <- svymean(~age, design, na.rm = TRUE)
sport_est <- svymean(~sport_regulier, design, na.rm = TRUE)
age_est
confint(age_est)
sport_est
confint(sport_est)
mean(enqueter$age, na.rm = TRUE)La comparaison brute/pondérée doit porter sur la cible : l’une décrit les observations, l’autre utilise le système de pondération.
G.9.3 Q3
svyby(
~sport_regulier,
~diplome_4,
design,
svymean,
na.rm = TRUE,
vartype = c("se", "ci")
)
svychisq(
~diplome_4 + sport_regulier,
design,
statistic = "F"
)Le commentaire doit présenter les proportions avant la p-value et ne pas conclure à un effet causal du diplôme.
G.9.4 Q4
design2 <- update(
design,
sexe_f = factor(
sexe,
levels = c(1, 2, 3),
labels = c("Homme", "Femme", "Autre/non-binaire")
)
)
svyby(
~satisfaction_vie,
~sexe_f,
design2,
svymean,
na.rm = TRUE,
vartype = "ci"
)Pour une comparaison strictement à deux groupes, svyttest() peut être utilisé après restriction aux deux catégories concernées. Pour trois groupes, un modèle ou un test global approprié est préférable.
G.9.5 Q5
La p-value est calculée sous l’hypothèse nulle. Elle mesure la compatibilité de la statistique observée avec cette hypothèse selon le modèle de test. Elle ne donne pas directement une probabilité a posteriori de H0 ou H1.
G.9.6 Q6
Le sous-ensemble d’un objet de design conserve les informations nécessaires au calcul de variance pour le domaine. Supprimer les observations avant de définir le plan peut altérer la représentation du mécanisme d’échantillonnage.
G.9.7 Q7
Exemple : « Estimations pondérées tenant compte des poids finaux, de la stratification et des unités primaires d’échantillonnage. Les n présentés sont des effectifs non pondérés ; les pourcentages et intervalles de confiance sont pondérés. »
H Examen blanc 3 — Analyse complète et modélisation
Durée indicative : 3 h
Barème : 20 points
H.1 Situation
Vous devez répondre à la question :
La confiance dans la science est-elle associée au niveau de diplôme et à l’âge, après prise en compte du sexe et de l’état de santé ?
confiance_science est mesurée de 1 (« pas du tout confiance ») à 5 (« tout à fait confiance »).
Vous pouvez traiter cette variable comme ordinale dans l’analyse principale.
H.2 Question 1 — Plan d’analyse — 2 points
Avant tout code, rédigez :
- la variable dépendante ;
- l’exposition principale ;
- trois covariables ;
- le modèle principal ;
- une analyse de sensibilité.
H.3 Question 2 — Préparation — 3 points
Construisez un facteur ordinal pour confiance_science et des facteurs lisibles pour le sexe et le diplôme. Vérifiez les effectifs par catégorie.
H.4 Question 3 — Description pondérée — 3 points
Estimez la distribution pondérée de la confiance dans la science et produisez une figure avec les pourcentages.
H.5 Question 4 — Modèle ordinal — 5 points
Ajustez un modèle ordinal tenant compte du design :
confiance_science ~ diplome_4 + age + sexe + sante.
Expliquez :
- la catégorie/ordre de la réponse ;
- la signification générale des coefficients ;
- pourquoi les probabilités prédites peuvent être préférables pour communiquer.
H.6 Question 5 — Sensibilité — 3 points
Proposez et réalisez une analyse de sensibilité où la confiance est dichotomisée :
- 1 pour niveaux 4–5 ;
- 0 pour niveaux 1–3.
Comparez la conclusion au modèle ordinal.
H.7 Question 6 — Limites — 2 points
Donnez au moins quatre limites possibles, dont au moins une liée au plan ou à la mesure.
H.8 Question 7 — Reproductibilité — 2 points
Décrivez les fichiers que vous fourniriez pour permettre de reproduire l’analyse sans nécessairement publier les microdonnées réelles.
H.9 Corrigé — Examen 3
H.9.1 Q1
Une proposition :
- Y : confiance dans la science, ordinale 1–5 ;
- exposition principale :
diplome_4; - covariables : âge, sexe/genre, santé ;
- modèle principal :
survey::svyolr(); - sensibilité : dichotomisation 4–5 vs 1–3 avec
svyglm(..., quasibinomial()).
H.9.2 Q2
enqueter3 <- enqueter %>%
mutate(
conf_science_ord = factor(
confiance_science,
levels = 1:5,
labels = c(
"Pas du tout", "Peu", "Ni l'un ni l'autre",
"Plutôt", "Tout à fait"
),
ordered = TRUE
),
sexe_f = factor(
sexe,
levels = c(1, 2, 3),
labels = c("Homme", "Femme", "Autre/non-binaire")
),
diplome_4 = factor(
diplome_4,
levels = c(
"Inférieur au bac", "Bac", "Bac+2", "Supérieur long"
)
),
sante_ord = factor(
sante,
levels = 1:5,
labels = c(
"Très bonne", "Bonne", "Moyenne", "Mauvaise", "Très mauvaise"
),
ordered = TRUE
)
)H.9.3 Q3
design3 <- svydesign(
ids = ~psu,
strata = ~strate,
weights = ~poids_final,
data = enqueter3,
nest = TRUE
)
svytable(~conf_science_ord, design3)
prop.table(svytable(~conf_science_ord, design3))Pour le graphique, convertir le tableau pondéré en data.frame puis utiliser geom_col().
H.9.4 Q4
mod_ord <- svyolr(
conf_science_ord ~ diplome_4 + age + sexe_f + sante_ord,
design = design3
)
summary(mod_ord)La copie doit vérifier que les niveaux 1→5 vont bien de faible vers forte confiance. Les coefficients sont liés aux odds cumulées selon la convention du modèle. Les probabilités par catégorie sont plus faciles à expliquer à un lecteur non spécialiste et réduisent le risque de mal lire le signe d’un coefficient ordinal.
H.9.5 Q5
design3 <- update(
design3,
conf_haute = case_when(
confiance_science %in% c(4, 5) ~ 1,
confiance_science %in% c(1, 2, 3) ~ 0,
TRUE ~ NA_real_
)
)
mod_bin <- svyglm(
conf_haute ~ diplome_4 + age + sexe_f + sante_ord,
design = design3,
family = quasibinomial()
)
summary(mod_bin)Le modèle binaire répond à une question plus grossière. Une conclusion stable est rassurante ; une différence forte indique que le choix de seuil structure l’interprétation et doit être discuté.
H.9.6 Q6
Limites possibles : mesure auto-déclarée ; étude transversale ; associations non causales ; non-réponse ; catégories rares ; hypothèse d’odds proportionnelles ; dépendance aux poids ; éventuelle erreur de couverture ; simplification du diplôme ; sensibilité au traitement des valeurs manquantes.
H.9.7 Q7
Partager au minimum : code, document Quarto, renv.lock, dictionnaire de variables, questionnaire si autorisé, README, description du design et des poids, métadonnées, et éventuellement une base synthétique reproduisant la structure. Les microdonnées sensibles peuvent rester sous accès contrôlé.
I Conseils pour l’enseignant
Ces sujets peuvent être adaptés de plusieurs manières :
- fournir ou non le dictionnaire ;
- exiger un script
.Rou un rendu.qmd; - retirer certaines lignes de code de la correction et demander une justification ;
- utiliser une nouvelle graine pour générer une variante du jeu synthétique ;
- demander un oral de cinq minutes centré sur l’interprétation plutôt que sur la syntaxe.
Pour limiter l’évaluation à la mémorisation du code, le barème devrait toujours attribuer une part substantielle à :
- la définition de l’univers ;
- la justification des recodages ;
- le choix du design ;
- l’interprétation de l’incertitude ;
- les limites ;
- la reproductibilité.