Droits de mutation (« frais de notaire ») par département - droits-mutation-departement

Data - cgedd

Info

Produit mensuel des droits de mutation à titre onéreux (DMTO, la plus grosse partie des « frais de notaire ») perçus par les départements, d’après la DGFiP, compilé par Jacques Friggit (IGEDD). Trois assiettes :

  • Droit commun : mutations taxées au taux de droit commun (pour l’essentiel les ventes de logements anciens) ;
  • Taux dérogatoire : mutations taxées à taux réduit (notamment terrains à bâtir, logements neufs) ;
  • Inscriptions d’hypothèques : droit sur les inscriptions d’hypothèques.

NB : depuis mi-2019, les montants de la Haute-Corse (2B) sont fusionnés dans ceux de la Corse-du-Sud (2A) ; depuis début 2021, ceux du Bas-Rhin (67) dans ceux du Haut-Rhin (68). Les graphiques par département ci-dessous regroupent donc la Corse et l’Alsace.

Source : IGEDD, valeur-immobilier-france.xlsx.

Téléchargement

Code
dmto |>
  filter(niveau == "Département") |>
  mutate(value = round(value)) |>
  pivot_wider(id_cols = c(date, code, libelle), names_from = type, values_from = value) |>
  rename(departement = libelle) |>
  download_this(output_name = "droits-mutation-departement",
                output_extension = ".csv",
                button_label = "Départements, mensuel (CSV)",
                button_type = "success",
                has_icon = TRUE, icon = "fa fa-download",
                csv2 = FALSE)
Code
dmto |>
  mutate(annee = year(date)) |>
  group_by(niveau, code, libelle, type, annee) |>
  summarise(value = round(sum(value)), nb_mois = n(), .groups = "drop") |>
  download_this(output_name = "droits-mutation-annuel",
                output_extension = ".csv",
                button_label = "Tous niveaux, annuel (CSV)",
                button_type = "success",
                has_icon = TRUE, icon = "fa fa-download",
                csv2 = FALSE)

France

Cumul sur 12 mois, par type

Code
dmto_12m |>
  filter(code == "FR", !is.na(value_12m)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (Md€)") +
  geom_line(aes(x = date, y = value_12m / 1e9, color = type)) +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 30, 1),
                     labels = dollar_format(accuracy = 1, prefix = "", suffix = " Md€")) +
  theme(legend.position = c(0.25, 0.85),
        legend.title = element_blank())

Droit commun, cumul sur 12 mois

Code
dmto_12m |>
  filter(code == "FR", type == "Droit commun", !is.na(value_12m)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (Md€)") +
  geom_line(aes(x = date, y = value_12m / 1e9)) +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 30, 1),
                     labels = dollar_format(accuracy = 1, prefix = "", suffix = " Md€"))

Droit commun, glissement annuel du cumul sur 12 mois

Code
dmto_12m |>
  filter(code == "FR", type == "Droit commun") |>
  arrange(date) |>
  mutate(yoy = value_12m / lag(value_12m, 12) - 1) |>
  filter(!is.na(yoy)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Glissement annuel") +
  geom_line(aes(x = date, y = yoy)) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01 * seq(-50, 50, 5),
                     labels = percent_format(accuracy = 1))

Île-de-France, Province, DOM (base 100 = 2019)

Code
dmto_12m |>
  filter(niveau == "France", code != "FR", type == "Droit commun", !is.na(value_12m)) |>
  group_by(libelle) |>
  mutate(value_12m = 100 * value_12m / value_12m[date == as.Date("2019-12-31")]) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (100 = 2019)") +
  geom_line(aes(x = date, y = value_12m, color = libelle)) +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 300, 10)) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

Régions

Cumul sur 12 mois, droit commun

