Indice de position sociale des collèges (IPS)

Données - DEPP (Éducation nationale)

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"))
suppressMessages(library(sf))
# cd ~/iCloud/website/data/depp; /usr/local/bin/R -e 'quarto::quarto_render("fr-en-ips_colleges.qmd")'

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

ips_path <- here::here("data", "depp", "fr-en-ips_colleges.parquet")
ips <- arrow::read_parquet(ips_path) |>
  dplyr::mutate(
    annee   = as.integer(substr(rentree_scolaire, 1, 4)),
    secteur = dplyr::recode(secteur, public = "Public",
                            `privé sous contrat` = "Privé sous contrat"),
    arr     = dplyr::if_else(grepl("^PARIS \\d", nom_de_la_commune),
                             as.integer(stringr::str_extract(nom_de_la_commune, "\\d+")), NA_integer_),
    college = stringr::str_to_title(sub("^COLL[EÈ]GE (PRIV[EÉ] )?", "", nom_de_l_etablissment))
  )

an <- max(ips$annee)
paris   <- dplyr::filter(ips, departement == "PARIS", !is.na(arr))
paris14 <- dplyr::filter(paris, arr == 14)

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_secteur <- c("Public" = "#2b6cb0", "Privé sous contrat" = "#dd6b20")

wkb2sfc <- function(x) sf::st_as_sfc(structure(lapply(x, as.raw), class = "WKB"), EWKB = FALSE)
arr_sf <- arrow::read_parquet(here::here("data", "paris", "arrondissements.parquet")) |>
  dplyr::transmute(arr = as.integer(c_ar), geometry = wkb2sfc(geom)) |>
  sf::st_as_sf(crs = 4326)

L’indice de position sociale (IPS) résume, pour chaque collège, le milieu social de ses élèves : construit à partir de la profession des parents, il est calé pour valoir environ 103 en moyenne nationale ; plus il est élevé, plus le recrutement est favorisé. C’est l’ingrédient central du modèle qui calcule les résultats attendus du brevet et donc la valeur ajoutée des collèges.

Rentrées 2016 à 2021 ; 7 014 collèges publics et privés sous contrat.

Paris — recrutement le plus favorisé, et parmi les plus inégaux

Code
dep <- ips |>
  dplyr::filter(annee == an) |>
  dplyr::group_by(departement) |>
  dplyr::summarise(ips = mean(ips, na.rm = TRUE), n = dplyr::n(), .groups = "drop") |>
  dplyr::filter(n >= 15)

dplyr::bind_rows(dplyr::slice_max(dep, ips, n = 12), dplyr::slice_min(dep, ips, n = 5)) |>
  dplyr::distinct() |>
  ggplot(aes(ips, forcats::fct_reorder(departement, ips),
             fill = departement == "PARIS")) +
  geom_col(width = 0.7) +
  geom_vline(xintercept = 103, linetype = "dashed", colour = "grey40") +
  scale_fill_manual(values = c(`TRUE` = "#c0392b", `FALSE` = "#4a7bb0"), guide = "none") +
  labs(title = "IPS moyen des collèges par département",
       subtitle = sprintf("Rentrée %d · 12 premiers + 5 derniers · pointillé = moyenne nationale (~103)", an),
       x = "IPS moyen", y = NULL) +
  theme_depp

Code
va_arr <- paris |> dplyr::filter(annee == an) |>
  dplyr::group_by(arr) |> dplyr::summarise(ips = mean(ips, na.rm = TRUE), .groups = "drop")

arr_sf |>
  dplyr::left_join(va_arr, by = "arr") |>
  ggplot() +
  geom_sf(aes(fill = ips), colour = "white", linewidth = 0.3) +
  geom_sf_text(aes(label = arr), size = 3, colour = "grey20") +
  geom_sf(data = dplyr::filter(arr_sf, arr == 14), fill = NA, colour = "black", linewidth = 0.8) +
  scale_fill_gradient(low = "#f0e6d8", high = "#5a3e8c", name = "IPS moyen") +
  labs(title = sprintf("IPS moyen des collèges par arrondissement (%d)", an),
       subtitle = "Le 14e est encadré · Paris va de ~101 (18e) à ~145 (7e)") +
  theme_void(base_size = 12) +
  ggplot2::theme(plot.title = ggplot2::element_text(face = "bold"),
                 plot.subtitle = ggplot2::element_text(colour = "grey35"),
                 plot.title.position = "plot")

