- A pergunta
- Por que um índice — e não centavos por kWh
- Fontes de dados
- A bridge metodológica pré-1996
- Marcadores históricos
- Código: leitura e merge dos dados
- Código: gráfico
- Como reproduzir
- Limitações e ressalvas
- Pontos frágeis desta demonstração
1. A pergunta
Como o preço residencial real da eletricidade no Reino Unido se comportou desde a privatização de 1990, e como esse comportamento se relaciona com a penetração crescente de solar e eólica na matriz? Privatização, mecanismos de subsídio (RO, CfD), saída do carvão, choque do gás de 2022 — todos os grandes pontos da história entram no mesmo gráfico, contra a curva de quanto da geração é solar mais eólica.
2. Por que um índice — e não centavos por kWh
Os outros dois plots desta série (Califórnia e Alemanha) trazem o eixo vertical em ct/kWh real — preço nominal de fato cobrado da residência, deflacionado pelo CPI do país. Para o Reino Unido a unidade é diferente: componente eletricidade do CPI da ONS, em termos reais, base 2010=100. Não é dinheiro — é número-índice.
A escolha foi deliberada. O Reino Unido publica, via DESNZ, uma tabela chamada "Historical electricity data since 1920" que reúne o sub-índice de eletricidade do CPI já em termos reais — a deflação está feita por dentro pela própria ONS. É a série mais longa, mais limpa e mais consistente metodologicamente que existe para o país. A alternativa seria juntar várias tabelas de pence/kWh nominais (Tables 211, 214, 221, 224, 231, 234) ao longo de quebras de metodologia entre Ofgem, BEIS e DESNZ, depois deflacionar manualmente — esforço grande para um resultado pior.
O leitor deve ler o eixo Y como "o quanto a residência britânica gasta com eletricidade hoje, em poder de compra constante, comparado com 2010". Conceitualmente é a mesma coisa que o ct/kWh real dos outros plots — só está apresentado em outra unidade.
3. Fontes de dados
Os arquivos consumidos pelo script estão em Energy/Costs/data/:
uk_electricity_cpi_real.csv— preço real, formato (year, cpi_electricity_real_2010_100)owid_share_solar.csv— share solar para todos os países (filtrado para "United Kingdom")owid_share_wind.csv— share eólico, idem
4. A bridge metodológica pré-1996
Há um degrau visível na série entre 1995 e 1996. Ele não é um movimento de preço — é a transição da ONS entre o método antigo de construção do CPI e o método mais moderno alinhado ao HICP europeu. O índice antes e depois da transição não é estritamente comparável: a base, os itens da cesta e a forma de agregar mudaram.
No gráfico, o segmento pré-1996 aparece em linha tracejada com marcadores ocos e o intervalo é sombreado em cinza claro. É uma marcação visual para o leitor: a continuidade aparente é visual, não estatística. As inferências sobre tendência devem partir de 1996 em diante.
5. Marcadores históricos
Quatro eventos ancoram a leitura política do gráfico. Cada um aparece como linha vertical fina, com legenda em itálico ao lado.
| Ano | Marcador | O que foi |
|---|---|---|
| 1990 | Privatisation | Electricity Act de 1989 — separação de geração, transmissão, distribuição e venda; criação do pool e dos primeiros agentes privados. |
| 2002 | RO scheme | Renewables Obligation — fornecedores obrigados a comprar uma fração crescente de eletricidade renovável certificada (ROCs). |
| 2013 | EMR / CfD | Electricity Market Reform introduz Contracts for Difference — Estado garante preço fixo a usinas renováveis (e a Hinkley Point C). |
| 2022 | Gas crisis | Choque do gás natural após a invasão da Ucrânia — preço de atacado explode e atinge a tarifa residencial via price cap da Ofgem. |
6. Código: leitura e merge dos dados
Script completo em Energy/Costs/scripts/build_uk_price.py. Trecho essencial:
from pathlib import Path
import pandas as pd
HERE = Path(__file__).parent
ROOT = HERE.parent
DATA = ROOT / "data"
def load() -> pd.DataFrame:
price = pd.read_csv(DATA / "uk_electricity_cpi_real.csv")
solar = pd.read_csv(DATA / "owid_share_solar.csv")
solar = solar[solar["Entity"] == "United Kingdom"].rename(
columns={"Year": "year", "Solar": "solar_pct"}
)[["year", "solar_pct"]]
wind = pd.read_csv(DATA / "owid_share_wind.csv")
wind = wind[wind["Entity"] == "United Kingdom"].rename(
columns={"Year": "year", "Wind": "wind_pct"}
)[["year", "wind_pct"]]
df = price.merge(solar, on="year", how="left").merge(wind, on="year", how="left")
df["solar_pct"] = df["solar_pct"].fillna(0)
df["wind_pct"] = df["wind_pct"].fillna(0)
return dfO how="left" preserva todos os anos do índice DESNZ. Para anos antes da existência de geração solar/eólica relevante, o fillna(0) substitui o NaN — não havia geração mensurável, então zero é a leitura correta.
7. Código: gráfico
import matplotlib.pyplot as plt
PLOTS = ROOT / "plots"
STYLE = ROOT.parent.parent / "vintage.mplstyle"
def save_plot(df: pd.DataFrame) -> None:
plt.style.use(str(STYLE))
fig, ax1 = plt.subplots(figsize=(10, 6))
pre = df[df["year"] < 1996]
post = df[df["year"] >= 1996]
bridge = df[(df["year"] >= 1995) & (df["year"] <= 1996)]
# Pos-1996: linha solida, marcadores cheios
l_price, = ax1.plot(post["year"], post["cpi_electricity_real_2010_100"],
linestyle="-", linewidth=1.6, color="black",
marker="o", markersize=3.5,
label="Price index (real, 2010=100)")
# Pre-1996: linha tracejada, marcadores ocos
ax1.plot(pre["year"], pre["cpi_electricity_real_2010_100"],
linestyle="--", linewidth=1.0, color="black",
marker="o", markersize=3.0, markerfacecolor="white")
# Bridge 1995-1996: tracejado conector
ax1.plot(bridge["year"], bridge["cpi_electricity_real_2010_100"],
linestyle="--", linewidth=1.0, color="black")
ax1.set_ylabel("Electricity CPI component (real, 2010=100)")
ax1.set_xlabel("Year")
ax1.set_ylim(60, 220)
ax2 = ax1.twinx()
l_solar, = ax2.plot(df["year"], df["solar_pct"],
linestyle="--", linewidth=1.2, color="black",
label="Solar share of generation")
l_wind, = ax2.plot(df["year"], df["wind_pct"],
linestyle=":", linewidth=1.4, color="black",
label="Wind share of generation")
ax2.set_ylabel("Share of electricity generation (%)")
ax2.set_ylim(bottom=0)
ax2.spines["right"].set_visible(True)
# Sombreamento do periodo pre-bridge
ax1.axvspan(1990, 1996, color="black", alpha=0.04, zorder=0)
ax1.text(1993, 62, "CPI methodology bridge (pre-1996)",
fontsize=7.5, ha="center", va="bottom",
style="italic", alpha=0.7)
markers = [
(1990, "Privatisation (1990)", 155),
(2002, "RO scheme (2002)", 213),
(2013, "EMR / CfD (2013)", 213),
(2022, "Gas crisis (2022)", 213),
]
for year, label, y in markers:
ax1.axvline(year, color="black", linewidth=0.5,
linestyle="-", alpha=0.4)
ax1.text(year, y, f" {label}",
fontsize=8, va="top", ha="left", style="italic")
ax1.legend([l_price, l_solar, l_wind],
[l.get_label() for l in (l_price, l_solar, l_wind)],
loc="upper left", bbox_to_anchor=(0.0, 1.0),
frameon=False, fontsize=9)
ax1.set_title(
"United Kingdom — real residential electricity price vs renewable share",
loc="left", fontweight="bold"
)
fig.savefig(PLOTS / "uk_price_vs_renewables.png",
dpi=300, bbox_inches="tight")
plt.close(fig)
8. Como reproduzir
# Pre-requisitos
pip install pandas matplotlib
# Estrutura esperada
Plotter/
+-- vintage.mplstyle
+-- Energy/
+-- Costs/
+-- scripts/
| +-- build_uk_price.py
+-- data/
| +-- uk_electricity_cpi_real.csv
| +-- owid_share_solar.csv
| +-- owid_share_wind.csv
+-- plots/
# Executar
cd Plotter/Energy/Costs
python scripts/build_uk_price.py
# Saidas geradas:
# data/uk_electricity_real_prices.csv (consolidado)
# plots/uk_price_vs_renewables.png9. Limitações e ressalvas
- Índice, não preço. O eixo Y compara o poder de compra exigido pela conta de luz, não centavos por kWh. Para conversões em valor absoluto, é preciso ancorar o índice em uma tarifa de um ano específico — escolha que envolve decidir se a tarifa é com ou sem standing charge, com ou sem desconto sazonal etc.
- Apenas residencial. O CPI-eletricidade da ONS reflete a cesta do consumidor doméstico. A indústria britânica paga preços bem distintos, com grandes consumidores tendo contratos bilaterais que escapam do CPI.
- Geração ≠ consumo. O eixo direito mostra share de geração interna do Reino Unido. O país importa eletricidade da França e dos Países Baixos via interconectores; a participação solar+eólica da eletricidade efetivamente consumida na ilha é ligeiramente diferente.
- Solar britânica é pequena por motivos físicos. Latitude alta + nebulosidade dão a fazendas solares no Reino Unido fatores de capacidade da ordem de 10-12% (contra 22-25% na Espanha, 27-30% no Texas). A baixa participação solar no gráfico não é falta de subsídio — é geografia.
10. Pontos frágeis desta demonstração
Três pontos da metodologia merecem ser explicitados antes de tomar o gráfico como veredito.
10.1 A bridge pré-1996 é uma fronteira de dados, não de preço
O degrau entre 1995 e 1996 não corresponde a nada que tenha acontecido no mercado britânico — é a ONS trocando o método de construção do CPI. Conclusões sobre tendência devem começar em 1996. O segmento anterior está plotado em tracejado com marcadores ocos exatamente para alertar visualmente o leitor.
10.2 Privatização de 1990 reorganizou a cadeia de preço
Em 1990 o Reino Unido desmontou a CEGB e dividiu a cadeia em geração, transmissão, distribuição e suprimento — quatro mercados distintos com regras próprias. O preço residencial pré-1990 vinha de uma estatal verticalmente integrada; o preço pós-1990 emerge de um pool atacadista, contratos bilaterais e margens regulamentadas. Comparar o ponto de 1990 com o de 1995 é tecnicamente possível, mas o leitor está comparando duas máquinas diferentes — apenas o sub-índice CPI as torna numericamente comparáveis, não a estrutura econômica subjacente.
10.3 O price cap da Ofgem distorce o pico de 2022
Desde 2019 a Ofgem impõe um teto trimestral à tarifa residencial padrão variável. Em 2022 o teto foi rasgado de fato: o governo britânico passou a subsidiar diretamente a diferença entre o preço de atacado (explosivo, por causa do gás) e o que a residência vê na fatura (Energy Price Guarantee, outubro de 2022). Ou seja, o pico de 2022 no gráfico é o que chegou ao consumidor depois do amortecedor estatal — sem o EPG, o índice teria subido bem mais. Em 2023 o subsídio foi sendo retirado, e a queda visível da série tem componente de remoção de proteção, não só de queda de preço de atacado.