Structure of consumption expenditure by COICOP consumption purpose

Data - Eurostat

Info

Last observation: Annual: 2020 (N = 4,763)

First observation: Annual: 1988 (N = 1,307)

Last data update: 23 jul 2026, 22:42. Last compile: 24 jul 2026, 01:48

Structure

France, Germany

Food Share of Consumption Expenditure

Code
hbs_str_t211 %>%
  filter(geo %in% c("FR", "DE"),
         coicop == "CP01") %>%
  year_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_2flags +
  scale_x_date(breaks = as.Date(paste0(seq(1985, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Food and non-alcoholic beverages (% of expenditure)") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

France: Consumption Structure Over Time

Food, Housing, Communications

Code
hbs_str_t211 %>%
  filter(geo == "FR",
         coicop %in% c("CP01", "CP04", "CP08")) %>%
  year_to_date %>%
  mutate(values = values/1000) %>%
  ggplot + geom_line(aes(x = date, y = values, color = Coicop)) +
  theme_minimal() +
  theme(legend.position = c(0.3, 0.7),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1985, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Share of consumption expenditure") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

coicop

France

Table

Code
hbs_str_t211 %>%
  
  filter(geo == "FR",
         substr(coicop, 1, 2) == "CP",
         coicop != "CP00",
         time %in% c("2015", "2020")) %>%
  select(-unit) %>%
  select(-geo) %>%
  spread(time, values) %>%
  print_table_conditional()

2-digit

Code
hbs_str_t211 %>%
  
  filter(geo == "FR",
         substr(coicop, 1, 2) == "CP",
         nchar(coicop) == 4,
         coicop != "CP00",
         time %in% c("2015", "2020")) %>%
  select(-unit) %>%
  select(-geo) %>%
  spread(time, values) %>%
  print_table_conditional()
freq Freq coicop Coicop Unit Geo 2015 2020
A Annual CP01 Food and non-alcoholic beverages Per mille France 143 143
A Annual CP02 Alcoholic beverages, tobacco and narcotics Per mille France 25 25
A Annual CP03 Clothing and footwear Per mille France 40 40
A Annual CP04 Housing, water, electricity, gas and other fuels Per mille France 289 289
A Annual CP05 Furnishings, household equipment and routine household maintenance Per mille France 48 48
A Annual CP06 Health Per mille France 16 16
A Annual CP07 Transport Per mille France 132 132
A Annual CP08 Communications Per mille France 24 24
A Annual CP09 Recreation and culture Per mille France 77 77
A Annual CP10 Education Per mille France 6 6
A Annual CP11 Restaurants and hotels Per mille France 55 55
A Annual CP12 Miscellaneous goods and services Per mille France 147 147

3-digit

Code
hbs_str_t211 %>%
  
  filter(geo == "FR",
         substr(coicop, 1, 2) == "CP",
         nchar(coicop) == 5,
         coicop != "CP00",
         time %in% c("2015", "2020")) %>%
  select(-unit) %>%
  select(-geo) %>%
  spread(time, values) %>%
  print_table_conditional()

4-digit

Code
hbs_str_t211 %>%
  
  filter(geo == "FR",
         substr(coicop, 1, 2) == "CP",
         nchar(coicop) == 6,
         coicop != "CP00",
         time %in% c("2015", "2020")) %>%
  select(-unit) %>%
  select(-geo) %>%
  spread(time, values) %>%
  print_table_conditional()

Table

2015

Code
hbs_str_t211 %>%
  filter(time == "2015",
         coicop %in% c("CP04", "CP041", "CP042")) %>%
  
  select_if(~ n_distinct(.) > 1) %>%
  spread(coicop, values) %>%
  arrange(-CP04) %>%
  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()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2020

Code
hbs_str_t211 %>%
  filter(time == "2020",
         coicop %in% c("CP04", "CP041", "CP042")) %>%
  
  select_if(~ n_distinct(.) > 1) %>%
  spread(coicop, values) %>%
  arrange(-CP04) %>%
  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()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}