Bilan démographique 2025 - ip2087

Données - INSEE

Figure 1 : évolution de la population au 1er janvier

Code
fig1 |>
  filter(str_detect(indicateur, "Solde naturel|Solde migratoire|Ajustements")) |>
  mutate(indicateur = str_remove(indicateur, " \\(a\\)-\\(b\\)")) |>
  ggplot(aes(x = factor(annee), y = valeur, fill = indicateur)) +
  geom_col() +
  geom_hline(yintercept = 0, color = "grey30") +
  scale_fill_manual(values = c("Solde naturel" = bleu, "Solde migratoire" = vert,
                                "Ajustements statistiques" = "grey60"), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Milliers",
       title = "Contributions à la variation de la population",
       subtitle = "solde naturel, solde migratoire et ajustements statistiques, 2020-2025")

Code
fig1 |>
  filter(indicateur == "Population au 1er janvier") |>
  ggplot(aes(x = annee, y = valeur / 1000)) +
  geom_line(color = bleu, linewidth = 1) +
  geom_point(aes(shape = provisoire), color = bleu, size = 2.5, fill = "white") +
  scale_shape_manual(values = c("FALSE" = 16, "TRUE" = 21), guide = "none") +
  theme_demo() +
  labs(x = NULL, y = "Millions d'habitants",
       title = "Population au 1er janvier", subtitle = "France hors Mayotte puis France, 2020-2026 (p : provisoire)")

Figure 2 : naissances, décès et solde naturel depuis 1965

Code
fig2a |>
  filter(groupe == "France hors Mayotte") |>
  ggplot(aes(x = annee, y = valeur / 1000, color = indicateur)) +
  geom_line(linewidth = 1) +
  scale_color_manual(values = c("Naissances" = bleu, "Décès" = rose), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Milliers", title = "Naissances et décès", subtitle = "France hors Mayotte, depuis 1965")

Code
fig2b |>
  filter(groupe == "France hors Mayotte") |>
  ggplot(aes(x = annee, y = valeur / 1000)) +
  geom_col(aes(fill = valeur < 0), show.legend = FALSE) +
  scale_fill_manual(values = c("FALSE" = bleu, "TRUE" = rose)) +
  geom_hline(yintercept = 0, color = "grey30") +
  theme_demo() +
  labs(x = NULL, y = "Milliers", title = "Solde naturel", subtitle = "France hors Mayotte, depuis 1965")

Figure 3 : naissances, femmes en âge de procréer et fécondité

Code
fig3 |>
  filter(!str_detect(indicateur, "ICF")) |>
  ggplot(aes(x = annee, y = valeur, color = indicateur)) +
  geom_line(linewidth = 1) +
  geom_hline(yintercept = 100, color = "grey60", linetype = "dashed") +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_demo(10) +
  labs(x = NULL, y = "Indice base 100 en 1995",
       title = "Naissances et nombre de femmes en âge d'avoir des enfants", subtitle = "base 100 en 1995") +
  guides(color = guide_legend(ncol = 1))

Code
fig3 |>
  filter(str_detect(indicateur, "ICF")) |>
  ggplot(aes(x = annee, y = valeur / 100)) +
  geom_line(color = bleu, linewidth = 1) +
  geom_hline(yintercept = 2.1, color = rose, linetype = "dashed") +
  annotate("text", x = 2000, y = 2.13, label = "seuil de renouvellement (2,1)", color = rose, size = 3.5) +
  theme_demo() +
  labs(x = NULL, y = "Enfants par femme", title = "Indicateur conjoncturel de fécondité", subtitle = "depuis 1995")

Figure 4 : fécondité par groupe d’âges

Code
fig4b |>
  ggplot(aes(x = annee, y = valeur, color = indicateur)) +
  geom_line(linewidth = 1) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Naissances pour 100 femmes",
       title = "Taux de fécondité par groupe d'âges", subtitle = "depuis 1995")

Code
fig4a |>
  filter(str_detect(indicateur, "Âge conjoncturel")) |>
  ggplot(aes(x = annee, y = valeur)) +
  geom_line(color = bleu, linewidth = 1) +
  geom_point(aes(shape = provisoire), color = bleu, size = 2.5, fill = "white") +
  scale_shape_manual(values = c("FALSE" = 16, "TRUE" = 21), guide = "none") +
  theme_demo() +
  labs(x = NULL, y = "Années", title = "Âge conjoncturel moyen à l'accouchement", subtitle = "depuis 2005")

Figure 5 : espérance de vie

