Code
library(tidyverse)library(tidyverse)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.
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.
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.
raw = read.csv("CO2.csv")
# keep countries only
owid = raw |> filter(iso_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.")| 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.
peers = c("Australia", "Canada", "France", "Germany", "Italy",
"Japan", "South Korea", "United Kingdom", "United States")
peer_data = owid |>
filter(country %in% peers, year >= 1990)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.
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.")| Check | Number found |
|---|---|
| Repeated country-years | 0 |
| Negative emissions | 0 |
| Missing values | 0 |
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).
# 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))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).")| 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 |
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).
# 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))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.
# 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"))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.
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")# 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)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.")| 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 |
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).")| 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 |
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))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).
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.
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.
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
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/
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.
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).
The oil comparison was repeated under different choices (Table 6).
# 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.")| 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.