House sales index of value of transactions (2015=100) - annual data - prc_hpi_hsva

Data - Eurostat

Info

Last observation: Annual: 2025 (N = 194)

First observation: Annual: 1998 (N = 3)

Last data update: 11 aoû 2026, 22:03. Last compile: 12 aoû 2026, 03:10

Structure

Purchase Total

France, Italy, Spain

Code
prc_hpi_hsva |>
  filter(geo %in% c("FR", "IT", "ES"),
         purchase == "TOTAL",
         unit == "I25_A_AVG") |>
  time_to_date() |>
  
  left_join(colors, by = c("Geo" = "country")) |>
  ggplot() + geom_line() + theme_minimal() +
  aes(x = date, y = values, color = color) +
  scale_color_identity() + add_flags +
  scale_x_date(breaks = seq(1920, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(-100, 300, 10)) +
  ylab("House Price Index") + xlab("")

Belgium, Denmark, Finland

Code
prc_hpi_hsva |>
  filter(geo %in% c("BE", "DK", "FI"),
         purchase == "TOTAL",
         unit == "I25_A_AVG") |>
  time_to_date() |>

  left_join(colors, by = c("Geo" = "country")) |>
  ggplot() + geom_line() + theme_minimal() +
  aes(x = date, y = values, color = color) +
  scale_color_identity() + add_flags +
  scale_x_date(breaks = seq(1920, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.1, 0.9),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(-100, 300, 10)) +
  ylab("House Price Index") + xlab("")

Annual Rate of Change

France, Netherlands, Sweden

Code
prc_hpi_hsva |>
  filter(geo %in% c("FR", "NL", "SE"),
         purchase == "TOTAL",
         unit == "RCH_A_AVG") |>
  time_to_date() |>
  left_join(colors, by = c("Geo" = "country")) |>
  mutate(values = values/100) |>
  ggplot() + geom_line(aes(x = date, y = values, color = color)) +
  theme_minimal() + scale_color_identity() + add_flags +
  scale_x_date(breaks = as.Date(paste0(seq(1998, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("House sales index, y-o-y rate of change") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

France: New vs. Existing Dwellings

Code
prc_hpi_hsva |>
  filter(geo == "FR",
         purchase %in% c("DW_NEW", "DW_EXST"),
         unit == "I25_A_AVG") |>
  time_to_date() |>
  ggplot() + geom_line(aes(x = date, y = values, color = Purchase)) +
  theme_minimal() +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1998, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("House sales index (2025 = 100)")

Latest Year by Country

Code
latest_y <- prc_hpi_hsva |>
  filter(purchase == "TOTAL", unit == "I25_A_AVG", !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

prc_hpi_hsva |>
  filter(geo %in% c("FR", "IT", "ES", "BE", "DK", "FI", "NL", "SE"),
         purchase == "TOTAL",
         unit %in% c("I25_A_AVG", "RCH_A_AVG"),
         time == latest_y) |>
  select(Geo, Unit, values) |>
  spread(Unit, values) |>
  print_table_conditional()
Geo Annual average index, 2025=100 Annual average rate of change
Belgium 100 26.8
Denmark 100 25.1
Finland 100 8.3
France 100 16.0
Italy 100 9.3
Netherlands 100 20.7
Spain 100 15.0
Sweden 100 3.5