Last data update: 30 oct. 2026, 22:43
Last compile: 30 oct. 2026, 22:43
`nombre-vente-maison-appartement-ancien` |>
ggplot() + theme_minimal() + xlab("") + ylab("Nombre de transactions") +
geom_line(aes(x = date, y = nombre_transactions)) +
scale_x_date(breaks = seq(1960, 2100, 5) |> paste0("-01-01") |> as.Date(),
labels = date_format("%Y")) +
scale_y_continuous(breaks = seq(0, 6000, 100),
labels = dollar_format(accuracy = 1, prefix = "", su = " K")) +
theme(legend.position = c(0.3, 0.5),
legend.title = element_blank()) +
geom_vline(xintercept = as.Date("2022-02-01"), color = "red", linetype = "dashed")
`nombre-vente-maison-appartement-ancien` |>
filter(date >= as.Date("2000-01-01")) |>
ggplot() + theme_minimal() + xlab("") + ylab("Nombre de transactions sur 12 mois") +
geom_line(aes(x = date, y = nombre_transactions)) +
scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
labels = date_format("%Y")) +
scale_y_continuous(breaks = seq(0, 6000, 100),
labels = dollar_format(accuracy = 1, prefix = "", su = " K")) +
theme(legend.position = c(0.3, 0.5),
legend.title = element_blank())
`nombre-vente-maison-appartement-ancien` |>
filter(date >= as.Date("2017-01-01")) |>
ggplot() + theme_minimal() + xlab("") + ylab("Nombre de transactions") +
geom_line(aes(x = date, y = nombre_transactions)) +
scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
labels = date_format("%Y")) +
scale_y_continuous(breaks = seq(0, 6000, 50),
labels = dollar_format(accuracy = 1, prefix = "", su = " K")) +
theme(legend.position = c(0.3, 0.5),
legend.title = element_blank())
`nombre-vente-maison-appartement-ancien` |>
filter(date >= as.Date("2000-01-01")) |>
arrange(date) |>
mutate(yoy = nombre_transactions / lag(nombre_transactions, 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))
Droits de mutation au taux de droit commun perçus par les départements (cumul sur 12 mois, voir droits-mutation-departement) rapportés au nombre de ventes de logements anciens sur 12 mois. Ordre de grandeur des « frais de notaire » départementaux par vente, donc approximation du prix moyen × taux. Le taux maximal est passé de 3,8 % à 4,5 % en 2014, puis jusqu’à 5 % à partir d’avril 2025 dans la plupart des départements.
dmto |>
filter(code == "FR", type == "Droit commun") |>
arrange(date) |>
mutate(dmto_12m = zoo::rollsumr(value, 12, fill = NA)) |>
inner_join(`nombre-vente-maison-appartement-ancien`, by = "date") |>
filter(!is.na(dmto_12m)) |>
mutate(dmto_par_vente = dmto_12m / (nombre_transactions * 1000)) |>
ggplot() + theme_minimal() + xlab("") + ylab("DMTO par vente (€)") +
geom_line(aes(x = date, y = dmto_par_vente)) +
scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
labels = date_format("%Y")) +
scale_y_continuous(breaks = seq(0, 20000, 1000),
labels = dollar_format(accuracy = 1, prefix = "", suffix = " €", big.mark = " ")) +
geom_vline(xintercept = as.Date(c("2014-03-01", "2025-04-01")), color = "red", linetype = "dashed")
dmto |>
filter(code == "FR", type == "Droit commun") |>
arrange(date) |>
mutate(dmto_12m = zoo::rollsumr(value, 12, fill = NA)) |>
inner_join(`nombre-vente-maison-appartement-ancien`, by = "date") |>
filter(!is.na(dmto_12m)) |>
transmute(date,
`Nombre de ventes (12 mois)` = nombre_transactions,
`Droits de mutation (12 mois)` = dmto_12m) |>
pivot_longer(-date) |>
group_by(name) |>
mutate(value = 100 * value / value[date == as.Date("2019-12-31")]) |>
ggplot() + theme_minimal() + xlab("") + ylab("100 = 2019") +
geom_line(aes(x = date, y = value, color = name)) +
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.3, 0.85),
legend.title = element_blank())