Le taux d’effort des ménages pour se loger en 2024 - ip2128

Données - INSEE

Figure 1 : décomposition du taux d’effort par statut d’occupation

Code
plot_taux_effort_stack(fig1, "statut_occupation", ordre_statuts, "par statut d'occupation, 2014 et 2024")

Figure 2a : décomposition de l’évolution des taux d’effort, en points

Code
fig2a_long <- fig2a |>
  select(statut_occupation, all_of(postes_taux_effort), aides_logement) |>
  mutate(statut_occupation = factor(statut_occupation, levels = ordre_statuts)) |>
  pivot_longer(-statut_occupation, names_to = "poste", values_to = "ecart") |>
  filter(!is.na(ecart)) |>
  mutate(poste = recode(poste, !!!postes_labels), poste = fct_relevel(poste, names(palette_postes)))

fig2a_points <- fig2a |>
  select(statut_occupation, taux_effort_brut, taux_effort_net) |>
  mutate(statut_occupation = factor(statut_occupation, levels = ordre_statuts)) |>
  pivot_longer(-statut_occupation, names_to = "taux", values_to = "valeur") |>
  mutate(taux = recode(taux, taux_effort_brut = "Taux d'effort brut", taux_effort_net = "Taux d'effort net"))

ggplot() +
  geom_col(data = fig2a_long, aes(x = statut_occupation, y = ecart, fill = poste)) +
  geom_point(data = fig2a_points, aes(x = statut_occupation, y = valeur, color = taux), shape = 18, size = 3) +
  geom_hline(yintercept = 0, color = "grey30", linewidth = 0.3) +
  scale_fill_manual(values = palette_postes, name = NULL) +
  scale_color_manual(values = c("Taux d'effort brut" = "black", "Taux d'effort net" = "grey50"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "Points",
       title = "Décomposition de l'évolution en points des taux d'effort",
       subtitle = "par statut d'occupation entre 2014 et 2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(ncol = 2), color = guide_legend(ncol = 1))

Figure 2b : évolution des revenus et des composantes des taux d’effort, en %

Code
postes_2b <- c(revenus = "Revenus", loyers = "Loyers",
               remboursements_emprunts = "Remboursements d'emprunts",
               charges_locatives_eau = "Charges locatives et eau",
               depenses_energetiques = "Dépenses énergétiques",
               taxe_fonciere = "Taxe foncière", taxe_habitation = "Taxe d'habitation",
               aides_logement = "Aides au logement")

fig2b |>
  mutate(statut_occupation = factor(statut_occupation, levels = ordre_statuts)) |>
  pivot_longer(-statut_occupation, names_to = "serie", values_to = "evolution") |>
  filter(!is.na(evolution)) |>
  mutate(serie = recode(serie, !!!postes_2b), serie = fct_relevel(serie, unname(postes_2b))) |>
  ggplot(aes(x = statut_occupation, y = evolution, fill = serie)) +
  geom_col(position = "dodge") +
  geom_hline(yintercept = 0, color = "grey30", linewidth = 0.3) +
  scale_fill_manual(values = c("Revenus" = "grey60", palette_postes), name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "% d'évolution 2014-2024",
       title = "Évolution des revenus et des composantes des taux d'effort",
       subtitle = "par statut d'occupation, 2014-2024") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 20, hjust = 1),
        panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(ncol = 3))

Figure 3 : décomposition du taux d’effort selon les revenus par UC

Code
ordre_quartiles <- c("Inférieur à Q1", "Q1 à Q2", "Q2 à Q3", "Supérieur à Q3", "Ensemble")
plot_taux_effort_stack(fig3, "quartile_revenus", ordre_quartiles,
                        "selon les revenus par UC, 2014 et 2024")

Figure 4 : taux d’effort net en 2024 selon le type de ménage

