Australia’s coal decline has not cut its fossil CO2: what the Minister should target next

Author

560629576

Code
library(tidyverse)

Introduction

Client

Chris Bowen MP. Photo: Foote (2022), AUSPIC.

The client is Chris Bowen, Australia’s Minister for Climate Change and Energy. He leads the federal government’s climate and energy policy, including Australia’s emissions targets, so he is expected to explain where emissions cuts are coming from.

Problem Context

Australia has committed to cut emissions 62 to 70% below 2005 levels by 2035 (Grattan, 2025). On paper, progress appears strong: net emissions were 23.3% below 2005 in 2024. However, much of this improvement depends on the land sector’s carbon sink (Shu, 2026). The Minister therefore needs to know whether the energy system itself is delivering cuts, and which fuels are limiting progress. This report examines Australia’s fossil fuel CO2 against eight comparable economies to identify where further cuts are needed.

Data Context

The data come from the Our World in Data CO2 and greenhouse gas emissions dataset (Ritchie et al., 2023), which takes its CO2 estimates from the Global Carbon Project. Each row of the raw file is one country in one year, covering over 200 countries from 1750 to 2023. Table 1 lists the variables used. Emissions are counted where fuel is burned, not where goods are consumed, and exclude land use, other greenhouse gases and international aviation and shipping.

Code
raw = read.csv("CO2.csv")

# keep countries only
owid = raw |> filter(iso_code != "")
Code
aus_2023 = owid |> filter(country == "Australia", year == 2023)

tibble(
  Variable = c("country", "iso_code", "year", "co2", "coal_co2", "oil_co2", "gas_co2", "population"),
  Meaning = c("Country name",
              "Standard three-letter country code; blank for totals and regions",
              "Calendar year (1990 to 2023 used)",
              "Total fossil CO2: coal, oil, gas, cement, flaring and other industry",
              "CO2 from coal", "CO2 from oil", "CO2 from gas",
              "People living in the country"),
  Type = c("Categorical", "Categorical", "Quantitative (discrete)", rep("Quantitative (continuous)", 4),
           "Quantitative (discrete)"),
  Unit = c("–", "–", "–", rep("Million tonnes (Mt)", 4), "People"),
  `Value (Australia, 2023)` = c(aus_2023$country, aus_2023$iso_code, aus_2023$year,
                        sprintf("%.0f", c(aus_2023$co2, aus_2023$coal_co2, aus_2023$oil_co2, aus_2023$gas_co2)),
                        sprintf("%.1f million", aus_2023$population / 1e6))
) |>
  knitr::kable(caption = "Table 1. Variables used from the dataset, with Australia's 2023 values as an example.")
Table 1. Variables used from the dataset, with Australia’s 2023 values as an example.
Variable Meaning Type Unit Value (Australia, 2023)
country Country name Categorical – Australia
iso_code Standard three-letter country code; blank for totals and regions Categorical – AUS
year Calendar year (1990 to 2023 used) Quantitative (discrete) – 2023
co2 Total fossil CO2: coal, oil, gas, cement, flaring and other industry Quantitative (continuous) Million tonnes (Mt) 383
coal_co2 CO2 from coal Quantitative (continuous) Million tonnes (Mt) 143
oil_co2 CO2 from oil Quantitative (continuous) Million tonnes (Mt) 142
gas_co2 CO2 from gas Quantitative (continuous) Million tonnes (Mt) 75
population People living in the country Quantitative (discrete) People 26.5 million

Australia is compared with the eight other G20 members classed as advanced economies by the International Monetary Fund (2022): Canada, France, Germany, Italy, Japan, South Korea, the United Kingdom and the United States. This rule sets the peers by income level, not by emissions results. China and India are excluded because they are classed as developing economies.

Code
peers = c("Australia", "Canada", "France", "Germany", "Italy",
          "Japan", "South Korea", "United Kingdom", "United States")

peer_data = owid |>
  filter(country %in% peers, year >= 1990)

Data cleaning and integrity checks

Rows that weren’t individual countries, such as “World” totals, continents and income groups, were removed before analysis, since keeping them would double count emissions already included in their member countries (flagged in the data by a blank country code, iso_code). The remaining nine countriesi were checked for duplicate years, negative values and missing data, and none were found (Table 2). Hence the figures that follow are drawn from complete, unduplicated records. The analysis covers 1990 to 2023, the last year in the file, and uses 2005 as the baseline because the 2035 target is measured against it.

Code
integrity = tibble(
  Check = c("Repeated country-years", "Negative emissions", "Missing values"),
  `Number found` = c(sum(duplicated(peer_data[, c("country", "year")])),
                     sum(peer_data[, c("co2", "coal_co2", "oil_co2", "gas_co2")] < 0),
                     sum(is.na(peer_data[, c("co2", "coal_co2", "oil_co2", "gas_co2", "population")])))
)

