Distribution of income by different income groups - EU-SILC and ECHP surveys - ilc_di02

Data - Eurostat

Info

Last observation: 2025 (N = 1316)

First observation: 1995 (N = 504)

Last data update: 14 aoû 2026, 20:21. Last compile: 18 aoû 2026, 01:32

Structure

Median Income Above 60% Threshold: France, Germany, Italy, Spain

Code
ilc_di02 |>
  filter(geo %in% c("FR", "DE", "IT", "ES"),
         rskpovth == "A_60",
         unit == "EUR",
         statinfo == "MED_EI") |>
  time_to_date() |>

  left_join(colors, by = c("Geo" = "country")) |>
  mutate(values = values/1000) |>
  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(1990, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank()) +
  xlab("") + ylab("Median income, above 60% threshold (thousand €)")

Above vs. Below 60% Threshold: France

Code
ilc_di02 |>
  filter(geo == "FR",
         rskpovth %in% c("A_60", "B_60"),
         unit == "EUR",
         statinfo == "MED_EI") |>
  time_to_date() |>

  mutate(values = values/1000) |>
  ggplot() + geom_line(aes(x = date, y = values, color = Rskpovth)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1990, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.85),
        legend.title = element_blank()) +
  xlab("") + ylab("Median equivalised income (thousand €)")

Latest Year by Country

Code
latest_y <- ilc_di02 |>
  filter(rskpovth == "A_60",
         unit == "EUR",
         statinfo == "MED_EI",
         geo == "EU27_2020",
         !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

ilc_di02 |>
  filter(rskpovth %in% c("A_60", "B_60"),
         unit == "EUR",
         statinfo == "MED_EI",
         geo %in% c("EU27_2020", "FR", "DE", "IT", "ES", "PT", "EL", "NL", "SE", "PL"),
         time == latest_y) |>
  select(Geo, Rskpovth, values) |>
  spread(Rskpovth, values) |>
  arrange(-`Above 60%`) |>
  print_table_conditional()
Geo Above 60% Below 60%
Netherlands 37172 17371
Germany 31900 13573
Sweden 31229 13192
France 28945 12607
European Union - 27 countries (from 2020) 25296 10576
Italy 24834 9982
Spain 23312 8938
Portugal 15872 6715
Poland 15373 6934
Greece 13153 5493

MD40 / MD70

Code
ilc_di02 |>
  filter(rskpovth %in% c("A_40", "A_70"),
         geo %in% c("FR", "DE"),
         unit == "EUR",
         statinfo == "MED_EI") |>
  time_to_date() |>

  arrange(date, rskpovth, geo, values) |>
  spread(rskpovth, values) |>
  mutate(D1D10 = A_40/A_70) |>
  mutate(values = D1D10) |>
  left_join(colors, by = c("Geo" = "country")) |>
  ggplot() + geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_flags +
  theme_minimal() +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(0, 1, 0.01)) +
  ylab("D10/D1") + xlab("")