Code
fig4 |>
  gt(groupname_col = "groupe_age") |>
  tab_header(title = "Taux d'effort net en 2024 selon le type de ménage") |>
  cols_label(type_menage = "", taux_effort_net = "Taux d'effort net",
             depenses_annuelles_nettes = "Dépenses annuelles nettes moyennes",
             revenus_annuels = "Revenus annuels moyens",
             part_ensemble_menages = "Part dans l'ensemble des ménages") |>
  fmt_number(columns = c(taux_effort_net, part_ensemble_menages), decimals = 1) |>
  fmt_number(columns = c(depenses_annuelles_nettes, revenus_annuels), decimals = 0)
Taux d'effort net en 2024 selon le type de ménage
Taux d'effort net Dépenses annuelles nettes moyennes Revenus annuels moyens Part dans l'ensemble des ménages
Personnes de référence de moins de 65 ans
Personnes seules 24.5 7,200 29,500 21.4
Familles monoparentales 21.6 8,000 36,900 8.9
Couples sans enfant 14.6 9,100 62,000 12.9
Couples avec un ou deux enfants 17.0 12,500 73,700 18.5
Couples avec trois enfants ou plus 17.5 12,800 73,100 4.7
Personnes de référence de 65 ans ou plus
Personnes seules 17.8 5,000 28,200 16.8
Couples 9.2 5,200 56,600 13.8
Autres ménages 17.1 8,300 48,700 3.1
Ensemble 16.8 8,200 48,700 100.0

Tableau complémentaire 1 : décomposition par parc locatif, 2014-2024

Code
tc1 |>
  ggplot(aes(x = factor(annee), y = taux_effort_net, color = statut_occupation, group = statut_occupation)) +
  geom_line(linewidth = 1) +
  geom_point() +
  scale_color_manual(values = c("Locataires du parc social" = "#1B3F8B",
                                 "Locataires du parc privé" = "#E8737A"), name = NULL) +
  theme_minimal(base_size = 12) +
  labs(x = NULL, y = "%",
       title = "Taux d'effort net des locataires par parc",
       subtitle = "2014, 2020, 2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Tableau complémentaire 2 : locataires par parc et revenus par UC

Code
tc2 |>
  filter(champ == "France hors Mayotte", quartile_revenus != "Ensemble") |>
  ggplot(aes(x = quartile_revenus, y = taux_effort_net, fill = factor(annee))) +
  geom_col(position = "dodge") +
  facet_wrap(~ statut_occupation) +
  scale_fill_manual(values = c("2014" = "#8FA8D8", "2024" = "#1B3F8B"), name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "%",
       title = "Taux d'effort net des locataires selon le parc et les revenus par UC",
       subtitle = "France hors Mayotte, 2014 et 2024") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 20, hjust = 1),
        panel.grid.minor = element_blank())

Tableau complémentaire 3 : propriétaires par statut et revenus par UC

Code
tc3 |>
  ggplot(aes(x = quartile_revenus, y = taux_effort_net, fill = factor(annee))) +
  geom_col(position = "dodge") +
  facet_wrap(~ statut_occupation) +
  scale_fill_manual(values = c("2014" = "#8FA8D8", "2024" = "#1B3F8B"), name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "%",
       title = "Taux d'effort net des propriétaires selon le statut et les revenus par UC",
       subtitle = "2014 et 2024") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 20, hjust = 1),
        panel.grid.minor = element_blank())

Tableau complémentaire 4 : taux d’effort selon d’autres caractéristiques

Code
tc4 |>
  select(section, caracteristique, ensemble, proprietaire, locataire) |>
  gt(groupname_col = "section") |>
  tab_header(title = "Taux d'effort net selon le statut d'occupation et d'autres caractéristiques",
             subtitle = "2024") |>
  cols_label(caracteristique = "", ensemble = "Ensemble", proprietaire = "Propriétaire",
             locataire = "Locataire") |>
  fmt_number(columns = -c(section, caracteristique), decimals = 1)