knitr::kable(integrity, caption = "Table 2. Data integrity checks on the nine countries, 1990 to 2023.")
Table 2. Data integrity checks on the nine countries, 1990 to 2023.
Check Number found
Repeated country-years 0
Negative emissions 0
Missing values 0

Evidence

Coal fell, but oil and gas filled the gap

Australia’s coal CO2 fell 58 million tonnes (Mt) between 2005 and 2023, but oil rose 25 Mt and gas 20 Mt, so total fossil CO2 barely moved, from 386 Mt to 383 Mt (Figure 1, Table 3).

Code
# Australia's emissions by source
aus_fuel = owid |>
  filter(country == "Australia", year >= 1990) |>
  select(year, Coal = coal_co2, Oil = oil_co2, Gas = gas_co2, Total = co2) |>
  mutate(Other = Total - Coal - Oil - Gas)

# long format for the stacked areas
aus_stack = aus_fuel |>
  select(-Total) |>
  pivot_longer(-year, names_to = "Source", values_to = "co2") |>
  mutate(Source = factor(Source, levels = c("Other", "Gas", "Oil", "Coal")))

# labels showing the change from 2005 to 2023
d05 = filter(aus_fuel, year == 2005)
d23 = filter(aus_fuel, year == 2023)
band_labels = tibble(
  Source = c("Coal", "Oil", "Gas", "Other"),
  y = c(d23$Coal / 2,
        d23$Coal + d23$Oil / 2,
        d23$Coal + d23$Oil + d23$Gas / 2,
        d23$Coal + d23$Oil + d23$Gas + d23$Other / 2 - 6),  # moved down to clear the total label
  change = c(d23$Coal - d05$Coal, d23$Oil - d05$Oil, d23$Gas - d05$Gas, d23$Other - d05$Other)
) |>
  mutate(label = paste0(Source, "\n", sprintf("%+.0f", change), " Mt"))

ggplot(aus_stack, aes(x = year, y = co2)) +
  geom_area(aes(fill = Source), stat = "identity", colour = "white", linewidth = 0.4, outline.type = "upper") +
  geom_line(data = aus_fuel, aes(y = Total), colour = "#1A1A1A", linewidth = 0.9) +
  geom_vline(xintercept = 2005, linetype = "dashed", colour = "grey35") +
  geom_point(data = filter(aus_fuel, year %in% c(2005, 2023)), aes(y = Total),
             shape = 21, size = 3, fill = "#1A1A1A", colour = "white", stroke = 1) +
  geom_text(data = band_labels, aes(x = 2023.5, y = y, label = label),
            hjust = 0, size = 3.4, fontface = "bold", colour = "grey20", lineheight = 0.95) +
  annotate("text", x = 2023.5, y = d23$Total + 24, hjust = 0, size = 3.4, fontface = "bold",
           colour = "#1A1A1A", lineheight = 0.95, label = sprintf("Total\n%.0f Mt", d23$Total)) +
  annotate("text", x = 2004.6, y = 428, hjust = 1, vjust = 1, size = 3.2, colour = "grey30", lineheight = 0.95,
           label = sprintf("2005 baseline: total %.0f Mt\n(the 2035 target is measured from here)", d05$Total)) +
  scale_fill_manual(values = c(Coal = "#4D4D4D", Oil = "#E76F51", Gas = "#2A9D8F", Other = "#CFCFCF"),
                    guide = "none") +
  scale_x_continuous(expand = expansion(mult = c(0.01, 0.005))) +
  scale_y_continuous(limits = c(0, 440), expand = expansion(mult = c(0, 0.02))) +
  coord_cartesian(clip = "off") +
  labs(
    title = "Coal CO2 fell after 2010 but oil and gas grew, so total fossil CO2 is back at its 2005 level",
    x = "Year",
    y = "Fossil CO2 emissions (million tonnes)",
    caption = "Source: Our World in Data (Ritchie et al., 2023)"
  ) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.minor = element_blank(), plot.title = element_text(size = 11.5),
        plot.title.position = "plot", plot.margin = margin(5.5, 58, 5.5, 5.5))

