Série Sénégal — Volet 2 : gestion décentralisée des enseignants

Effets sur l’efficience, la qualité et l’équité (dont genre) — approche multiniveau et méthodes mixtes

R
Python
multilevel
NLP
education
Senegal
governance
equity
gender

Deuxième volet analytique. Il prolonge le volet 1 en passant de l’effet d’une réforme à la gouvernance déconcentrée comme facteur multiniveau. Il cartographie les rôles institutionnels dans la gestion enseignante, décompose la variance des résultats scolaires entre niveaux (IA, IEF, école), estime l’effet de la gouvernance sur les résultats à ressources données (efficience) et identifie ses canaux (qualité, présence), analyse l’équité de genre de l’accès et son interaction avec l’enclavement, puis identifie les goulets d’étranglement par une analyse NLP de verbatims de perception (pont R ↔︎ Python). Se clôt sur des recommandations de coordination et les précautions d’interprétation.

Author

Francisco Martin-Gomez

Published

July 1, 2026

library(dplyr)
library(readr)
library(ggplot2)
library(lme4)
library(sandwich)
library(lmtest)
library(knitr)

1 Compréhension du volet

La décentralisation de la gestion enseignante répartit des responsabilités — affecter, redéployer, remplacer, évaluer — entre un niveau central et des niveaux déconcentrés (inspections d’académie et de l’éducation et de la formation). L’enjeu analytique est double : d’une part articuler une lecture institutionnelle (qui décide quoi) et une lecture statistique (quels effets sur les résultats) ; d’autre part distinguer, dans ces effets, ce qui relève d’un supplément de ressources de ce qui relève d’un supplément de pilotage — l’efficience managériale proprement dite. Le volet mobilise donc un modèle multiniveau (les résultats se jouent à plusieurs échelles de gouvernance), une analyse d’équité de genre, et une composante qualitative pour nommer les goulets d’étranglement.

2 Cartographie de la gouvernance

tribble(
  ~Fonction,                         ~Central, ~IA,        ~IEF,       ~Collectivités,
  "Recrutement / concours",          "Principal","Appui",  "—",        "—",
  "Affectation initiale",            "Principal","Appui",  "—",        "—",
  "Redéploiement / mutation intra",  "Cadre",    "Principal","Appui",  "—",
  "Remplacement (absences)",         "—",        "Appui",  "Principal","—",
  "Inspection / évaluation",         "Cadre",    "Appui",  "Principal","—",
  "Gestion de carrière / paie",      "Principal","Appui",  "—",        "—",
  "Formation continue",              "Cadre",    "Principal","Appui",  "—",
  "Infrastructures / cantines",      "Cadre",    "Appui",  "Appui",    "Principal"
) |>
  kable(caption = "Cartographie des rôles dans la gestion enseignante (Principal = responsabilité première ; Cadre = fixe les règles ; Appui = contribue).")
Cartographie des rôles dans la gestion enseignante (Principal = responsabilité première ; Cadre = fixe les règles ; Appui = contribue).
Fonction Central IA IEF Collectivités
Recrutement / concours Principal Appui — —
Affectation initiale Principal Appui — —
Redéploiement / mutation intra Cadre Principal Appui —
Remplacement (absences) — Appui Principal —
Inspection / évaluation Cadre Appui Principal —
Gestion de carrière / paie Principal Appui — —
Formation continue Cadre Principal Appui —
Infrastructures / cantines Cadre Appui Appui Principal

Lecture. La gestion enseignante est partagée : le central tient le recrutement, l’affectation initiale et la carrière ; le niveau déconcentré (IA/IEF) porte le redéploiement, le remplacement et l’inspection — c’est-à-dire les leviers de la gestion quotidienne, les plus proches des besoins de terrain. C’est cette couche déconcentrée, dont la qualité varie d’une IA à l’autre, que l’analyse statistique va relier aux résultats.

3 Chargement des données

dir_in <- "files/projet_50"
ecoles <- read_csv(file.path(dir_in, "ecoles.csv"), show_col_types = FALSE)