Taux d'effort net selon le statut d'occupation et d'autres caractéristiques
2024
Ensemble Propriétaire Locataire
Personne de référence de moins de 65 ans
Personnes seules 24.5 20.5 28.9
Familles monoparentales 21.6 18.2 26.0
Couples sans enfant 14.6 12.6 20.9
Couples avec un ou deux enfants 17.0 16.2 21.1
Couples avec trois enfants ou plus 17.5 17.0 19.0
Personne de référence de 65 ans ou plus
Personnes seules 17.8 12.4 33.5
Couples 9.2 7.7 23.0
Autres ménages 17.1 11.3 24.7
Par tranche d’âge de la personne de référence
Moins de 30 ans 25.7 24.1 27.4
30-39 ans 22.4 22.3 23.5
40-49 ans 20.0 19.0 23.8
50-64 ans 14.4 11.9 23.2
65-74 ans 12.2 8.9 28.0
75 ans et plus 12.7 9.6 30.4
Par nationalité de la personne de référence
Française 16.5 13.8 24.9
Étrangère 21.0 15.8 24.9
Par ancienneté d’occupation
Moins de 4 ans 22.0 19.5 25.3
4 ans ou plus 15.3 12.9 24.6
Par type de commune
Grands centres urbains 17.8 14.2 24.2
Centres urbains intermédiaires 18.1 14.5 25.6
Petites villes 16.1 13.1 26.7
Ceintures urbaines 15.7 13.8 24.8
Bourgs ruraux 16.5 14.5 25.9
Rural dispersé 14.4 13.1 25.5
Par période de construction
Avant 1945 16.0 13.1 25.8
De 1946 à 1970 18.2 15.1 24.7
De 1971 à 1990 15.2 12.7 24.8
De 1991 à 2005 15.3 12.3 24.3
2006 et après 19.9 17.8 24.5
Ensemble 16.8 13.9 24.9

Tableau complémentaire 5 : distribution des taux d’effort nets, 2024

Code
tc5 |>
  filter(statut_occupation != "Ensemble") |>
  select(statut_occupation, inferieur_15, entre_15_33, entre_33_40, superieur_40) |>
  pivot_longer(-statut_occupation, names_to = "tranche", values_to = "part") |>
  mutate(tranche = recode(tranche, inferieur_15 = "Moins de 15 %", entre_15_33 = "15 % à 33 %",
                           entre_33_40 = "33 % à 40 %", superieur_40 = "Plus de 40 %"),
         tranche = fct_relevel(tranche, "Moins de 15 %", "15 % à 33 %", "33 % à 40 %", "Plus de 40 %"),
         statut_occupation = fct_relevel(statut_occupation, ordre_statuts)) |>
  ggplot(aes(x = statut_occupation, y = part, fill = tranche)) +
  geom_col() +
  coord_flip() +
  scale_fill_brewer(palette = "RdYlBu", direction = -1, name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "%",
       title = "Distribution des taux d'effort nets selon le statut d'occupation",
       subtitle = "2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Tableau complémentaire 6 : ratio revenu / revenu disponible

Code
quartile_ordre <- c("Inférieur à Q1", "Q1 à Q2", "Q2 à Q3", "Supérieur à Q3")

tc6 |>
  filter(section == "Par quartile de revenus par UC") |>
  mutate(caracteristique = factor(caracteristique, levels = quartile_ordre)) |>
  select(caracteristique, ensemble, proprietaire, locataire) |>
  pivot_longer(-caracteristique, names_to = "statut", values_to = "ratio") |>
  mutate(statut = recode(statut, ensemble = "Ensemble", proprietaire = "Propriétaire",
                          locataire = "Locataire"),
         statut = fct_relevel(statut, "Ensemble", "Propriétaire", "Locataire")) |>
  ggplot(aes(x = caracteristique, y = ratio, fill = statut)) +
  geom_col(position = "dodge") +
  geom_hline(yintercept = 1, linetype = "dashed", color = "grey40") +
  scale_fill_manual(values = c("Ensemble" = "#1B3F8B", "Propriétaire" = "#E8737A",
                                "Locataire" = "#F2A65A"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "Ratio",
       title = "Ratio entre le revenu et le revenu disponible",
       subtitle = "selon le quartile de revenus par UC, 2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())