Skip to content
Snippets Groups Projects
title: "The energy and carbon inequality corridor for a 1.5°C compatible and just Europe"
author:
  - Ingram S. Jaccard:
      email: jaccard@pik-potsdam.de
      institute: [PIK]
      correspondence: false
  - Peter-Paul Pichler:
      email: pichler@pik-potsdam.de
      institute: [PIK]
      correspondence: false
  - Johannes Többen:
      email: toebben@pik-potsdam.de
      institute: [PIK, GWS]
      correspondence: false
  - Helga Weisz:
      email: weisz@pik-potsdam.de
      institute: [PIK, HU]
      correspondence: false
institute:
  - PIK: Social Metabolism and Impacts, Potsdam Institute for Climate Impact Research, Member of the Leibniz Association, PO Box 60 12 03, Potsdam, 14412, Germany
  - HU: Department of Cultural History & Theory and Department of Social Sciences, Humboldt University Berlin, Unter den Linden 6, Berlin, 10117, Germany
  - GWS: Gesellschaft für Wirtschaftliche Strukturforschung (GWS) mbH, Heinrichstraße 30, 49080 Osnabrück, Germany
output: 
    word_document:
      fig_caption: yes
      reference_docx: "../templates/template.docx" # Insert path for the DOCX file
      pandoc_args:
      - --lua-filter=../templates/scholarly-metadata.lua
      - --lua-filter=../templates/author-info-blocks.lua
      - --lua-filter=../templates/pagebreak.lua
bibliography: references.bib
csl: "../templates/vancouver.csl" # Insert path for the bib-style
keywords: |
  inequality; energy; carbon
abstract: |

Keywords: r rmarkdown::metadata$keywords

Abstract: The call for a decent life for all within planetary limits poses a dual challenge: Provide all people with the essential resources needed to live well and, collectively, not exceed the source and sink capacity of the biosphere to sustain human societies. We explore for 28 European countries the corridor of possible distributions of household energy and carbon footprints that meet the minimum energy requirements for a decent life, but do not exceed the maximum energy supply compatible with achieving the 1.5°C target in 2050. We estimated household energy and carbon footprints for harmonized European expenditure deciles in 2015 by combining data from national Household Budget Surveys (HBS) provided by EUROSTAT, with the Environmentally-Extended Multi-Regional Input-Output (EE-MRIO) model EXIOBASE. Estimates for a range of minimum energy requirements for a decent life, as well as estimates for the maximum available energy supply, were taken from the 1.5°C scenario literature. We found top-to-bottom decile ratios (10:10) of 7.2 for expenditure, 3.5 for energy and 2.6 for carbon. The lower footprint ratios can be attributed to the fact that higher consumption in the top deciles is offset by very inefficient energy and heating technologies, especially in the four lowest deciles (mostly Eastern Europe). Adopting best technology across all European expenditure deciles would save 19 EJ per year and align energy and carbon footprint inequality with expenditure inequality. At those inequality levels, the dual goal can only be achieved through CCS deployment, large and fast efficiency improvements, plus extremely low minimum energy requirements of 27 GJ per adult equivalent (as compared to currently 130 GJ/ae in the lowest decile). When around 50 GJ/ae minimum energy requirements for a decent life and no CCS deployment is assumed, the mathematical possible inequality to also achieve the 1.5°C target becomes practically zero. We conclude that for Europe and the eurozone, combining the goals of providing enough energy for a decent life and achieving the Paris agreement poses an immense and widely underestimated challenge, one which will likely require substantial monetary and fiscal leeway.

knitr::opts_chunk$set(
  collapse = TRUE,
  warning = FALSE,
  message = FALSE,
  echo = FALSE,
  comment = "#>",
  fig.path = "../figures/",
  dpi = 300
)

if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse,
               janitor,
               here,
               wbstats,
               ISOcodes,
               viridis,
               hrbrthemes,
               wesanderson,
               glue,
               ggridges,
               patchwork,
               kableExtra,
               readxl,
               flextable)

pal <- wes_palette("Cavalcanti1", 5, type = "discrete")
extrafont::loadfonts()

options(scipen=999)

library(here)
# load data wrangling functions
source(here("analysis", "R", "wrangler_functions.R"))

## load result data for EU deciles
eu_q_count = 10

# summary countries aggregated by country quintiles and eu ntile
dat_country_summary_by_cquint_and_euntile = get_country_summary_by_cquint_and_euntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank")
pdat_country_summary_by_cquint_and_euntile =
  pivot_results_longer_adorn(dat_country_summary_by_cquint_and_euntile, cols_ex)

# summary of countries by EU quantile without sectoral resolution
dat_country_summary_by_eu_ntile = get_country_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "eu_q_rank")
pdat_country_summary_by_eu_ntile = 
  pivot_results_longer_adorn(dat_country_summary_by_eu_ntile, cols_ex)

# summary of countries by country quintile with aggregate sectoral resolution
dat_sector_summary_by_country_quintile = get_sector_summary_by_country_quintile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_country_quintile =
  pivot_results_longer_adorn(dat_sector_summary_by_country_quintile, cols_ex)

# summary of eu ntile with aggregate sectoral resolution
dat_sector_summary_by_eu_ntile = get_sector_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_eu_ntile =
  pivot_results_longer_adorn(dat_sector_summary_by_eu_ntile, cols_ex)

Introduction

Decarbonising the energy system in accordance with the Paris agreement requires a deep transformation of both the supply and the demand side [@riahi_shared_2017] [@grubler_low_2018]. On both sides, however, necessary transformation is restricted by different factors. On the supply side, there exist economic and physical upper limits of how much energy can be provided from renewable sources on the one hand, and how much CO2 removal infrastructure is used to compensate for remaining emissions from fossil fuels on the other. On the demand side [@creutzig_towards_2018], by contrast, there are lower limits to how much energy is minimally required for a decent standard of living [@grubler_low_2018] [@millward-hopkins_providing_2020], depending on different assumptions about infrastructures and service provision [@creutzig_towards_2018], as well as the prevalent social ideas about what constitutes decent living [@rao_energy_2019] [@millward-hopkins_providing_2020]. Maximum possible energy supply and minimum required energy demand describe the corridor in which the simultaneous achievement of climate targets and a decent standard of living for all is possible and, at the same time, restricts the distribution of available energy services among the population. If this dual objective is taken seriously in European climate policy, then there are practical limits to how unequal the society of the future can be, which go beyond the purely political [@leach_equity_2018]. In fact, a limited energy supply creates an obvious, if rarely acknowledged, zero-sum game where energetic over-consumption by some must be compensated with less consumption by others.

The average household energy footprint of European citizens was around 170 gigajoules (GJ) per capita in 2015 [@stadler_exiobase_2018] [@eurostat_eurostat_nodate-3], and the household carbon footprint around 7 tonnes CO2-equivalence (tCO2eq) per capita [@eurostat_eurostat_nodate-4]. However, the differences in household energy and carbon footprints are large within and between different regions in Europe [@ivanova_mapping_2017] [@gore_t._confronting_2020] [@oswald_large_2020]. Energy footprints ranged from less than 100 GJ per capita to over 300 GJ per capita [@oswald_large_2020], and carbon footprints from below 2.5 tCO2eq per capita to 55 tCO2eq per capita [@ivanova_unequal_2020]. Depending on the assumptions of different global decarbonisation scenarios, the average footprints likely need to be reduced to somewhere below 100 GJ per capita [@riahi_shared_2017] [@grubler_low_2018] [@millward-hopkins_providing_2020], and below 2.1 tCO2eq per capita [@akenji_1.5-degree_2019] by 2050, respectively.

