| source | dataset | Title | .html | .rData |
|---|---|---|---|---|
| eurostat | hbs_str_t221 | Structure of consumption expenditure by activity and employment status of the reference person and COICOP consumption purpose | 2026-01-29 | 2026-01-29 |
| insee | bdf2017 | Budget de famille 2017 | 2026-01-29 | 2023-11-21 |
| insee | if203 | Les ménages les plus modestes dépensent davantage pour leur logement et les plus aisés pour les transports | 2025-10-11 | 2023-07-20 |
Structure of consumption expenditure by activity and employment status of the reference person and COICOP consumption purpose
Data - Eurostat
Info
Data on housing
| source | dataset | Title | .html | .rData |
|---|---|---|---|---|
| bdf | RPP | Prix de l'immobilier | 2026-01-29 | 2026-01-29 |
| bis | LONG_PP | Residential property prices - detailed series | 2026-01-11 | 2024-05-10 |
| bis | SELECTED_PP | Property prices, selected series | 2026-01-29 | 2026-01-29 |
| ecb | RPP | Residential Property Price Index Statistics | 2026-01-29 | 2026-01-29 |
| eurostat | ei_hppi_q | House price index (2015 = 100) - quarterly data | 2026-01-29 | 2026-01-29 |
| eurostat | hbs_str_t223 | Mean consumption expenditure by income quintile | 2025-10-11 | 2026-01-29 |
| eurostat | prc_hicp_midx | HICP (2015 = 100) - monthly data (index) | 2025-12-22 | 2026-01-29 |
| eurostat | prc_hpi_q | House price index (2015 = 100) - quarterly data | 2026-01-29 | 2026-01-29 |
| fred | housing | House Prices | 2026-01-29 | 2026-01-29 |
| insee | IPLA-IPLNA-2015 | Indices des prix des logements neufs et Indices Notaires-Insee des prix des logements anciens | 2026-01-30 | 2026-01-29 |
| oecd | SNA_TABLE5 | Final consumption expenditure of households | 2026-01-16 | 2023-10-19 |
| oecd | housing | NA | NA | NA |
LAST_COMPILE
| LAST_COMPILE |
|---|
| 2026-01-31 |
Last
Code
hbs_str_t221 %>%
group_by(time) %>%
summarise(Nobs = n()) %>%
arrange(desc(time)) %>%
head(2) %>%
print_table_conditional()| time | Nobs |
|---|---|
| 2020 | 9868 |
| 2015 | 12090 |
coicop
All
Code
hbs_str_t221 %>%
left_join(coicop, by = "coicop") %>%
group_by(coicop, Coicop) %>%
summarise(Nobs = n()) %>%
print_table_conditional()2-digit
Code
hbs_str_t221 %>%
filter(nchar(coicop) == 4) %>%
left_join(coicop, by = "coicop") %>%
group_by(coicop, Coicop) %>%
summarise(Nobs = n()) %>%
print_table_conditional()| coicop | Coicop | Nobs |
|---|---|---|
| CP01 | Food and non-alcoholic beverages | 1028 |
| CP02 | Alcoholic beverages, tobacco and narcotics | 1026 |
| CP03 | Clothing and footwear | 1028 |
| CP04 | Housing, water, electricity, gas and other fuels | 1028 |
| CP05 | Furnishings, household equipment and routine household maintenance | 1028 |
| CP06 | Health | 1026 |
| CP07 | Transport | 1026 |
| CP08 | Communications | 1028 |
| CP09 | Recreation and culture | 1028 |
| CP10 | Education | 1013 |
| CP11 | Restaurants and hotels | 1026 |
| CP12 | Miscellaneous goods and services | 1028 |
3-digit
Code
hbs_str_t221 %>%
filter(nchar(coicop) == 5) %>%
left_join(coicop, by = "coicop") %>%
group_by(coicop, Coicop) %>%
summarise(Nobs = n()) %>%
print_table_conditional()4-digit
Code
hbs_str_t221 %>%
filter(nchar(coicop) == 6) %>%
left_join(coicop, by = "coicop") %>%
group_by(coicop, Coicop) %>%
summarise(Nobs = n()) %>%
print_table_conditional()wstatus
Code
hbs_str_t221 %>%
left_join(wstatus, by = "wstatus") %>%
group_by(wstatus, Wstatus) %>%
summarise(Nobs = n()) %>%
print_table_conditional()| wstatus | Wstatus | Nobs |
|---|---|---|
| INAC_OTH | Other persons outside the labour force (former name: inactive persons) | 9014 |
| MW_IS | Manual workers in industry and services | 9142 |
| NMW_IS | Non-manual workers in industry and services | 9015 |
| NSAL | Employed persons except employees | 9237 |
| RET | Retired persons | 9176 |
| UNE | Unemployed persons | 8940 |
| UNK | Unknown | 3429 |
geo
Code
hbs_str_t221 %>%
left_join(geo, by = "geo") %>%
group_by(geo, Geo) %>%
summarise(Nobs = n()) %>%
arrange(-Nobs) %>%
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 .}unit
Code
hbs_str_t221 %>%
group_by(unit) %>%
summarise(Nobs = n()) %>%
print_table_conditional()| unit | Nobs |
|---|---|
| PM | 57953 |
time
Code
hbs_str_t221 %>%
group_by(time) %>%
summarise(Nobs = n()) %>%
print_table_conditional()| time | Nobs |
|---|---|
| 1988 | 3310 |
| 1994 | 5239 |
| 1999 | 4738 |
| 2005 | 9779 |
| 2010 | 12929 |
| 2015 | 12090 |
| 2020 | 9868 |
France - Compare
2020, HBS
Code
hbs_str_t221 %>%
filter(time == "2020",
geo == "FR") %>%
left_join(coicop, by = "coicop") %>%
select_if(~ n_distinct(.) > 1) %>%
spread(wstatus, values) %>%
select_if(~ n_distinct(.) > 1) %>%
print_table_conditional2015, HBS
All
Code
hbs_str_t221 %>%
filter(time == "2015",
geo == "FR") %>%
left_join(coicop, by = "coicop") %>%
select_if(~ n_distinct(.) > 1) %>%
spread(wstatus, values) %>%
select_if(~ n_distinct(.) > 1) %>%
print_table_conditional2-digit
Code
hbs_str_t221 %>%
filter(time == "2015",
geo == "FR",
nchar(coicop) == 4) %>%
left_join(coicop, by = "coicop") %>%
select_if(~ n_distinct(.) > 1) %>%
spread(wstatus, values) %>%
select_if(~ n_distinct(.) > 1) %>%
print_table_conditional| coicop | Coicop | INAC_OTH | MW_IS | NMW_IS | NSAL | RET | UNE | UNK |
|---|---|---|---|---|---|---|---|---|
| CP01 | Food and non-alcoholic beverages | 154 | 145 | 126 | 125 | 168 | 152 | 124 |
| CP02 | Alcoholic beverages, tobacco and narcotics | 39 | 32 | 22 | 24 | 23 | 32 | 23 |
| CP03 | Clothing and footwear | 51 | 47 | 46 | 38 | 24 | 49 | 40 |
| CP04 | Housing, water, electricity, gas and other fuels | 316 | 276 | 270 | 262 | 324 | 311 | 304 |
| CP05 | Furnishings, household equipment and routine household maintenance | 39 | 41 | 47 | 47 | 56 | 38 | 45 |
| CP06 | Health | 14 | 15 | 16 | 12 | 17 | 17 | 9 |
| CP07 | Transport | 89 | 147 | 140 | 165 | 108 | 113 | 215 |
| CP08 | Communications | 35 | 28 | 22 | 21 | 21 | 35 | 16 |
| CP09 | Recreation and culture | 70 | 71 | 84 | 83 | 72 | 70 | 78 |
| CP10 | Education | 24 | 5 | 8 | 10 | 1 | 5 | 3 |
| CP11 | Restaurants and hotels | 52 | 50 | 72 | 70 | 29 | 46 | 46 |
| CP12 | Miscellaneous goods and services | 115 | 143 | 147 | 142 | 156 | 133 | 98 |
All quintiles
Sums
2-digit
Code
hbs_str_t221 %>%
filter(time == "2020",
substr(coicop, 1, 2) == "CP",
nchar(coicop) == 4) %>%
left_join(geo, by = "geo") %>%
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) %>%
left_join(geo, by = "geo") %>%
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) %>%
left_join(wstatus, by = "wstatus") %>%
left_join(coicop, by = "coicop") %>%
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))