La réussite au baccalauréat

Données - DEPP (Éducation nationale)

Auteur·rice
Code
source(here::here("_rinit.R"))
source(here::here("code", "basic_functions.R"))   # dataset_info_lines(), related_data()
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/depp; /usr/local/bin/R -e 'quarto::quarto_render("reussite-au-baccalaureat.qmd")'
# cd ~/iCloud/website/data;      sh _status/run_all_silent.sh --only depp

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 8, fig.height = 4.6, dpi = 150)

bac_path <- here::here("data", "depp", "reussite-au-baccalaureat.parquet")
bac <- arrow::read_parquet(bac_path)

# La colonne 2011 est aberrante dans le fichier source DEPP (nombres ~2x,
# taux de réussite > 100 %) — écartée de tous les graphiques ci-dessous.
bac2 <- dplyr::filter(bac, annee != 2011)

annee_max <- max(bac2$annee)

theme_depp <- ggplot2::theme_minimal(base_size = 12) +
  ggplot2::theme(plot.title    = ggplot2::element_text(face = "bold"),
                 plot.subtitle = ggplot2::element_text(colour = "grey35"),
                 panel.grid.minor = ggplot2::element_blank(),
                 plot.title.position = "plot",
                 legend.position = "bottom")

pal_voie <- c("Baccalauréat général"       = "#2b6cb0",
              "Baccalauréat technologique" = "#dd6b20",
              "Baccalauréat professionnel" = "#38a169",
              "Tous baccalauréats"         = "grey20")
pal_sexe <- c("Garçons" = "#3182ce", "Filles" = "#d53f8c", "Garçons + filles" = "grey30")

Deux séries longues de la DEPP sur les résultats du baccalauréat depuis 1997 : le nombre d’admis et le taux de réussite, ventilés d’une part par voie et série, d’autre part par origine sociale du candidat. Source : DEPP, système d’information OCEAN / Cyclades et ministère chargé de l’agriculture ; France hors Mayotte jusqu’en 2011, France entière ensuite.

Note

Le fichier Excel diffusé par la DEPP contient une colonne 2011 manifestement erronée (effectifs et taux environ doublés). L’année 2011 est conservée telle quelle dans le Parquet mais exclue de tous les graphiques de cette page.

Taux de réussite, toutes voies

Code
bac2 |>
  dplyr::filter(ventilation == "série", indicateur == "Taux de réussite",
                voie == "Tous baccalauréats", sous_categorie == "Ensemble") |>
  ggplot(aes(annee, valeur, colour = sexe)) +
  geom_line(linewidth = 0.9) +
  geom_point(size = 1.6) +
  scale_colour_manual(values = pal_sexe, name = NULL) +
  scale_x_continuous(breaks = scales::breaks_width(4)) +
  scale_y_continuous(labels = scales::label_percent(scale = 1)) +
  labs(title = "Taux de réussite au baccalauréat",
       subtitle = "Tous baccalauréats, France — filles, garçons, ensemble",
       x = NULL, y = NULL) +
  theme_depp

Taux de réussite par voie

Code
bac2 |>
  dplyr::filter(ventilation == "série", indicateur == "Taux de réussite",
                sous_categorie == "Ensemble", sexe == "Garçons + filles") |>
  ggplot(aes(annee, valeur, colour = voie)) +
  geom_line(linewidth = 0.9) +
  scale_colour_manual(values = pal_voie, name = NULL) +
  scale_x_continuous(breaks = scales::breaks_width(4)) +
  scale_y_continuous(labels = scales::label_percent(scale = 1)) +
  labs(title = "Taux de réussite au baccalauréat par voie",
       subtitle = "Ensemble filles + garçons", x = NULL, y = NULL) +
  theme_depp

Nombre d’admis par voie

Code
bac2 |>
  dplyr::filter(ventilation == "série", indicateur == "Admis",
                sous_categorie == "Ensemble", sexe == "Garçons + filles",
                voie != "Tous baccalauréats") |>
  ggplot(aes(annee, valeur, fill = voie)) +
  geom_area(alpha = 0.85) +
  scale_fill_manual(values = pal_voie, name = NULL) +
  scale_x_continuous(breaks = scales::breaks_width(4)) +
  scale_y_continuous(labels = scales::label_number(scale = 1e-3, suffix = " k")) +
  labs(title = "Admis au baccalauréat par voie",
       subtitle = "France, filles + garçons", x = NULL, y = NULL) +
  theme_depp

