La vulnérabilité énergétique des ménages face au logement en 2021 - IA106

Données - INSEE

Figure 1 : taux de vulnérabilité énergétique par département en 2021

Code
fig1 |>
  mutate(departement = fct_reorder(departement, taux_vulnerabilite)) |>
  ggplot(aes(x = departement, y = taux_vulnerabilite)) +
  geom_col(fill = "#1B3F8B") +
  geom_hline(yintercept = fig1_national, linetype = "dashed", color = "#E8737A") +
  coord_flip() +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "%",
       title = "Taux de vulnérabilité énergétique par département",
       subtitle = paste0("2021 (pointillé : moyenne France métropolitaine, ", fig1_national, " %)")) +
  theme(panel.grid.minor = element_blank(), panel.grid.major.y = element_blank())

Figure 2 : superficie et dépenses énergétiques selon l’étiquette DPE

Code
fig2 |>
  ggplot(aes(x = dpe)) +
  geom_col(aes(y = depenses), fill = "#1B3F8B") +
  geom_line(aes(y = superficie * max(depenses) / max(superficie), group = 1), color = "#E8737A", linewidth = 1) +
  geom_point(aes(y = superficie * max(depenses) / max(superficie)), color = "#E8737A") +
  scale_y_continuous(name = "Dépenses annuelles (€)",
                      sec.axis = sec_axis(~ . * max(fig2$superficie) / max(fig2$depenses), name = "Superficie (m²)")) +
  theme_minimal(base_size = 12) +
  labs(x = "Étiquette DPE",
       title = "Dépenses énergétiques et superficie moyennes selon l'étiquette DPE",
       subtitle = "2021") +
  theme(panel.grid.minor = element_blank())

Figure 3 : vulnérabilité, revenus et logement selon le type de ménage

Code
fig3 |>
  select(type_menage, part_ensemble_menages, part_ensemble_vulnerables) |>
  pivot_longer(-type_menage, names_to = "serie", values_to = "part") |>
  mutate(serie = recode(serie, part_ensemble_menages = "Part dans l'ensemble des ménages",
                         part_ensemble_vulnerables = "Part dans les ménages vulnérables"),
         type_menage = fct_reorder(type_menage, part, .fun = max)) |>
  ggplot(aes(x = type_menage, y = part, fill = serie)) +
  geom_col(position = "dodge") +
  coord_flip() +
  scale_fill_manual(values = c("Part dans l'ensemble des ménages" = "#8FA8D8",
                                "Part dans les ménages vulnérables" = "#1B3F8B"), name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "%",
       title = "Répartition des ménages selon leur type",
       subtitle = "ensemble des ménages vs. ménages vulnérables énergétiquement, 2021") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Code
fig3 |>
  gt() |>
  tab_header(title = "Vulnérabilité, revenus, dépenses et logement selon le type de ménage", subtitle = "2021") |>
  fmt_number(columns = -type_menage, decimals = 1)
Vulnérabilité, revenus, dépenses et logement selon le type de ménage
2021
type_menage part_ensemble_menages part_ensemble_vulnerables part_vulnerables revenu_disponible_mensuel depenses_annuelles part_dpe_efg superficie_moyenne
Personnes seules de 60 ans ou plus 21.7 50.0 40.0 1,958.0 1,986.0 51.0 89.0
Autres personnes seules 19.2 23.5 21.2 1,961.0 1,304.0 39.0 63.0
Familles monoparentales 10.6 9.2 15.2 2,831.0 1,632.0 31.0 88.0
Couples de 60 ans ou plus 14.8 9.2 10.9 3,822.0 2,040.0 37.0 110.0
Autres couples sans enfant 11.1 3.8 6.0 4,184.0 1,610.0 32.0 89.0
Autres couples avec enfants 22.7 4.3 3.3 5,207.0 1,759.0 25.0 108.0
Ensemble 100.0 100.0 17.4 3,403.0 1,733.0 36.0 91.0

Figure 4 : éligibilité des propriétaires vulnérables à MaPrimeRénov’

Code
fig4 |>
  mutate(statut_occupation = str_wrap(statut_occupation, 25)) |>
  ggplot(aes(x = statut_occupation, y = effectifs / 1000, fill = dpe)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("E, F ou G" = "#E8737A", "A, B, C ou D" = "#1B3F8B"), name = "Étiquette DPE") +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "Milliers de ménages",
       title = "Ménages vulnérables selon leur statut d'occupation et l'étiquette DPE",
       subtitle = "2021") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Code