Figure 1. Australia’s fossil CO2 emissions by source, 1990 to 2023; the top edge of the stack is total fossil CO2. Between 2005 and 2023, coal fell 58 Mt while oil, gas and other sources rose 25, 20 and 10 Mt, leaving the total almost unchanged. Other = cement, flaring and other industry.
Code
aus_change = owid |>
  filter(country == "Australia", year %in% c(2005, 2023)) |>
  transmute(year, Coal = coal_co2, Oil = oil_co2, Gas = gas_co2,
            `Other (cement, flaring, industry)` = co2 - coal_co2 - oil_co2 - gas_co2,
            `Total fossil CO2` = co2) |>
  pivot_longer(-year, names_to = "Source", values_to = "co2") |>
  pivot_wider(names_from = year, values_from = co2) |>
  mutate(
    `Change (Mt)` = round(`2023` - `2005`, 1),
    `Change (%)` = round((`2023` / `2005` - 1) * 100, 1),
    `2005` = round(`2005`, 1),
    `2023` = round(`2023`, 1)
  )

knitr::kable(aus_change, caption = "Table 3. Australia's CO2 emissions by source, 2005 vs 2023 (million tonnes and per cent, rounded).")
Table 3. Australia’s CO2 emissions by source, 2005 vs 2023 (million tonnes and per cent, rounded).
Source 2005 2023 Change (Mt) Change (%)
Coal 200.7 142.7 -58.0 -28.9
Oil 116.5 141.6 25.1 21.5
Gas 54.5 74.6 20.2 37.1
Other (cement, flaring, industry) 14.5 24.1 9.6 66.0
Total fossil CO2 386.2 383.0 -3.2 -0.8

That lag is not normal among comparable economies

Australia’s total fossil CO2 fell just 0.8%, the second weakest of nine advanced economies; only South Korea’s rose (+15.8%). The UK, Italy, France and Germany each cut it by more than 30% (Figure 2).

Code
# percentage change in CO2 from 2005 to 2023
total_change = peer_data |>
  filter(year == 2005 | year == 2023) |>
  group_by(country) |>
  summarise(pct = (co2[year == 2023] - co2[year == 2005]) / co2[year == 2005] * 100)

# one colour for each country
country_colours = c("Australia" = "#E76F51", "Canada" = "#6250D6", "France" = "#1BAF7A",
                    "Germany" = "#EDA100", "Italy" = "#2A78D6", "Japan" = "#E87BA4",
                    "South Korea" = "#184F95", "United Kingdom" = "#E34948", "United States" = "#008300")

ggplot(total_change, aes(x = pct, y = reorder(country, -pct), fill = country)) +
  geom_vline(xintercept = 0, colour = "grey40") +
  geom_col(width = 0.62) +
  geom_text(aes(label = paste0(round(pct, 1), "%"), hjust = ifelse(pct < 0, 1.12, -0.12)), size = 3.6) +
  scale_fill_manual(values = country_colours) +
  xlim(-58, 28) +
  labs(
    title = "Five of eight peers cut fossil CO2 by more than 20% since 2005; Australia's fell 0.8%",
    x = "Change in fossil CO2, 2005 to 2023 (%)",
    y = NULL,
    caption = "Source: Our World in Data (Ritchie et al., 2023)"
  ) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "none", panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank(), plot.title = element_text(size = 11.5),
        plot.title.position = "plot", axis.text.y = element_text(size = 11))

Figure 2. Change in fossil CO2 emissions between 2005 and 2023 in nine advanced economies. Australia (orange) fell 0.8%, the second weakest result; only South Korea’s emissions rose.

Oil, not coal or gas, is the outlier

Oil CO2 fell in all eight peers, by 5% to 41%, but rose 21.5% in Australia. Relative to 2005, Australia’s oil CO2 has exceeded every peer’s since 2007 (Figure 3). Six of the eight peers cut coal more than Australia’s 29%, and four also raised gas.

Code
# index each fuel to 2005 = 100
fuel_idx = peer_data |>
  filter(year >= 2005) |>
  select(country, year, Coal = coal_co2, Oil = oil_co2, Gas = gas_co2) |>
  pivot_longer(c(Coal, Oil, Gas), names_to = "Fuel", values_to = "mt") |>
  group_by(country, Fuel) |>
  mutate(index = mt / mt[year == 2005] * 100) |>
  ungroup() |>
  mutate(Fuel = factor(Fuel, levels = c("Coal", "Oil", "Gas")),
         is_aus = country == "Australia")

# panel titles
n_peers = n_distinct(fuel_idx$country) - 1
n_fell = fuel_idx |>
  filter(!is_aus, year == 2023) |>
  group_by(Fuel) |>
  summarise(n = sum(index < 100))
panel_names = setNames(paste0(n_fell$Fuel, ": ", n_fell$n, " of ", n_peers, " peers fell"),
                       n_fell$Fuel)

# labels at the end of the lines
ends = fuel_idx |>
  filter(year == 2023) |>
  mutate(name = ifelse(country == "United Kingdom", "UK", country))
fuel_labels = bind_rows(
  filter(ends, is_aus),
  ends |> filter(!is_aus) |> group_by(Fuel) |> slice_max(index, n = 1),
  ends |> filter(!is_aus) |> group_by(Fuel) |> slice_min(index, n = 1)
) |>
  ungroup() |>
  mutate(label = paste0(name, " ", sprintf("%+.0f%%", index - 100)))

