Owner-occupied housing price index (2015=100) - quarterly data

Data - Eurostat

Info

source dataset .html .RData
eurostat prc_hpi_ooq 2024-11-05 2024-10-09

Data on housing

source dataset .html .RData
bdf RPP 2024-11-19 2024-11-19
bis LONG_PP 2024-08-09 2024-05-10
bis SELECTED_PP 2024-10-31 2024-10-31
ecb RPP 2024-10-08 2024-10-30
eurostat ei_hppi_q 2024-11-21 2024-11-21
eurostat hbs_str_t223 2024-11-08 2024-11-21
eurostat prc_hicp_midx 2024-11-01 2024-11-21
eurostat prc_hpi_q 2024-11-05 2024-10-09
fred housing 2024-11-22 2024-11-22
insee IPLA-IPLNA-2015 2024-11-09 2024-11-22
oecd housing 2024-09-15 2020-01-18
oecd SNA_TABLE5 2024-09-11 2023-10-19

Last

Code
prc_hpi_ooq %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  head(3) %>%
  print_table_conditional()
time Nobs
2024Q2 1279
2024Q1 1278
2023Q4 1277

expend

Code
prc_hpi_ooq %>%
  left_join(expend, by = "expend") %>%
  group_by(expend, Expend) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
expend Expend Nobs
DW_ACQ_NEW New dwellings 8318
TOTAL Total 8318
DW_ACQ Acquisitions of dwellings 8313
DW_ACQ_OTH Other services related to the acquisition of dwellings 8270
DW_OWN Ownership of dwellings 8265
DW_ACQ_NEWP Purchases of newly built dwellings 8224
DW_OWN_RMNT Major repairs and maintenance 8203
DW_OWN_INS Insurance connected with dwellings 7828
DW_ACQ_NEWSB Self-build dwellings and major renovations 7549
DW_ACQ_EXST Existing dwellings new to the households 3776
DW_OWN_OTH Other services related to ownership of dwellings 3012

unit

Code
prc_hpi_ooq %>%
  left_join(unit, by = "unit") %>%
  group_by(unit, Unit) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
unit Unit Nobs
I15_Q Quarterly index, 2015=100 20510
I10_Q Quarterly index, 2010=100 20220
RCH_Q Quarterly rate of change 20176
RCH_A Annual rate of change 19170

geo

Code
prc_hpi_ooq %>%
  left_join(geo, by = "geo") %>%
  group_by(geo, Geo) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

time

Code
prc_hpi_ooq %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

Greece, Europe, France, Spain, Italy, Germany

Purchase Total

