Paris se transforme

Données - Ville de Paris

Code
source(here::here("_rinit.R"))
source(here::here("data", "paris", "_paris.R"))   # wkb2sfc(), paris_basemap(), arrondissements_sf()
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/paris; /usr/local/bin/R -e 'quarto::quarto_render("parissetransforme.qmd")'

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

pst_path <- here::here("data", "paris", "parissetransforme.parquet")
pst <- arrow::read_parquet(pst_path) |>
  dplyr::mutate(ar = suppressWarnings(as.integer(substr(code_postal, 4, 5))))

n_tot  <- nrow(pst)
arr_sf <- arrondissements_sf()
pts_sf <- pst |>
  dplyr::mutate(geometry = wkb2sfc(geo_point_2d)) |>
  sf::st_as_sf(crs = 4326)

theme_carte <- theme_void(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        plot.margin = margin(5, 12, 5, 5))
theme_barres <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.major.y = element_blank())

« Paris se transforme » recense les projets municipaux concrets menés dans chaque quartier — écoles rénovées, commerces aidés, rues végétalisées, cours Oasis, stations de tri… 3 262 projets répartis en 14 grandes catégories.

Code
pst |>
  dplyr::filter(!is.na(date_liv)) |>
  dplyr::arrange(dplyr::desc(date_liv)) |>
  dplyr::transmute(Titre = titre_descriptif, Catégorie = categorie, Arrondissement = ar,
                   Livraison = date_liv) |>
  head(8) |>
  gt::gt() |>
  gt::tab_header(title = "8 projets livrés les plus récents") |>
  gt::tab_options(table.width = "100%")
8 projets livrés les plus récents
Titre Catégorie Arrondissement Livraison
Rénovation de la Cipale Sport 12 2025-12-31
Un jardin en hommage aux attentats du 13 novembre 2015 Mémoire 4 2025-11-13
Une nouvelle cour à l'école Duquesne (7e) Écoles et crèches 7 2025-11-10
Hommage dans le 16e à Tamara de Lempicka, figure de l'Art déco Culture et Patrimoine 16 2025-11-10
Renouveau à la bibliothèque Louise Walser-Gaillard (9e) Culture et Patrimoine 9 2025-11-10
La Maison des autres modes ouvre dans le 11e Attractivité et emploi 11 2025-11-03
À la bibliothèque Maurice-Genevoix (18e), le mobilier se met au vert Culture et Patrimoine 18 2025-11-03
Un buste pour Hubert Reeves Culture et Patrimoine 6 2025-11-03

Carte

Code
pal <- leaflet::colorFactor("Set3", domain = pst$categorie)

leaflet::leaflet(pts_sf, options = leaflet::leafletOptions(minZoom = 11)) |>
  paris_basemap() |>
  leaflet::addPolygons(data = arr_sf, fill = FALSE, color = "#999", weight = 1) |>
  leaflet::addCircleMarkers(
    radius = 4, stroke = FALSE, fillOpacity = 0.75, fillColor = ~pal(categorie),
    label = ~titre_descriptif,
    popup = ~sprintf("<b>%s</b><br>%s — %s<br>%s", titre_descriptif, categorie, sous_categorie,
                     dplyr::coalesce(adresse, ""))
  ) |>
  leaflet::addLegend("bottomright", pal = pal, values = ~categorie, title = "Catégorie", opacity = 0.9)

Par arrondissement

Code
cnt <- pst |> dplyr::filter(!is.na(ar)) |> dplyr::count(ar, name = "n")

arr_sf |>
  dplyr::left_join(cnt, by = c("c_ar" = "ar")) |>
  ggplot() +
  geom_sf(aes(fill = n), colour = "white", linewidth = 0.2) +
  scale_fill_viridis_c(option = "viridis", direction = -1, na.value = "grey92", name = "Projets") +
  labs(title = "Projets « Paris se transforme » par arrondissement") +
  theme_carte

Par catégorie

Code
pst |>
  dplyr::count(categorie, sort = TRUE) |>
  dplyr::mutate(categorie = forcats::fct_reorder(categorie, n)) |>
  ggplot(aes(n, categorie)) +
  geom_col(fill = "#2f6f4f", width = 0.65) +
  geom_text(aes(label = n), hjust = -0.2, size = 3) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Projets par catégorie",
       subtitle = "« Attractivité et emploi » domine, porté par l'aide aux commerçants et artisans",
       x = NULL, y = NULL) +
  theme_barres

Code
pst |>
  dplyr::filter(!is.na(sous_categorie)) |>
  dplyr::count(sous_categorie, sort = TRUE) |>
  head(12) |>
  dplyr::mutate(sous_categorie = forcats::fct_reorder(sous_categorie, n)) |>
  ggplot(aes(n, sous_categorie)) +
  geom_col(fill = "#3b6f8a", width = 0.65) +
  geom_text(aes(label = n), hjust = -0.2, size = 3) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Sous-catégories les plus fréquentes", x = NULL, y = NULL) +
  theme_barres

2 669 projets sur 3262 (82%) n’ont pas de date de livraison renseignée — pas d’évolution temporelle fiable sur l’ensemble du jeu de données.

Tous les projets

Code
pst |>
  dplyr::arrange(dplyr::desc(date_liv)) |>
  dplyr::transmute(Titre = titre_descriptif, Catégorie = categorie, `Sous-catégorie` = sous_categorie,
                   Arrondissement = ar, Adresse = adresse, Livraison = date_liv) |>
  reactable::reactable(
    searchable = TRUE,
    filterable = TRUE,
    pagination = TRUE,
    defaultPageSize = 20,
    compact = TRUE,
    resizable = TRUE,
    highlight = TRUE,
    wrap = TRUE,
    defaultColDef = reactable::colDef(
      align = "left",
      headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word")
    ),
    columns = list(
      Titre = reactable::colDef(minWidth = 220),
      Catégorie = reactable::colDef(minWidth = 140),
      `Sous-catégorie` = reactable::colDef(minWidth = 160),
      Arrondissement = reactable::colDef(minWidth = 70, maxWidth = 110),
      Adresse = reactable::colDef(minWidth = 160),
      Livraison = reactable::colDef(minWidth = 90, maxWidth = 110)
    )
  )

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Paris se transforme](https://opendata.paris.fr/explore/dataset/parissetransforme/information/)",
    "Ville de Paris",
    "Open Database License (ODbL)",
    sprintf("`data/paris/parissetransforme.parquet` (%s ko) + `arrondissements.parquet`",
            round(file.size(pst_path) / 1024)),
    format(as.Date(file.mtime(pst_path)), "%d %B %Y"),
    sprintf("%s projets, %d catégories", format(n_tot, big.mark = " "), dplyr::n_distinct(pst$categorie))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Paris se transforme
Producteur Ville de Paris
Licence Open Database License (ODbL)
Fichier data/paris/parissetransforme.parquet (406 ko) + arrondissements.parquet
Mise à jour 05 septembre 2026
Observations 3 262 projets, 14 catégories