ggplot(fuel_idx, aes(x = year, y = index, group = country)) +
  geom_hline(yintercept = 100, linetype = "dashed", colour = "grey60") +
  geom_line(data = filter(fuel_idx, !is_aus), colour = "#A9B7C6", linewidth = 0.7) +
  geom_line(data = filter(fuel_idx, is_aus), colour = "#E76F51", linewidth = 1.6) +
  geom_text(data = fuel_labels, aes(x = 2023.4, y = index, label = label, colour = is_aus),
            hjust = 0, size = 3, fontface = "bold", show.legend = FALSE) +
  facet_wrap(~Fuel, nrow = 1, labeller = as_labeller(panel_names)) +
  scale_colour_manual(values = c("TRUE" = "#E76F51", "FALSE" = "#5B6B7C")) +
  scale_x_continuous(breaks = c(2005, 2014, 2023), expand = expansion(mult = c(0.02, 0.8))) +
  scale_y_continuous(breaks = seq(0, 200, 50)) +
  coord_cartesian(ylim = c(0, 200)) +
  labs(
    title = "Since 2007, Australia's oil CO2 has stayed above every peer's; its coal and gas have not",
    subtitle = "CO2 from each fuel, 2005 = 100. Grey lines are the eight peers",
    x = NULL,
    y = "CO2 (2005 = 100)",
    caption = "Source: Our World in Data (Ritchie et al., 2023)"
  ) +
  theme_minimal(base_size = 11) +
  theme(panel.grid.minor = element_blank(),
        strip.text = element_text(face = "bold", size = 10.5),
        plot.title = element_text(size = 12), plot.title.position = "plot",
        panel.spacing.x = unit(1.1, "lines"))

Figure 3. CO2 from coal, oil and gas since 2005 (2005 = 100): Australia (orange) and each of the eight peers (grey lines). Panel headings count the peers whose CO2 from that fuel fell between 2005 and 2023. Australia’s oil line is above every peer’s in every year from 2007; its coal and gas lines stay among the peers’ lines in nearly every year.

Even without coal, the gap would remain

Removing all 143 Mt of 2023 coal CO2, more than closing every coal-fired power station would achieve, would leave 240 Mt, 38% below 2005 (Figure 4). Applying the target’s 62 to 70% cut (Grattan, 2025) to fossil CO2 gives 147 to 116 Mt, so 94 to 124 Mt more must go. Matching the peers’ average oil cut (23% below 2005) would supply 52 Mt of that (42 to 55%). These are what-ifs, not forecasts.

Code
a = owid |>
  filter(country == "Australia", year %in% c(2005, 2023)) |>
  transmute(year, Coal = coal_co2, Oil = oil_co2, Gas = gas_co2,
            Other = co2 - coal_co2 - oil_co2 - gas_co2)

# peers' average change in oil CO2
peer_oil_change = peer_data |>
  filter(country != "Australia", year %in% c(2005, 2023)) |>
  select(country, year, oil_co2) |>
  pivot_wider(names_from = year, values_from = oil_co2) |>
  summarise(m = mean(`2023` / `2005` - 1) * 100) |>
  pull(m)
oil_2005 = a$Oil[a$year == 2005]

# data for the four bars
stack = bind_rows(
  a |> filter(year == 2005) |> mutate(bar = "2005\nactual"),
  a |> filter(year == 2023) |> mutate(bar = "2023\nactual"),
  a |> filter(year == 2023) |> mutate(bar = "2023, all\ncoal removed", Coal = 0),
  a |> filter(year == 2023) |> mutate(bar = "...and oil at\n23% below 2005", Coal = 0,
                                      Oil = oil_2005 * (1 + peer_oil_change / 100))
) |>
  select(-year) |>
  pivot_longer(-bar, names_to = "Source", values_to = "co2") |>
  mutate(bar = factor(bar, levels = unique(bar)),
         Source = factor(Source, levels = c("Other", "Gas", "Oil", "Coal")))

# 2005 total for the dashed lines
base_2005 = sum(a[a$year == 2005, c("Coal", "Oil", "Gas", "Other")])
# total of each bar
totals = stack |> group_by(bar) |> summarise(total = sum(co2))