Code
prc_hpi_ooq %>%
  filter(expend == "TOTAL",
         geo %in% c("EL", "FR", "ES", "IT", "DE"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  group_by(geo) %>%
  mutate(values = 100*values/values[date == as.Date("2011-01-01")]) %>%
  filter(date >= as.Date("2009-01-01"),
         date <= as.Date("2016-01-01")) %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "EA", "Europe", Geo),
         Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  ggplot(.) + geom_line(aes(x = date, y = values, color = Geo)) + 
  theme_minimal() + xlab("") + ylab("100 = Janv. 2011") +
  scale_x_date(breaks = seq(1960, 2021, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%y")) +
  scale_color_manual(values = c("#ED2939", "#000000", "#009246", "#FFC400")) + add_4flags +
  scale_y_log10(breaks = seq(0, 200, 5)) +
  theme(legend.position = "none",
        legend.title = element_blank())

Acquisitions of dwellings - DW_ACQ

Code
prc_hpi_ooq %>%
  filter(expend == "DW_ACQ",
         geo %in% c("EL", "FR", "ES", "IT", "DE"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  group_by(geo) %>%
  mutate(values = 100*values/values[date == as.Date("2011-01-01")]) %>%
  filter(date >= as.Date("2009-01-01"),
         date <= as.Date("2016-01-01")) %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "EA", "Europe", Geo),
         Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  ggplot(.) + geom_line(aes(x = date, y = values, color = Geo)) + 
  theme_minimal() + xlab("") + ylab("100 = Janv. 2011") +
  scale_x_date(breaks = seq(1960, 2021, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%y")) +
  scale_color_manual(values = c("#ED2939", "#000000", "#009246", "#FFC400")) + add_4flags +
  scale_y_log10(breaks = seq(0, 200, 5)) +
  theme(legend.position = "none",
        legend.title = element_blank())

Ownership of new dwellings - DW_NEW

Code
prc_hpi_ooq %>%
  filter(expend == "DW_OWN",
         geo %in% c("EL", "FR", "ES", "IT", "DE"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  group_by(geo) %>%
  mutate(values = 100*values/values[date == as.Date("2011-01-01")]) %>%
  filter(date >= as.Date("2009-01-01"),
         date <= as.Date("2016-01-01")) %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "EA", "Europe", Geo),
         Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  ggplot(.) + geom_line(aes(x = date, y = values, color = Geo)) + 
  theme_minimal() + xlab("") + ylab("100 = Janv. 2011") +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_color_manual(values = c("#ED2939", "#000000", "#009246", "#FFC400")) + add_4flags +
  scale_y_log10(breaks = seq(0, 200, 2)) +
  theme(legend.position = "none",
        legend.title = element_blank())

2006Q1

Code
prc_hpi_ooq %>%
  filter(time == "2006Q1") %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

Purchase Total

Nobs

Code
prc_hpi_ooq %>%
  filter(expend == "TOTAL",
         unit == "I15_Q") %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "EA", "Europe", Geo),
         Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  group_by(geo, Geo) %>%
  arrange(time) %>%
  summarise(first = first(time),
            last = last(time),
            Nobs = n()) %>%
  arrange(-Nobs) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

France, Italy, Germany

Code
prc_hpi_ooq %>%
  filter(expend == "TOTAL",
         geo %in% c("FR", "IT", "DE"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "EA", "Europe", Geo),
         Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  ggplot() + geom_line(aes(x = date, y = values, color = Geo)) + theme_minimal() + add_3flags +
  scale_color_manual(values = c("#ED2939", "#000000", "#009246", "#FFC400")) +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(-100, 300, 5)) +
  ylab("House Price Index") + xlab("")

Belgium, Denmark, Sweden, United Kingdom

Code
prc_hpi_ooq %>%
  filter(expend == "TOTAL",
         geo %in% c("BE", "DK", "SE", "UK"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  ggplot() + geom_line(aes(x = date, y = values, color = Geo)) + theme_minimal() + add_4flags +
  scale_color_manual(values = c("#000000", "#C60C30", "#FECC00", "#6E82B5")) +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(-100, 300, 10)) +
  ylab("House Price Index") + xlab("")

All Series

France

Code
prc_hpi_ooq %>%
  filter(geo %in% c("FR"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(expend, by = "expend") %>%
  ggplot() + geom_line() + theme_minimal() +
  aes(x = date, y = values, color = Expend, linetype = Expend) +
  scale_color_manual(values = viridis(11)[1:10]) +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  theme(legend.position = c(0.75, 0.3),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(-100, 300, 10)) +
  ylab("House Price Index") + xlab("")

Germany

Code
prc_hpi_ooq %>%
  filter(geo %in% c("DE"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(expend, by = "expend") %>%
  ggplot() + geom_line() + theme_minimal() +
  aes(x = date, y = values, color = Expend, linetype = Expend) +
  scale_color_manual(values = viridis(11)[1:10]) +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% 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("")

Italy

Code
prc_hpi_ooq %>%
  filter(geo %in% c("IT"),
         unit == "I15_Q") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(expend, by = "expend") %>%
  ggplot() + geom_line() + theme_minimal() +
  aes(x = date, y = values, color = Expend, linetype = Expend) +
  scale_color_manual(values = viridis(12)[1:11]) +
  scale_x_date(breaks = seq(1920, 2025, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  theme(legend.position = c(0.6, 0.9),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(-100, 300, 5)) +
  ylab("House Price Index") + xlab("")