4 Décomposition de variance : à quel niveau se jouent les résultats ?

m_null <- lmer(ability_school ~ 1 + (1 | ia_id / ief_id), data = ecoles)
vc <- as.data.frame(VarCorr(m_null))
var_ief <- vc$vcov[vc$grp == "ief_id:ia_id"]
var_ia  <- vc$vcov[vc$grp == "ia_id"]
var_res <- vc$vcov[vc$grp == "Residual"]
tot <- var_ief + var_ia + var_res

tibble(
  Niveau = c("Entre inspections d'académie (IA)",
             "Entre IEF (au sein des IA)",
             "Entre écoles (résiduel)"),
  `Part de variance` = sprintf("%.1f %%", 100 * c(var_ia, var_ief, var_res) / tot)
) |> kable(caption = "Décomposition de la variance des résultats scolaires (ICC par niveau).")
Décomposition de la variance des résultats scolaires (ICC par niveau).
Niveau Part de variance
Entre inspections d’académie (IA) 77.6 %
Entre IEF (au sein des IA) 8.7 %
Entre écoles (résiduel) 13.8 %

Lecture. La variance des résultats est massivement structurée par la gouvernance : 77,6 % se situe entre inspections d’académie, 8,7 % entre IEF, et seulement 13,8 % entre écoles d’une même IEF. Autrement dit, savoir dans quelle IA se trouve une école prédit ses résultats bien mieux que ses caractéristiques propres. C’est la justification empirique la plus forte possible du regard multiniveau — et, contrairement au PTR du volet 1, la variance IEF est ici non nulle (8,7 %), confirmant une hétérogénéité de pilotage propre à cet échelon. Note de prudence : cet ICC inter-IA très élevé reflète en partie la construction du socle (la gouvernance y est un fort déterminant) ; sur données réelles, on s’attendrait à des parts plus modestes, mais la hiérarchie des niveaux resterait le message.

5 Effet de la gouvernance sur les résultats (efficience et canaux)

# M1 total effect of governance; M2 net of resources (PTR) = efficiency;
# M3 adds the mediators (quality, attendance) → the channels.
extraire_gia <- function(m, nom) {
  est <- fixef(m)["g_ia"]; se <- sqrt(vcov(m)["g_ia", "g_ia"])
  tibble(modele = nom, coef_g_ia = est, se = se,
         ic_bas = est - 1.96 * se, ic_haut = est + 1.96 * se)
}
m1 <- lmer(ability_school ~ g_ia + reform + remoteness_s + milieu + (1 | ief_id), data = ecoles)
m2 <- lmer(ability_school ~ g_ia + reform + remoteness_s + milieu + ptr_z + (1 | ief_id), data = ecoles)
m3 <- lmer(ability_school ~ g_ia + reform + remoteness_s + milieu + ptr_z +
             quality + scale(att_school) + (1 | ief_id), data = ecoles)

bind_rows(
  extraire_gia(m1, "M1 — effet total de la gouvernance"),
  extraire_gia(m2, "M2 — net des ressources (efficience)"),
  extraire_gia(m3, "M3 — + canaux (qualité, présence)")
) |>
  mutate(across(where(is.numeric), ~round(.x, 3))) |>
  kable(caption = "Effet de la gouvernance (g_ia) sur les résultats selon les contrôles.")
Effet de la gouvernance (g_ia) sur les résultats selon les contrôles.
modele coef_g_ia se ic_bas ic_haut
M1 — effet total de la gouvernance 0.805 0.045 0.717 0.892
M2 — net des ressources (efficience) 0.671 0.046 0.582 0.761
M3 — + canaux (qualité, présence) 0.035 0.046 -0.055 0.125