ggplot(stack, aes(x = bar, y = co2, fill = Source)) +
  geom_col(width = 0.6) +
  geom_text(data = totals, aes(x = bar, y = total, label = round(total)),
            inherit.aes = FALSE, vjust = -0.5, fontface = "bold") +
  geom_hline(yintercept = base_2005 * 0.38, linetype = "dashed", colour = "#1B7F72") +
  geom_hline(yintercept = base_2005 * 0.30, linetype = "dashed", colour = "#1B7F72") +
  annotate("text", x = 4.45, y = base_2005 * 0.38 + 13, hjust = 0, size = 3.2, colour = "#1B7F72",
           label = "62% cut (147)") +
  annotate("text", x = 4.45, y = base_2005 * 0.30 - 13, hjust = 0, size = 3.2, colour = "#1B7F72",
           label = "70% cut (116)") +
  scale_fill_manual(values = c(Coal = "#4D4D4D", Oil = "#E76F51", Gas = "#2A9D8F", Other = "#CFCFCF"),
                    breaks = c("Coal", "Oil", "Gas", "Other")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  coord_cartesian(xlim = c(0.5, 5.1), clip = "off") +
  labs(
    title = "Even with all coal gone, fossil CO2 stays above a 62 to 70% cut",
    subtitle = "Static what-ifs on 2023 emissions, not forecasts. Dashed lines: illustrative benchmark",
    x = NULL,
    y = "Fossil CO2 (million tonnes)",
    fill = "Source",
    caption = "Source: Our World in Data (Ritchie et al., 2023); target from Grattan (2025).\nIllustrative only: the official target covers all gases and the land sector."
  ) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(), plot.title.position = "plot")

Figure 4. Australia’s fossil CO2 in 2005 and 2023, in 2023 with all coal CO2 removed, and then with oil also at 23% below its 2005 level, the peers’ average cut (static what-ifs, not forecasts). Dashed lines apply the target’s 62% and 70% cuts to 2005 fossil CO2 as an illustrative benchmark; the official target covers all gases and the land sector. Even after both changes, 189 Mt remains above the benchmark. Other = cement, flaring and other industry.

That oil gap is unlikely to be chance

Code
# single-case t-test (Crawford & Howell, 1998)
ch_test = function(case, ref) {
  n = length(ref)
  t = (case - mean(ref)) / (sd(ref) * sqrt(1 + 1 / n))
  c(t = t, df = n - 1, p = 2 * pt(abs(t), df = n - 1, lower.tail = FALSE))
}

# percentage change by source
pct_by_source = peer_data |>
  filter(year %in% c(2005, 2023)) |>
  select(country, year, Oil = oil_co2, Gas = gas_co2, Coal = coal_co2, `Total fossil CO2` = co2) |>
  pivot_longer(-c(country, year), names_to = "Source", values_to = "mt") |>
  pivot_wider(names_from = year, values_from = mt) |>
  mutate(pct = (`2023` / `2005` - 1) * 100)

# one test for each source
compare = pct_by_source |>
  group_by(Source) |>
  group_modify(~ {
    ref = .x$pct[.x$country != "Australia"]
    case = .x$pct[.x$country == "Australia"]
    r = ch_test(case, ref)
    tibble(peer_mean = mean(ref), aus = case, t = r[["t"]], p = r[["p"]])
  }) |>
  ungroup() |>
  # Bonferroni adjustment for four tests
  mutate(p_adj = pmin(1, p * 4))

# oil data and checks for the appendix
oil_all = pct_by_source |> filter(Source == "Oil")
oil_peers = oil_all |> filter(country != "Australia")
tt = t.test(oil_peers$pct, mu = 0)
sw = shapiro.test(oil_peers$pct)
Code
oil_peers |>
  arrange(pct) |>
  transmute(Country = country,
            `2005 (Mt)` = sprintf("%.1f", `2005`),
            `2023 (Mt)` = sprintf("%.1f", `2023`),
            `Change (%)` = sprintf("%.1f", pct)) |>
  bind_rows(tibble(Country = c("Peer mean", "Peer standard deviation"),
                   `2005 (Mt)` = "", `2023 (Mt)` = "",
                   `Change (%)` = sprintf("%.1f", c(mean(oil_peers$pct), sd(oil_peers$pct))))) |>
  bind_rows(oil_all |>
              filter(country == "Australia") |>
              transmute(Country = "Australia (the case tested)",
                        `2005 (Mt)` = sprintf("%.1f", `2005`),
                        `2023 (Mt)` = sprintf("%.1f", `2023`),
                        `Change (%)` = sprintf("%.1f", pct))) |>
  knitr::kable(caption = "Table 4. Oil CO2 in the eight peers (the reference group) and in Australia (the case compared with them), 2005 to 2023.")