In this paper, we assess under what conditions European energy inequality is compatible with the achievement of global climate goals and a decent standard of living, taking both inequality within and between European countries into account. To this end, we first construct household energy and carbon footprints for harmonized European expenditure deciles in 2015, combining data from EUROSTAT's Household Budget Survey (HBS) with the Environmentally-Extended Multi-Regional Input-Output (EE-MRIO) model EXIOBASE. We analyze the distribution of energy and carbon intensities across European expenditure deciles and final consumption categories, and compare this current structure to a counterfactual situation where all European expenditure deciles use the best technology available in Europe. Finally, we examine how the energy inequality across European expenditure deciles would need to change in order to achieve the dual goal of climate protection and a decent standard of living for all.

While the European Green Deal already recognizes that inequalities in income, energy infrastructure, energy consumption, and carbon emissions, lead to different responsibilities and capacities in achieving the energy and emission savings targets [@european_commission_communication_2019], a quantification of the attainable corridor for a 1.5°C compatible and just transition in Europe is missing in the literature.

Materials and methods

Income-stratified national household energy and carbon footprints

We first used the EE-MRIO model EXIOBASE for 2015 (version3.7, industry-by-industry) [@stadler_exiobase_2018] and the European HBS macro-data from EUROSTAT for 2015 [@eurostat_database_nodate] to calculate income-stratified national household energy and carbon footprints (together denoted as environmental footprints in this paper). The EUROSTAT HBS publishes mean household expenditure by income quintile, in purchasing power standards (PPS), by COICOP consumption category, country and year. We chose EXIOBASE as the EE-MRIO for this study because of its European focus, with nearly all countries in the EUROSTAT HBS also found as stand-alone countries in EXIOBASE, its detailed environmental extension data, and its year coverage.

To integrate HBS data into EXIOBASE we created correspondence tables between the EXIOBASE sectors and the matching COICOP consumption categories used in the HBS. We then used the relative expenditure shares of each income quintile on the COICOP consumption categories in the HBS, to stratify the matching EXIOBASE national household final demand expenditure per sector by income quintile, according to those relative HBS expenditure shares. Using standard input-output techniques we calculated ‘total’ (i.e. direct and indirect supply chain) energy and carbon intensities per EXIOBASE sector, and multiplied them with the now income-stratified EXIOBASE national household final demand expenditure, to estimate the supply chain part of national household energy and carbon footprints by national income quintile.

We used the energy extension ‘gross total energy use’ from EXIOBASE, which converts final energy consumption in the International Energy Agency (IEA) energy balance data from the territorial to residence principle following the System of Environmental Economic Accounting (SEEA) [@stadler_exiobase_2018], and the EXIOBASE greenhouse gas (GHG) emission extensions CO2, CH4, N2O, SF6, HFCs, and PFCs (all in CO2-equivalence), from combustion, non-combustion, agriculture and waste, but not land-use change [@stadler_exiobase_2018]. Direct household energy use and carbon emissions are included in the environmental footprints.

European household expenditure deciles

To calculate European household expenditure deciles, we first ranked the national income quintiles (140 in total: 28 European countries x 5 national income quintiles each) according to their mean household expenditure in PPS, and then aggregated the result to 10 European expenditure groups. For brevity we call these expenditure deciles through the rest of the paper. Our coverage of European countries is limited to those with the necessary data in both the EUROSTAT HBS and EXIOBASE. This resulted in a country sample that includes the non-European Union (EU) members Norway, Turkey and the UK, but excludes the EU members Italy and Luxembourg.

Units of analysis

The unit of analysis for our energy and carbon footprint calculations is the household. We normalized our results to average adult equivalent per household and per national income quintile, as this is how the EUROSTAT HBS publishes its data. The first adult in the household is given a weight of 1.0, each adult thereafter 0.5, and each child 0.3 [@eurostat_description_2016].

For our calculations of attainable corridors for achieving the dual goal of climate protection and a decent standard of living for all, we adjusted the total per capita results from published 1.5°C decarbonisation scenarios to household adult equivalents in order to better compare them with our environmental footprint estimates. Estimates of minimum final energy required for a decent standard of living are from Grubler et al. (2018) [@grubler_low_2018] and Millward-Hopkins et al. (2020) [@millward-hopkins_providing_2020], while maximum final energy compatible with the 1.5°C target is from the decarbonisation scenarios in the International Institute for Applied Systems Analysis (IIASA) scenario database [@riahi_shared_2017] [@gea_gea_nodate].

As inequality measure we use the 10:10 ratio, i.e. the expenditure or the environmental footprint of the top European expenditure decile divided by that of the bottom European expenditure decile. Thus, an expenditure 10:10 ratio of 5 means that one adult equivalent in the top decile spent 5 times more on average than one adult equivalent in the bottom decile.

Computing maximum permissible inequality

Based on a counterfactual best available technology distribution across European expenditure deciles, for each value combination of maximum energy supply from four scenarios [@riahi_shared_2017] [@gea_gea_nodate] and minimum energy requirements from refs. [@grubler_low_2018] and [@millward-hopkins_providing_2020], the maximum permissible inequality was calculated as a 10:10 ratio using the formula [insert formula]. All data and procedures are described in more detail in the supplementary information (SI).

Results and discussion

Environmental footprints are less unequal than expenditure


p1 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Expenditure (trn€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy footprint (EJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p3 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon footprint (MtCO2eq)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_top = p1 + p2 + p3


p1 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2015) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_co2eq_kg)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2015) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_co2eq_kg = weighted.mean(pe_co2eq_kg,total_fd_me)),
               aes(y=pe_co2eq_kg, yend=pe_co2eq_kg, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per expenditure (kgCO2eq/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2015) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_energy_use_mj)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2015) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me)),
               aes(y=pe_energy_use_mj, yend=pe_energy_use_mj, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy intensity per expenditure (MJ/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

dat3 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2015) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj)

p3 = dat3 %>%
  ggplot(aes(x=factor(eu_q_rank), y=intensity_e_c)) +
  geom_violin(aes(weight=total_energy_use_tj), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat3 %>%
                 filter(year == 2015) %>%
                 group_by(eu_q_rank) %>%
                 summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj)),
               aes(y=intensity_e_c, yend=intensity_e_c, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    #theme_ipsum() +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per energy (gCO2eq/TJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 


p_bottom = p2 + p1 + p3

a = p_top / p_bottom + plot_annotation(tag_levels = 'a') +
  plot_layout(guides = 'collect')  & 
  theme(plot.margin = unit(c(0.25,0.25,0.25,0.25), "cm"),
        legend.position = 'bottom',
        axis.title.y = element_text(size=13, hjust = 0.5),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))

ggsave(here("analysis", "figures", "figure1.pdf"), device=cairo_pdf)

# values in text

## inequality
exp = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

exp_10_10 = round((exp %>% filter(eu_q_rank == 10))$value/(exp %>% filter(eu_q_rank == 1))$value,digits = 1)

energy = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

energy_10_10 = round((energy %>% filter(eu_q_rank == 10))$value/(energy %>% filter(eu_q_rank == 1))$value,digits = 1)

co2eq = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name))

co2eq_10_10 = round((co2eq %>% filter(eu_q_rank == 10))$value/(co2eq %>% filter(eu_q_rank == 1))$value,digits = 1)

## total per decile

exp_bottom_decile = round((exp %>% filter(eu_q_rank == 1))$value, digits = 1)

exp_top_decile = round((exp %>% filter(eu_q_rank == 10))$value, digits = 1)

energy_bottom_decile = round((energy %>% filter(eu_q_rank == 1))$value, digits = 1)

energy_top_decile = round((energy %>% filter(eu_q_rank == 10))$value, digits = 1)

