Last data update: 03 Oct 2026, 10:41
Last compile: 04 Oct 2026, 08:09
Les cartes couvrent la France métropolitaine ; les départements d’outre-mer figurent dans les données (Mayotte, où les naissances ont augmenté de 47,5 %, est la seule exception hors champ des autres tableaux).
lim <- max(abs(carte$evol_naissances_2010_2022), na.rm = TRUE)
ggplot(carte) +
geom_sf(aes(fill = evol_naissances_2010_2022), color = "white", linewidth = 0.1) +
scale_fill_gradient2(low = "#B2182B", mid = "#F7F7F7", high = bleu, midpoint = 0, limits = c(-lim, lim),
name = "%", na.value = "grey85") +
theme_carte() +
labs(title = "Les naissances reculent presque partout depuis 2010",
subtitle = sprintf("Évolution du nombre de naissances 2010-2022, par département (France hors Mayotte : %s %%)",
format(france$evol_naissances_2010_2022, decimal.mark = ",")))
bind_rows(slice_max(dep |> filter(niveau == "Département"), evol_naissances_2010_2022, n = 12),
slice_min(dep |> filter(niveau == "Département"), evol_naissances_2010_2022, n = 12)) |>
mutate(departement = fct_reorder(departement, evol_naissances_2010_2022),
signe = evol_naissances_2010_2022 > 0) |>
ggplot(aes(x = evol_naissances_2010_2022, y = departement, fill = signe)) +
geom_col(show.legend = FALSE) +
geom_vline(xintercept = france$evol_naissances_2010_2022, linetype = "dashed", color = "grey30") +
geom_text(aes(label = sprintf("%+.1f %%", evol_naissances_2010_2022),
hjust = if_else(evol_naissances_2010_2022 > 0, -0.1, 1.1)), size = 3.2) +
scale_fill_manual(values = c("TRUE" = bleu, "FALSE" = rose)) +
scale_x_continuous(expand = expansion(mult = 0.15)) +
theme_ip() +
labs(x = NULL, y = NULL, title = "Les 12 départements où les naissances ont le moins et le plus reculé",
subtitle = "évolution 2010-2022, en % ; pointillé : moyenne nationale")
ggplot(carte) +
geom_sf(aes(fill = icf_2022), color = "white", linewidth = 0.1) +
scale_fill_viridis_c(option = "mako", direction = -1, name = "Enfants\npar femme", na.value = "grey85") +
theme_carte() +
labs(title = "Indice conjoncturel de fécondité en 2022",
subtitle = sprintf("par département (France hors Mayotte : %s)", format(france$icf_2022, decimal.mark = ",")))
dep |>
filter(niveau == "Département", !is.na(icf_2022), !str_starts(code_dep, "97")) |>
ggplot(aes(x = icf_2022, y = evol_naissances_2010_2022)) +
geom_hline(yintercept = france$evol_naissances_2010_2022, color = "grey70", linetype = "dashed") +
geom_vline(xintercept = france$icf_2022, color = "grey70", linetype = "dashed") +
geom_point(color = bleu, size = 2.5, alpha = 0.8) +
ggrepel::geom_text_repel(aes(label = departement), size = 3, color = "grey30", max.overlaps = 12,
segment.color = "grey80") +
geom_smooth(method = "lm", se = FALSE, color = rose, linewidth = 0.8) +
theme_ip() +
labs(x = "Indice conjoncturel de fécondité en 2022", y = "Évolution des naissances 2010-2022 (%)",
title = "Fécondité élevée et baisse des naissances moins marquée : un lien faible",
subtitle = "un point par département métropolitain (outre-mer exclu) ; pointillés : France hors Mayotte")
Insee décompose l’évolution des naissances en trois effets : le taux de fécondité, l’effet démographique (le nombre de femmes en âge d’avoir des enfants) et les mobilités résidentielles (les arrivées et départs de ces femmes).
carte |>
mutate(typologie = fct_relevel(typologie, "Cumul d’effets défavorables",
"Effet taux de fécondité prédominant",
"Effet taux de fécondité prédominant avec amortissement migratoire",
"Effet démographique prédominant",
"Effet mobilités résidentielles prédominant")) |>
ggplot() +
geom_sf(aes(fill = typologie), color = "white", linewidth = 0.1) +
scale_fill_manual(values = c("#B2182B", bleu, "#8FB0DE", jaune, vert), name = NULL,
labels = scales::label_wrap(55), na.value = "grey85") +
theme_carte() + theme(legend.position = "bottom") +
guides(fill = guide_legend(ncol = 1)) +
labs(title = "Typologie des départements selon l'effet dominant",
subtitle = "contribution la plus importante à l'évolution des naissances 2010-2022")
extremes <- dep |>
filter(niveau == "Département", !is.na(effet_taux_fecondite)) |>
slice_min(evol_naissances_2010_2022, n = 10) |>
bind_rows(dep |> filter(niveau == "Département", !is.na(effet_taux_fecondite)) |>
slice_max(evol_naissances_2010_2022, n = 10)) |>
mutate(departement = fct_reorder(departement, evol_naissances_2010_2022))
extremes |>
pivot_longer(starts_with("effet"), names_to = "effet", values_to = "valeur") |>
mutate(effet = recode(effet, effet_taux_fecondite = "Effet taux de fécondité",
effet_demographique = "Effet démographique",
effet_mobilites_residentielles = "Effet mobilités résidentielles")) |>
ggplot(aes(x = valeur, y = departement)) +
geom_col(aes(fill = effet), width = 0.7) +
geom_point(data = extremes, aes(x = evol_naissances_2010_2022), shape = 18, size = 3.5, color = "black") +
geom_vline(xintercept = 0, color = "grey30") +
scale_fill_manual(values = cols_effets, name = NULL) +
theme_ip() +
labs(x = "Points de %", y = NULL, title = "Les 10 départements où les naissances ont le plus baissé... et le moins",
subtitle = "décomposition de l'évolution 2010-2022 (point noir : évolution totale)")
ordre_aav <- unique(aav$taille_aav)
aav |>
filter(categorie != "Ensemble") |>
mutate(taille_aav = factor(taille_aav, levels = rev(ordre_aav)),
categorie = fct_relevel(categorie, "Commune-centre", "Autre commune du pôle principal",
"Commune d'un pôle secondaire", "Commune de la couronne")) |>
ggplot(aes(y = taille_aav)) +
geom_segment(aes(x = icf_2022, xend = icf_2010, yend = taille_aav), color = "grey75", linewidth = 1) +
geom_point(aes(x = icf_2010, color = "2010"), size = 3) +
geom_point(aes(x = icf_2022, color = "2022"), size = 3) +
facet_wrap(~ categorie, ncol = 2) +
scale_color_manual(values = c("2010" = gris, "2022" = bleu), name = NULL) +
scale_y_discrete(labels = scales::label_wrap(28)) +
theme_ip(11) +
labs(x = "Enfants par femme", y = NULL, title = "La fécondité a baissé partout, y compris dans les couronnes",
subtitle = "indice conjoncturel de fécondité en 2010 et 2022, par taille d'aire d'attraction et catégorie de commune")
aav |>
filter(categorie == "Ensemble") |>
mutate(taille_aav = fct_reorder(taille_aav, evol_naissances)) |>
ggplot(aes(x = evol_naissances, y = taille_aav)) +
geom_col(fill = bleu, width = 0.65) +
geom_text(aes(label = sprintf("%.1f %%", evol_naissances)), hjust = 1.1, color = "white", size = 3.5) +
scale_y_discrete(labels = scales::label_wrap(35)) +
theme_ip() +
labs(x = "%", y = NULL, title = "Plus on s'éloigne des grandes villes, plus les naissances reculent",
subtitle = "évolution des naissances 2010-2022 selon la taille de l'aire d'attraction des villes")
aav |>
filter(categorie == "Ensemble", !is.na(effet_taux_fecondite)) |>
mutate(taille_aav = fct_reorder(taille_aav, evol_naissances)) |>
pivot_longer(starts_with("effet"), names_to = "effet", values_to = "valeur") |>
mutate(effet = recode(effet, effet_taux_fecondite = "Effet taux de fécondité",
effet_demographique = "Effet démographique",
effet_mobilites_residentielles = "Effet mobilités résidentielles")) |>
ggplot(aes(x = valeur, y = taille_aav, fill = effet)) +
geom_col(width = 0.7) +
geom_vline(xintercept = 0, color = "grey30") +
scale_fill_manual(values = cols_effets, name = NULL) +
scale_y_discrete(labels = scales::label_wrap(35)) +
theme_ip() +
labs(x = "Points de %", y = NULL, title = "Les mobilités résidentielles amortissent la baisse dans les grandes aires",
subtitle = "décomposition de l'évolution des naissances 2010-2022")
aav700 |>
mutate(aav = fct_reorder(aav, evol_naissances)) |>
pivot_longer(starts_with("effet"), names_to = "effet", values_to = "valeur") |>
mutate(effet = recode(effet, effet_taux_fecondite = "Effet taux de fécondité",
effet_demographique = "Effet démographique",
effet_mobilites_residentielles = "Effet mobilités résidentielles")) |>
ggplot(aes(x = valeur, y = aav)) +
geom_col(aes(fill = effet), width = 0.7) +
geom_point(data = aav700, aes(x = evol_naissances, y = fct_reorder(aav, evol_naissances)),
shape = 18, size = 3.5) +
geom_vline(xintercept = 0, color = "grey30") +
scale_fill_manual(values = cols_effets, name = NULL) +
theme_ip() +
labs(x = "Points de %", y = NULL, title = "Bordeaux et Nantes attirent les jeunes femmes, Lille et Grenoble les perdent",
subtitle = "décomposition 2010-2022 (point noir : total), aires de 700 000 habitants ou plus")
lim2 <- max(abs(carte$evol_naissances_2022_2025), na.rm = TRUE)
ggplot(carte) +
geom_sf(aes(fill = evol_naissances_2022_2025), color = "white", linewidth = 0.1) +
scale_fill_gradient2(low = "#B2182B", mid = "#F7F7F7", high = bleu, midpoint = 0, limits = c(-lim2, lim2),
name = "%") +
theme_carte() +
labs(title = "La baisse des naissances se poursuit entre 2022 et 2025",
subtitle = sprintf("évolution 2022-2025 par département (France : %s %% ; données 2025 provisoires)",
format(france$evol_naissances_2022_2025, decimal.mark = ",")))