Code
dmto_12m |>
  filter(niveau == "Région", type == "Droit commun", !is.na(value_12m)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (Md€)") +
  geom_line(aes(x = date, y = value_12m / 1e9, color = libelle)) +
  scale_x_date(breaks = seq(1960, 2100, 4) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = c(0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5),
                labels = dollar_format(accuracy = 0.01, prefix = "", suffix = " Md€")) +
  theme(legend.title = element_blank())

Base 100 = 2019

Code
dmto_12m |>
  filter(niveau == "Région", type == "Droit commun", !is.na(value_12m),
         date >= as.Date("2015-01-01")) |>
  group_by(libelle) |>
  mutate(value_12m = 100 * value_12m / value_12m[date == as.Date("2019-12-31")]) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (100 = 2019)") +
  geom_line(aes(x = date, y = value_12m)) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "grey50") +
  facet_wrap(~ libelle) +
  scale_x_date(breaks = seq(1960, 2100, 4) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y"))

Départements

Tableau

Code
dep_12m |>
  group_by(zone) |>
  arrange(date) |>
  summarise(`Cumul 12 mois (M€)` = last(value_12m) / 1e6,
            `Glissement annuel` = last(value_12m) / value_12m[date == last_date - years(1)] - 1,
            `Max (M€)` = max(value_12m, na.rm = TRUE) / 1e6,
            `Date du max` = date[which.max(value_12m)],
            `Écart au max` = last(value_12m) / max(value_12m, na.rm = TRUE) - 1) |>
  arrange(-`Cumul 12 mois (M€)`) |>
  rename(`Département` = zone) |>
  gt::gt() |>
  gt::fmt_number(c(`Cumul 12 mois (M€)`, `Max (M€)`), decimals = 0, sep_mark = " ") |>
  gt::fmt_percent(c(`Glissement annuel`, `Écart au max`), decimals = 1) |>
  gt::fmt_date(`Date du max`, date_style = "yMMM", locale = "fr") |>
  gt::opt_interactive(use_search = TRUE, use_sorting = TRUE, page_size_default = 20)

20 premiers départements, cumul sur 12 mois

Code
dep_12m |>
  filter(date == last_date) |>
  slice_max(value_12m, n = 20) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_col(aes(x = value_12m / 1e6, y = reorder(zone, value_12m)), fill = "#2c7fb8") +
  scale_x_continuous(breaks = seq(0, 2000, 100),
                     labels = dollar_format(accuracy = 1, prefix = "", suffix = " M€")) +
  labs(caption = paste("Cumul sur 12 mois à fin", format(last_date, "%B %Y")))

Carte : cumul sur 12 mois

Code
carte_data <- dep_12m |>
  filter(date == last_date) |>
  select(zone, value_12m) |>
  left_join(zones, by = "zone") |>
  # La Corse / l'Alsace ont un montant pour 2 polygones : on répartit à parts égales
  group_by(zone) |>
  mutate(value_12m = value_12m / n()) |>
  ungroup()

carte_data |>
  right_join(departements, by = "CODE_DEPT") |>
  ggplot() + aes(long, lat, group = group, fill = value_12m / 1e6) +
  coord_equal() + theme_void() + geom_polygon(color = "white", linewidth = 0.1) +
  scale_fill_viridis_c(na.value = "white", direction = -1, trans = "log10",
                       name = "M€ sur 12 mois",
                       breaks = c(10, 20, 50, 100, 200, 500, 1000)) +
  labs(caption = paste("Droit commun, cumul sur 12 mois à fin", format(last_date, "%B %Y"),
                       "\nCorse et Alsace : montant réparti à parts égales"))

Carte : glissement annuel

Code
dep_12m |>
  group_by(zone) |>
  summarise(yoy = value_12m[date == last_date] / value_12m[date == last_date - years(1)] - 1) |>
  left_join(zones, by = "zone") |>
  right_join(departements, by = "CODE_DEPT") |>
  ggplot() + aes(long, lat, group = group, fill = yoy) +
  coord_equal() + theme_void() + geom_polygon(color = "white", linewidth = 0.1) +
  scale_fill_gradient2(low = "#d7191c", mid = "white", high = "#1a9641", midpoint = 0,
                       na.value = "grey90", labels = percent_format(accuracy = 1),
                       name = "Glissement\nannuel") +
  labs(caption = paste("Droit commun, cumul sur 12 mois à fin", format(last_date, "%B %Y"),
                       "vs. un an plus tôt"))

Carte : écart au pic de 2022

Code
dep_12m |>
  group_by(zone) |>
  summarise(ecart = value_12m[date == last_date] /
              max(value_12m[year(date) == 2022], na.rm = TRUE) - 1) |>
  left_join(zones, by = "zone") |>
  right_join(departements, by = "CODE_DEPT") |>
  ggplot() + aes(long, lat, group = group, fill = ecart) +
  coord_equal() + theme_void() + geom_polygon(color = "white", linewidth = 0.1) +
  scale_fill_gradient2(low = "#d7191c", mid = "white", high = "#1a9641", midpoint = 0,
                       na.value = "grey90", labels = percent_format(accuracy = 1),
                       name = "Écart au\nmax. 2022") +
  labs(caption = paste("Droit commun, cumul sur 12 mois à fin", format(last_date, "%B %Y"),
                       "vs. maximum atteint en 2022"))

Grandes métropoles (base 100 = 2019)

Code
dep_12m |>
  filter(zone %in% c("Paris (75)", "Hauts-de-Seine (92)", "Rhône (69)",
                     "Bouches-du-Rhône (13)", "Gironde (33)", "Haute-Garonne (31)",
                     "Alpes-Maritimes (06)", "Loire-Atlantique (44)", "Nord (59)"),
         !is.na(value_12m)) |>
  group_by(zone) |>
  mutate(value_12m = 100 * value_12m / value_12m[date == as.Date("2019-12-31")]) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Cumul sur 12 mois (100 = 2019)") +
  geom_line(aes(x = date, y = value_12m, color = zone)) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "grey50") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 300, 10)) +
  theme(legend.title = element_blank())

Paris : produit mensuel et cumul sur 12 mois

Code
dep_12m |>
  filter(zone == "Paris (75)") |>
  ggplot() + theme_minimal() + xlab("") + ylab("M€") +
  geom_col(aes(x = date, y = value / 1e6), fill = "grey70") +
  geom_line(aes(x = date, y = value_12m / 12 / 1e6), color = "#d7191c") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  labs(caption = "Barres : produit mensuel ; ligne : moyenne mensuelle sur 12 mois")