Conditions de logement début 2024 - Les locataires sont moins bien lotis que les propriétaires - ip2090

Données - INSEE

Figure 1 : statut d’occupation selon le type de ménage

Code
fig1 |>
  filter(!poids, type_menage != "ensemble",
         statut %in% c("Propriétaire non accédant", "Propriétaire accédant",
                        "Locataire du parc social", "Locataire du parc privé",
                        "Logé gratuitement")) |>
  mutate(type_menage = recode(type_menage,
    personnes_seules_moins65 = "Personnes seules (- 65 ans)",
    familles_monoparentales = "Familles monoparentales",
    couples_sans_enfant_moins65 = "Couples sans enfant (- 65 ans)",
    couples_1_2_enfants = "Couples avec 1-2 enfants",
    couples_3plus_enfants = "Couples avec 3+ enfants",
    personnes_seules_65plus = "Personnes seules (65 ans ou +)",
    couples_65plus = "Couples (65 ans ou +)",
    autres_menages = "Autres ménages"
  )) |>
  ggplot(aes(x = type_menage, y = value, fill = statut)) +
  geom_col(position = "stack") +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = NULL,
       title = "Répartition des ménages par statut d'occupation",
       subtitle = "selon le type de ménage, début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Figure 2 : caractéristiques du logement selon le type d’habitat et le statut

Code
fig2 |>
  mutate(caracteristique = fct_reorder(caracteristique, surface_moyenne)) |>
  ggplot(aes(x = caracteristique, y = surface_moyenne, fill = section)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "m²",
       title = "Surface moyenne du logement",
       subtitle = "selon le type d'habitat et le statut d'occupation, début 2024") +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Figure 3 : ménages vivant dans un logement surpeuplé

Code
fig3 |>
  mutate(groupe = coalesce(groupe_age, section),
         caracteristique = fct_reorder(caracteristique, part_surpeuple)) |>
  ggplot(aes(x = caracteristique, y = part_surpeuple, fill = groupe)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~ groupe, scales = "free_y", ncol = 1) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Part des ménages vivant dans un logement surpeuplé",
       subtitle = "selon le statut d'occupation et le type de ménage, début 2024 (en %)") +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank(),
        strip.text = element_text(size = 8))

Figure 4 : défauts du logement selon le statut et le type d’habitat

