Ségrégation résidentielle et logement social dans les grandes agglomérations en 2022 - IA121

Données - INSEE

Figure 1 : concentration spatiale et ségrégation du parc social

Code
fig1 |>
  mutate(unite_urbaine = fct_reorder(unite_urbaine, concentration_parc_social)) |>
  ggplot(aes(x = unite_urbaine, y = concentration_parc_social)) +
  geom_col(fill = "#1B3F8B") +
  coord_flip() +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "Indice de dissimilarité (%)",
       title = "Concentration spatiale du parc social",
       subtitle = "grandes agglomérations, 2022") +
  theme(panel.grid.minor = element_blank(), panel.grid.major.y = element_blank())

Code
fig1 |>
  ggplot(aes(x = part_logements_sociaux, y = segregation_totale)) +
  geom_point(color = "#1B3F8B", size = 2) +
  ggrepel::geom_text_repel(aes(label = unite_urbaine), size = 2.8, max.overlaps = 15) +
  theme_minimal(base_size = 11) +
  labs(x = "Part de logements sociaux (%)", y = "Indice d'entropie (ségrégation totale)",
       title = "Ségrégation résidentielle et part de logements sociaux",
       subtitle = "grandes agglomérations, 2022") +
  theme(panel.grid.minor = element_blank())

Figure 2 : distribution des niveaux de vie, parc social vs. parc privé

Code
fig2 |>
  pivot_longer(-decile, names_to = "parc", values_to = "niveau_vie") |>
  mutate(parc = recode(parc, parc_social = "Parc social", parc_prive = "Parc privé")) |>
  ggplot(aes(x = decile, y = niveau_vie, color = parc, group = parc)) +
  geom_line(linewidth = 1) +
  geom_point() +
  scale_color_manual(values = c("Parc social" = "#1B3F8B", "Parc privé" = "#E8737A"), name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "€ par an",
       title = "Distribution des niveaux de vie des ménages",
       subtitle = "parc social vs. parc privé, 2022") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid.minor = element_blank())

Figure 3 : niveau de vie médian et part de logements sociaux par quartier

Code
fig3 |>
  select(cinquieme, niveau_vie_median_social, niveau_vie_median_prive) |>
  pivot_longer(-cinquieme, names_to = "parc", values_to = "niveau_vie") |>
  mutate(parc = recode(parc, niveau_vie_median_social = "Parc social",
                        niveau_vie_median_prive = "Parc privé")) |>
  ggplot(aes(x = cinquieme, y = niveau_vie, fill = parc)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("Parc social" = "#1B3F8B", "Parc privé" = "#E8737A"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "€ par an",
       title = "Niveau de vie médian selon le cinquième de niveau de vie de l'IRIS",
       subtitle = "quartiers classés selon le niveau de vie médian du parc privé, 2022") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 20, hjust = 1),
        panel.grid.minor = element_blank())

Code
fig3 |>
  ggplot(aes(x = cinquieme, y = part_logements_sociaux)) +
  geom_col(fill = "#1B3F8B") +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "%",
       title = "Part de logements sociaux selon le cinquième de niveau de vie de l'IRIS",
       subtitle = "2022") +
  theme(axis.text.x = element_text(angle = 20, hjust = 1), panel.grid.minor = element_blank())

Figure 5 : écart de niveau de vie à l’entrée dans un logement social

Code
fig5 |>
  select(cinquieme, ecart_composition_parc, ecart_selection_demandeurs) |>
  pivot_longer(-cinquieme, names_to = "composante", values_to = "valeur") |>
  mutate(composante = recode(composante, ecart_composition_parc = "Composition du parc",
                              ecart_selection_demandeurs = "Sélection et autosélection des demandeurs")) |>
  ggplot(aes(x = cinquieme, y = valeur, fill = composante)) +
  geom_col() +
  geom_point(data = fig5, aes(x = cinquieme, y = ecart_total), inherit.aes = FALSE, shape = 18, size = 3) +
  scale_fill_manual(values = c("Composition du parc" = "#1B3F8B",
                                "Sélection et autosélection des demandeurs" = "#E8737A"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "Points de %",
       title = "Écart de niveau de vie à l'entrée dans un logement social",
       subtitle = "par rapport aux quartiers les plus modestes, 2018-2022 (losange : écart total)") +
  theme(legend.position = "bottom", axis.text.x = element_text(angle = 20, hjust = 1),
        panel.grid.minor = element_blank())

Figure 6 : réduction de l’indice de ségrégation résidentielle

Code
fig6 |>
  mutate(unite_urbaine = fct_reorder(unite_urbaine, reduction_segregation)) |>
  select(unite_urbaine, dont_composante_locale, reduction_segregation) |>
  mutate(reste = reduction_segregation - dont_composante_locale) |>
  select(-reduction_segregation) |>
  pivot_longer(-unite_urbaine, names_to = "composante", values_to = "valeur") |>
  mutate(composante = recode(composante, dont_composante_locale = "Composante locale (mixité au sein des IRIS)",
                              reste = "Reste (répartition entre IRIS)")) |>
  ggplot(aes(x = unite_urbaine, y = valeur, fill = composante)) +
  geom_col() +
  coord_flip() +
  scale_fill_manual(values = c("Composante locale (mixité au sein des IRIS)" = "#1B3F8B",
                                "Reste (répartition entre IRIS)" = "#8FA8D8"), name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "%",
       title = "Réduction de l'indice de ségrégation résidentielle",
       subtitle = "sous une répartition homogène des ménages dans le parc social existant, 2022") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())