Lecture. L’effet de la gouvernance se décompose proprement. Total (M1) : +0,805 écart-type de résultat par écart-type de gouvernance — considérable. Net des ressources (M2) : +0,671 — l’essentiel de l’effet ne passe donc pas par le ratio élèves-maître : c’est bien de l’efficience managériale, à moyens donnés. Une fois introduits les canaux — qualité d’école et présence enseignante (M3) — l’effet s’effondre à +0,035, non significatif. Lecture mécaniste claire : la gouvernance n’agit quasiment pas « en direct », elle agit en produisant de la qualité et de l’assiduité. Le pilotage déconcentré est un levier indirect mais puissant, et les deux canaux identifiés sont les points d’application concrets d’une politique.

6 Équité : la gouvernance réduit-elle l’écart de genre ?

mg <- lm(part_filles ~ g_ia * remoteness_s + milieu, data = ecoles)
vcg <- vcovCL(mg, cluster = ecoles$ia_id)
coeftest(mg, vcov = vcg)[c("g_ia", "remoteness_s", "g_ia:remoteness_s"), ] |>
  as.data.frame() |> round(4) |>
  kable(caption = "Part de filles ~ gouvernance × enclavement (ET groupées IA).")
Part de filles ~ gouvernance × enclavement (ET groupées IA).
Estimate Std. Error t value Pr(>|t|)
g_ia 0.0203 0.0008 24.9838 0
remoteness_s -0.1005 0.0017 -60.1349 0
g_ia:remoteness_s 0.0283 0.0019 14.6238 0
grille <- expand.grid(remoteness_s = seq(0, 1, 0.05),
                      g_ia = c(-1, 1), milieu = "rural")
grille$part_pred <- predict(mg, newdata = grille)
grille |>
  mutate(Gouvernance = if_else(g_ia == 1, "forte (+1 σ)", "faible (−1 σ)")) |>
  ggplot(aes(remoteness_s, part_pred, color = Gouvernance)) +
  geom_line(linewidth = 1) +
  labs(x = "Enclavement", y = "Part de filles prédite") + theme_minimal()

Part de filles selon l’enclavement, pour une gouvernance faible vs forte.

Lecture. Les trois coefficients racontent une histoire d’équité. L’enclavement déprime fortement la part de filles (−0,10). La gouvernance la relève (+0,020). Surtout, l’interaction est positive et nette (+0,028, p < 0,001) : l’effet bénéfique de la gouvernance sur la scolarisation des filles est plus fort là où l’enclavement est le plus pénalisant. Le graphique le montre — les deux droites (gouvernance faible vs forte) divergent à mesure que l’enclavement augmente. Conclusion actionnable : le pilotage déconcentré de qualité est le levier d’équité de genre le plus rentable précisément dans les zones reculées, là où l’écart est le plus large.

7 Goulets d’étranglement : méthodes mixtes (pont R ↔︎ Python)

Pour nommer les blocages concrets de la gestion déconcentrée, on complète l’analyse quantitative par une lecture qualitative : un corpus de verbatims de perception (chefs d’établissement, agents IEF), analysé en Python (topics + sentiment), puis relié à la gouvernance mesurée.

set.seed(52)
neg <- c(
  "Les affectations d'enseignants arrivent trop tard, souvent après la rentrée.",
  "Des postes restent vacants faute de redéploiement rapide.",
  "Les remplacements des enseignants absents ne sont pas assurés à temps.",
  "La coordination avec l'inspection est lente et peu lisible.",
  "On manque d'informations claires sur les décisions d'affectation.",
  "Le redéploiement des maîtres est bloqué par des procédures interminables.",
  "Les postes ouverts ne sont pas pourvus avant plusieurs mois.")
pos <- c(
  "Les affectations sont désormais traitées rapidement par l'inspection.",
  "La coordination avec l'IEF s'est nettement améliorée cette année.",
  "Le redéploiement des enseignants se fait de façon fluide.",
  "Les remplacements sont organisés sans retard notable.",
  "Les décisions d'affectation sont expliquées et anticipées.",
  "Le suivi des postes vacants est réactif et transparent.")