Code
fig4 |>
  filter(section != "Ensemble") |>
  select(section, caracteristique, logement_bruyant, logement_trop_sombre,
         logement_difficile_a_chauffer, logement_difficile_a_rafraichir, logement_trop_cher) |>
  pivot_longer(-c(section, caracteristique), names_to = "defaut", values_to = "part") |>
  mutate(defaut = recode(defaut,
    logement_bruyant = "Bruyant", logement_trop_sombre = "Trop sombre",
    logement_difficile_a_chauffer = "Difficile à chauffer",
    logement_difficile_a_rafraichir = "Difficile à rafraîchir", logement_trop_cher = "Trop cher"
  )) |>
  ggplot(aes(x = caracteristique, y = part, fill = defaut)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  scale_fill_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Part de ménages concernés par chaque défaut du logement",
       subtitle = "selon le statut d'occupation et le type d'habitat, début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Figure 5 : défauts de l’environnement selon le type de commune

Code
fig5 |>
  filter(!poids) |>
  select(-ensemble, -poids) |>
  pivot_longer(-defaut, names_to = "commune", values_to = "part") |>
  mutate(commune = str_replace_all(commune, "_", " "),
         commune = str_to_sentence(commune),
         defaut = str_wrap(defaut, 40)) |>
  ggplot(aes(x = commune, y = part, fill = defaut)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = NULL,
       title = "Part de ménages concernés par les défauts de l'environnement",
       subtitle = "selon le type de commune de résidence, début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 1 : statut d’occupation selon l’âge

Code
tc1 |>
  filter(age != "Ensemble",
         statut %in% c("Propriétaire non-accédant", "Propriétaire accédant",
                        "Locataire du parc social", "Locataire du parc privé",
                        "Logé gratuitement")) |>
  ggplot(aes(x = age, y = part, fill = statut)) +
  geom_col(position = "stack") +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 12) +
  labs(x = NULL, y = NULL,
       title = "Statut d'occupation selon l'âge de la personne de référence",
       subtitle = "début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank())

Tableau complémentaire 3 : surface moyenne selon statut et type de ménage

Code
tc3 |>
  filter(section != "Ensemble") |>
  mutate(statut = str_replace_all(statut, "_", " "), statut = str_to_sentence(statut)) |>
  ggplot(aes(x = type_menage, y = surface_moyenne_m2, fill = statut)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "m²",
       title = "Surface moyenne du logement",
       subtitle = "selon le statut d'occupation et le type de ménage, début 2024") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 4 : surface par habitant et peuplement, 2013-2024

Code
tc4 |>
  filter(bloc == "Surface par habitant (m²)",
         !str_detect(caracteristique, "^(Surface par habitant|Par )"),
         !is.na(france_metro_2013)) |>
  select(caracteristique, `2013` = france_metro_2013, `2020` = france_metro_2020,
         `2024` = france_metro_2024) |>
  pivot_longer(-caracteristique, names_to = "annee", values_to = "surface") |>
  mutate(caracteristique = fct_reorder(caracteristique, surface)) |>
  ggplot(aes(x = caracteristique, y = surface, fill = annee)) +
  geom_col(position = position_dodge(width = 0.75), width = 0.7) +
  coord_flip() +
  scale_fill_brewer(palette = "Blues", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "m² par habitant",
       title = "Surface par habitant, France métropolitaine",
       subtitle = "2013, 2020 et 2024") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 5 : situation de peuplement

Code
tc5 |>
  filter(section != "Ensemble", caracteristique != "Ensemble") |>
  select(section, caracteristique, sous_peuplement_tres_accentue, sous_peuplement_prononce,
         sous_peuplement_modere, peuplement_normal, surpeuplement_modere, surpeuplement_accentue) |>
  pivot_longer(-c(section, caracteristique), names_to = "situation", values_to = "part") |>
  mutate(situation = str_replace_all(situation, "_", " "), situation = str_to_sentence(situation),
         situation = factor(situation, levels = c("Sous peuplement tres accentue", "Sous peuplement prononce",
                                                    "Sous peuplement modere", "Peuplement normal",
                                                    "Surpeuplement modere", "Surpeuplement accentue"))) |>
  ggplot(aes(x = caracteristique, y = part, fill = situation)) +
  geom_col(position = position_stack(reverse = TRUE)) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  scale_fill_brewer(palette = "RdYlBu", name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = NULL,
       title = "Situation de peuplement du logement",
       subtitle = "selon le statut d'occupation et le type de ménage, début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 6 : opinion sur l’adéquation du logement

Code
tc6 |>
  filter(section != "Ensemble", caracteristique != "Ensemble") |>
  select(section, caracteristique, trop_grand, correct, trop_petit) |>
  pivot_longer(-c(section, caracteristique), names_to = "opinion", values_to = "part") |>
  mutate(opinion = recode(opinion, trop_grand = "Trop grand pour vos besoins",
                           correct = "Correct", trop_petit = "Trop petit pour vos besoins"),
         opinion = factor(opinion, levels = c("Trop petit pour vos besoins", "Correct",
                                               "Trop grand pour vos besoins"))) |>
  ggplot(aes(x = caracteristique, y = part, fill = opinion)) +
  geom_col(position = position_stack(reverse = TRUE)) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  scale_fill_manual(values = c("Trop petit pour vos besoins" = "#E8737A",
                                "Correct" = "#8FB0DE", "Trop grand pour vos besoins" = "#1B3F8B"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Opinion des ménages sur l'adéquation du logement",
       subtitle = "nombre de pièces vs nombre d'occupants, début 2024 (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 7 : défauts d’environnement dans les QPV

Code
tc7 |>
  filter(!str_starts(defaut, "Part")) |>
  rename(`Quartier prioritaire (QPV)` = qpv, `Unités urbaines environnantes` = unites_urbaines_environnantes) |>
  mutate(defaut = fct_reorder(defaut, `Quartier prioritaire (QPV)`)) |>
  pivot_longer(-defaut, names_to = "zone", values_to = "part") |>
  ggplot(aes(x = defaut, y = part, fill = zone)) +
  geom_col(position = position_dodge(width = 0.75), width = 0.7) +
  coord_flip() +
  scale_fill_manual(values = c("Quartier prioritaire (QPV)" = "#E8737A",
                                "Unités urbaines environnantes" = "#1B3F8B"), name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = NULL,
       title = "Défauts de l'environnement du logement",
       subtitle = "dans les quartiers prioritaires vs les unités urbaines environnantes (en %)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Tableau complémentaire 8 : emménagements récents

Code
tc8 |>
  filter(section != "Ensemble") |>
  mutate(caracteristique = fct_reorder(caracteristique, part_emmenages_recents)) |>
  ggplot(aes(x = caracteristique, y = part_emmenages_recents, fill = section)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~ section, scales = "free_y", ncol = 1) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = NULL,
       title = "Part des ménages ayant emménagé au cours des quatre dernières années",
       subtitle = "début 2024 (en %)") +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank(),
        strip.text = element_text(size = 8))