co2eq_bottom_decile = round((co2eq %>% filter(eu_q_rank == 1))$value, digits = 1)

co2eq_top_decile = round((co2eq %>% filter(eu_q_rank == 10))$value, digits = 1)


## per adult equivalent per decile and mean

aeu = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2015,
         indicator == "total_adult_eq") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value),
            eu_ntile_name = first(eu_ntile_name)) 

exp_pae = exp %>%
  rename(total_fd_me = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_fd_e = (total_fd_me/value)*1000000000000)

fd_pae_bottom_decile = round((exp_pae %>% filter(eu_q_rank == 1))$pae_fd_e, digits = 0)

fd_pae_top_decile = round((exp_pae %>% filter(eu_q_rank == 10))$pae_fd_e, digits = 0)

energy_pae = energy %>%
  rename(total_energy_use_tj = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_energy_use_gj = (total_energy_use_tj/value)*1000000000)

energy_pae_bottom_decile = round((energy_pae %>% filter(eu_q_rank == 1))$pae_energy_use_gj, digits = 1)

energy_pae_top_decile = round((energy_pae %>% filter(eu_q_rank == 10))$pae_energy_use_gj, digits = 1)

energy_total_hh = round((energy_pae %>% summarise(total_energy_use_tj = sum(total_energy_use_tj)))$total_energy_use_tj, digits = 0)

energy_pae_mean = round(mean(energy_pae$pae_energy_use_gj), digits = 1)

co2eq_pae = co2eq %>%
  rename(total_co2eq_kg = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_co2eq_t = (total_co2eq_kg/value)*1000000)

co2eq_pae_bottom_decile = round((co2eq_pae %>% filter(eu_q_rank == 1))$pae_co2eq_t, digits = 1)

co2eq_pae_top_decile = round((co2eq_pae %>% filter(eu_q_rank == 10))$pae_co2eq_t, digits = 1)


## intensities

mean_energy_intens = dat_country_summary_by_eu_ntile %>%
                 filter(year == 2015) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me))

mean_energy_intens_bottom_decile = round((mean_energy_intens %>% filter(eu_q_rank == 1))$pe_energy_use_mj, digits = 1)

mean_energy_intens_top_decile = round((mean_energy_intens %>% filter(eu_q_rank == 10))$pe_energy_use_mj, digits = 1)

mean_co2eq_of_energy_intens = dat_country_summary_by_eu_ntile %>%
  filter(year == 2015) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj) %>%
  group_by(eu_q_rank) %>%
  summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj))

mean_co2eq_of_energy_intens_bottom_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 1))$intensity_e_c, digits = 1)

mean_co2eq_of_energy_intens_top_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 10))$intensity_e_c, digits = 1)

Increasing expenditure generally translated into larger environmental footprints across European expenditure deciles (Figure 1a). However, the energy and carbon inequality was much lower than the expenditure inequality (Figures 1b and 1c). The top decile divided by the bottom decile (the 10:10 ratio) was r exp_10_10 for expenditure, r energy_10_10 for energy and r co2eq_10_10 for carbon (Figures 1a-c). Total expenditure ranged from r exp_bottom_decile trn€ to r exp_top_decile trn€ between bottom and top decile, or r fd_pae_bottom_decile€ to r fd_pae_top_decile€ per adult equivalent (ae), the energy footprint from r energy_bottom_decile EJ to r energy_top_decile EJ (or r energy_pae_bottom_decile GJ/ae to r energy_pae_top_decile GJ/ae), and the carbon footprint from r co2eq_bottom_decile MtCO2eq to r co2eq_top_decile MtCO2eq (or r co2eq_pae_bottom_decile tCO2eq/ae to r co2eq_pae_top_decile tCO2eq/ae).

The reason for this is evident from Figures 1d-f. Both the energy intensity of consumption, measured as energy footprint per € expenditure (d), and the carbon intensity of energy, measured as carbon footprint per energy footprint (f), decreased from bottom to top expenditure decile. The population-weighted average energy intensity of consumption decreased from r mean_energy_intens_bottom_decile MJ/€ in the bottom decile to less than half (r mean_energy_intens_top_decile MJ/€) in the top decile. Likewise, the carbon intensity of energy was higher in the bottom decile (r mean_co2eq_of_energy_intens_bottom_decile gCO2eq/TJ) compared to the top decile (r mean_co2eq_of_energy_intens_top_decile gCO2eq/TJ). The carbon intensity of consumption in Figure 1f combines the effects of the intensities displayed in Figures 1d and 1e. Across all population-weighted intensities per deciles, the variance in the lower four deciles is much higher (Figures 1d-f).

knitr::include_graphics(here::here("analysis", "figures", "figure1.pdf"))

The different intensities of household consumption across European expenditure deciles can be attributed to a combination of two plausible causes: first, the composition of consumption baskets could systematically differ according to the level of household expenditure. Second, the energy and carbon intensity within individual final consumption categories could systematically differ according to the level of household expenditure.


pdat_basket = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), by="sector_agg_id") %>% 
  group_by(eu_q_rank) %>%
  mutate(value = total_fd_me/sum(total_fd_me)*100) %>%
  select(five_sectors, eu_q_rank, 
         value) %>%
  mutate(indicator = "Expenditure share (%)")

pdat_int_co2eq = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), by="sector_agg_id") %>% 
  mutate(value = (total_co2eq_kg)/(total_fd_me*1000000)) %>%
  select(five_sectors, eu_q_rank, 
         value) %>%
  mutate(indicator = "Carbon intensity (kgCO2eq/€)")

pdat_int_energy = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), by="sector_agg_id") %>% 
  mutate(value = (total_energy_use_tj)/(total_fd_me)) %>%
  select(five_sectors, eu_q_rank,
         value) %>%
  mutate(indicator = "Energy intensity (MJ/€)")

library(viridis)
pdat = pdat_int_co2eq %>%
  bind_rows(pdat_int_energy) %>%
  bind_rows(pdat_basket) 

p1 = pdat_basket %>%
  mutate(Decile = if_else(eu_q_rank<10, paste0("D0", eu_q_rank), paste0("D", eu_q_rank))) %>% 
ggplot(aes(x=value, y=five_sectors, color=Decile)) +
  #geom_point(shape=18, alpha=0.75) +
  geom_text(label="I", alpha=0.75, fontface="bold") +
  scale_color_viridis(option = "A", end = 0.8,
                      direction = -1, 
                      discrete = T,
                      name="European\ndecile") +
  theme_minimal() +
  labs(x=unique(pdat_basket$indicator),y="")

p2 = pdat_int_energy %>%
  mutate(Decile = if_else(eu_q_rank<10, paste0("D0", eu_q_rank), paste0("D", eu_q_rank))) %>% 
ggplot(aes(x=value, y=five_sectors, color=Decile)) +
  #geom_point(shape=18, alpha=0.75) +
  geom_text(label="I", alpha=0.75, fontface="bold") +
  scale_color_viridis(option = "A", end = 0.8,
                      direction = -1, 
                      discrete = T,
                      name="European\ndecile") +
  theme_minimal() +
  labs(x=unique(pdat_int_energy$indicator),y="")

p3 = pdat_int_co2eq %>%
  mutate(Decile = if_else(eu_q_rank<10, paste0("D0", eu_q_rank), paste0("D", eu_q_rank))) %>% 
ggplot(aes(x=value, y=five_sectors, color=Decile)) +
  #geom_point(shape=18, alpha=0.75) +
  geom_text(label="I", alpha=0.75, fontface="bold") +
  scale_color_viridis(option = "A", end = 0.8,
                      direction = -1, 
                      discrete = T,
                      name="European\ndecile") +
  theme_minimal() +
  labs(x=unique(pdat_int_co2eq$indicator),y="")

