Last observation: 2025 (N = 147)
First observation: 2011 (N = 101)
Last data update: 01 oct. 2026, 23:06
Last compile: 01 oct. 2026, 23:08
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).
`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))
`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())
`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")
`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"))
`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())
`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())
`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())
`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)")
`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())
`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())
`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())
`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)")