GDP & emissions - degrowthing or decoupling?

Author

Ben Anderson & Tom Rushby

Published

October 6, 2022

Friday fagpackets

One of a series

What’s all this about de-growth?

<sigh>

Data

Downloaded from the awesome OurWorldInData.

Code
dt_abs <- data.table::fread(here::here("data", "co2-emissions-and-gdp.csv"))
dt_pc <- data.table::fread(here::here("data", "co2-emissions-and-gdp-per-capita.csv"))

Who do we care about?

Code
entities_of_interest <- c("United Kingdom", "United States", "New Zealand", "China")

Absolute GDP & emissions

First we’ll try production emissions.

Code
plotDT <- dt_abs[Entity %in% entities_of_interest]

ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP, PPP (constant 2017 international $)`)/1000000000, 
                            x = as.numeric(`Annual CO2 emissions`)/1000000,
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  labs(x = "Annual CO2 emissions (production-based, gT)",
       y = "GDP $bn (constant 2017 $)")

Next we’ll try consumption emissions.

Note that 2020 consumption-based emissions data is missing so you don’t see the downtick

Code
plotDT <- dt_abs[Entity %in% entities_of_interest]

ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP, PPP (constant 2017 international $)`)/1000000000, 
                            x = as.numeric(`Annual consumption-based CO2 emissions`)/1000000,
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  labs(x = "Annual CO2 emissions (consumption-based, gT)",
       y = "GDP $bn (constant 2017 $)")

Per capita GDP & emissions

Since we’ll be dividing everything pairwise by the same denominator, nothing much should change… but the plots should be much clearer as we’ve removed the affect of population size

First we’ll try production emissions.

Code
plotDT <- dt_pc[Entity %in% entities_of_interest]

p <- ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP per capita, PPP (constant 2017 international $)`), 
                            x = as.numeric(`Annual CO2 emissions (per capita)`),
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  theme(legend.position = "none") +
  labs(x = "Annual CO2 emissions per capita (production-based, T)",
       y = "GDP per capita (constant 2017 $)")

Let’s repeat that for all countries. Hover over the dots to see which is which #YMMV

Code
#plotDT <- dt_pc[Entity %in% entities_of_interest]
plotDT <- dt_pc # for fun

p <- ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP per capita, PPP (constant 2017 international $)`), 
                            x = as.numeric(`Annual CO2 emissions (per capita)`),
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  theme(legend.position = "none") +
  labs(x = "Annual CO2 emissions per capita (production-based, T)",
       y = "GDP per capita (constant 2017 $)")

plotly::ggplotly(p)

Next we’ll try consumption emissions.

Note that 2020 consumption-based emissions data is missing so you don’t see the down-tick

Code
plotDT <- dt_pc[Entity %in% entities_of_interest]

ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP per capita, PPP (constant 2017 international $)`), 
                            x = as.numeric(`Annual consumption-based CO2 emissions (per capita)`),
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  labs(x = "Annual CO2 emissions per capita (consumption-based, T)",
       y = "GDP per capita (constant 2017 $)")

Let’s repeat that for all countries. Hover over the dots to see which is which #YMMV

Code
#plotDT <- dt_pc[Entity %in% entities_of_interest]
plotDT <- dt_pc # for fun

p <- ggplot2::ggplot(plotDT, aes(y = as.numeric(`GDP per capita, PPP (constant 2017 international $)`), 
                            x = as.numeric(`Annual consumption-based CO2 emissions (per capita)`),
                            colour = Entity,
                            alpha = Year)) +
  geom_point() +
  labs(x = "Annual CO2 emissions per capita (consumption-based, T)",
       y = "GDP per capita (constant 2017 $)")

plotly::ggplotly(p)

Efficiency

How about looking at efficency gC02e per $ GDP?

Following https://timjackson.org.uk/earth-vs-growth/

Code
dt_abs[, `Emissions intensity` := `Annual CO2 emissions`/`GDP, PPP (constant 2017 international $)`*1000*1000]

entities_of_interest <- c("United Kingdom", "United States", "World", "New Zealand", "China")
Code
plotDT <- dt_abs[Entity %in% entities_of_interest]

ggplot2::ggplot(plotDT, aes(Year, `Emissions intensity`, colour = Entity)) +
  geom_line() +
  labs(y = "gC02 per $ GDP",
       colour = "Country",
       caption = "Data: https://ourworldindata.org")

For the UK, let’s say c. 300g/$ in 1995 reducing to 200g/$ in 2010. So 15 years. To go from 200g/$ to zero at the same rate would take approx. 30 years. So net-zero by 2050?

Regardless of whether that aligns with science-based targets (i.e. absolute zero by 2044) … what happens if the economy grows … by say 2-3% per year? … would that force total emissions up (fixed intensity) or result in efficiency gains (lower intensity)?

Code
dt_abs[, `Emissions intensity (consumption-based)` := `Annual consumption-based CO2 emissions`/`GDP, PPP (constant 2017 international $)`*1000*1000]
Code
plotDT <- dt_abs[Entity %in% entities_of_interest]

ggplot2::ggplot(plotDT, aes(Year, `Emissions intensity (consumption-based)`, colour = Entity)) +
  geom_line() +
  labs(y = "gC02 per $ GDP")
Warning: Removed 4 row(s) containing missing values (geom_path).

Whom do we love?

quarto

data.table

ggplot2

here

skimr

Data descriptions

Check

Skim the absolute data:

Code
skimr::skim(dt_abs)
Warning: Couldn't find skimmers for class: integer64; No user-defined `sfl`
provided. Falling back to `character`.

Warning: Couldn't find skimmers for class: integer64; No user-defined `sfl`
provided. Falling back to `character`.
Data summary
Name dt_abs
Number of rows 7795
Number of columns 8
Key NULL
_______________________
Column type frequency:
character 4
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Entity 0 1.00 4 32 0 255 0
Code 0 1.00 0 8 931 225 0
Annual CO2 emissions 479 0.94 1 21 0 6137 0
GDP, PPP (constant 2017 international $) 1626 0.79 1 21 0 6162 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Year 0 1.00 2005.06 8.930000e+00 1990.00 1997.00 2005.00 2013.00 2.02000e+03 ▇▇▇▇▇
Annual consumption-based CO2 emissions 3730 0.52 976326173.39 3.366486e+09 197201.67 10759532.52 59975058.69 290854945.27 3.67025e+10 ▇▁▁▁▁
Emissions intensity 2105 0.73 263.56 2.409400e+02 9.15 122.67 196.73 309.26 2.30112e+03 ▇▁▁▁▁
Emissions intensity (consumption-based) 4295 0.45 291.92 1.686800e+02 4.19 179.06 251.82 365.36 1.82195e+03 ▇▂▁▁▁

Skim the per capita data

Code
skimr::skim(dt_pc)
Data summary
Name dt_pc
Number of rows 7745
Number of columns 6
Key NULL
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Entity 0 1 4 32 0 252 0
Code 0 1 0 8 899 224 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Year 0 1.00 2005.07 8.93 1990.00 1997.00 2005.00 2013.00 2020.00 ▇▇▇▇▇
GDP per capita, PPP (constant 2017 international $) 1579 0.80 17879.29 20132.68 436.72 3678.83 10365.78 25832.03 161971.47 ▇▂▁▁▁
Annual consumption-based CO2 emissions (per capita) 3680 0.52 6.53 6.92 0.05 1.19 4.30 9.89 57.79 ▇▂▁▁▁
Annual CO2 emissions (per capita) 492 0.94 5.11 6.44 0.02 0.77 2.97 7.42 68.72 ▇▁▁▁▁
Code
# hidden chunk