#plot_annotation(tag_levels = 'a')
a = (p1 + p2 + p3) + 
  plot_layout(guides = "collect") + 
  plot_annotation(tag_levels = 'a') & 
  theme(legend.position = 'bottom',
        text=element_text(family="Liberation Sans Narrow"),
        axis.title.y = element_text(size=13, hjust = 0.5),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))

#pdat$facet = factor(pdat$indicator, levels = c("Expenditure share (%)", "Energy intensity (MJ/€)", "Carbon intensity (kgCO2eq/€)"))

#a = ggplot(pdat, aes(x=value, y=five_sectors, color=eu_q_rank)) +
#  geom_text(label="I", alpha=0.75, fontface="bold") +
#  scale_colour_viridis_b(option = "A", end = 0.8,
#                         direction = -1,
#                         breaks = c(2,3,4,5,6,7,8,9),
#                         #guide_legend(),
#                         guide = guide_colorsteps(show.limits=TRUE),
#                         name="European\ndecile") +
#  facet_wrap(~facet, scales="free_x",
#             strip.position="bottom") +
#  theme_minimal() +
#  labs(x="",y="") +
#  theme(text=element_text(size=13, family="Liberation Sans Narrow"),
#        panel.spacing = unit(2.5, "lines"),
#        strip.placement="outside") 

ggsave(here("analysis", "figures", "figure2.pdf"), device=cairo_pdf)
knitr::include_graphics(here::here("analysis", "figures", "figure2.pdf"))

exp_share_housing_bottom_decile = round((pdat_basket %>% filter(eu_q_rank == 1, five_sectors == "housing"))$value, digits = 1)

exp_share_housing_top_decile = round((pdat_basket %>% filter(eu_q_rank == 10, five_sectors == "housing"))$value, digits = 1)

int_co2eq_housing_bottom_decile = round((pdat_int_co2eq %>% filter(eu_q_rank == 1, five_sectors == "housing"))$value, digits = 1)

int_co2eq_housing_top_decile = round((pdat_int_co2eq %>% filter(eu_q_rank == 10, five_sectors == "housing"))$value, digits = 1)

exp_share_services_bottom_decile = round((pdat_basket %>% filter(eu_q_rank == 1, five_sectors == "services"))$value, digits = 1)

exp_share_services_top_decile = round((pdat_basket %>% filter(eu_q_rank == 10, five_sectors == "services"))$value, digits = 1)

Our results show that both of these factors play a role (Figure 2). The housing sector stands out with a carbon intensity of consumption more than 6 times higher in the bottom decile (r int_co2eq_housing_bottom_decile kgCO2eq/€) than in the top decile (r int_co2eq_housing_top_decile kgCO2eq/€). Housing has the highest variance in energy and carbon intensity among expenditure deciles, and for the bottom deciles, it is the most energy and carbon intensive category. Overall, with increasing expenditure decile, the shares of mobility, services and housing expenditures increase and the shares of food and goods decrease. The bottom decile spent an average of r exp_share_housing_bottom_decile% of their household expenditure on housing, while the top decile spent r exp_share_housing_top_decile%. Households in the top decile spent about r exp_share_services_top_decile% on services, which has the lowest energy and carbon intensities of all final consumption categories, compared to r exp_share_services_bottom_decile% in the bottom decile.

The tendency for energy and carbon intensity to decrease with increasing affluence has been reported for the global level between countries [@hubacek_global_2017] [@berthe_mechanisms_2015] [@scruggs_political_1998] [@weber_quantifying_2008] and also within Europe [@sommer_carbon_2017] [@bianco_understanding_2019] [@kerkhof_determinants_2009]. Our results show that the four lowest European expenditure deciles make up over 80% of the population in Eastern European countries, while less than 20% of the population in the higher-income European countries (Scandinavia, Germany, France, Austria, the Netherlands, Belgium, the UK, and Ireland) are in the lowest European expenditure deciles (see SI, Figure S1).

The high intensities in the bottom four European expenditure deciles can be attributed in large part to more inefficient and dirtier domestic energy supply and demand technologies for heating and electricity generation in Poland, Bulgaria, the Czech Republic, and Romania. Poland alone was responsible for about 40% of total coal combustion for heat production in Europe in 2015 [@eurostat_eurostat_nodate-2], and had a higher average intensity of carbon per MJ of heat delivered than both Europe and the world [@werner_international_2017]. We did not account for energy subsidies here, but different subsidy levels in different countries could also contribute to higher energy and carbon intensities [@sovacool_reviewing_2017].

Inequality across final consumption categories


pdat = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), by="sector_agg_id") %>% 
  select(five_sectors, eu_q_rank, contains("pae_co2eq"), contains("pae_energy")) %>%
  pivot_longer(cols=-c(five_sectors, eu_q_rank), names_to="indicator", values_to="value") %>%
  mutate(indicator_type = if_else(str_detect(indicator, "co2eq"), 
                                  "tCO2eq per adult eq", 
                                  "Energy GJ per adult eq")) %>%
  filter(indicator != "pae_co2eq_t", 
         indicator != "pae_energy_use_gj")
  
  
pal <- wes_palette("Zissou1", 4, type = "discrete")
pal = pal[c(2,1,3,4)]
  
p1 = ggplot(pdat %>% filter(indicator_type == "tCO2eq per adult eq"), 
       aes(x=(eu_q_rank), y=value, fill=indicator)) +
  geom_col(position = position_stack()) +
  facet_wrap(~five_sectors, ncol = 5) +
  scale_fill_manual(values = pal, name="Location", labels=c("Direct", "Domestic", "Europe", "non-Europe")) +
  scale_x_continuous(breaks = c(1,2,3,4,5,6,7,8,9,10), 
                     labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) +
  #theme_ipsum() +
  theme_minimal() +
  theme(text=element_text(family="Liberation Sans Narrow")) +
  labs(x="", y="Carbon footprint tCO2eq per adult eq") +
  theme(legend.position = "bottom", 
          axis.text.x = element_text(angle = 90, size = 12),
          axis.text.y = element_text(size = 12),
          strip.text = element_text(size = 12),
          axis.title.y = element_text(size = 10))

p2 = ggplot(pdat %>% filter(indicator_type == "Energy GJ per adult eq"), 
       aes(x=(eu_q_rank), y=value, fill=indicator)) +
  geom_col(position = position_stack()) +
  facet_wrap(~five_sectors, ncol = 5) +
  scale_fill_manual(values = pal, name="Location", labels=c("Direct", "Domestic", "Europe", "non-Europe")) +
  scale_x_continuous(breaks = c(1,2,3,4,5,6,7,8,9,10), 
                     labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) +
  #theme_ipsum() +
  theme_minimal() +
  theme(text=element_text(family="Liberation Sans Narrow")) +
  labs(x="", y="Energy footprint GJ per adult eq") +
  theme(legend.position = "bottom", 
          axis.text.x = element_text(angle = 90, size = 12),
          axis.text.y = element_text(size = 12),
          strip.text = element_text(size = 12),
          axis.title.y = element_text(size = 10))

a = p1 / p2 + plot_layout(guides = "collect") & theme(legend.position = 'bottom', 
                                                  plot.margin =  margin(1, 1, 1, 1, "mm"),
                                                  panel.spacing = unit(c(1, 1, 1, 1), "mm"))


hm = pdat %>% filter(indicator_type == "Energy GJ per adult eq") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value))

ggsave(here("analysis", "figures", "figure3.pdf"))

co2eq_per_sector = pdat %>%
  filter(indicator_type == "tCO2eq per adult eq") %>%
  group_by(five_sectors, eu_q_rank) %>%
  summarise(value = sum(value))