Code
fig5b |>
  mutate(sexe = if_else(str_detect(indicateur, "femmes"), "Femmes", "Hommes"),
         age = if_else(str_detect(indicateur, "60 ans"), "À 60 ans", "À la naissance")) |>
  ggplot(aes(x = annee, y = valeur, color = sexe)) +
  geom_line(linewidth = 1) +
  facet_wrap(~ age, scales = "free_y") +
  scale_color_manual(values = c("Femmes" = rose, "Hommes" = bleu), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Années", title = "Espérance de vie à la naissance et à 60 ans", subtitle = "depuis 1995")

Code
fig5a |>
  filter(annee == max(annee)) |>
  mutate(sexe = if_else(str_detect(groupe, "femmes"), "Femmes", "Hommes"),
         indicateur = fct_inorder(indicateur)) |>
  ggplot(aes(x = indicateur, y = valeur, fill = sexe)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("Femmes" = rose, "Hommes" = bleu), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Années restant à vivre",
       title = "Espérance de vie à divers âges", subtitle = "dernière année disponible (provisoire)")

Figure 6 : structure par âge

Code
fig6a |>
  mutate(valeur = if_else(sexe == "Hommes", -valeur, valeur), annee = factor(annee)) |>
  ggplot(aes(x = age, y = valeur, fill = sexe)) +
  geom_col(width = 1) +
  coord_flip() +
  facet_wrap(~ annee, nrow = 1) +
  scale_y_continuous(labels = ~ scales::comma(abs(.x), big.mark = " ")) +
  scale_fill_manual(values = c("Femmes" = rose, "Hommes" = bleu), name = NULL) +
  theme_demo(10) +
  labs(x = "Âge au 1er janvier", y = "Milliers", title = "Pyramide des âges", subtitle = "2006, 2016 et 2026")

Code
fig6b |>
  filter(indicateur != "Ensemble", indicateur != "dont 75 ans ou plus") |>
  mutate(indicateur = fct_relevel(indicateur, "65 ans ou plus", "De 20 à 64 ans", "Moins de 20 ans")) |>
  ggplot(aes(x = factor(annee), y = valeur / 100, fill = indicateur)) +
  geom_col() +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_manual(values = c("Moins de 20 ans" = vert, "De 20 à 64 ans" = bleu, "65 ans ou plus" = rose), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = NULL, title = "Répartition de la population par grands groupes d'âges", subtitle = "au 1er janvier")

Figure 7 : mariages et pacs

Code
fig7 |>
  filter(str_detect(indicateur, "Ensemble")) |>
  ggplot(aes(x = annee, y = valeur / 1000, color = groupe)) +
  geom_line(linewidth = 1) +
  scale_color_manual(values = c("Mariages" = bleu, "Pacs" = rose), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Milliers", title = "Nombre de mariages et de pacs", subtitle = "depuis 2000")

Tableaux complémentaires

Code
tc1 |>
  filter(indicateur == "Population au 1er janvier") |>
  ggplot(aes(x = annee, y = valeur / 1e6)) +
  geom_line(color = bleu, linewidth = 1) +
  theme_demo() +
  labs(x = NULL, y = "Millions d'habitants", title = "Population au 1er janvier depuis 1982")

Code
tc4 |>
  filter(indicateur %in% c("Femmes", "Hommes"), str_detect(groupe, "sexe différent")) |>
  ggplot(aes(x = annee, y = valeur, color = indicateur)) +
  geom_line(linewidth = 1) +
  scale_color_manual(values = c("Femmes" = rose, "Hommes" = bleu), name = NULL) +
  theme_demo() +
  labs(x = NULL, y = "Années", title = "Âge moyen au mariage", subtitle = "mariages de personnes de sexe différent")

Code
tc5 |>
  filter(str_detect(indicateur, "Indicateur conjoncturel|Âge conjoncturel")) |>
  mutate(indicateur = if_else(str_detect(indicateur, "Indicateur"), "icf", "age")) |>
  select(pays, indicateur, valeur) |>
  pivot_wider(names_from = indicateur, values_from = valeur) |>
  ggplot(aes(x = age, y = icf, label = pays)) +
  geom_point(aes(color = pays == "France"), size = 2, show.legend = FALSE) +
  ggrepel::geom_text_repel(aes(color = pays == "France"), size = 3, max.overlaps = 30, show.legend = FALSE) +
  scale_color_manual(values = c("FALSE" = "grey40", "TRUE" = rose)) +
  theme_demo() +
  labs(x = "Âge conjoncturel moyen à l'accouchement (années)", y = "Enfants par femme",
       title = "Fécondité en Europe, 2023", subtitle = "indicateur conjoncturel de fécondité et âge à l'accouchement")