Fiscalité directe locale par commune (REI), 2009-2025 : cartes de la région parisienne

Données - DGFIP

Code
source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/dgfip; /usr/local/bin/R -e 'quarto::quarto_render("rei-communes.qmd")'
# cd ~/iCloud/website/data; sh _status/run_all_silent.sh --only dgfip

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                       fig.width = 9, fig.height = 5.5, dpi = 150)
source(here::here("data", "dgfip", "_cartes.R"))

ds_path <- here::here("data", "dgfip", "rei-communes.parquet")
rei <- arrow::read_parquet(ds_path)
fr <- scales::label_number(big.mark = " ", decimal.mark = ",")
pct <- scales::label_number(accuracy = 1, suffix = " %")

theme_dgfip <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.minor = element_blank())
derniere <- max(rei$annee)

Source : DGFIP, REI (recensement des éléments d’imposition à la fiscalité directe locale), un fichier par année, ~35 000 communes, de 2009 à 2025. On retient pour chaque commune la base nette, le taux net voté par la commune et le produit de la taxe foncière sur les propriétés bâties (FB) et non bâties (FNB), de la taxe d’habitation (TH) et de la cotisation foncière des entreprises (CFE), ainsi que la population. Les comparaisons nationales sont dans rei. Fonds de carte : IGN GEOFLA 2016 (Paris fusionné en une seule commune, comme dans le REI).

Deux ruptures à garder en tête en lisant les séries :

Code
idf <- communes_sf(IDF) |> dplyr::left_join(
  rei |> dplyr::filter(annee == derniere) |> dplyr::select(code_insee, libelle, pop, fb_taux, fb_base, fb_produit, cfe_total, th_taux),
  by = "code_insee")
idf_dep <- departements_sf(idf)
dep_noms <- c("75" = "Paris", "77" = "Seine-et-Marne", "78" = "Yvelines", "91" = "Essonne",
              "92" = "Hauts-de-Seine", "93" = "Seine-Saint-Denis", "94" = "Val-de-Marne", "95" = "Val-d'Oise")

Taxe foncière sur les propriétés bâties

Taux communal de FB, dernière année

Code
carte(idf, "fb_taux", paste0("Taux de taxe foncière sur le bâti, ", derniere),
      "Île-de-France, taux net voté par la commune (incluant l'ex-part départementale)", "Taux (%)", idf_dep,
      limites = c(20, 55), labels = fr)

Évolution du taux de FB, 2022-dernière année

Les hausses de taux des dernières années (Paris notamment, de 13,5 % à 20,5 % en 2023) ressortent nettement.

Code
evol <- rei |>
  dplyr::filter(annee %in% c(2022, derniere)) |>
  dplyr::select(code_insee, annee, fb_taux) |>
  tidyr::pivot_wider(names_from = annee, values_from = fb_taux, names_prefix = "a") |>
  dplyr::mutate(variation = .data[[paste0("a", derniere)]] - a2022)
idf_evol <- idf |> dplyr::left_join(evol, by = "code_insee")
carte(idf_evol, "variation", paste0("Variation du taux de FB, 2022-", derniere),
      "Île-de-France, en points de pourcentage", "Points", idf_dep,
      divergente = TRUE, limites = c(-8, 8), labels = fr)

Les 15 communes (plus de 5 000 habitants) qui ont le plus augmenté leur taux

Code
idf_evol |>
  sf::st_drop_geometry() |>
  dplyr::filter(!is.na(variation), pop >= 5000) |>
  dplyr::slice_max(variation, n = 15) |>
  dplyr::mutate(libelle = forcats::fct_reorder(stringr::str_to_title(libelle), variation)) |>
  ggplot(aes(libelle, variation)) + geom_col(fill = "#b2182b") + coord_flip() +
  labs(title = paste0("Hausses du taux de FB en Île-de-France, 2022-", derniere), x = NULL, y = "Points de pourcentage") +
  theme_dgfip

Produit de FB par habitant