mobility_co2eq_10_10 = round((co2eq_per_sector %>% filter(eu_q_rank == 10, five_sectors == "mobility"))$value/
                                (co2eq_per_sector %>% filter(eu_q_rank == 1, five_sectors == "mobility"))$value,digits = 0)

goods_co2eq_10_10 = round((co2eq_per_sector %>% filter(eu_q_rank == 10, five_sectors == "goods"))$value/
                                (co2eq_per_sector %>% filter(eu_q_rank == 1, five_sectors == "goods"))$value,digits = 0)

services_co2eq_10_10 = round((co2eq_per_sector %>% filter(eu_q_rank == 10, five_sectors == "services"))$value/
                                (co2eq_per_sector %>% filter(eu_q_rank == 1, five_sectors == "services"))$value,digits = 1)

food_co2eq_10_10 = round((co2eq_per_sector %>% filter(eu_q_rank == 10, five_sectors == "food"))$value/
                                (co2eq_per_sector %>% filter(eu_q_rank == 1, five_sectors == "food"))$value,digits = 1)

energy_per_sector = pdat %>%
  filter(indicator_type == "Energy GJ per adult eq") %>%
  group_by(five_sectors, eu_q_rank) %>%
  summarise(value = sum(value))

mobility_energy_10_10 = round((energy_per_sector %>% filter(eu_q_rank == 10, five_sectors == "mobility"))$value/
                                (energy_per_sector %>% filter(eu_q_rank == 1, five_sectors == "mobility"))$value,digits = 0)

goods_energy_10_10 = round((energy_per_sector %>% filter(eu_q_rank == 10, five_sectors == "goods"))$value/
                                (energy_per_sector %>% filter(eu_q_rank == 1, five_sectors == "goods"))$value,digits = 0)

services_energy_10_10 = round((energy_per_sector %>% filter(eu_q_rank == 10, five_sectors == "services"))$value/
                                (energy_per_sector %>% filter(eu_q_rank == 1, five_sectors == "services"))$value,digits = 1)

food_energy_10_10 = round((energy_per_sector %>% filter(eu_q_rank == 10, five_sectors == "food"))$value/
                                (energy_per_sector %>% filter(eu_q_rank == 1, five_sectors == "food"))$value,digits = 1)

The final consumption categories (housing, mobility, food, goods, and services) contributed very differently to the environmental footprint of European households in 2015 (Figure 3). On average, housing and mobility are the two largest categories, accounting for nearly two thirds of both the energy and carbon footprints. However, there are large differences between the categories when looking at the respective contributions of each expenditure decile. For housing there is very little difference between deciles in both the energy and the carbon footprint. The bottom four deciles even have higher carbon footprints from housing than most top deciles, which can be explained by the extreme differences in intensity shown in Figure 2. Mobility was the most unequal category, with footprints in the top decile 10 times higher than the bottom decile, corroborating findings in refs. [@ivanova_quantifying_2020] and [@oswald_large_2020]. Goods was the second most unequal final consumption category (10:10 ratios around r goods_energy_10_10 for both footprints), followed by services (10:10 ratios of r services_energy_10_10 for energy and r services_co2eq_10_10 for carbon) and then food (10:10 ratios of r food_energy_10_10 for both footprints).


knitr::include_graphics(here::here("analysis", "figures", "figure3.pdf"))

co2eq_per_source = pdat %>%
  filter(indicator_type == "tCO2eq per adult eq") %>%
  group_by(five_sectors, indicator) %>%
  summarise(value = sum(value)) %>%
  mutate(share = value/sum(value))

housing_co2eq_direct = round(((co2eq_per_source %>% filter(five_sectors == "housing", 
                                                          indicator == "pae_co2eq_direct_t"))$share)*100, digits = 0)

energy_per_source = pdat %>%
  filter(indicator_type == "Energy GJ per adult eq") %>%
  group_by(five_sectors, indicator) %>%
  summarise(value = sum(value)) %>%
  mutate(share = value/sum(value))

housing_energy_direct = round(((energy_per_source %>% filter(five_sectors == "housing", 
                                                          indicator == "pae_energy_use_direct_gj"))$share)*100, digits = 0)

The geographical source of the energy and carbon footprints also varies by category (Figure 3). The housing footprint was almost entirely domestic, with r housing_co2eq_direct% and r housing_energy_direct% respectively coming from direct household energy use and carbon emissions from heating and cooling, and the rest embedded primarily along the domestic supply chain. The mobility footprint, on the other hand, was around one fourth non-European. The majority of the mobility footprint, above 60%, came from vehicle fuel, either directly from households, or indirectly, i.e. embedded along the supply chain. The goods footprint was mostly non-European, while services and food were both around one third non-European. These results suggest that proposed future carbon border-adjustment mechanisms [@european_commission_communication_2019] will especially impact the goods and mobility footprints of the higher deciles, and to a lesser extent the food and services footprints.

Counterfactual: a 1.5°C compatible Europe

Global 1.5°C compatible decarbonisation scenarios achieve a similar climate outcome with different assumptions about the transformation of energy supply and demand, from renewable capacity, and deployment of carbon-capture-and-storage (CCS), to socio-technological demand transformation. Table 1 shows some final energy results for the year 2050 from six different decarbonisation scenarios, already adjusted from total GJ/capita to household GJ/adult equivalent. The original total GJ/capita scenario results are from different world regions (OECD, West EU, Global North, and Global), depending on the regional disaggregation of the publicly available scenario results, and so should not be interpreted as perfectly comparable with each other. For the purposes of our study, however, we are simply interested in the range of scenario results within which to situate our household environmental footprint results, presented below in the ‘Inequality in a 1.5°C compatible Europe’ section and Figure 5.


df_scenario_info = read_excel(here("analysis/data/raw/scenarios.xlsx"), sheet="overview") %>%
  select(scenario, type,fe_gj_aeu = final_energy_gj_per_aeu_2050,
         ccs_required = primary_energy_fossil_w_ccs2050_ej,
         description) %>%
  arrange(desc(fe_gj_aeu)) %>%
  mutate(fe_gj_aeu = round(fe_gj_aeu),
         ccs_required = round(ccs_required)) %>%
  select(scenario,type,fe_gj_aeu)

flextable(df_scenario_info) %>%
  autofit() %>%
  set_header_labels(scenario = "Scenario", 
                    type = "Type",
                    fe_gj_aeu = "Final energy in 2050: household GJ/adult equivalent") %>%
  set_caption("***Table 1: Decarbonisation scenarios. Scenario: Shared Socioeconomic Pathways (SSP) 1-1.9 and 2-1.9, IEA Energy Technology Perspectives Beyond 2 Degrees (IEA ETP B2DS), Global Energy Assessment (GEA)-efficiency, Low Energy Demand (LED), Decent Living Energy (DLE). Type: distinction between supply-side and demand-side scenarios. GEA-efficiency categorized as a 'mix' due to some bottom-up quantifications of final energy demand in some sectors. Final energy in 2050: final energy estimates for 2050 per scenario, adjusted from total GJ/capita to household GJ/adult equivalent. The original total GJ/capita results are from different world regions (OECD, West EU, Global North, and Global), depending on the regional disaggregation of the publicly available scenario results.***") %>%
  align(j=3, align = "center") %>%
  align(align = "left", part = "header") %>%
  width(width = 2.1) 

