Logement — part des meublés dans le locatif privé à Paris, par IRIS

Données - INSEE

Code
here::i_am("data/insee/logement-meubles-paris.qmd")
source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
invisible(Sys.setenv(TZ = "Europe/Paris"))
# cd ~/iCloud/website/data/insee; /usr/local/bin/R -e 'quarto::quarto_render("logement-meubles-paris.qmd")'
# sh ~/iCloud/website/website_short.sh; open https://fgeerolf.com/data/insee/logement-meubles-paris.html
# Données : cd ~/iCloud/website/data/insee; Rscript --vanilla logement_meubles_iris.R

source(here::here("data", "insee", "_iris_meubles.R"))   # wkb2sfc(), iris_meubles_sf(), zones_meubles_sf()

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 8, fig.height = 7, dpi = 150)

iris_path <- here::here("data", "insee", "logement_meubles_iris.parquet")
iris_stats <- arrow::read_parquet(iris_path) |> dplyr::filter(DEP == "75")

iris_paris <- iris_meubles_sf("75")
arr_paris  <- zones_meubles_sf("75") |> dplyr::mutate(arr = as.integer(substr(ZONE, 4, 5)))

fill_meuble <- function(name = "Part\nmeublé") {
  scale_fill_viridis_c(option = "rocket", direction = -1, name = name,
                       labels = scales::percent, limits = c(0, NA))
}
theme_carte <- theme_void(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        legend.position = "right")

Le recensement de la population identifie, pour chaque logement occupé à titre de résidence principale, un statut d’occupation détaillé (variable STOCD) qui distingue notamment :

Le locatif privé est défini ici comme la somme des deux premières catégories (loué vide non HLM + loué meublé — la location meublée en HLM est marginale et de toute façon non isolée par STOCD), et la part des meublés comme le poids du loué meublé dans cet ensemble :

\[ \text{part meublé} = \frac{\text{loué meublé}}{\text{loué vide non HLM} + \text{loué meublé}} \]

Source : fichier détail logement du recensement de la population 2021 (Insee), agrégé par IRIS (936 IRIS avec au moins un logement locatif privé recensé à Paris).

Carte par IRIS

Code
iris_paris |>
  ggplot() +
  geom_sf(aes(fill = part_meuble), colour = "white", linewidth = 0.05) +
  fill_meuble() +
  labs(title = "Part des meublés dans le locatif privé, par IRIS",
       subtitle = "Paris, recensement de la population 2021") +
  theme_carte

Carte interactive

Survol pour le détail par IRIS (part de meublés, nombre de logements locatifs privés recensés). Les IRIS grisés n’ont pas de logement locatif privé significatif recensé (parcs, zones d’activité…) ou une estimation jugée peu fiable (moins de 30 logements locatifs privés dans l’échantillon).

Code
pal <- colorNumeric("rocket", domain = iris_paris$part_meuble, na.color = "#d9d9d9")

leaflet(iris_paris, options = leafletOptions(minZoom = 11)) |>
  meubles_basemap() |>
  addPolygons(
    fillColor = ~pal(part_meuble), fillOpacity = 0.8,
    color = "white", weight = 0.5,
    highlightOptions = highlightOptions(weight = 2, color = "#333", bringToFront = TRUE),
    label = ~sprintf("%s (%s) — %s", LIB_IRIS, CODE_IRIS,
                     ifelse(is.na(part_meuble), "n.d.", scales::percent(part_meuble, 0.1))),
    popup = ~sprintf(
      "<b>%s</b><br>IRIS %s, %s<br>Part meublé : <b>%s</b><br>Logements locatifs privés recensés : %s",
      LIB_IRIS, CODE_IRIS, LIBCOM,
      ifelse(is.na(part_meuble), "n.d.", scales::percent(part_meuble, 0.1)),
      ifelse(is.na(n_locatif_prive), "n.d.", n_locatif_prive))
  ) |>
  addLegend("bottomright", pal = pal, values = ~part_meuble,
            title = "Part\nmeublé", labFormat = labelFormat(suffix = ""), opacity = 0.9)

Carte par arrondissement

Agrégée sur l’ensemble des logements locatifs privés recensés de l’arrondissement (et non la moyenne des parts par IRIS), la part de meublés grimpe nettement dans les arrondissements centraux et du nord-est parisien.

Code
arr_paris |>
  ggplot() +
  geom_sf(aes(fill = part_meuble), colour = "white", linewidth = 0.2) +
  geom_sf_text(aes(label = arr), colour = "white", size = 3, fontface = "bold") +
  fill_meuble() +
  labs(title = "Part des meublés dans le locatif privé, par arrondissement",
       subtitle = "Paris, recensement de la population 2021") +
  theme_carte