Code
idf_h <- idf |> dplyr::mutate(fb_par_hab = fb_produit / pop)
carte(idf_h, "fb_par_hab", paste0("Produit de la taxe foncière sur le bâti par habitant, ", derniere),
      "Île-de-France, euros par habitant (communes seules)", "€ / hab.", idf_dep,
      palette = "plasma", direction = -1, limites = c(100, 900), labels = fr)

Distribution des taux par département

Code
idf |>
  sf::st_drop_geometry() |>
  dplyr::filter(!is.na(fb_taux)) |>
  dplyr::mutate(departement = factor(dep_noms[dep], levels = dep_noms)) |>
  ggplot(aes(departement, fb_taux, colour = departement)) +
  geom_boxplot(outlier.shape = NA, fill = NA) + geom_jitter(width = 0.15, alpha = 0.3, size = 0.8) +
  scale_colour_viridis_d(guide = "none") + coord_flip() +
  labs(title = paste0("Taux de taxe foncière sur le bâti par commune, ", derniere), x = NULL, y = "Taux (%)") + theme_dgfip

Évolution du taux depuis 2009 : quelques communes

Code
choix <- c("75056" = "Paris", "92051" = "Neuilly-sur-Seine", "92012" = "Boulogne-Billancourt", "92050" = "Nanterre",
           "93066" = "Saint-Denis", "93048" = "Montreuil", "78646" = "Versailles", "94028" = "Créteil")
rei |>
  dplyr::filter(code_insee %in% names(choix)) |>
  dplyr::mutate(commune = choix[code_insee]) |>
  ggplot(aes(annee, fb_taux, colour = commune)) +
  geom_vline(xintercept = 2020.5, linetype = "dashed", colour = "grey50") +
  geom_line() + geom_point(size = 1) +
  scale_x_continuous(breaks = scales::breaks_pretty(9)) +
  labs(title = "Taux communal de taxe foncière sur le bâti", subtitle = "Trait pointillé : transfert de la part départementale (2021)",
       x = NULL, y = "Taux (%)", colour = NULL) + theme_dgfip + theme(legend.position = "bottom")

Taxe d’habitation

Taux de TH en 2017 (dernière année avant la réforme)

Code
th17 <- communes_sf(IDF) |>
  dplyr::left_join(rei |> dplyr::filter(annee == 2017) |> dplyr::select(code_insee, th_taux), by = "code_insee")
carte(th17, "th_taux", "Taux de taxe d'habitation, 2017", "Île-de-France, taux net voté par la commune",
      "Taux (%)", idf_dep, palette = "magma", direction = -1, limites = c(8, 25), labels = fr)

Taux de TH sur les résidences secondaires, dernière année

Code
carte(idf, "th_taux", paste0("Taux de taxe d'habitation (résidences secondaires), ", derniere),
      "Île-de-France, taux net voté par la commune", "Taux (%)", idf_dep,
      palette = "magma", direction = -1, limites = c(8, 30), labels = fr)

Cotisation foncière des entreprises

CFE : sommes mises en recouvrement par habitant, dernière année

Tous niveaux confondus (commune, EPCI, syndicats…), rapportées à la population de la commune : les pôles d’activité (La Défense, Roissy, Paris…) ressortent.

Code
idf_c <- idf |> dplyr::mutate(cfe_par_hab = cfe_total / pop)
carte(idf_c, "cfe_par_hab", paste0("CFE par habitant, ", derniere),
      "Île-de-France, euros par habitant", "€ / hab.", idf_dep,
      palette = "viridis", limites = c(0, 800), labels = fr)

France entière

Code
fr_sf <- communes_sf(depts = NULL, simplifier = 400) |>
  dplyr::left_join(rei |> dplyr::filter(annee == derniere) |> dplyr::select(code_insee, fb_taux), by = "code_insee")
carte(fr_sf, "fb_taux", paste0("Taux communal de taxe foncière sur le bâti, ", derniere),
      "Communes de France métropolitaine ; en gris, communes sans polygone 2016 (fusions récentes)", "Taux (%)",
      palette = "viridis", limites = c(15, 60), labels = fr)