Taux de réussite selon l’origine sociale

Code
cs_lvls <- bac2 |>
  dplyr::filter(ventilation == "origine sociale", indicateur == "Taux de réussite",
                voie == "Tous baccalauréats", annee == annee_max,
                sous_categorie != "Toutes origines sociales") |>
  dplyr::arrange(valeur) |> dplyr::pull(sous_categorie)

bac2 |>
  dplyr::filter(ventilation == "origine sociale", indicateur == "Taux de réussite",
                voie == "Tous baccalauréats",
                sous_categorie %in% c("CADRE,PROFESS INTELLECTUELLE SUPERIEURE",
                                      "PROFESSION INTERMEDIAIRE", "EMPLOYE", "OUVRIER",
                                      "Toutes origines sociales")) |>
  dplyr::mutate(sous_categorie = stringr::str_to_sentence(sous_categorie)) |>
  ggplot(aes(annee, valeur, colour = sous_categorie)) +
  geom_line(linewidth = 0.9) +
  scale_colour_brewer(palette = "Set1", name = NULL) +
  scale_x_continuous(breaks = scales::breaks_width(4)) +
  scale_y_continuous(labels = scales::label_percent(scale = 1)) +
  labs(title = "Taux de réussite au baccalauréat selon l'origine sociale",
       subtitle = "Tous baccalauréats, France", x = NULL, y = NULL) +
  theme_depp

Code
bac2 |>
  dplyr::filter(ventilation == "origine sociale", indicateur == "Taux de réussite",
                voie == "Tous baccalauréats", annee == annee_max,
                sous_categorie != "Toutes origines sociales") |>
  dplyr::mutate(sous_categorie = factor(stringr::str_to_sentence(sous_categorie),
                                        levels = stringr::str_to_sentence(cs_lvls))) |>
  ggplot(aes(valeur, sous_categorie)) +
  geom_col(fill = "#2b6cb0", width = 0.68) +
  geom_text(aes(label = scales::label_percent(accuracy = 0.1, scale = 1)(valeur)),
            hjust = -0.1, size = 3.1) +
  scale_x_continuous(labels = scales::label_percent(scale = 1),
                     expand = ggplot2::expansion(mult = c(0, 0.12))) +
  labs(title = sprintf("Réussite au bac par origine sociale (%d)", annee_max),
       subtitle = "Taux de réussite — tous baccalauréats, France", x = NULL, y = NULL) +
  theme_depp

Toutes les données

Code
bac |>
  dplyr::transmute(Sexe = sexe, Ventilation = ventilation, Voie = voie,
                   Catégorie = sous_categorie, Indicateur = indicateur,
                   Année = annee, Mention = mention, Valeur = round(valeur, 2)) |>
  dplyr::arrange(dplyr::desc(Année), Ventilation, Voie, Catégorie) |>
  reactable::reactable(
    searchable = TRUE, filterable = TRUE, pagination = TRUE,
    defaultPageSize = 15, compact = TRUE, resizable = TRUE, highlight = TRUE, wrap = TRUE,
    defaultColDef = reactable::colDef(
      align = "left", headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word"))
  )

Source & données

Code
tibble::tibble(
  ` ` = c("Série", "Producteur", "Champ", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[La réussite au baccalauréat](https://www.education.gouv.fr/les-series-statistiques-des-indicateurs-de-resultats-des-lycees-1118) — DEPP",
    "Direction de l'Évaluation, de la Prospective et de la Performance (DEPP), ministère de l'Éducation nationale",
    "France hors Mayotte jusqu'en 2011, France entière ensuite ; y compris ministère chargé de l'agriculture",
    sprintf("`data/depp/reussite-au-baccalaureat.parquet` (%s ko)", round(file.size(bac_path) / 1024)),
    format(as.Date(file.mtime(bac_path)), "%d %B %Y"),
    sprintf("%d lignes, %d–%d (colonne 2011 conservée mais erronée)",
            nrow(bac), min(bac$annee), max(bac$annee))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Série La réussite au baccalauréat — DEPP
Producteur Direction de l’Évaluation, de la Prospective et de la Performance (DEPP), ministère de l’Éducation nationale
Champ France hors Mayotte jusqu’en 2011, France entière ensuite ; y compris ministère chargé de l’agriculture
Fichier data/depp/reussite-au-baccalaureat.parquet (137 ko)
Mise à jour 06 septembre 2026
Observations 5122 lignes, 1997–2025 (colonne 2011 conservée mais erronée)