Proportion of consumption decile by income decile - experimental statistics - icw_sr_07

Data - Eurostat

Info

Last observation: Annual: 2020 (N = 2,900)

First observation: Annual: 2010 (N = 2,600)

Last data update: 23 jul 2026, 22:19. Last compile: 24 jul 2026, 01:59

Structure

Income-Consumption Persistence at the Bottom

Share of Bottom Income Decile Also in Bottom Consumption Decile

Code
icw_sr_07 %>%
  filter(geo %in% c("FR", "DE", "ES"),
         quant_inc == "D1",
         quant_expn == "D1") %>%
  year_to_date %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values / 100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) +
  geom_point(aes(x = date, y = values, color = color)) +
  theme_minimal() + scale_color_identity() + add_3flags +
  scale_x_date(breaks = as.Date(paste0(seq(2010, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Households in bottom income decile\nalso in bottom consumption decile") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

France, Latest Year: Consumption Decile by Income Decile (Bottom vs. Top)

Code
icw_sr_07 %>%
  filter(geo == "FR",
         quant_inc %in% c("D1", "D10")) %>%
  filter(time == max(time)) %>%
  mutate(values = values / 100,
         quant_expn = factor(quant_expn, levels = paste0("D", 1:10))) %>%
  ggplot + geom_col(aes(x = quant_expn, y = values, fill = Quant_inc), position = "dodge") +
  theme_minimal() +
  theme(legend.position = c(0.75, 0.85),
        legend.title = element_blank()) +
  xlab("Consumption decile") + ylab("Share of households") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

Income-Consumption Matrix, France, Latest Year

Code
latest_yr <- icw_sr_07 %>%
  filter(geo == "FR", !is.na(values)) %>%
  summarise(m = max(time)) %>%
  pull(m)

icw_sr_07 %>%
  filter(geo == "FR",
         time == latest_yr) %>%
  mutate(quant_inc = factor(quant_inc, levels = paste0("D", 1:10)),
         quant_expn = factor(quant_expn, levels = paste0("D", 1:10))) %>%
  select(quant_inc, quant_expn, values) %>%
  spread(quant_expn, values) %>%
  arrange(quant_inc) %>%
  print_table_conditional()
quant_inc D1 D2 D3 D4 D5 D6 D7 D8 D9 D10
D1 42.0 22.0 10.9 8.1 4.8 4.0 2.9 1.7 0.6 3.0
D2 26.4 23.9 19.5 11.8 6.5 4.8 3.8 1.7 1.0 0.6
D3 14.7 18.7 18.9 14.7 11.7 10.0 6.7 2.7 1.1 0.8
D4 10.2 13.6 14.8 17.2 12.1 13.4 7.8 5.1 3.9 1.8
D5 6.6 11.1 12.3 13.3 15.5 11.4 11.4 8.6 6.4 3.4
D6 4.6 6.8 9.5 10.5 14.8 15.0 13.9 12.5 8.4 4.0
D7 2.4 3.8 6.3 9.3 13.4 12.5 15.9 15.7 12.2 8.4
D8 1.9 2.6 4.1 7.7 10.8 13.7 15.4 15.9 16.0 11.9
D9 1.0 1.2 3.0 4.2 4.8 10.0 12.7 18.5 21.7 23.0
D10 0.9 1.3 1.2 2.4 3.4 3.4 7.9 12.6 24.3 42.5