Code
paris |>
  dplyr::filter(annee == an) |>
  dplyr::mutate(arr = factor(arr, levels = 1:20)) |>
  ggplot(aes(ips, arr)) +
  geom_vline(xintercept = 103, linetype = "dashed", colour = "grey55") +
  geom_point(aes(colour = secteur), size = 2.4, alpha = 0.85,
             position = position_jitter(height = 0.12, seed = 1)) +
  scale_colour_manual(values = pal_secteur, name = NULL) +
  scale_y_discrete(limits = rev) +
  labs(title = "Chaque collège parisien selon son IPS et son arrondissement",
       subtitle = sprintf("Rentrée %d — un même arrondissement mêle des recrutements très contrastés", an),
       x = "IPS", y = "Arrondissement") +
  theme_depp

Focus : les collèges du 14e

Code
paris14 |>
  dplyr::filter(annee == an) |>
  dplyr::arrange(dplyr::desc(ips)) |>
  dplyr::transmute(Collège = college, Secteur = secteur, IPS = ips,
                   `Écart-type` = ecart_type_de_l_ips) |>
  reactable::reactable(
    pagination = FALSE, compact = TRUE, resizable = TRUE, highlight = TRUE, wrap = TRUE,
    defaultColDef = reactable::colDef(align = "left",
      headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word")),
    columns = list(
      Collège = reactable::colDef(minWidth = 180),
      IPS = reactable::colDef(style = function(v) if (!is.na(v)) list(
        fontWeight = "bold",
        color = if (v >= 103) "#2b6cb0" else "#c0392b") else NULL)))

Au sein du seul 14e, l’écart d’IPS entre le collège au recrutement le plus favorisé et le moins favorisé atteint 48 points — davantage que l’écart entre le département de Paris et la Guyane.

Code
paris14 |>
  ggplot(aes(annee, ips, colour = college, group = college)) +
  geom_hline(yintercept = 103, linetype = "dashed", colour = "grey55") +
  geom_line(aes(linetype = secteur), linewidth = 0.8) +
  geom_point(size = 1.8) +
  scale_x_continuous(breaks = sort(unique(paris14$annee))) +
  scale_linetype_manual(values = c("Public" = "solid", "Privé sous contrat" = "31"), name = NULL) +
  scale_colour_brewer(palette = "Paired", name = NULL) +
  labs(title = "IPS des collèges du 14e",
       subtitle = paste0("Rentrées ", min(paris14$annee), "–", an,
                         " · trait pointillé = privé sous contrat · ligne grise = moyenne nationale"),
       x = NULL, y = "IPS") +
  theme_depp +
  ggplot2::theme(legend.text = ggplot2::element_text(size = 9)) +
  ggplot2::guides(colour = ggplot2::guide_legend(ncol = 3),
                  linetype = ggplot2::guide_legend(order = 1))

Tous les collèges de Paris

Code
ips |>
  dplyr::filter(departement == "PARIS") |>
  dplyr::transmute(
    Rentrée = rentree_scolaire, UAI = uai, Collège = nom_de_l_etablissment,
    Commune = nom_de_la_commune, Secteur = secteur,
    IPS = ips, `Écart-type IPS` = ecart_type_de_l_ips) |>
  dplyr::arrange(dplyr::desc(Rentrée), Commune, Collège) |>
  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")))

Le fichier complet (France entière, 41 701 lignes) est interrogeable sur data.education.gouv.fr.

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Champ", "Définition", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Indice de position sociale des collèges](https://data.education.gouv.fr/explore/dataset/fr-en-ips_colleges/) — DEPP",
    "Direction de l'Évaluation, de la Prospective et de la Performance (DEPP), ministère de l'Éducation nationale",
    "France ; collèges publics et privés sous contrat",
    "IPS : score synthétique du milieu social des élèves d'un établissement (professions des parents), calé à ~103 en moyenne nationale ; l'écart-type mesure l'hétérogénéité sociale interne (disponible à partir de la rentrée 2019)",
    sprintf("`data/depp/fr-en-ips_colleges.parquet` (%s ko)", round(file.size(ips_path) / 1024)),
    format(as.Date(file.mtime(ips_path)), "%d %B %Y"),
    sprintf("%s lignes, rentrées %d–%d",
            format(nrow(ips), big.mark = " "), min(ips$annee), an)
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Indice de position sociale des collèges — DEPP
Producteur Direction de l’Évaluation, de la Prospective et de la Performance (DEPP), ministère de l’Éducation nationale
Champ France ; collèges publics et privés sous contrat
Définition IPS : score synthétique du milieu social des élèves d’un établissement (professions des parents), calé à ~103 en moyenne nationale ; l’écart-type mesure l’hétérogénéité sociale interne (disponible à partir de la rentrée 2019)
Fichier data/depp/fr-en-ips_colleges.parquet (735 ko)
Mise à jour 08 septembre 2026
Observations 41 701 lignes, rentrées 2016–2021