Carte interactive

Code
pal_arr <- colorNumeric("rocket", domain = arr_paris$part_meuble)

leaflet(arr_paris, options = leafletOptions(minZoom = 11)) |>
  meubles_basemap() |>
  addPolygons(
    fillColor = ~pal_arr(part_meuble), fillOpacity = 0.8,
    color = "white", weight = 1.5,
    highlightOptions = highlightOptions(weight = 3, color = "#333", bringToFront = TRUE),
    label = ~sprintf("%de arrondissement — %s", arr, scales::percent(part_meuble, 0.1)),
    popup = ~sprintf(
      "<b>%de arrondissement</b> (%s)<br>Part meublé : <b>%s</b><br>Logements locatifs privés recensés : %s",
      arr, LIBCOM, scales::percent(part_meuble, 0.1), n_locatif_prive)
  ) |>
  addLegend("bottomright", pal = pal_arr, values = ~part_meuble,
            title = "Part\nmeublé", opacity = 0.9)

Classement des arrondissements

Code
arr_paris |>
  sf::st_drop_geometry() |>
  dplyr::transmute(Arrondissement = paste0(arr, "e"), Nom = LIBCOM,
                   `Locatif privé` = n_locatif_prive,
                   `Part meublé` = part_meuble) |>
  dplyr::arrange(dplyr::desc(`Part meublé`)) |>
  dplyr::mutate(Rang = dplyr::row_number(), .before = 1) |>
  gt::gt() |>
  gt::fmt_percent(columns = `Part meublé`, decimals = 1) |>
  gt::fmt_number(columns = `Locatif privé`, decimals = 0) |>
  gt::data_color(columns = `Part meublé`, palette = "OrRd") |>
  gt::tab_footnote(gt::md(paste0(
    "Recensement de la population 2021 (Insee), fichier détail logement — ",
    "locatif privé = loué vide non HLM + loué meublé (`STOCD` 21 et 23)."))) |>
  gt::tab_options(table.width = "100%")
Rang Arrondissement Nom Locatif privé Part meublé
1 5e Panthéon 6,270 36.4%
2 3e Temple 3,914 34.0%
3 10e Entrepôt 8,761 33.4%
4 13e Gobelins 14,534 33.2%
5 4e Hôtel-de-Ville 2,991 32.6%
6 7e Palais-Bourbon 5,048 31.4%
7 17e Batignolles-Monceau 15,860 30.8%
8 16e Passy 13,136 29.7%
9 6e Luxembourg 4,283 29.3%
10 11e Popincourt 16,081 29.1%
11 9e Opéra 6,510 29.0%
12 14e Observatoire 11,671 27.6%
13 20e Ménilmontant 14,973 27.0%
14 18e Buttes-Montmartre 19,328 27.0%
15 19e Buttes-Chaumont 13,704 26.9%
16 2e Bourse 2,715 26.7%
17 12e Reuilly 13,045 25.3%
18 8e Élysée 3,464 23.3%
19 1e Louvre 1,967 23.2%
20 15e Vaugirard 22,206 23.1%
Recensement de la population 2021 (Insee), fichier détail logement — locatif privé = loué vide non HLM + loué meublé (STOCD 21 et 23).

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Fichiers", "Géométries IRIS",
         "Mise à jour", "Observations"),
  `  ` = c(
    "[Logements ordinaires en 2021 — Fichier détail](https://www.insee.fr/fr/statistiques/8268903)",
    "Insee — Recensement de la population 2021",
    sprintf("`data/insee/logement_meubles_iris.parquet` (%s ko)",
            round(file.size(iris_path) / 1024)),
    "IGN, contours IRIS (Géoplateforme, WFS `data.geopf.fr`)",
    format(as.Date(file.mtime(iris_path)), "%d %B %Y"),
    sprintf("%s IRIS, %s logements locatifs privés recensés au total",
            nrow(iris_stats), sum(iris_stats$n_locatif_prive))
  )
) |>
  gt::gt() |>
  gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Logements ordinaires en 2021 — Fichier détail
Producteur Insee — Recensement de la population 2021
Fichiers data/insee/logement_meubles_iris.parquet (118 ko)
Géométries IRIS IGN, contours IRIS (Géoplateforme, WFS data.geopf.fr)
Mise à jour 24 septembre 2026
Observations 936 IRIS, 200461 logements locatifs privés recensés au total