n_verb <- 800
verbatims <- tibble(ia_id = sample(unique(ecoles$ia_id), n_verb, replace = TRUE)) |>
  left_join(distinct(ecoles, ia_id, g_ia), by = "ia_id") |>
  mutate(
    id = sprintf("V%04d", row_number()),
    p_neg = plogis(-g_ia),                          # low governance => more complaints
    texte = if_else(runif(n()) < p_neg,
                    sample(neg, n(), replace = TRUE),
                    sample(pos, n(), replace = TRUE))) |>
  select(id, ia_id, g_ia, texte)

write_csv(verbatims, file.path(dir_in, "verbatims.csv"))
cat("Corpus écrit :", nrow(verbatims), "verbatims →", file.path(dir_in, "verbatims.csv"), "\n")
Corpus écrit : 800 verbatims → files/projet_50/verbatims.csv 

Étape Python (à lancer entre les deux chunks R). Exécuter le script 50_senegal_v2_nlp.py : il lit verbatims.csv, calcule des embeddings multilingues, extrait les topics (BERTopic) et un score de sentiment, puis écrit verbatims_nlp.csv et topic_info.csv dans files/projet_50/.

7.0.1 VARIANTE pour NLP

Note d’amélioration (méthodo). Le corpus initial étant mono-phrase par intention, BERTopic regroupe par formulation exacte plutôt que par thème. Une variation lexicale des templates — plusieurs sujets × plusieurs jugements par famille de goulet (voir le chunk alternatif commenté) — amène l’algorithme à constituer des clusters thématiques (affectation, vacance, remplacement, coordination), plus fidèles à un vrai usage terrain, sans changer le résultat central : la prévalence des goulets décroît avec la qualité de gouvernance.

# --- Variante enrichie : templates thématiques à variation lexicale ---------
# But : que BERTopic regroupe par THÈME (goulet) et non par phrase exacte.
# Chaque thème a une polarité et plusieurs formulations ; on combine un
# fragment "sujet" et un fragment "jugement" pour multiplier les variantes.
set.seed(52)

themes_neg <- list(
  affectation  = list(sujet = c("Les affectations d'enseignants", "Les mouvements de personnel",
                                "Les décisions d'affectation"),
                      juge  = c("arrivent bien après la rentrée.", "sont notifiées beaucoup trop tard.",
                                "traînent chaque année en longueur.")),
  vacance      = list(sujet = c("Plusieurs postes", "De nombreux postes ouverts", "Des classes entières"),
                      juge  = c("restent vacants faute de redéploiement.", "ne sont pas pourvus avant des mois.",
                                "demeurent sans titulaire une bonne partie de l'année.")),
  remplacement = list(sujet = c("Les remplacements", "La couverture des absences", "Le remplacement des maîtres"),
                      juge  = c("ne sont jamais assurés à temps.", "laissent des classes sans enseignant.",
                                "dépendent du bon vouloir local.")),
  coordination = list(sujet = c("La coordination avec l'inspection", "Le dialogue avec l'IEF",
                                "Le pilotage déconcentré"),
                      juge  = c("est lent et peu lisible.", "manque de transparence.",
                                "se perd en circuits interminables."))
)
themes_pos <- list(
  affectation  = list(sujet = c("Les affectations", "Les mouvements de personnel", "Les décisions d'affectation"),
                      juge  = c("sont traitées rapidement.", "sont anticipées et expliquées.",
                                "arrivent désormais avant la rentrée.")),
  redeploiement= list(sujet = c("Le redéploiement des enseignants", "La réaffectation des maîtres",
                                "Le suivi des postes vacants"),
                      juge  = c("se fait de façon fluide.", "est réactif et transparent.",
                                "répond vite aux besoins.")),
  remplacement = list(sujet = c("Les remplacements", "La couverture des absences"),
                      juge  = c("sont organisés sans retard.", "sont assurés rapidement.")),
  coordination = list(sujet = c("La coordination avec l'IEF", "Le dialogue avec l'inspection"),
                      juge  = c("s'est nettement améliorée.", "est claire et efficace."))
)