Table 4. Oil CO2 in the eight peers (the reference group) and in Australia (the case compared with them), 2005 to 2023.
Country 2005 (Mt) 2023 (Mt) Change (%)
Japan 642.4 377.7 -41.2
Italy 238.5 155.9 -34.6
France 241.3 174.6 -27.7
Germany 305.2 231.6 -24.1
United Kingdom 200.4 154.9 -22.7
United States 2642.6 2250.9 -14.8
South Korea 195.1 170.4 -12.7
Canada 261.0 248.9 -4.6
Peer mean -22.8
Peer standard deviation 12.0
Australia (the case tested) 116.5 141.6 21.5
Code
compare |>
  mutate(Source = factor(Source, levels = c("Oil", "Gas", "Coal", "Total fossil CO2"))) |>
  arrange(Source) |>
  transmute(`CO2 source` = Source,
            `Peer mean (%)` = sprintf("%+.1f", peer_mean),
            `Australia (%)` = sprintf("%+.1f", aus),
            `t (df = 7)` = sprintf("%.2f", t),
            `p-value` = sprintf("%.3f", p),
            `Adjusted p-value` = sprintf("%.3f", p_adj)) |>
  knitr::kable(align = "lrrrrr", caption = "Table 5. Does Australia's change in CO2 from each source differ from the eight peers'? Single-case t-tests; adjusted p-values allow for the four comparisons (Bonferroni).")
Table 5. Does Australia’s change in CO2 from each source differ from the eight peers’? Single-case t-tests; adjusted p-values allow for the four comparisons (Bonferroni).
CO2 source Peer mean (%) Australia (%) t (df = 7) p-value Adjusted p-value
Oil -22.8 +21.5 3.50 0.010 0.040
Gas +9.4 +37.1 0.58 0.580 1.000
Coal -49.4 -28.9 0.53 0.615 1.000
Total fossil CO2 -22.7 -0.8 1.02 0.340 1.000
Code
ggplot(oil_peers, aes(sample = pct)) +
  stat_qq(size = 2.5, colour = "#2A9D8F") +
  stat_qq_line(colour = "grey40") +
  labs(
    title = "Points sit close to the line, so normality is reasonable",
    subtitle = paste0("Shapiro-Wilk p = ", round(sw$p.value, 2), " (no evidence against normality), n = 8"),
    x = "Theoretical quantiles (normal distribution)",
    y = "Observed % change in oil CO2",
    caption = "Source: Our World in Data (Ritchie et al., 2023)"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(size = 11.5))

Figure 5. Normal QQ plot of the eight peers’ percentage change in oil CO2, 2005 to 2023. Points close to the line support the normality assumption of the t-test.

Australia’s 21.5% rise is far above the peers’ mean change of −22.8%, a gap that a t-test finds unlikely to be chance (t = 3.50, p = 0.010, or 0.040 allowing for four fuel comparisons; Appendix). Gas, coal and total CO2 show no such gap (Table 5). Oil is where Australia departs from its peers (suggestive, not conclusive).

Limitations

  • Scope. The target covers all greenhouse gases and the land sector (Shu, 2026), so progress may be better than fossil CO2 shows.
  • Accounting. Emissions are counted where fuel is burned, ignoring trade. On a consumption basis (Davis & Caldeira, 2010), Australia’s total fell 1.5% between 2005 and 2022 against 18.6% for peers, so the lag remains, though oil cannot be tested this way (Appendix).
  • Population. Australia’s population grew 30%, so growth explains much of its lag in total: per person, total fossil CO2 fell 24% against 29% for peers, but oil CO2 per person fell only 7% against 29%.
  • Sample. Eight peers who trade with each other make p-values indicative, and ending in 2019 lifts the adjusted p-value to 0.095, above 0.05 (Appendix).
  • Cause. The data show where Australia differs, not why; with no sector split, transport as the starting point rests on inventory data (Shu, 2026).

Recommendation

Set an oil CO2 goal in the 2035 plan that cuts about 52 Mt from 2023 levels, matching the peers’ average fall of 23% since 2005, starting with transport, 100 Mt in 2024 and dominated by road fuels (Shu, 2026). Track fossil CO2 against 2005 annually.

AI usage statement

