Median saving rate by income quintile - experimental statistics - icw_sr_03

Data - Eurostat

Info

Last observation: Annual: 2020 (N = 174)

First observation: Annual: 2010 (N = 162)

Last data update: 24 jul 2026, 01:57. Last compile: 24 jul 2026, 01:57

Structure

Tables

2010

Code
icw_sr_03 %>%
  filter(time == "2010") %>%
  select(quant_inc, geo, Geo, values) %>%
  
  spread(quant_inc, values) %>%
  select(geo, Geo, TOTAL, everything()) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../bib/flags/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  arrange(-`TOTAL`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2015

Code
icw_sr_03 %>%
  filter(time == "2015") %>%
  select(quant_inc, geo, Geo, values) %>%

  spread(quant_inc, values) %>%
  select(geo, Geo, TOTAL, everything()) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../bib/flags/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  arrange(-`TOTAL`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Latest

Code
latest_y <- icw_sr_03 %>%
  filter(!is.na(values)) %>%
  summarise(m = max(time)) %>%
  pull(m)

icw_sr_03 %>%
  filter(time == latest_y) %>%
  select(quant_inc, geo, Geo, values) %>%

  spread(quant_inc, values) %>%
  select(geo, Geo, TOTAL, everything()) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../bib/flags/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  arrange(-`TOTAL`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Germany, France, Sweden

Code
icw_sr_03 %>%
  filter(time == "2015",
         geo %in% c("SE", "FR", "DE")) %>%
  mutate(quantile = substr(quant_inc, 3, 3) %>% as.numeric) %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + geom_line(aes(x = quantile, y = values/100, color = color)) +
  scale_color_identity() + theme_minimal() +
  geom_image(data = . %>%
               filter(quantile == 3) %>%
               mutate(image = paste0("../../icon/flag/", str_to_lower(gsub(" ", "-", Geo)), ".png")),
             aes(x = quantile, y = values/100, image = image), asp = 1.5) +
  xlab("Quintile") + ylab("Median saving rate by income quintile") +
  scale_y_continuous(breaks = 0.01*seq(-30, 50, 5),
                     labels = percent_format(accuracy = 1)) +
  scale_x_continuous(breaks = seq(0, 5, 1))

Portugal, Spain, United Kingdom

Code
icw_sr_03 %>%
  filter(time == "2015",
         geo %in% c("UK", "ES", "PT")) %>%
  mutate(quantile = substr(quant_inc, 3, 3) %>% as.numeric) %>%

  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + geom_line(aes(x = quantile, y = values/100, color = color)) +
  scale_color_identity() + theme_minimal() +
  geom_image(data = . %>%
               filter(quantile == 5) %>%
               mutate(image = paste0("../../icon/flag/", str_to_lower(gsub(" ", "-", Geo)), ".png")),
             aes(x = quantile, y = values/100, image = image), asp = 1.5) +
  xlab("Quintile") + ylab("Median saving rate by income quintile") +
  scale_y_continuous(breaks = 0.01*seq(-30, 50, 5),
                     labels = percent_format(accuracy = 1)) +
  scale_x_continuous(breaks = seq(0, 5, 1))

Evolution over Time: France, Germany, Spain, Portugal

Code
icw_sr_03 %>%
  filter(quant_inc == "TOTAL",
         geo %in% c("FR", "DE", "ES", "PT")) %>%
  year_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_4flags +
  scale_x_date(breaks = as.Date(paste0(seq(2005, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Median saving rate, overall population") +
  scale_y_continuous(breaks = 0.01*seq(0, 50, 5),
                     labels = percent_format(accuracy = 1))