The various global supply-side scenarios (SSP1-1.9, SSP2-1.9, GEA-efficiency, IEA ETP B2DS) [@riahi_shared_2017] [@gea_gea_nodate] [@grubler_low_2018] would see the European household energy footprint falling from the 2015 level of r energy_total_hh EJ to around 21-31 EJ by 2050, equivalent to a per adult equivalent reduction from a 2015 average of r energy_pae_mean GJ to around 64-94 GJ. The differences in final energy in 2050 in the scenarios reflect different model assumptions about the rate of expansion of renewable energy, efficiency improvements and conservation, and CCS capacity. These scenarios rely on CCS, which is still a fairly speculative technology, and we therefore interpret them as ranges for the upper limits of 1.5°C compatible energy supply [@riahi_shared_2017] [@gea_gea_nodate].

It is more difficult to determine a lower limit for the minimum amount of energy required for a decent standard of living. Such a lower limit depends strongly on the prevalent socio-cultural idea of what constitutes a decent standard of living, and, perhaps even more strongly, on the physical infrastructure available to deliver this. The two global demand-side scenarios, Low Energy Demand (LED) [@grubler_low_2018] and Decent Living Energy (DLE) [@millward-hopkins_providing_2020], that attempt to define such a limit conclude that, in principle, a very low energy footprint, between around 15-53 household GJ per adult equivalent, could be sufficient. However, these scenarios rely on socio-technological transformations on a scale that, especially at the lower end, far exceed the current political discourse on the subject. These scenarios are 1.5°C compatible without resorting to any CCS but they all implicitly (LED) [@grubler_low_2018] or explicitly (DLE) [@millward-hopkins_providing_2020] assume near complete equality of consumption across the population. To put these low energy numbers in perspective, the average household energy footprint in our sample was r energy_pae_mean GJ per adult equivalent in 2015, about a factor 5 above the high estimate. Households in the bottom European expenditure decile, many falling within the EUROSTAT definition of severe material deprivation [@eurostat_living_nodate], still had an energy footprint of r energy_pae_bottom_decile GJ per adult equivalent in 2015 (roughly 80 GJ/capita), a factor of 2.5 above the high estimate.

Based on these two constraints, the upper limit on the supply side and the lower limit on the demand side, it is possible to make a generalized estimate of how much inequality in the distribution of energy consumption is numerically possible, if at the same time global warming is to be kept below 1.5°C and a decent standard of living for all is to be made possible. Before we can make this evaluation, we must take into account the existing large differences in the technological efficiency of energy provision (Figure 2). These differences will be adjusted in the next step.

Empirical best technology available per final consumption category

pal <- wes_palette("Zissou1", 4, type = "discrete")
pal = pal[c(2,1,3,4)]

pdat_int_energy = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>% 
  mutate(intensity_energy = (total_energy_use_tj)/(total_fd_me)) %>%
  select(five_sectors, eu_q_rank, 
         intensity_energy) %>%
  filter(eu_q_rank == 10) %>%
  select(-eu_q_rank)

pdat_final_demand = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>%
  left_join(pdat_int_energy, by="five_sectors") %>%
  mutate(total_energy_use_tj_new = (total_fd_me)*intensity_energy) %>%
  mutate(total_energy_use_tj_diff = total_energy_use_tj-total_energy_use_tj_new) %>%
  select(five_sectors, eu_q_rank, 
         total_energy_use_tj_diff, total_energy_use_tj_new) %>%
  group_by(eu_q_rank) %>%
  summarise(total_energy_use_tj_new = sum(total_energy_use_tj_new)*0.000001,
            total_energy_use_tj_diff = sum(total_energy_use_tj_diff)*0.000001) %>%
  pivot_longer(-c(eu_q_rank), names_to = "indicator", values_to = "value")


p1 = ggplot(pdat_final_demand, aes(x=eu_q_rank, y=value, fill=indicator, alpha=indicator)) +
  geom_col(position = position_stack()) +
  scale_fill_manual(values=c(pal[1], pal[2]), 
                    labels=c("2015", "Best technology"), name="Energy\nfootprint") +
  scale_alpha_manual(values=c(0.3,1),labels=c("2015", "Best technology"), name="Energy\nfootprint")+
  scale_x_continuous(breaks = c(1,2,3,4,5,6,7,8,9,10), 
                     labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) +
  labs(y="Energy footprint (EJ)", x="") +
  theme_minimal() +
  coord_flip() +
  theme(legend.position="bottom")

pdat_energy_country = get_sector_summary_by_country_quintile_direct() %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>%
  left_join(pdat_int_energy, by="five_sectors") %>%
  mutate(total_energy_use_tj_new = (total_fd_me)*intensity_energy) %>%
  #mutate(total_energy_use_tj_save = total_energy_use_tj_new/total_energy_use_tj*100) %>%
  select(iso2, 
         total_energy_use_tj_new, total_energy_use_tj) %>%
  group_by(iso2) %>%
  summarise(total_energy_use_tj_save = 100 - sum(total_energy_use_tj_new)/sum(total_energy_use_tj)*100)

library(rworldmap)
library(ggthemes)



df_country_mean = pdat_energy_country %>%
  mutate(iso2 = if_else(iso2 == "EL", "GR", iso2)) %>%
  mutate(iso2 = if_else(iso2 == "UK", "GB", iso2)) %>%
  left_join(ISO_3166_1 %>% select(iso2 = Alpha_2, iso3 = Alpha_3), by="iso2")


quantile_rank_map = joinCountryData2Map(df_country_mean, 
                                        joinCode = "ISO_A3", 
                                        nameJoinColumn = "iso3")
quantile_rank_map_poly = fortify(quantile_rank_map) #extract polygons 

quantile_rank_map_poly = merge(quantile_rank_map_poly, quantile_rank_map@data, by.x="id", by.y="ADMIN", all.x=T)
quantile_rank_map_poly = quantile_rank_map_poly %>% arrange(id, order)
map = ggplot() + 
  geom_polygon(data = quantile_rank_map_poly, aes(long, lat, group = group), color="black") +
  geom_polygon(data = quantile_rank_map_poly, aes(long, lat, group = group, 
                                        fill=total_energy_use_tj_save)) + 
  #scale_fill_gradient(name="Mean decile \nrank", low="skyblue", high = "skyblue4", na.value = "#EEEEEE") +
  scale_fill_viridis(direction = -1, discrete = F, na.value = "white", name="Energy\nsavings (%)") +
  theme_map() +
  labs(x="",y="")+
  coord_map("bonne", lat0 = 50,xlim = c(-9, 40), ylim = c(38, 68), clip="on") +
  theme(legend.position = c(0.85, 0.6))
  

a = p1 + map + plot_annotation(tag_levels = 'a') +
  theme(plot.margin = unit(c(0.25,0.25,0.25,0.25), "cm"),
        legend.position = 'bottom',
        axis.title.y = element_text(size=13, hjust = 0.5),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))

ggsave(here("analysis", "figures", "figure4.pdf"))
knitr::include_graphics(here::here("analysis", "figures", "figure4.pdf"))

pdat_final_demand = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>%
  left_join(pdat_int_energy, by="five_sectors") %>%
  mutate(total_energy_use_tj_new = (total_fd_me)*intensity_energy) %>%
  mutate(total_energy_use_tj_diff = total_energy_use_tj-total_energy_use_tj_new) %>%
  select(eu_q_rank, total_energy_use_tj, total_energy_use_tj_new, total_energy_use_tj_diff) %>%
  group_by(eu_q_rank) %>%
  summarise(total_energy_use_tj = sum(total_energy_use_tj),
            total_energy_use_tj_new = sum(total_energy_use_tj_new),
            total_energy_use_tj_diff = sum(total_energy_use_tj_diff)) %>%
  mutate(pae_energy_use_gj = (total_energy_use_tj/33417583)*1000,
         pae_energy_use_gj_new = (total_energy_use_tj_new/33417583)*1000)