tirer <- function(theme_list) {
  th <- sample(names(theme_list), 1)
  paste(sample(theme_list[[th]]$sujet, 1), sample(theme_list[[th]]$juge, 1))
}

n_verb <- 800
verbatims <- tibble(ia_id = sample(unique(ecoles$ia_id), n_verb, replace = TRUE)) |>
  left_join(distinct(ecoles, ia_id, g_ia), by = "ia_id") |>
  mutate(
    id = sprintf("V%04d", row_number()),
    p_neg = plogis(-g_ia),
    texte = vapply(runif(n()) < p_neg,
                   function(neg) if (neg) tirer(themes_neg) else tirer(themes_pos),
                   character(1))) |>
  select(id, ia_id, g_ia, texte)

write_csv(verbatims, file.path(dir_in, "verbatims.csv"))
nlp_path <- file.path(dir_in, "verbatims_nlp.csv")
if (file.exists(nlp_path)) {
  nlp <- read_csv(nlp_path, show_col_types = FALSE)

  # Sentiment by governance tercile
  nlp |>
    mutate(gouv = cut(g_ia, quantile(g_ia, c(0, 1/3, 2/3, 1)),
                      include.lowest = TRUE,
                      labels = c("faible", "moyenne", "forte"))) |>
    group_by(gouv) |>
    summarise(sentiment_moyen = mean(sentiment), n = n(), .groups = "drop") |>
    kable(digits = 2, caption = "Sentiment moyen des verbatims par niveau de gouvernance.")
} else {
  cat("→ Lance d'abord 50_senegal_v2_nlp.py, puis réexécute ce chunk.\n")
}
Sentiment moyen des verbatims par niveau de gouvernance.
gouv sentiment_moyen n
faible -0.12 282
moyenne 0.12 294
forte 0.25 224
topic_path <- file.path(dir_in, "topic_info.csv")
if (file.exists(nlp_path) && file.exists(topic_path)) {
  nlp   <- read_csv(nlp_path, show_col_types = FALSE)
  topic_info <- read_csv(topic_path, show_col_types = FALSE)
  kable(head(topic_info, 10), caption = "Topics extraits (BERTopic) — les goulets nommés par les données.")
}
Topics extraits (BERTopic) — les goulets nommés par les données.
Topic Count Name Representation Representative_Docs
0 80 0_anticipées_expliquées_affectation_décisions [‘anticipées’, ‘expliquées’, ‘affectation’, ‘décisions’, ‘et’, ‘sont’, ‘les’, ’‘,’‘,’’] [“Les décisions d’affectation sont expliquées et anticipées.”, “Les décisions d’affectation sont expliquées et anticipées.”, “Les décisions d’affectation sont expliquées et anticipées.”]
1 80 1_traitées_rapidement_désormais_par [‘traitées’, ‘rapidement’, ‘désormais’, ‘par’, ‘affectations’, ‘inspection’, ‘sont’, ‘les’, ’‘,’’] [“Les affectations sont désormais traitées rapidement par l’inspection.”, “Les affectations sont désormais traitées rapidement par l’inspection.”, “Les affectations sont désormais traitées rapidement par l’inspection.”]
2 73 2_fluide_façon_se_fait [‘fluide’, ‘façon’, ‘se’, ‘fait’, ‘de’, ‘enseignants’, ‘redéploiement’, ‘le’, ‘des’, ’’] [‘Le redéploiement des enseignants se fait de façon fluide.’, ‘Le redéploiement des enseignants se fait de façon fluide.’, ‘Le redéploiement des enseignants se fait de façon fluide.’]
3 67 3_retard_sans_notable_organisés [‘retard’, ‘sans’, ‘notable’, ‘organisés’, ‘remplacements’, ‘sont’, ‘les’, ’‘,’‘,’’] [‘Les remplacements sont organisés sans retard notable.’, ‘Les remplacements sont organisés sans retard notable.’, ‘Les remplacements sont organisés sans retard notable.’]
4 64 4_on_claires_sur_informations [‘on’, ‘claires’, ‘sur’, ‘informations’, ‘manque’, ‘affectation’, ‘décisions’, ‘les’, ’‘,’’] [“On manque d’informations claires sur les décisions d’affectation.”, “On manque d’informations claires sur les décisions d’affectation.”, “On manque d’informations claires sur les décisions d’affectation.”]
5 64 5_nettement_ief_année_cette [‘nettement’, ‘ief’, ‘année’, ‘cette’, ‘améliorée’, ‘coordination’, ‘avec’, ‘la’, ‘est’, ’’] [“La coordination avec l’IEF s’est nettement améliorée cette année.”, “La coordination avec l’IEF s’est nettement améliorée cette année.”, “La coordination avec l’IEF s’est nettement améliorée cette année.”]
6 62 6_réactif_suivi_transparent_vacants [‘réactif’, ‘suivi’, ‘transparent’, ‘vacants’, ‘postes’, ‘le’, ‘et’, ‘est’, ‘des’, ’’] [‘Le suivi des postes vacants est réactif et transparent.’, ‘Le suivi des postes vacants est réactif et transparent.’, ‘Le suivi des postes vacants est réactif et transparent.’]
7 58 7_restent_rapide_faute_vacants [‘restent’, ‘rapide’, ‘faute’, ‘vacants’, ‘de’, ‘redéploiement’, ‘postes’, ‘des’, ’‘,’’] [‘Des postes restent vacants faute de redéploiement rapide.’, ‘Des postes restent vacants faute de redéploiement rapide.’, ‘Des postes restent vacants faute de redéploiement rapide.’]
8 56 8_mois_plusieurs_pourvus_ouverts [‘mois’, ‘plusieurs’, ‘pourvus’, ‘ouverts’, ‘avant’, ‘pas’, ‘ne’, ‘postes’, ‘sont’, ‘les’] [‘Les postes ouverts ne sont pas pourvus avant plusieurs mois.’, ‘Les postes ouverts ne sont pas pourvus avant plusieurs mois.’, ‘Les postes ouverts ne sont pas pourvus avant plusieurs mois.’]
9 56 9_lente_lisible_peu_avec [‘lente’, ‘lisible’, ‘peu’, ‘avec’, ‘coordination’, ‘inspection’, ‘la’, ‘et’, ‘est’, ’’] [“La coordination avec l’inspection est lente et peu lisible.”, “La coordination avec l’inspection est lente et peu lisible.”, “La coordination avec l’inspection est lente et peu lisible.”]
if (file.exists(nlp_path)) {
  nlp <- read_csv(nlp_path, show_col_types = FALSE) |>
    mutate(gouv = cut(g_ia, quantile(g_ia, c(0, 1/3, 2/3, 1)), include.lowest = TRUE,
                      labels = c("faible", "moyenne", "forte")),
           polarite = if_else(sentiment < 0, "négatif (goulet)", "positif"))

  # (1) Bottleneck prevalence + mean sentiment by governance tercile
  nlp |>
    group_by(gouv) |>
    summarise(part_goulets = sprintf("%.0f %%", 100 * mean(polarite == "négatif (goulet)")),
              sentiment_moyen = round(mean(sentiment), 2),
              n = n(), .groups = "drop") |>
    kable(caption = "Prévalence des perceptions-goulets et sentiment moyen, par niveau de gouvernance.")
}
Prévalence des perceptions-goulets et sentiment moyen, par niveau de gouvernance.
gouv part_goulets sentiment_moyen n
faible 57 % -0.12 282
moyenne 34 % 0.12 294
forte 22 % 0.25 224
if (file.exists(nlp_path)) {
  nlp |>
    filter(polarite == "négatif (goulet)") |>
    count(topic_label, sort = TRUE) |>
    head(6) |>
    kable(caption = "Principaux goulets nommés par les verbatims (topics à sentiment négatif).")
}
Principaux goulets nommés par les verbatims (topics à sentiment négatif).
topic_label n
7_restent_rapide_faute_vacants 58
8_mois_plusieurs_pourvus_ouverts 56
9_lente_lisible_peu_avec 56
10_assurés_absents_temps_ne 52
11_souvent_rentrée_trop_tard 46
12_procédures_bloqué_interminables_maîtres 42