Claude (Sonnet 5; Anthropic; https://claude.ai) was used throughout this project to explain the report requirements, suggest analysis approaches, write and debug R code for the figures and tests, draft wording for sections, and check numbers and logic. The author edited the text and made the final decisions on content.

Acknowledgements

  • 2025 S1 Data1001 Winner Sample

  • 2025 S2 Data1001 Winner Sample

  • 2026 Data1001 Report Template

  • 2026 Report Rubric

  • Tutor feedback on the draft report, October 2026

References

Crawford, J. R., & Howell, D. C. (1998). Comparing an individual’s test score against norms derived from small samples. The Clinical Neuropsychologist, 12(4), 482–486. https://doi.org/10.1076/clin.12.4.482.7241

Davis, S. J., & Caldeira, K. (2010). Consumption-based accounting of CO2 emissions. Proceedings of the National Academy of Sciences, 107(12), 5687–5692. https://doi.org/10.1073/pnas.0906974107

Foote, D. (2022). Official portrait: Hon. Chris Bowen MP [Photograph]. AUSPIC, Department of Parliamentary Services, Commonwealth of Australia.

Grattan, M. (2025, September 18). Federal government announces 2035 emissions reduction target. Australian Geographic (republished from The Conversation). https://www.australiangeographic.com.au/climate/2025/09/federal-government-announces-2035-emissions-reduction-target/

International Monetary Fund. (2022). World Economic Outlook database: WEO groups and aggregates information (April 2022). https://www.imf.org/external/pubs/ft/weo/2022/01/weodata/groups.htm

Ritchie, H., Rosado, P., & Roser, M. (2023). CO2 and greenhouse gas emissions. Our World in Data. https://ourworldindata.org/co2-and-greenhouse-gas-emissions

Shu, M. (2026, September 17). Australia: Current emission levels. Climate Scorecard. https://www.climatescorecard.org/2026/09/australia-current-emission-levels/

Appendix

Hypothesis test (HATPC)

Test. Single-case t-test (Crawford & Howell, 1998), two-tailed, on the percentage change in oil CO2 from 2005 to 2023. It is the one-sample t-test adapted to compare one new observation, Australia, with a small reference group, the eight peers.

Hypotheses. H₀: Australia’s change in oil CO2 comes from the same distribution as the peers’ changes, so any gap from the peer mean is chance. H₁: Australia’s change does not come from that distribution. Significance level 0.05.

Assumptions.

  • Independence: each country is one observation. This is only roughly true, since countries trade and share oil markets, and the peers are chosen by a rule, not sampled at random, so the p-value is indicative.
  • Normality: the peers’ changes sit close to the line on the QQ plot (Figure 5) and Shapiro-Wilk gives p = 0.99, so there is no evidence against normality. With n = 8 this check has low power, so it is reassurance, not proof.
  • Percentage change is used rather than raw tonnes, because raw changes are dominated by country size and fail the normality check (Shapiro-Wilk p = 0.012).

Test statistic. t = (x − mean) / (SD × √(1 + 1/n)) = (21.54 − (−22.80)) / (11.95 × √(1 + 1/8)) = 3.50 on 7 degrees of freedom, where x is Australia’s change and the mean and SD describe the eight peers (Table 4).

P-value. p = 0.010 (two-tailed).

Conclusion. H₀ is rejected at the 5% level: Australia’s +21.5% change in oil CO2, 3.7 peer standard deviations above the peer mean, is unlikely to be chance variation around the peers’ pattern. It also lies outside the 95% prediction interval for a peer-like country (−52.8% to +7.2%). The peers themselves cut oil CO2 by 22.8% on average (95% confidence interval −32.8% to −12.8%; one-sample t(7) = −5.40, p = 0.001), but that test only asks whether the peer mean differs from zero, not whether Australia differs from the peers.

Choice of fuel. Four comparisons were made (oil, gas, coal and total fossil CO2; Table 5), and oil was singled out because it is where Australia’s change stands out. The p-value for oil is therefore multiplied by 4 (Bonferroni), giving 0.040, which still holds at 5%. Holm’s method gives the same value. Gas, coal and total CO2 show no gap (all p ≥ 0.34 before adjustment).

Sensitivity checks

The oil comparison was repeated under different choices (Table 6).

Code
# repeat the oil test with different choices
oil_pct = function(y0, y1, per_person = FALSE, drop = character(0)) {
  peer_data |>
    filter(!country %in% drop) |>
    mutate(v = if (per_person) oil_co2 / population else oil_co2) |>
    group_by(country) |>
    summarise(pct = (mean(v[year %in% y1]) / mean(v[year %in% y0]) - 1) * 100, .groups = "drop")
}

run_test = function(d) {
  ref = d$pct[d$country != "Australia"]
  case = d$pct[d$country == "Australia"]
  r = ch_test(case, ref)
  tibble(aus = case, peer_mean = mean(ref), t = r[["t"]], df = r[["df"]], p = r[["p"]],
         p_adj = min(1, r[["p"]] * 4))
}

checks = bind_rows(
  run_test(oil_pct(2005, 2023)) |> mutate(Check = "Main result: 2005 to 2023"),
  run_test(oil_pct(2005, 2019)) |> mutate(Check = "End year 2019 (before COVID-19)"),
  run_test(oil_pct(2004:2006, 2021:2023)) |> mutate(Check = "3-year averages: 2004-06 to 2021-23"),
  run_test(oil_pct(2005, 2023, per_person = TRUE)) |> mutate(Check = "Per person, 2005 to 2023")
) |>
  transmute(Check,
            `Australia (%)` = sprintf("%+.1f", aus),
            `Peer mean (%)` = sprintf("%.1f", peer_mean),
            `t (df)` = paste0(sprintf("%.2f", t), " (", df, ")"),
            `p-value` = sprintf("%.3f", p),
            `Adjusted p-value` = sprintf("%.3f", p_adj))

# leave one peer out at a time
loo = map_dfr(setdiff(peers, "Australia"), ~ run_test(oil_pct(2005, 2023, drop = .x)))
rng = function(x, fmt) paste(sprintf(fmt, range(x)), collapse = " to ")
loo_row = tibble(Check = "Each peer left out in turn (range of 8 runs)",
                 `Australia (%)` = sprintf("%+.1f", loo$aus[1]),
                 `Peer mean (%)` = rng(loo$peer_mean, "%.1f"),
                 `t (df)` = paste0(rng(loo$t, "%.2f"), " (", loo$df[1], ")"),
                 `p-value` = rng(loo$p, "%.3f"),
                 `Adjusted p-value` = rng(loo$p_adj, "%.3f"))

bind_rows(checks, loo_row) |>
  knitr::kable(align = "lrrrrr", caption = "Table 6. Sensitivity of the oil result (Australia against the eight peers) to the end year, averaging, population and the peer set.")
Table 6. Sensitivity of the oil result (Australia against the eight peers) to the end year, averaging, population and the peer set.
Check Australia (%) Peer mean (%) t (df) p-value Adjusted p-value
Main result: 2005 to 2023 +21.5 -22.8 3.50 (7) 0.010 0.040
End year 2019 (before COVID-19) +23.1 -17.7 2.88 (7) 0.024 0.095
3-year averages: 2004-06 to 2021-23 +18.0 -22.4 3.34 (7) 0.012 0.050
Per person, 2005 to 2023 -6.8 -29.2 3.01 (7) 0.020 0.079
Each peer left out in turn (range of 8 runs) +21.5 -25.4 to -20.2 3.20 to 4.31 (6) 0.005 to 0.019 0.020 to 0.074

In every version Australia has the worst oil result of the nine and p is below 0.05 before adjustment, so the direction of the result does not depend on the end year, the averaging, the population adjustment or any single peer. The adjusted p-value is more fragile: it exceeds 0.05 for the 2019 end year (0.095), the per-person version (0.079) and five of the eight leave-one-out runs, so the evidence is suggestive, not conclusive.

Population. Australia’s population grew 30.3% from 2005 to 2023, the most of the nine (peer range −2.8% to +21.1%). Per person, its total fossil CO2 fell 23.9% against a peer mean fall of 28.7% (p = 0.81), so Australia does not lag overall once population is allowed for. Its oil CO2 per person fell 6.8%, against a peer mean fall of 29.2%.

Accounting basis. The main analysis counts CO2 where fuel is burned (territorial emissions), which leaves out CO2 embodied in traded goods (Davis & Caldeira, 2010) and CO2 from international aviation and shipping. The dataset also gives consumption-based emissions, which add the CO2 embodied in imports and remove that embodied in exports, but only for total CO2 and only to 2022. On that basis Australia’s 2005 to 2022 change is −1.5%, against a peer mean of −18.6% (SD 15.7), and it again ranks eighth of nine (territorial basis: −0.5% against −18.7%). The single-case t-test is not significant on the consumption basis (t = 1.03, p = 0.338), as for total CO2 in Table 5. Australia exports more embodied CO2 than it imports (net −45 Mt, or 11.8% of its territorial total, in 2022), as does Canada; the other seven peers are net importers. The lag in total is therefore not an artefact of territorial accounting. The dataset has no consumption-based split by fuel, so the oil result cannot be tested this way.

Target comparison on net emissions. Figure 4 applies the target’s cut to fossil CO2 only. The official measure is net emissions of all gases including the land sector: 607.7 Mt CO2-e in 2005 and 466.4 Mt in 2024 (Shu, 2026). A 62 to 70% cut from 2005 means 231 to 182 Mt. Removing 2023’s coal CO2 (143 Mt) from the 2024 total leaves about 324 Mt, so 93 to 141 Mt would still have to go, close to the 94 to 124 Mt in Figure 4, and a 52 Mt oil cut would cover 37 to 56% of it. The result is approximate, because it combines a 2024 total with 2023 coal data from a different source.

Sector evidence. The dataset has no sector split, so it cannot show which sector drives the rise in oil CO2. Transport is proposed as the starting point because inventory data put it at 100.4 Mt CO2-e in 2024, second only to electricity (151.7 Mt) and dominated by road fuels (Shu, 2026). The sector split of Australia’s 142 Mt of oil CO2 should be confirmed from the national inventory before measures are designed.