energy_pae_mean_new = round(mean(pdat_final_demand$pae_energy_use_gj_new), digits = 0)

energy_total_hh_diff = round((pdat_final_demand %>% 
                               summarise(total_energy_use_tj_diff = sum(total_energy_use_tj_diff)*0.000001))$total_energy_use_tj_diff, digits = 0)

energy_10_10_new = round(pdat_final_demand$pae_energy_use_gj_new[10]/pdat_final_demand$pae_energy_use_gj_new[1], digits = 1)

Our results show that in 2015, higher-income people in higher-income countries had access to the most energy-efficient energy services across the final consumption categories (Figure 2). Since we are interested in the numerically possible inequality in the distribution of actual consumption of goods and services in the next section, these efficiency differences must first be adjusted. In practice, this corresponds, for example, to the need for large-scale investments in the technical efficiency of heat, electricity and hot water supply, especially in Eastern Europe [@bianco_understanding_2019]. Improving technical efficiency is already a major part of the EU platform, and new transition funds for lower-income countries, whether public or private under a Green Deal framework, need to be appropriately targeted, and at an appropriately large scale, to reduce the high intensities of consumption in the lower deciles [@european_commission_communication_2019] [@european_commission_european_2020]. Figure 4 shows the household energy footprint savings per decile (Figure 4a) that would have occurred in 2015 if all deciles had the same energy intensity per final consumption category as the top decile. Around r energy_total_hh_diff EJ would have been saved in total, the mean would have been r energy_pae_mean_new GJ/ae instead of r energy_pae_mean GJ/ae, and the energy footprint of the bottom decile would have been less than half its 2015 value. Figure 4b shows saved energy footprint per country, with Eastern European countries especially saving large proportions of their 2015 footprint, over 60% for Bulgaria and Estonia for example. Energy inequality would have been higher, at a 10:10 ratio of r energy_10_10_new (close to expenditure inequality, at r exp_10_10, as the differences in intensity per decile are removed), compared to our actual 2015 energy inequality estimate of a 10:10 ratio of r energy_10_10.

Inequality in a 1.5°C compatible Europe


pdat_int_energy = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>% 
  mutate(intensity_energy = (total_energy_use_tj)/(total_fd_me)) %>%
  select(five_sectors, eu_q_rank, 
         intensity_energy) %>%
  filter(eu_q_rank == 10) %>%
  select(-eu_q_rank)

pdat_final_demand = get_sector_summary_by_eu_ntile_direct(eu_q_count) %>%
  ungroup() %>%
  filter(year==2015) %>%
  left_join(read_csv(here("analysis/data/derived/sectors_agg_method1_ixi.csv")), 
            by="sector_agg_id") %>%
  left_join(pdat_int_energy, by="five_sectors") %>%
  mutate(total_energy_use_tj_new = (total_fd_me)*intensity_energy) %>%
  mutate(total_energy_use_tj_diff = total_energy_use_tj-total_energy_use_tj_new) %>%
  select(eu_q_rank,total_energy_use_tj_new) %>%
  group_by(eu_q_rank) %>%
  summarise(total_energy_use_tj_new = sum(total_energy_use_tj_new)) %>%
  mutate(pae_energy_use_tj = total_energy_use_tj_new/33417583,
         pae_energy_use_gj = pae_energy_use_tj*1000)

df_energy_deciles = pdat_final_demand %>%
  select(eu_q_rank, pae_energy_use_gj)

ineq_curr = df_energy_deciles$pae_energy_use_gj[10]/df_energy_deciles$pae_energy_use_gj[1]

df_scenario_info = read_excel(here("analysis/data/raw/scenarios.xlsx"), sheet="overview") %>%
  select(scenario, fe_gj_aeu = final_energy_gj_per_aeu_2050,
         ccs_required = primary_energy_fossil_w_ccs2050_ej,
         description) %>%
  arrange(fe_gj_aeu) %>%
  mutate(fe_gj_aeu = round(fe_gj_aeu),
         ccs_required = round(ccs_required)) 

mea_seq = c(df_scenario_info$fe_gj_aeu, seq(from=50, to=300, by=50))
#mea = c(16,300)
mer = c(16,60)


# vectorized function that returns scaled quantiles given 
#quantile index column and column with quantile averages
#qidx: quantile index
#qavg_to_scale: column to scale
#first_target: target value of first quantile
#mean_target: target mean of scaled quantiles

scaled_quantiles <- function(.data, 
                          qidx, 
                          qavg_to_scale, 
                          first_target, 
                          mean_target) {
  
  # cumbersomely extract current quantile mean
  mean_current = .data %>%
    ungroup() %>%
    summarise(mean_cur = first(mean({{qavg_to_scale}}))) %>%
    pull(mean_cur)
    
  # cumbersomely extract current first wuantile value
  first_current = .data %>%
    ungroup() %>%
    arrange({{qidx}}) %>%
    summarise(first_cur = first({{qavg_to_scale}})) %>%
    pull(first_cur)
  
  df_tmp = .data %>%
    mutate(tmp = {{qavg_to_scale}}*mean_target/mean_current)
  
  first_tmp = df_tmp$tmp[1]
  
  df_tmp = df_tmp %>%
    mutate(scaled = mean_target-(mean_target-tmp) * (mean_target-first_target)/(mean_target-first_tmp)) %>%
    select({{qidx}}, scaled) %>%
    mutate(v_mean = mean_target, v_first = first_target)
}

## run once to save file
df_all = NULL
for (min_energy in seq(from=mer[1], to=mer[2], by=0.1)) {
  for (mean_energy in mea_seq) {
    if (min_energy <= mean_energy) {
      df_all = df_all %>%
      bind_rows(df_energy_deciles %>%
                  scaled_quantiles(eu_q_rank, pae_energy_use_gj, min_energy, mean_energy))
    }
  }
}

saveRDS(df_all, here("analysis/data/derived/scenarios_extrafine.rds"))

round_by = 10

df_all = readRDS(here("analysis/data/derived/scenarios_extrafine.rds")) %>%
  filter(eu_q_rank %in% c(1,10)) %>%
  group_by(v_mean, v_first) %>%
  summarise(ratio = last(scaled)/first(scaled)) %>%
  mutate(bin_ratio = if_else((ratio*100)%%round_by > round_by*0.5, 
                             ratio*100+(round_by-(ratio*100)%%round_by),
                             ratio*100-(ratio*100)%%round_by)) %>%
  group_by(bin_ratio, v_first) %>%
  summarise(v_mean = mean(v_mean)) %>%
  mutate(bin_ratio = bin_ratio*0.01)


df_grid = df_all %>%
  filter(!(v_mean %in% df_scenario_info$fe_gj_aeu))
df_scenario = df_all %>%
  filter((v_mean %in% df_scenario_info$fe_gj_aeu))

df_dle = tibble(bin_ratio = 1, v_first = 16, v_mean = 16)

scenario_label = df_scenario_info %>%
  mutate(labl = paste0(scenario, " (", fe_gj_aeu, ")")) %>%
  pull(labl)

library(ggsci)

