Share of housing costs in disposable household income, by type of household and income group - EU-SILC survey - ilc_mded01

Data - Eurostat

Info

Last observation: 2025 (N = 1679)

First observation: 2003 (N = 102)

Last data update: 14 aoû 2026, 21:19. Last compile: 18 aoû 2026, 01:34

Structure

Housing Cost Burden by Household Type and Country

France, Germany, Italy, Spain, Netherlands

Code
ilc_mded01 |>
  filter(geo %in% c("FR", "DE", "IT", "ES", "NL"),
         hhcomp == "TOTAL",
         rskpovth == "TOTAL") |>
  year_to_date() |>
  mutate(values = values/100) |>
  left_join(colors, by = c("Geo" = "country")) |>
  mutate(color = ifelse(geo == "NL", color2, color)) |>
  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(2000, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Housing costs (% of disposable income)") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

France: by Household Composition

Code
ilc_mded01 |>
  filter(geo == "FR",
         hhcomp %in% c("A1", "A2", "A1_DCH", "TOTAL"),
         rskpovth == "TOTAL") |>
  year_to_date() |>
  mutate(values = values/100) |>
  ggplot() + geom_line(aes(x = date, y = values, color = Hhcomp)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(2000, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.3, 0.8),
        legend.title = element_blank()) +
  xlab("") + ylab("Housing costs (% of disposable income)") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

Latest Year, by Poverty Risk Threshold

Table

Code
latest_y <- ilc_mded01 |>
  filter(hhcomp == "TOTAL",
         !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

ilc_mded01 |>
  filter(hhcomp == "TOTAL",
         time == latest_y) |>
  select(geo, Geo, Rskpovth, values) |>
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) |>
  select(-geo) |>
  spread(Rskpovth, values) |>
  arrange(-Total) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}