Baisse des naissances depuis 2010 - ip2121

Données - INSEE

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).

Figure 1 : évolution des naissances entre 2010 et 2022

Code
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 = ",")))

Code
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")

Figure 2 : fécondité en 2022

Code
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 = ",")))

Code
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")

Figure 3 : qu’est-ce qui explique la baisse ?

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).

Code
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")

Code
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)")

Figure 4 : villes-centres, périphéries et campagnes

Code
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")

Code
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")

Code
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")

Figure 5 : les grandes aires d’attraction

Code
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")

Tableau complémentaire 1 : et depuis 2022 ?

Code
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 = ",")))