Datos de centrales eléctricas en Alemania
Input
La base de datos elegida para este proyecto trata sobre las centrales eléctricas en Alemania para el año 2020. Esta base de datos incluye información sobre distintos tipos de recursos energéticos utilizados en dichas instalaciones. Estos datos han sido obtenidos de Open Power System Data (OPSD), la cual es una plataforma que recopila información energética de diversos países europeos con el objetivo de fomentar la transparencia y facilitar el análisis en el sector energético.
Esta base de datos proporciona detalles clave sobre cada central eléctrica, como su ubicación, su fuente de energía (renovable o no renovable), o la capacidad de generación de energía entre otros. Estos datos son fundamentales para analizar y evaluar la infraestructura energética de Alemania y su evolución.
·Nivel de agregación: País
·Última actualización: 2020-10-01
·Referencias: https://www.umweltbundesamt.de/dokument/datenbank-kraftwerke-in-deutschland
·Acceso URL: https://data.open-power-system-data.org/conventional_power_plants/2020-10-01
Estos datos están disponible para su descarga en formato CSV, XLSX, y SQLITE.
En este caso he escogido el formato CSV.
Descripción
Cargamos las librerías necesarias:
Leemos el conjunto de datos seleccionado:
centrales <- read.csv("data/000140/conventional_power_plants_DE.csv")
Observamos que tenemos un dataframe de 909 observaciones y 38 variables:
Debido a la gran cantidad de variables que tiene nuestra base de datos, solamente nos vamos a quedar con las de mayor importancia para nuestro estudio.
names(centrales)
[1] "id" "name_bnetza" "block_bnetza"
[4] "name_uba" "company" "street"
[7] "postcode" "city" "state"
[10] "country" "capacity_net_bnetza" "capacity_gross_uba"
[13] "energy_source" "technology" "chp"
[16] "chp_capacity_uba" "commissioned" "commissioned_original"
[19] "retrofit" "shutdown" "status"
[22] "type" "lat" "lon"
[25] "eic_code_plant" "eic_code_block" "efficiency_data"
[28] "efficiency_source" "efficiency_estimate" "energy_source_level_1"
[31] "energy_source_level_2" "energy_source_level_3" "eeg"
[34] "network_node" "voltage" "network_operator"
[37] "merge_comment" "comment"
Seleccionamos las siguientes:
centrales <- select(centrales, id, name_bnetza, company, city, capacity_net_bnetza, energy_source, lat, lon)
Seguidamente, vamos a transformar nuestro dataframe en un objeto sf para obtener la geometría de nuestras centrales eléctricas:
Ahora hacemos una visualización rápida de los datos utilizando leaflet:
leaflet(centrales_sf) %>%
addTiles() %>%
addCircleMarkers(
radius = 3, fillOpacity = 0.8)
Se detecta que hay varios puntos que se encuentran fuera de nuestro país, Alemania, por lo que habría que corregir este error delimitando el territorio. Además, contamos con varios tipos de fuentes de energía para las centrales eléctricas, por lo que sería conveniente poder diferenciarlas en el mapa para poder tener una mejor observación. Finalmente haremos un último check para revisar que no tengamos valores NA en las coordenadas.
Tratamiento
El primer error a corregir es la delimitación del territorio con el fin de que no tengamos ningún punto fuera del país. Para corregir este error voy a usar el paquete rnaturalearth con sus datos rnaturalearthdata.
# Sacamos el mapa del mundo en formato sf
mundo <- ne_countries(scale = "medium", returnclass = "sf")
# Del objeto del mundo obtenemos nuestro país, Alemania
alemania <- mundo[mundo$name == "Germany", ] %>% select(name, geometry)
# Verificamos que el CRS sea 4326
st_crs(alemania)
Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["latitude",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["longitude",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
Una vez obtenido el multipolígono que define las fronteras de Alemania y verificado que está en el sistema de coordenadas 4326, realizaremos una intersección entre nuestros datos y la geometría del país para filtrar únicamente las centrales eléctricas dentro de sus límites.
centrales_alemania <- st_intersection(centrales_sf, alemania)
dim(centrales_alemania)
[1] 873 10
Como podemos observar ahora tenemos menos observaciones que antes, por lo que hemos eliminado aquellas que no se encontraban en Alemania.
Ahora vamos a comprobar si nuestro nuevo objeto contiene valores NA en sus coordenadas, ya que de ser así estas observaciones deberían ser eliminadas.
No tenemos ningún valor NA, lo cual es una gran señal para nuestro proyecto.
Ahora para acabar con el tratamiento de los datos voy a realizar una mejora significativa en el gráfico, tanto añadiendo filtros de diferenciación entre las diferentes fuentes de energía, como añadiendo una leyenda para ayudar a entender el gráfico. Para ello, el primer paso es crear una paleta de colores con todos los tipos de fuentes de energía que tenemos:
unique(centrales_alemania$energy_source)
[1] "Biomass and biogas" "Hard coal" "Hydro"
[4] "Lignite" "Natural gas" "Nuclear"
[7] "Oil" "Other fuels" "Waste"
[10] "Other fossil fuels" "Mixed fossil fuels"
colores_manual <- c(
"Natural gas" = "#A6D8E7",
"Oil" = "#000000",
"Biomass and biogas" = "#2E8B57",
"Hydro" = "#1E90FF",
"Nuclear" = "#FFD700",
"Non-renewable waste" = "#8B4513",
"Mixed fossil fuels" = "#808080",
"Hard coal" = "#36454F",
"Other or unspecified energy sources" = "#800080",
"Lignite" = "#CD853F",
"Bioenergy" = "#90EE90",
"Other fossil fuels" = "#FF8C00",
"Other fuels" = "#F5F5DC",
"Waste" = "#A9A9A9"
)
A continuación voy a eliminar los posibles espacios que pueda haber en la variable energy_source, y filtrar los valores no definidos en la paleta:
Y para acabar con los colores voy a mapearlos según los valores de energy_source, y voy a crear una columna con los colores asignados a cada fuente de energía.
Para finalizar con el tratamiento de la base de datos voy a crear un control de capas interactivo en el que vamos a poder elegir qué fuentes de energía observar y si poder ver o no la leyenda. Para ello voy a crear una lista que almacene los datos de cada tipo de energía, e iremos agregando los mapas según vayamos avanzando:
# Creamos la lista que almacena los datos de cada tipo de energía
lista_energia <- list()
tipos_energia <- unique(centrales_alemania$energy_source)
for (i in seq_along(tipos_energia)) {
lista_energia[[i]] <- centrales_alemania %>% filter(energy_source == tipos_energia[i])
}
names(lista_energia) <- tipos_energia
# Ahora hacemos el mapa base con el multipolígono de Alemania
map <- leaflet() %>%
addTiles() %>%
addPolygons(
data = alemania,
fillColor = NA,
color = "#000000",
weight = 1,
smoothFactor = 0.5,
opacity = 1,
fillOpacity = 0
)
# Agregamos los marcadores para cada tipo de energía
for (i in seq_along(lista_energia)) {
map <- map %>%
addCircleMarkers(
data = lista_energia[[i]],
color = colores_manual[[tipos_energia[i]]],
radius = 3, fillOpacity = 0.8,
popup = ~paste("<b>Nombre:</b>", name_bnetza,
"<br><b>Empresa:</b>", company,
"<br><b>Ciudad:</b>", city,
"<br><b>Capacidad:</b>", capacity_net_bnetza, "MW",
"<br><b>Fuente de energía:</b>", energy_source),
group = tipos_energia[i] # Agrupamos por tipo de energía
)
}
# Añadimos la leyenda independientemente
map <- map %>%
addLegend(
position = "bottomright",
colors = unname(colores_manual),
labels = names(colores_manual),
title = "Fuentes de Energía",
opacity = 1,
group = "Leyenda"
)
# Creamos el control de capas interactivo junto con la leyenda
grupos <- c(tipos_energia, "Leyenda")
map2 <- map %>%
addLayersControl(
overlayGroups = grupos,
options = layersControlOptions(collapsed = TRUE),
position = "bottomleft"
)
Output
Hemos obtenido el siguiente gráfico:
map2
Ahora en este gráfico ya vemos delimitada la zona de Alemania y podemos diferenciar claramente los distintos tipos de fuente de energía. Además, clickando en los puntos podemos obtener información sobre esa central eléctrica.
Este mapa sale del objeto centrales_alemania, el cual es el objeto final resultante del tratamiento de los datos realizados en el proyecto. Este objeto es un objeto sf con 873 observaciones y 11 variables.
Para finalizar este proyecto, voy a guardar nuestro objeto final para el uso público de este mismo:
sf::st_write(centrales_alemania, "centrales_alemania.gpkg")
Writing layer `centrales_alemania' to data source
`centrales_alemania.gpkg' using driver `GPKG'
Writing 873 features with 10 fields and geometry type Point.
El fichero generados con este procedimiento/técnica/metodología se puede descargar en formato GPKG de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394