fig4_eligibilite |>
  mutate(niveau_prise_en_charge = recode(niveau_prise_en_charge,
                                          prise_charge_30 = "30 %", prise_charge_45 = "45 %",
                                          prise_charge_60 = "60 %", prise_charge_80 = "80 %"),
         niveau_prise_en_charge = fct_relevel(niveau_prise_en_charge, "30 %", "45 %", "60 %", "80 %")) |>
  ggplot(aes(x = str_wrap(paste(statut_occupation, dpe), 25), y = part, fill = niveau_prise_en_charge)) +
  geom_col() +
  coord_flip() +
  scale_fill_brewer(palette = "Blues", name = "Prise en charge") +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "%",
       title = "Répartition selon le niveau de prise en charge MaPrimeRénov'",
       subtitle = "propriétaires de logements occupés par des ménages vulnérables, 2021") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Figure 5 : caractérisation des départements

Code
fig5 |>
  count(typologie, sort = TRUE) |>
  gt() |>
  tab_header(title = "Typologie des départements selon leur taux de vulnérabilité", subtitle = "2021") |>
  cols_label(typologie = "Typologie", n = "Nombre de départements")
Typologie des départements selon leur taux de vulnérabilité
2021
Typologie Nombre de départements
Taux élevé à cause du bâti et des revenus 29
Taux proche de la moyenne 21
Taux élevé à cause du climat, du bâti et des revenus 19
Taux modéré grâce au bâti et aux revenus 15
Taux modéré grâce au climat, malgré bâti et revenus 8
Taux élevé du fait du climat 4

Figure 6 : contributions à l’écart de vulnérabilité selon la densité

Code
fig6 |>
  select(territoire, starts_with("contrib_")) |>
  pivot_longer(-territoire, names_to = "contribution", values_to = "valeur") |>
  mutate(contribution = recode(contribution,
                                contrib_structure_revenus = "Structure des revenus",
                                contrib_qualite_isolation = "Qualité d'isolation du parc",
                                contrib_formes_habitat = "Formes de l'habitat",
                                contrib_energies_chauffage = "Énergies de chauffage",
                                contrib_climat_residuel = "Climat et effet résiduel"),
         territoire = fct_relevel(territoire, "Pôles urbains", "Couronnes urbaines",
                                   "Rural périurbain", "Rural non périurbain")) |>
  ggplot(aes(x = territoire, y = valeur, fill = contribution)) +
  geom_col() +
  geom_point(data = fig6, aes(x = territoire, y = ecart), inherit.aes = FALSE, shape = 18, size = 3) +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "Points de %",
       title = "Contributions à l'écart de taux de vulnérabilité par rapport à la moyenne nationale",
       subtitle = "selon la densité des territoires, 2021 (losange : écart total)") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Figure complémentaire 1 : dépenses selon le mode de chauffage et le DPE

Code
figc1 |>
  mutate(dpe = fct_relevel(dpe, "A, B ou C", "D ou E", "F ou G")) |>
  ggplot(aes(x = mode_chauffage, y = depenses, fill = dpe)) +
  geom_col(position = "dodge") +
  coord_flip() +
  scale_fill_manual(values = c("A, B ou C" = "#8FA8D8", "D ou E" = "#1B3F8B", "F ou G" = "#E8737A"),
                     name = "Étiquette DPE") +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "Dépenses annuelles (€)",
       title = "Dépenses énergétiques conventionnelles selon le mode de chauffage et le DPE",
       subtitle = "2021") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Figure complémentaire 2 : décomposition des contributions par département

Code
figc2 |>
  slice_max(abs(ecart), n = 15) |>
  select(departement, ecart, starts_with("contrib_"), effet_residuel) |>
  pivot_longer(c(starts_with("contrib_"), effet_residuel), names_to = "composante", values_to = "valeur") |>
  mutate(composante = recode(composante,
                              contrib_climat = "Climat",
                              contrib_structure_revenus = "Structure des revenus",
                              contrib_parc_residentiel = "Parc résidentiel",
                              effet_residuel = "Effet résiduel"),
         departement = fct_reorder(departement, ecart)) |>
  ggplot(aes(x = departement, y = valeur, fill = composante)) +
  geom_col() +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "Points de %",
       title = "Décomposition de l'écart de taux de vulnérabilité",
       subtitle = "15 départements aux écarts les plus marqués, 2021") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())