Structure of consumption expenditure by activity and employment status of the reference person and COICOP consumption purpose

Data - Eurostat

Info

Last observation: Annual: 2020 (N = 9,868)

First observation: Annual: 1988 (N = 3,310)

Last data update: 11 aoû 2026, 20:54. Last compile: 12 aoû 2026, 00:06

Structure

Food Budget Share

Retired Persons: France, Germany, Italy, Spain

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

France, by Employment Status of Reference Person

Code
hbs_str_t221 |>
  filter(geo == "FR",
         coicop == "CP01",
         wstatus %in% c("MW_IS", "NMW_IS", "RET", "UNE")) |>
  year_to_date() |>
  mutate(values = values / 1000) |>
  ggplot() + geom_line(aes(x = date, y = values, color = Wstatus)) +
  theme_minimal() +
  theme(legend.position = "right", legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1985, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Food and non-alcoholic beverages (share of budget)") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

Budget Structure, Latest Year, France

Code
latest_yr <- hbs_str_t221 |>
  filter(geo == "FR",
         nchar(coicop) == 4,
         substr(coicop, 1, 2) == "CP",
         !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

hbs_str_t221 |>
  filter(geo == "FR",
         nchar(coicop) == 4,
         substr(coicop, 1, 2) == "CP",
         wstatus %in% c("MW_IS", "NMW_IS", "RET", "UNE"),
         time == latest_yr) |>
  mutate(values = round(values / 10, 1)) |>
  select(Coicop, Wstatus, values) |>
  spread(Wstatus, values) |>
  print_table_conditional()
Coicop Manual workers in industry and services Non-manual workers in industry and services Retired persons Unemployed persons
Alcoholic beverages, tobacco and narcotics 3.2 2.2 2.3 3.2
Clothing and footwear 4.7 4.6 2.4 4.9
Communications 2.8 2.2 2.1 3.5
Education 0.5 0.8 0.1 0.5
Food and non-alcoholic beverages 14.5 12.6 16.8 15.2
Furnishings, household equipment and routine household maintenance 4.1 4.7 5.6 3.8
Health 1.5 1.6 1.7 1.7
Housing, water, electricity, gas and other fuels 27.6 27.0 32.4 31.1
Miscellaneous goods and services 14.3 14.7 15.6 13.3
Recreation and culture 7.1 8.4 7.2 7.0
Restaurants and hotels 5.0 7.2 2.9 4.6
Transport 14.7 14.0 10.8 11.3

coicop

France - Compare

2020, HBS

Code
hbs_str_t221 |>
  filter(time == "2020",
         geo == "FR") %>%
  
  select_if(~ n_distinct(.) > 1) |>
  spread(wstatus, values) %>%
  select_if(~ n_distinct(.) > 1) |>
  print_table_conditional()

2015, HBS

All

Code
hbs_str_t221 |>
  filter(time == "2015",
         geo == "FR") %>%
  
  select_if(~ n_distinct(.) > 1) |>
  spread(wstatus, values) %>%
  select_if(~ n_distinct(.) > 1) |>
  print_table_conditional()

2-digit

Code
hbs_str_t221 |>
  filter(time == "2015",
         geo == "FR",
         nchar(coicop) == 4) %>%
  
  select_if(~ n_distinct(.) > 1) |>
  spread(wstatus, values) %>%
  select_if(~ n_distinct(.) > 1) |>
  print_table_conditional()

All quintiles

Sums

2-digit

Code
hbs_str_t221 |>
  filter(time == "2020",
         substr(coicop, 1, 2) == "CP",
         nchar(coicop) == 4) %>%
  
  select_if(~ n_distinct(.) > 1) |>
  group_by(wstatus, geo, Geo) |>
  summarise(values = sum(values)) |>
  spread(wstatus, values) |>
  print_table_conditional()
geo Geo INAC_OTH MW_IS NMW_IS NSAL RET UNE UNK
AT Austria 1000 1002 999 1000 1002 999 NA
BE Belgium 1000 999 998 1000 998 999 NA
BG Bulgaria 1000 1002 1000 999 999 1002 NA
CY Cyprus 1001 1000 999 998 1000 1001 NA
DE Germany 1000 1000 1000 999 1001 1000 NA
DK Denmark 1001 999 1001 1000 1000 1000 1001
EE Estonia 1002 1001 1001 1001 1000 1000 999
EL Greece 1002 998 999 997 1000 999 NA
ES Spain 1000 1001 1000 999 999 1002 NA
EU27_2020 European Union - 27 countries (from 2020) 998 1002 1000 1000 1000 1000 NA
FI Finland 999 1000 1000 1000 1001 1001 NA
FR France 998 1000 1000 999 999 1001 1001
HR Croatia 1000 999 1000 999 999 999 NA
HU Hungary 1001 1001 999 1002 1002 1000 1000
IE Ireland 1000 1001 999 999 999 1000 1000
IT Italy 999 1000 1000 1002 999 999 999
LT Lithuania 1000 1001 1000 1001 1001 1000 NA
LU Luxembourg 1001 1000 1001 999 1002 1000 NA
LV Latvia 1000 999 1002 1002 1001 1000 NA
ME Montenegro 1002 1001 999 999 999 1000 NA
MT Malta 1000 1000 999 999 1000 998 1001
NO Norway NA NA NA NA NA NA 1001
PL Poland 1001 1000 998 1001 1001 1000 1000
RO Romania 1001 1000 998 999 1001 999 999
RS Serbia 1000 1000 1002 1000 999 999 NA
SI Slovenia 1001 1001 1001 1000 1000 998 1000
SK Slovakia 1000 1002 1001 999 1000 1000 NA
TR Türkiye 1001 999 1001 1001 1000 1001 1001

3-digit

Code
hbs_str_t221 |>
  filter(time == "2020",
         substr(coicop, 1, 2) == "CP",
         nchar(coicop) == 5) %>%
  
  select_if(~ n_distinct(.) > 1) |>
  group_by(wstatus, geo, Geo) |>
  summarise(values = sum(values)) |>
  spread(wstatus, values) |>
  print_table_conditional()
geo Geo INAC_OTH MW_IS NMW_IS NSAL RET UNE UNK
AT Austria 1000 999 1000 1002 998 1004 NA
BE Belgium 1001 998 998 1002 1000 998 NA
BG Bulgaria 998 999 1001 1000 998 996 NA
CY Cyprus 994 998 998 1000 993 996 NA
DE Germany 978 988 992 988 993 999 NA
DK Denmark 998 1002 1003 1002 999 1002 1003
EE Estonia 984 986 989 988 984 983 978
EL Greece 999 999 1000 1000 999 995 NA
ES Spain 998 998 1000 1001 1000 1000 NA
FI Finland 979 986 970 973 990 981 NA
FR France 994 995 988 982 990 1000 998
HR Croatia 1001 1000 1003 999 995 998 NA
HU Hungary 1003 998 997 1003 1001 1000 1001
IE Ireland 1003 1000 999 1000 1001 1000 999
IT Italy 996 1000 999 1001 998 1003 1002
LT Lithuania 999 1001 1000 1003 999 997 NA
LU Luxembourg 1002 1001 1001 998 997 1000 NA
LV Latvia 998 1002 1001 997 1001 1000 NA
ME Montenegro 989 981 987 989 982 981 NA
MT Malta 1003 999 1001 1000 999 999 998
NO Norway NA NA NA NA NA NA 991
PL Poland 1000 997 996 996 996 1001 999
RS Serbia 1002 996 999 1002 999 1000 NA
SI Slovenia 999 998 1000 999 1002 996 999
SK Slovakia 998 1000 1001 998 998 999 NA
TR Türkiye 998 1002 999 1002 1001 997 1002

CP041, CP042, CP041_042

2015

France

Code
hbs_str_t221 |>
  filter(coicop %in% c("CP041", "CP042"),
         time == "2015",
         geo %in% c("FR")) |>
  spread(coicop, values) |>
  mutate(CP041_042 = CP041 + CP042) |>
  gather(coicop, values, CP041, CP042, CP041_042) |>
  
  
  mutate(Coicop = ifelse(coicop == "CP041_042", "Imputed rentals plus actual rentals", Coicop),
         wstatus = ifelse(wstatus == "Y_GE60", "Y60+", wstatus),
         wstatus = ifelse(wstatus == "Y_LT30", "Y30-", wstatus)) |>
  ggplot() + geom_line(aes(x = Wstatus, y = values/1000, color = Coicop, group = Coicop)) +
  theme_minimal() +
  xlab("") + ylab("Weight in CPI") +
  scale_y_continuous(breaks = 0.01*seq(-30, 50, 2),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.2, 0.9),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))