a = df_grid %>%
  ggplot(aes(x=v_first, y=bin_ratio, group=v_mean)) +
  geom_smooth(aes(linetype="Maximum energy\nsupply (GJ/ae)"), se=FALSE, color="grey", size=0.5) +
  scale_linetype_manual(name="", values = c(2)) +
  geom_smooth(data=df_scenario, aes(color=factor(v_mean)), se=FALSE) +
  geom_point(data=df_dle, aes(color=factor(v_mean))) +
  geom_hline(yintercept = ineq_curr, color="grey") +
  annotate(geom="text",x=56,y=12,label="300", angle=-35, size=3, color="grey32") +
  annotate(geom="text",x=46,y=9.5,label="200", angle=-35, size=3, color="grey32") +
  annotate(geom="text",x=33.5,y=6,label="100", angle=-35, size=3, color="grey32") +
  annotate(geom="text",x=60,y=ineq_curr-0.28,
           label="energy use inequality 2015", size=3.75, hjust=1, color="grey40") +
  scale_color_npg(
                     name = "Scenario", 
                     labels = scenario_label) +
  lims(x=c(15.5,60), y=c(1,13)) +
  labs(x= "Minimum energy use (GJ/ae)", y="Max. possible energy use inequality (10:10 ratio)") +
  theme_minimal() +
  theme(text=element_text(family="Liberation Sans Narrow"),
      axis.title.y = element_text(size=13, hjust = 0.5),
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      legend.text = element_text(size=12),
      legend.title = element_text(size=13))


ggsave(here("analysis", "figures", "figure5.pdf"))

Based on this counterfactual distribution of the energy footprint using homogeneous supply technologies, we then scale down the energy footprint across European expenditure deciles to meet supply constraints on average and, where necessary, "squeeze" the distribution to not undershoot minimum energy requirements in any decile (Figure 5).

Both the DLE and LED scenarios satisfy final energy demand for a decent standard of living and are compatible with the 1.5°C target without resorting to CCS technologies [@millward-hopkins_providing_2020] [@grubler_low_2018]. The DLE scenario explicitly envisions absolute global equality (a 10:10 ratio of 1) in energy consumption, except for small differences in required energy consumption based on climatic and demographic factors, as well as differences in population density [@millward-hopkins_providing_2020]. The LED scenario does not explicitly discuss distributional aspects beyond giving different final energy values for the Global North (around 53 household GJ/ae) and the Global South (around 20 household GJ/ae) [@grubler_low_2018]. However, due to the bottom-up construction of this demand scenario, these values can be interpreted as estimates for minimum required final energy. The energy supply scenarios do not include specific details about how the energy footprints are distributed within countries [@riahi_shared_2017] [@rao_improving_2017]. They achieve energy savings through the replacement of carbon-intensive fossil fuels by cleaner alternatives, efficiency improvements including the electrification of final energy, and some measures towards energy conservation [@riahi_shared_2017].

knitr::include_graphics(here::here("analysis", "figures", "figure5.pdf"))

The colored curves in Figure 5 represent constant average household energy footprints according to the different scenarios. The slopes of the curves connect different assumptions about minimum required energy for a decent standard of living (on the x-axis), to the corresponding energy inequality that is consistent with the average energy availability. It is clear from Figure 5 that at current (2015) inequality levels, only the scenarios with heavier CCS deployment (SSP2-1.9, SSP1-1.9, IEA ETP B2DS) and GEA-efficiency are possible, and only if we assume in addition an extremely low minimum energy requirement below 27 GJ/ae, which is roughly the value the LED scenario gives for the world in 2050. If we use the value given for the Global North at around 53 GJ/ae as minimum energy requirement, which still requires strong demand-side measures, then inequality would need to be zero in the LED scenario and more than halved in all other scenarios.

Conclusions

To achieve the aggregated final energy targeted in the different 1.5°C compatible scenarios, the energy footprint needs to be reduced in all European countries, as well as almost all expenditure groups. The carbon intensity of energy services needs to be reduced across all expenditure groups. The focus in the lower deciles should be on efficiency improvements, and on absolute reductions in energy consumption in the upper deciles [@alfredsson_why_2018] [@royston_invisible_2018]. Even under our bold assumption that the energy and emission efficiencies of all expenditure deciles converge, and demand develops as in the 1.5°C scenarios, our results show that a drastic reduction in the inequality of energy footprints is needed to secure decent living standards for all Europeans.

This illustrates an immense political challenge: ensuring a decent standard of living for all at the targeted final energy level of the minimum demand scenarios (between around 15 to 53 household GJ per adult equivalent [@grubler_low_2018] [@millward-hopkins_providing_2020], down from an average of r energy_pae_mean household GJ/ae) requires a fundamental reorganization of almost all areas of life and economy. It seems hard to imagine how, for example, the living space per capita can be reduced from about 40m² to 30m² (LED) [@grubler_low_2018], let alone to 15m² (DLE) [@millward-hopkins_providing_2020], or that air travel can be reduced to one short-to-medium-haul return flight every three years per person, which is an assumption behind the DLE scenario [@millward-hopkins_providing_2020]. However, each increase in the minimum energy required for a decent life also increases the need to redistribute the energy footprint between countries and expenditure groups, i.e. to reduce energy inequality ever more drastically. Achieving this seems at least as difficult politically. This shows that, in addition to measures to reduce average energy consumption and emissions, instruments to reduce inequality in energy consumption must be developed to ensure a just transition that "leaves no one behind", as the European Green Deal promises [@european_commission_communication_2019].

Particularly in the coming phase of necessary restructuring of the European economy, a social protection mechanism of whatever kind assuring a decent life will play a central role. However, the current organization of the eurozone offers little monetary or fiscal leeway to EU member states, especially the less wealthy where this would be particularly important, to strengthen or introduce such measures. At the European level, implementation fails due to the lack of a common economic policy, as well as the fact that the European Central Bank (ECB) (unlike other central banks) only has a mandate to stabilize prices, but not to provide full employment or other effective means of social protection for European citizens [@european_parliament_ecbs_2020]. At least in the eurozone, there is a great need for action to increase the scope for national and/or EU-wide policy making; both to ensure the social protection of citizens and to enable the necessary investments to restructure infrastructure and the economy.

Strong progressive carbon pricing could have a positive distributional effect besides its effect on absolute emission reduction [@klenert_making_2018]. In addition, other distribution and transfer instruments [@gough_recomposing_2017], such as wealth and inheritance taxes, or more progressive income taxes [@piketty_carbon_2015], will have to be discussed in order to reduce the large differences in purchasing power within and between the countries of Europe, at least as long as expenditure remains coupled to environmental footprints.

Our study highlights the challenges largely implicit in the 1.5°C scenarios with respect to securing a decent standard of living for all, and provides further evidence that achieving this dual objective likely requires a shift in the current policy focus on growth in favor of decreasing environmental impacts and increasing social equity [@haberl_systematic_2020] [@dalessandro_feasible_2020] [@millward-hopkins_fair_2021]. Although our empirical investigation is limited to countries in Europe, we contend that our main conclusions apply in a similar or stronger form to the global achievement of climate and equity goals [@hubacek_poverty_2017] [@woodward_incrementum_2015] [@sovacool_dispossessed_2021] [@hubacek_global_2017] [@kartha_carbon_2020] [@lamb_what_2020] [@oswald_global_2021], as articulated in the sustainable development goals.

\newpage

Associated Content

Supplementary Information

Supplementary materials and methods, including extended discussion on limitations, and supplementary results.

Author Information

Corresponding Author

*email:

Author Contributions

I.S.J., P-P.P., and H.W. designed research; I.S.J. and P-P.P. performed research; I.S.J., P-P.P., J.T., and H.W. interpreted results; and I.S.J., P-P.P., J.T., and H.W. wrote the paper.

Notes

The authors declare no competing financial interest.

Acknowledgements

We thank Jakob Napiontek.

\newpage

References

::: {#refs} :::

\newpage

Colophon

This report was generated on r Sys.time() using the following computational environment and dependencies:

# which R packages and versions?
if ("devtools" %in% installed.packages()) devtools::session_info()

The current Git commit details are:

# what commit is this file at? 
if ("git2r" %in% installed.packages() & git2r::in_repository(path = ".")) git2r::repository(here::here())