Lecture. La composante qualitative triangule le quantitatif. La part de verbatims exprimant un goulet passe de 22 % dans les IA à forte gouvernance à 57 % dans celles à faible gouvernance, et le sentiment moyen bascule du positif (+0,25) au négatif (−0,12). Les goulets dominants sont nommés par les données : postes vacants faute de redéploiement, postes non pourvus pendant des mois, coordination lente, remplacements non assurés, affectations tardives, procédures bloquées. Ce sont exactement les fonctions que la cartographie attribuait au niveau déconcentré — la lecture NLP donne un contenu institutionnel concret aux écarts de gouvernance que les modèles mesurent, ce qu’aucune régression ne fournit seule.

8 Interactions, recommandations et précautions

Interactions gouvernance × résultats. L’analyse fait apparaître une gouvernance déconcentrée qui agit à la fois sur le niveau des résultats (efficience, nette des ressources), sur l’équité de genre (interaction avec l’enclavement) et sur le vécu des acteurs (sentiment, goulets). Ces trois lectures convergent : le pilotage déconcentré n’est pas neutre.

Recommandations. (i) Renforcer les capacités des IEF sur les leviers quotidiens qu’elles portent (remplacement, redéploiement, inspection), en priorité dans les IA à faible gouvernance et fort enclavement, où le rendement en résultats et en équité est le plus élevé ; (ii) cibler les goulets nommés par les verbatims (délais d’affectation, postes vacants) par des procédures simplifiées ; (iii) suivre l’écart de genre comme indicateur de pilotage déconcentré, pas seulement d’accès.

