Les titres de séjour - les-titres-de-sejour

Données - DSED

Source : DSED, ministère de l’Intérieur, MI-AGDREF. Champ : France, ressortissants de pays tiers (sauf mention contraire). Colonne flux : Stock (titres valides au 31 décembre), Primo-délivrance (premiers titres) ou Renouvellement ; provisoire signale la dernière année, non définitive. Depuis le Brexit, les Britanniques sont isolés dans une série à part (ils sont comptés dans les « Divers » en 2021).

Stocks de titres valides

Titres valides au 31 décembre

Code
`les-titres-de-sejour` |>
  filter(tableau == "Stocks valides au 31 décembre", categorie == "Total") |>
  ggplot(aes(x = date, y = value / 1e6)) +
  geom_line() + geom_point() + theme_minimal() + xlab("") +
  ylab("Millions de titres et documents de séjour valides") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  scale_y_continuous(limits = c(0, NA))

Par type de titre

Code
`les-titres-de-sejour` |>
  filter(tableau == "Stocks valides au 31 décembre par type de titre", categorie != "Total") |>
  ggplot(aes(x = date, y = value / 1e6, fill = categorie)) +
  geom_area() + theme_minimal() + xlab("") + ylab("Millions de titres valides") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Par motif et durée, 2025

Code
`les-titres-de-sejour` |>
  filter(str_detect(tableau, "par motif et durée"), annee == 2025,
         categorie != "Total", sous_categorie != "Total") |>
  mutate(categorie = str_remove(categorie, "^Motif ") |> str_to_sentence() |> str_wrap(35),
         categorie = fct_reorder(categorie, value, .fun = sum),
         sous_categorie = str_wrap(sous_categorie, 40)) |>
  ggplot(aes(x = categorie, y = value / 1e6, fill = sous_categorie)) +
  geom_col() + coord_flip() + theme_minimal() +
  xlab("") + ylab("Millions de titres valides au 31 décembre 2025") +
  theme(legend.position = "bottom", legend.title = element_blank(), legend.direction = "vertical")

Britanniques

Code
`les-titres-de-sejour` |>
  filter(flux == "Stock", str_detect(tableau, "Britanniques")) |>
  ggplot(aes(x = date, y = value / 1e3)) +
  geom_line() + geom_point() + theme_minimal() + xlab("") +
  ylab("Milliers de titres détenus par des Britanniques") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y"))

Premiers titres de séjour

Par motif

Code
`les-titres-de-sejour` |>
  filter(flux == "Primo-délivrance", tableau == "Par motif", sous_categorie == "Total" | categorie == "Étudiants",
         categorie != "Total") |>
  ggplot(aes(x = date, y = value / 1e3, fill = categorie)) +
  geom_col() + theme_minimal() + xlab("") + ylab("Milliers de premiers titres délivrés") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Par type de titre

Code
`les-titres-de-sejour` |>
  filter(flux == "Primo-délivrance", tableau == "Par type de titre",
         sous_categorie == "Total", categorie != "Total") |>
  mutate(categorie = fct_reorder(categorie, -value, .fun = sum)) |>
  ggplot(aes(x = date, y = value / 1e3, fill = categorie)) +
  geom_col() + theme_minimal() + xlab("") + ylab("Milliers de premiers titres délivrés") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Motifs humanitaires

Code
`les-titres-de-sejour` |>
  filter(flux == "Primo-délivrance", tableau == "Par motif", categorie == "Humanitaire", sous_categorie != "Total") |>
  ggplot(aes(x = date, y = value / 1e3, color = sous_categorie)) +
  geom_line() + geom_point(size = 0.8) + theme_minimal() + xlab("") + ylab("Milliers de premiers titres délivrés") +
  scale_x_date(date_breaks = "2 years", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Principales nationalités, 2025

Code
`les-titres-de-sejour` |>
  filter(flux == "Primo-délivrance", str_detect(tableau, "nationalité"), annee == 2025, !is.na(rang)) |>
  mutate(categorie = fct_reorder(str_to_title(categorie), value)) |>
  ggplot(aes(x = categorie, y = value / 1e3)) +
  geom_col(fill = "#2166ac") + coord_flip() + theme_minimal() +
  xlab("") + ylab("Milliers de premiers titres délivrés (2025, provisoire)")

Maroc, Algérie, Tunisie

Code
`les-titres-de-sejour` |>
  filter(flux == "Primo-délivrance", str_detect(tableau, "nationalité"), categorie %in% c("MAROC", "ALGERIE", "TUNISIE")) |>
  mutate(categorie = str_to_title(categorie)) |>
  ggplot(aes(x = date, y = value / 1e3, color = categorie)) +
  geom_line() + geom_point(size = 0.8) + theme_minimal() + xlab("") +
  ylab("Milliers de premiers titres délivrés") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Renouvellements

Par motif

Code
`les-titres-de-sejour` |>
  filter(flux == "Renouvellement", tableau == "Par motif", categorie != "Total") |>
  ggplot(aes(x = date, y = value / 1e3, fill = categorie)) +
  geom_col() + theme_minimal() + xlab("") + ylab("Milliers de titres renouvelés") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Par type de titre

Code
`les-titres-de-sejour` |>
  filter(flux == "Renouvellement", tableau == "Par type de titre",
         sous_categorie == "Total", categorie != "Total") |>
  mutate(categorie = fct_reorder(categorie, -value, .fun = sum)) |>
  ggplot(aes(x = date, y = value / 1e3, fill = categorie)) +
  geom_col() + theme_minimal() + xlab("") + ylab("Milliers de titres renouvelés") +
  scale_x_date(date_breaks = "1 year", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank())

Principales nationalités, 2025

Code
`les-titres-de-sejour` |>
  filter(flux == "Renouvellement", str_detect(tableau, "nationalité"), annee == 2025, !is.na(rang)) |>
  mutate(categorie = fct_reorder(str_to_title(categorie), value)) |>
  ggplot(aes(x = categorie, y = value / 1e3)) +
  geom_col(fill = "#e08214") + coord_flip() + theme_minimal() +
  xlab("") + ylab("Milliers de titres renouvelés (2025, provisoire)")