Aceasta este o altă postare scurtă și simplă pe blog, care construiește o diagramă pe care o voi actualiza în mod regulat, ca parte a monitorizării impactului crizei de combustibil cu ardere lentă cauzată de războiul SUA cu Iranul.
Am o pagină pe acest site cu câteva diagrame despre criza combustibilului.
Prețurile benzinei (sau benzinei) și motorinei
Iată noul grafic de astăzi.
Pentru cei interesați, iată câteva dintre caracteristicile cheie pe care le-am gândit și sunt în mod deliberat parte din lustruirea aici
- Atât Noua Zeelandă, cât și prețurile din SUA pe aceeași bază pentru comparabilitate directă (și pentru a șoca americanii cu cât plătește restul lumii pentru benzină).
- Maparea culorii la țară și utilizarea fațetelor pentru tipul de combustibil, mai degrabă decât invers; Procedând astfel, este mai ușor să comparați țară cu țară (mai degrabă decât combustibil cu combustibil, ceea ce mi s-a părut mai puțin interesant).
- Folosirea culorii în titlu (mulțumită lui
ggtextde Claus O. Wilke și Brenton M. Wiernik) mai degrabă decât o legendă sau o etichetare directă a liniilor — tehnică foarte puternică de reducere a dezordinei în acest context, cred. - Adnotări, cu caractere cursive gri alese cu grijă, pentru a indica evenimentele/perioadele de interes cheie și pentru a răspunde la întrebările evidente pe care oricine se uită la diagramă (inclusiv eu, în această dimineață), de exemplu, „ce s-a întâmplat în XXX?”
- Culori pentru țările alese pentru a-și sugera steaguri.
- Asigurați-vă că publicul înțelege situația particulară a taxelor pentru motorină în Noua Zeelandă (vehiculele diesel și electrice plătesc o taxă de utilizare a drumului pe distanța parcursă, nu combustibilul consumat, care nu este inclus în aceste prețuri).
- M-am gândit și, în cele din urmă, am decis să nu forțesc scara axei verticale să coboare la zero. Încă puțin nesigur despre acesta, văd avantaje și dezavantaje ale ambelor opțiuni.
Am, de asemenea, o versiune mărită a diagramei care privește doar 2026. Acest lucru este de fapt destul de puțin interesant. Îmi place marea evoluție a ultimilor douăzeci de ani prezentată în graficul principal și modul în care putem lega modificările prețurilor de evenimente majore.
Surse de date și cod
Deci nu este nimic deosebit de complex în cod. Aveam nevoie de trei surse de date:
- Prețurile combustibililor din Noua Zeelandă, furnizate de Ministerul Afacerilor, Inovării și Ocupării Forței de Muncă
- Prețurile combustibililor din SUA sunt furnizate de Energy Information Administration
- Cursul de schimb NZD / USD, pe care l-am luat de la FRED, serviciul de date din St Louis Federal Reserve.
Erau alegeri de făcut în legătură cu exact ce serii să se potrivească și să se prezinte, dar nu prea dificil și cred că am ales corect.
Există, de asemenea, un pic de joc pentru a nu descărca fișierele de date de fiecare dată când scriptul este rulat, dar numai atunci când datele sunt într-o oarecare măsură învechite. Serii de prețuri sunt săptămânale, așa că nu are rost să loviți serverul furnizorului pentru încă o copie a fișierului când ultima observație publicată a fost acum șase zile sau mai puțin.
library(tidyverse)
library(janitor)
library(readxl)
library(patchwork)
library(ggtext)
#---------------New Zealand----------------------
# Download petrol prices from MBIE. Not sure how to determine if it is 'stale'
# or not, seems to get 10 days out of date at least.
download.file(
"https://www.mbie.govt.nz/assets/Data-Files/Energy/Weekly-fuel-price-monitoring/weekly-table.csv",
destfile = "nz-petrol-prices.csv"
)
# For some reason this crashes R
# nz <- read_csv("nz-petrol-prices.csv")
# so need to use read.csv instead
# The exchange rate file is a bit slow to donwload so only want to download it
# if necessary ie latest value is more than 10 days old
stale_fx <- TRUE
if (file.exists("nzd_usd.csv")) {
nzd_usd <- read_csv("nzd_usd.csv")
if (as.numeric(Sys.Date() - max(nzd_usd$observation_date)) < 10) {
stale_fx <- FALSE
}
}
if (stale_fx) {
download.file(
"https://fred.stlouisfed.org/graph/fredgraph.csv?id=DEXUSNZ",
destfile = "nzd_usd.csv"
)
nzd_usd <- read_csv("nzd_usd.csv")
}
nz <- read.csv("nz-petrol-prices.csv") |>
as_tibble() |>
clean_names() |>
mutate(date = as.Date(date)) |>
filter(variable == "Adjusted retail price") |>
left_join(nzd_usd, by = c("date" = "observation_date")) |>
arrange(date) |>
fill(DEXUSNZ, .direction = "down") |>
mutate(value_usd_gallon = value * DEXUSNZ * 3.78541 / 100) |>
mutate(fuel = ifelse(fuel == "Premium Petrol 95R", "Premium Petrol", fuel)) |>
select(date, fuel, value_usd_gallon) |>
mutate(country = "New Zealand")
# Adjusted retail price is
# "The national average price paid by consumers for a given fuel for the week. "
# note, different from "Board price" which is the advertised rate Decided the
# Adjusted retail price (i.e. what actually paid) was most comparable to the USA
# series in the next section.
#------------------USA---------------------
# See https://www.eia.gov/dnav/pet/pet_pri_gnd_dcus_nus_w.htm
stale_usa <- TRUE
if (file.exists("usa-petrol-prices.xls")) {
tmp <- read_excel("usa-petrol-prices.xls", sheet = "Data 1", skip = 2)
if (as.numeric(Sys.Date() - max(as.Date(tmp$Date))) < 7) {
stale_usa <- FALSE
}
}
if (stale_usa) {
download.file(
"https://www.eia.gov/dnav/pet/xls/PET_PRI_GND_DCUS_NUS_W.xls",
destfile = "usa-petrol-prices.xls",
mode = "wb"
)
}
usa <- read_excel("usa-petrol-prices.xls", sheet = "Data 1", skip = 2) |>
mutate(Date = as.Date(Date)) |>
select(
date = Date,
`Regular Petrol` = `Weekly U.S. Regular All Formulations Retail Gasoline Prices (Dollars per Gallon)`,
`Premium Petrol` = `Weekly U.S. Premium All Formulations Retail Gasoline Prices (Dollars per Gallon)`,
Diesel = `Weekly U.S. No 2 Diesel Ultra Low Sulfur (0-15 ppm) Retail Prices (Dollars per Gallon)`
) |>
gather(fuel, value_usd_gallon, -date) |>
mutate(country = "USA")
#------------combine the two----------------
combined_petrol <- usa |>
rbind(nz) |>
filter(date >= min(nz$date)) |>
filter(fuel != "Premium Petrol") |>
mutate(fuel = fct_relevel(fuel, "Regular Petrol"))
#-----------------plot drawing---------------
annotations <- tibble(
date = as.Date(c(
"2008-01-01",
"2013-01-01",
"2016-10-01",
"2022-06-01",
"2026-02-01"
)),
value_usd_gallon = 8.5,
fuel = "Regular Petrol",
country = "USA",
label = c(
"Buildup to GlobalnFinancial Crisis",
"'$100 oil plateau'",
"US shale comes online",
"Russia invades Ukraine",
"USA attacks Iran"
)
) |>
mutate(fuel = factor(fuel, levels = levels(combined_petrol$fuel)))
# Base definition of chart, used in both versions:
p0 <- combined_petrol |>
ggplot(aes(x = date, y = value_usd_gallon, colour = country)) +
facet_wrap(~fuel, ncol = 1) +
geom_line(linewidth = 0.7) +
scale_y_continuous(label = dollar) +
scale_colour_manual(values = c("New Zealand" = "blue", "USA" = "red")) +
labs(
x = "",
colour = "",
y = "Price (USD per gallon)",
title = "Retail petrol and diesel prices 2004-2026, **New Zealand** vs **USA**, (USD/gallon).",
subtitle = "New Zealand prices include petrol excise, GST and other taxes but exclude diesel fuel excise.",
caption = "Source: New Zealand MBIE, USA EIA"
) +
theme(legend.position = "none", plot.title = element_markdown())
# Main chart:
p1 <- p0 +
geom_text(
data = annotations,
aes(label = label),
colour = "grey40",
vjust = 1,
size = 2.9,
fontface = "italic"
)
# Zoomed in on 2026:
p2 <- p0 +
filter(combined_petrol, date >= "2026-01-01") +
geom_point() +
labs(
title = "Retail petrol and diesel prices 2026, **New Zealand** vs **USA**, (USD/gallon)."
) +
scale_x_date(
date_breaks = "1 month",
date_labels = "%B"
)
print(p1)
print(p2)
Asta e tot pentru azi.