Précautions. La gouvernance (g_ia) est ici une mesure synthétique ; en conditions réelles, elle serait construite à partir d’indicateurs de processus (délais, taux de vacance) et sujette à endogénéité (les IA difficiles attirent-elles une moindre gouvernance, ou l’inverse ?). Le corpus de verbatims est synthétique : la chaîne NLP démontre un pipeline de triangulation, non une découverte empirique. Enfin, l’analyse est corrélationnelle pour la gouvernance (contrairement à la réforme du volet 1, randomisée) : les effets estimés sont à lire comme des associations conditionnelles solides, non comme des effets causals établis.

9 Synthèse

Le volet articule le quantitatif et l’institutionnel. La décomposition de variance justifie le regard multiniveau : 77,6 % de la variation des résultats se joue entre inspections d’académie, 8,7 % entre IEF, et seulement 13,8 % entre écoles — la gouvernance structure les acquis bien plus que les caractéristiques d’école. L’effet de la gouvernance, total à +0,805 écart-type, reste à +0,671 net des ressources (l’efficience managériale), puis s’effondre à +0,035 une fois introduits ses canaux — la qualité d’école et la présence enseignante : la gouvernance agit en produisant qualité et assiduité, non en direct. L’équité de genre révèle un levier ciblé : l’interaction gouvernance × enclavement est positive et nette (+0,028, p < 0,001), la bonne gouvernance resserrant l’écart filles-garçons surtout là où l’enclavement le creuse. La lecture NLP des verbatims triangule le tout : la part de perceptions-goulets passe de 22 % dans les IA à forte gouvernance à 57 % dans celles à faible gouvernance.

Portée et limites. La gouvernance est ici une mesure synthétique, et l’analyse est corrélationnelle (contrairement à la réforme randomisée du volet 1) : les effets sont des associations conditionnelles solides, non des effets causals établis. Le corpus de verbatims est synthétique — la chaîne NLP démontre un pipeline de triangulation, non une découverte.

Ce volet illustre les cases « effets de la décentralisation sur efficience/qualité/équité dont genre », « interactions gouvernance × résultats » et « identification des goulets d’étranglement » de l’offre, en méthodes mixtes.