Atomkraftwerke in Europa

By Philipp Leppert in R Kartierung Webscraping

September 8, 2021

Benötigte R-Pakete:

library(tidyverse)
library(ggmap)
library(gganimate)
library(rvest)

Datenbeschaffung

Die Internationale Atomenergie-Organisation (IAEA) unterhält auf ihrer Webseite eine Datenbank, in der sich detallierte Angaben zu allen Atomreaktoren weltweit befinden - das Power Reactor Information System (PRIS). Auf GitHub habe ich einen Auszug aus dieser Datenbank (Stand 21.06.2021) gefunden, den ich für die Auswertungen in diesem Artikel verwende. Die Daten befinden sich im .CSV Format und müssen nur in R eingelesen werden.

Der Datenbestand umfasst allerdings nur allgemeine Angaben zu den Reaktoren und ich möchte diese um die ins Netz eingespeiste Energiemenge erweitern. Diese Angaben findet man ebenfalls für jeden Reaktor im PRIS unter der Rubrik Operating History, welche jährlich vom Betreiber gepflegt wird (sofern dieser Daten an die IAEA übermittelt). Mittels Webscraping extrahiere ich dabei die Spalte Electricity Supplied [GW.h] von jedem Reaktor. Jeder Reaktor besitzt in der Datenbank eine ID, welche auch auf der Webseite verwendet wird. Unten findet man den Code für die Extraktion der Daten. Die Liste der relevanten Reaktor-IDs ergibt sich aus dem ersten Datenbestand von GitHub. Ich verwende die Funktion tryCatch() um mögliche Fehlermeldungen zu überspringen, falls eine Reaktor-ID nicht mehr auf der Webseite verfügbar ist.

scraper_pris <- function(url){
  
  # Vectors
  reactor_name <- vector(mode = "character")
  year <- vector(mode = "double")
  electricity <- vector(mode = "double")
  
  # Name
  tryCatch(
    reactor_name <-
      url %>%
      read_html() %>%
      html_nodes("#MainContent_MainContent_lblReactorName") %>%
      html_text(),
    error = function(e){NA})  
    
  # Year
  tryCatch(
    year <- 
      url %>%
      read_html() %>%
      html_nodes(".active td:nth-child(1)") %>%
      html_text() %>%
      str_replace_all("\r\n","") %>%
      str_trim() %>%
      as.numeric(),
    error = function(e){NA})  
    
  # Electricity supplied
  tryCatch(
    electricity <- 
      url %>%
      read_html() %>%
      html_nodes(".active td:nth-child(2)") %>%
      html_text() %>%
      str_replace_all("\r\n","") %>%
      str_trim() %>%
      as.numeric(),
    error = function(e){NA}) 
    
  # Data
    scraped_data <- tibble(
      reactor_name, year, electricity
    )

  return(scraped_data)
}

Datenaufbereitung

Im Datenbankauszug mit den allgemeinen Reaktorangaben gibt es 3 .CSV Dateien, die Schlüsseltabellen für die Länderkürzel, den Reaktorstatus sowie den Reaktortyp enthalten.

data_countries <-
  read_delim(
    file = "data/1-countries.csv", 
    delim = ","
    ) %>%
  rename("CountryCode" = Code, "CountryName" = Name)

data_status <- 
  read_delim(
    file = "data/2-nuclear_power_plant_status_type.csv", 
    delim = ","
    ) %>%
  rename("StatusId" = Id, "StatusType" = Type)

data_reactors <- 
  read_delim(
    file = "data/3-nuclear_reactor_type.csv", 
    delim = ","
    ) %>%
  rename("ReactorTypeId" = Id, "ReactorType" = Type)

Die 4. .CSV Datei enthält die Grunddaten für die einzelnen Atomreaktoren. Jede Zeile dieses Datensatzes repräsentiert einen Reaktor. Am Standort eines Atomkraftwerks kann es mehrere Reaktoren geben. Die Grunddaten der Reaktoren verknüpfe ich mit den drei zuvor eingelesenen Schlüsseltabellen.

data_raw <- 
  read_delim(
    file = "data/4-nuclear_power_plants.csv", 
    delim = ",")

data_wide <-  
  data_raw %>%
  left_join(data_status,  by = "StatusId") %>%
  left_join(data_reactors,  by = "ReactorTypeId") %>%
  left_join(data_countries,  by = "CountryCode") %>%
  select(-c(StatusId, ReactorTypeId, Id)) 

Die Daten sehen so aus:


Name Latitude Longitude CountryCode ReactorModel ConstructionStartAt OperationalFrom OperationalTo Capacity Source LastUpdatedAt IAEAId StatusType ReactorType Description CountryName
Ågesta 59.20600 18.08290 SE NA 1957-12-01 1964-05-01 1974-06-02 9 WNA/IAEA 2015-05-24 01:51:37 528 Shutdown PHWR Pressurized Heavy Water Reactor Sweden
Akademik Lomonosov-1 69.70958 170.30625 RU KLT-40S 'Floating' 2007-04-15 2020-05-22 NA 30 WNA/IAEA/Google Maps 2021-05-31 00:00:00 895 Operational PWR Pressurized Water Reactor Russia
Akademik Lomonosov-2 69.70958 170.30625 RU KLT-40S 'Floating' 2007-04-15 2020-05-22 NA 30 WNA/IAEA/Google Maps 2021-05-31 00:00:00 896 Operational PWR Pressurized Water Reactor Russia
Akhvaz-1 NA NA IR NA NA NA NA NA WNA NA NA Planned NA NA Iran
Akhvaz-2 NA NA IR NA NA NA NA NA WNA NA NA Planned NA NA Iran
Akkuyu-1 36.14444 33.54111 TR VVER V-509 2018-04-03 NA NA 1114 WNA/Wikipedia/IAEA 2018-06-30 22:21:08 553 Under Construction PWR Pressurized Water Reactor Turkey
Akkuyu-2 36.14444 33.54111 TR VVER V-509 2020-04-08 NA NA 1114 Wikipedia/IAEA 2020-08-30 22:39:56 1080 Under Construction PWR Pressurized Water Reactor Turkey
Akkuyu-3 36.14444 33.54111 TR VVER V-509 2021-03-10 NA NA 1114 Wikipedia/IAEA 2021-04-19 23:47:37 1081 Under Construction PWR Pressurized Water Reactor Turkey
Akkuyu-4 36.14444 33.54111 TR NA NA NA NA NA Wikipedia NA NA Planned PWR Pressurized Water Reactor Turkey
Aktau (Shevchenko) 43.60700 51.28300 KZ BN-350 1964-10-01 NA 1999-04-22 52 WNA/IAEA 2021-04-19 23:47:37 414 Shutdown FBR Fast Breeder Reactor Kazakhstan
Almaraz-1 39.80700 -5.69800 ES WH 3LP 1973-07-03 1983-09-01 NA 900 WNA/IAEA 2017-02-10 21:56:15 153 Operational PWR Pressurized Water Reactor Spain
Almaraz-2 39.80700 -5.69800 ES WH 3LP 1973-07-03 1984-07-01 NA 900 WNA/IAEA 2019-06-02 17:17:55 154 Operational PWR Pressurized Water Reactor Spain
Angra-1 -23.00800 -44.45700 BR WH 2LP 1971-05-01 1985-01-01 NA 609 WNA/IAEA 2021-02-14 01:47:53 24 Operational PWR Pressurized Water Reactor Brazil
Angra-2 -23.00800 -44.45700 BR PRE KONVOI 1976-01-01 2001-02-01 NA 1245 WNA/IAEA 2015-05-24 01:50:19 25 Operational PWR Pressurized Water Reactor Brazil
Angra-3 -23.01000 -44.47000 BR PRE KONVOI 2010-06-01 NA NA 1340 WNA/IAEA 2018-06-30 22:21:29 26 Under Construction PWR Pressurized Water Reactor Brazil
APS-1 Obninsk 55.08400 36.57000 RU AM-1 1951-01-01 1954-12-01 2002-04-29 5 WNA/IAEA 2015-05-24 01:51:32 447 Shutdown LWGR Light Water Graphite Reactor Russia
Arkansas Nuclear One-1 (ANO-1) 35.31000 -93.23000 US B&W LLP (DRYAMB) 1968-10-01 1974-12-19 NA 850 WNA/IAEA 2017-02-10 21:58:30 652 Operational PWR Pressurized Water Reactor United States
Arkansas Nuclear One-2 (ANO-2) 35.31000 -93.22900 US CE 2LP (DRYAMB) 1968-12-06 1980-03-26 NA 912 WNA/IAEA 2017-02-10 21:58:53 689 Operational PWR Pressurized Water Reactor United States
Armenian-1 40.18200 44.14700 AM VVER V-270 1969-07-01 1977-10-06 1989-02-25 376 WNA/IAEA 2021-06-07 00:00:00 1 Shutdown PWR Pressurized Water Reactor Armenia
Armenian-2 40.18200 44.14700 AM VVER V-270 1975-07-01 1980-05-03 NA 375 WNA/IAEA 2021-06-28 21:12:17 2 Operational PWR Pressurized Water Reactor Armenia
Armenian-3 40.18080 44.14720 AM NA NA NA NA NA WNA 2021-06-07 00:00:00 NA Planned PWR Pressurized Water Reactor Armenia
Asco-1 41.20200 0.57100 ES WH 3LP 1974-05-16 1984-12-10 NA 995 WNA/IAEA 2021-01-05 23:19:47 155 Operational PWR Pressurized Water Reactor Spain
Asco-2 41.20200 0.57100 ES WH 3LP 1975-03-07 1986-03-31 NA 997 WNA/IAEA 2021-04-19 23:47:37 156 Operational PWR Pressurized Water Reactor Spain
Atucha-1 -33.96700 -59.20900 AR PHWR KWU 1968-06-01 1974-06-24 NA 340 WNA/IAEA 2021-02-14 01:47:53 3 Operational PHWR Pressurized Heavy Water Reactor Argentina
Atucha-2 -33.96700 -59.20900 AR PHWR KWU 1981-07-14 2016-05-26 NA 692 WNA/IAEA 2017-09-25 00:19:13 5 Operational PHWR Pressurized Heavy Water Reactor Argentina
Balakovo-1 52.09200 47.95200 RU VVER V-320 1980-12-01 1986-05-23 NA 950 WNA/IAEA 2015-05-24 01:51:36 524 Operational PWR Pressurized Water Reactor Russia
Balakovo-2 52.09200 47.95200 RU VVER V-320 1981-08-01 1988-01-18 NA 950 WNA/IAEA 2015-05-24 01:51:36 525 Operational PWR Pressurized Water Reactor Russia
Balakovo-3 52.09200 47.95200 RU VVER V-320 1982-11-01 1989-04-08 NA 950 WNA/IAEA 2015-05-24 01:51:36 526 Operational PWR Pressurized Water Reactor Russia
Balakovo-4 52.09200 47.95200 RU VVER V-320 1984-04-01 1993-12-22 NA 950 WNA/IAEA 2015-05-24 01:51:36 527 Operational PWR Pressurized Water Reactor Russia
Baltic-1 54.93900 22.16200 RU VVER V-491 2012-02-22 NA NA 1109 WNA/IAEA 2015-05-24 01:51:57 968 Under Construction PWR Pressurized Water Reactor Russia
Barakah-1 (Braka) 23.95275 52.19330 AE APR-1400 2012-07-19 2021-04-01 NA 1345 WNA/IAEA 2021-05-30 14:38:32 1050 Operational PWR Pressurized Water Reactor United Arab Emirates
Barakah-2 (Braka) 23.95275 52.19330 AE APR-1400 2013-04-16 NA NA 1345 WNA/IAEA 2015-12-27 15:05:52 1051 Under Construction PWR Pressurized Water Reactor United Arab Emirates
Barakah-3 (Braka) 23.95275 52.20330 AE APR-1400 2014-09-24 NA NA 1345 WNA/IAEA 2015-05-24 01:51:58 1052 Under Construction PWR Pressurized Water Reactor United Arab Emirates
Chutka-1 NA NA IN NA NA NA NA NA WNA 2021-06-07 00:00:00 NA Planned PHWR Pressurized Heavy Water Reactor India
Chutka-2 NA NA IN NA NA NA NA NA WNA 2021-06-07 00:00:00 NA Planned PHWR Pressurized Heavy Water Reactor India
Barseback-1 55.74500 12.92600 SE AA-II 1971-02-01 1975-07-01 1999-11-30 570 WNA/IAEA 2018-03-10 12:52:00 538 Shutdown BWR Boiling Water Reactor Sweden
Barseback-2 55.74500 12.92600 SE AA-II 1973-01-01 1977-07-01 2005-05-31 570 WNA/IAEA 2018-03-10 12:52:02 540 Shutdown BWR Boiling Water Reactor Sweden
Beaver Valley-1 40.62400 -80.43200 US WH 3LP (DRYSUB) 1970-06-26 1976-10-01 NA 835 WNA/IAEA 2017-02-10 21:58:44 669 Operational PWR Pressurized Water Reactor United States
Beaver Valley-2 40.62400 -80.43200 US WH 3LP (DRYSUB) 1974-05-03 1987-11-17 NA 836 WNA/IAEA 2017-02-10 21:58:59 712 Operational PWR Pressurized Water Reactor United States
Belarusian-1 54.76667 26.11667 BY VVER V-491 2013-11-08 NA NA 1110 IAEA 2021-01-05 23:19:47 1056 Operational PWR Pressurized Water Reactor Belarus
Belarusian-2 54.76667 26.11667 BY VVER V-491 2014-04-27 NA NA 1110 IAEA 2018-03-10 12:54:39 1061 Under Construction PWR Pressurized Water Reactor Belarus
Belene-1 43.62453 25.18675 BG NA 1987-01-01 NA NA 953 WNA/IAEA 2021-02-13 22:57:00 NA Cancelled Construction PWR Pressurized Water Reactor Bulgaria
Belene-2 43.62453 25.18650 BG NA 1987-03-31 NA NA 953 WNA/IAEA 2021-02-13 22:57:00 NA Cancelled Construction PWR Pressurized Water Reactor Bulgaria
Belleville-1 47.51100 2.87100 FR P4 REP 1300 1980-05-01 1988-06-01 NA 1310 WNA/IAEA 2015-05-24 01:51:02 211 Operational PWR Pressurized Water Reactor France
Belleville-2 47.51100 2.87100 FR P4 REP 1300 1980-08-01 1989-01-01 NA 1310 WNA/IAEA 2015-05-24 01:51:02 212 Operational PWR Pressurized Water Reactor France
Beloyarsk-1 56.84200 61.32100 RU AMB-100 1958-06-01 1964-04-26 1983-01-01 102 WNA/IAEA 2015-05-24 01:51:34 488 Shutdown LWGR Light Water Graphite Reactor Russia
Beloyarsk-2 56.84200 61.32100 RU AMB-200 1962-01-01 1969-12-01 1990-01-01 146 WNA/IAEA 2015-05-24 01:51:35 503 Shutdown LWGR Light Water Graphite Reactor Russia
Beloyarsk-3 56.84200 61.32100 RU BN-600 1969-01-01 1981-11-01 NA 560 WNA/IAEA 2015-05-24 01:51:34 484 Operational FBR Fast Breeder Reactor Russia
Beloyarsk-4 56.84200 61.32100 RU BN-800 2006-07-18 2016-10-31 NA 820 WNA/IAEA 2017-09-25 00:19:53 451 Operational FBR Fast Breeder Reactor Russia
Beloyarsk-5 56.84200 61.32100 RU BN-1200 NA NA NA NA WNA/Wikipedia NA NA Planned FBR Fast Breeder Reactor Russia

In diesem Datensatz existieren die Spalten ConstructionStartAt, OperationalFrom und OperationalTo, welche den Zeitpunkt markieren an dem der Bau, der Betrieb und die Stilllegung des Reaktors stattfand. Später möchte ich eine animierte Karte erstellen, bei der sich diese fixen Datumsangaben wie eine Zeitreihe verhalten - d.h. ab dem Zeitpunkt an dem der Bau beginnt, befindet sich das AKW solange im Bau bis sich der Status ändert (bspw. wenn ein Reaktor in Betrieb gesetzt wird). Hierfür transformiere ich den Datensatz und fasse das Ereignis, das jede Spalte repräsentiert, in der Spalte (TimeEvent) zusammen und hinterlege das jeweilige Datum in der Spalte (Date). Ist ein Ereignis für einen Reaktor noch nicht eingetreten so wird es entfernt.

data_long <-
  data_wide %>%
  pivot_longer(cols = c("ConstructionStartAt", "OperationalFrom", "OperationalTo"), 
               names_to = "TimeEvent", 
               values_to = "Date") %>%
  mutate(Year = lubridate::year(Date),
         TimeEvent_Animation = case_when(
           TimeEvent == "ConstructionStartAt" ~ "under construction",
           TimeEvent == "OperationalFrom" ~ "active",
           TimeEvent == "OperationalTo" ~ "decommissioned"
         )) %>%
  filter(!is.na(Date))

Die transformierten Daten (ausgewählte Spalten) sehen so aus:


Name TimeEvent Date TimeEvent_Animation
Ågesta ConstructionStartAt 1957-12-01 under construction
Ågesta OperationalFrom 1964-05-01 active
Ågesta OperationalTo 1974-06-02 decommissioned
Akademik Lomonosov-1 ConstructionStartAt 2007-04-15 under construction
Akademik Lomonosov-1 OperationalFrom 2020-05-22 active
Akademik Lomonosov-2 ConstructionStartAt 2007-04-15 under construction
Akademik Lomonosov-2 OperationalFrom 2020-05-22 active
Akkuyu-1 ConstructionStartAt 2018-04-03 under construction
Akkuyu-2 ConstructionStartAt 2020-04-08 under construction
Akkuyu-3 ConstructionStartAt 2021-03-10 under construction
Aktau (Shevchenko) ConstructionStartAt 1964-10-01 under construction
Aktau (Shevchenko) OperationalTo 1999-04-22 decommissioned
Almaraz-1 ConstructionStartAt 1973-07-03 under construction
Almaraz-1 OperationalFrom 1983-09-01 active
Almaraz-2 ConstructionStartAt 1973-07-03 under construction
Almaraz-2 OperationalFrom 1984-07-01 active
Angra-1 ConstructionStartAt 1971-05-01 under construction
Angra-1 OperationalFrom 1985-01-01 active
Angra-2 ConstructionStartAt 1976-01-01 under construction
Angra-2 OperationalFrom 2001-02-01 active
Angra-3 ConstructionStartAt 2010-06-01 under construction
APS-1 Obninsk ConstructionStartAt 1951-01-01 under construction
APS-1 Obninsk OperationalFrom 1954-12-01 active
APS-1 Obninsk OperationalTo 2002-04-29 decommissioned
Arkansas Nuclear One-1 (ANO-1) ConstructionStartAt 1968-10-01 under construction
Arkansas Nuclear One-1 (ANO-1) OperationalFrom 1974-12-19 active
Arkansas Nuclear One-2 (ANO-2) ConstructionStartAt 1968-12-06 under construction
Arkansas Nuclear One-2 (ANO-2) OperationalFrom 1980-03-26 active
Armenian-1 ConstructionStartAt 1969-07-01 under construction
Armenian-1 OperationalFrom 1977-10-06 active
Armenian-1 OperationalTo 1989-02-25 decommissioned
Armenian-2 ConstructionStartAt 1975-07-01 under construction
Armenian-2 OperationalFrom 1980-05-03 active
Asco-1 ConstructionStartAt 1974-05-16 under construction
Asco-1 OperationalFrom 1984-12-10 active
Asco-2 ConstructionStartAt 1975-03-07 under construction
Asco-2 OperationalFrom 1986-03-31 active
Atucha-1 ConstructionStartAt 1968-06-01 under construction
Atucha-1 OperationalFrom 1974-06-24 active
Atucha-2 ConstructionStartAt 1981-07-14 under construction
Atucha-2 OperationalFrom 2016-05-26 active
Balakovo-1 ConstructionStartAt 1980-12-01 under construction
Balakovo-1 OperationalFrom 1986-05-23 active
Balakovo-2 ConstructionStartAt 1981-08-01 under construction
Balakovo-2 OperationalFrom 1988-01-18 active
Balakovo-3 ConstructionStartAt 1982-11-01 under construction
Balakovo-3 OperationalFrom 1989-04-08 active
Balakovo-4 ConstructionStartAt 1984-04-01 under construction
Balakovo-4 OperationalFrom 1993-12-22 active
Baltic-1 ConstructionStartAt 2012-02-22 under construction

Zum Schluss erweitere ich noch die Grunddaten um die eingespeiste Energiemenge. Zunächst erstelle ich einen Vektor mit den relevanten Reaktor-IDs. Diese werden jeweils an die URL der PRIS-Datenbank angehangen, sodass der jeweilige Reaktor aufgerufen wird. Anschließend fasse ich alle extrahierten Daten im Tibble operatingHistory zusammen.

# relevante Reaktoren (IEAD ID)
reactor_ids <- 
  data_wide %>%
  select(IAEAId) %>%
  filter(!is.na(IAEAId)) %>%
  arrange(IAEAId) %>%
  pull()

pages <- tibble(
  IAEAId = reactor_ids,
  url = str_c("https://pris.iaea.org/PRIS/CountryStatistics/ReactorDetails.aspx?current=",
              reactor_ids),
  running_id = 1:length(reactor_ids)
  )

operatingHistory <- purrr::map_dfr(.x = pages$url, 
                                   .f = ~scraper_pris(url = .x), 
                                   .id = "IAEAId") 

operatingHistory <- operatingHistory %>%
  mutate(running_id = as.numeric(running_id)) %>%
  left_join(pages, by="running_id")

Die extrahierten Daten werden dann mit den Basisdaten der Reaktoren verknüpft und sehen so aus (ausgewählte Spalten):

data_oH <-
  data_wide %>%
  left_join(operatingHistory, by = "IAEAId")

Name Latitude Longitude Capacity year electricity
Ågesta 59.20600 18.0829 9 1971 30.00
Ågesta 59.20600 18.0829 9 1972 49.00
Ågesta 59.20600 18.0829 9 1973 43.50
Ågesta 59.20600 18.0829 9 1974 18.10
Akademik Lomonosov-1 69.70958 170.3063 30 2019 0.68
Akademik Lomonosov-1 69.70958 170.3063 30 2020 64.93
Akademik Lomonosov-2 69.70958 170.3063 30 2019 2.12
Akademik Lomonosov-2 69.70958 170.3063 30 2020 51.44
Aktau (Shevchenko) 43.60700 51.2830 52 1992 463.94
Aktau (Shevchenko) 43.60700 51.2830 52 1993 444.11
Aktau (Shevchenko) 43.60700 51.2830 52 1994 378.07
Aktau (Shevchenko) 43.60700 51.2830 52 1995 83.19
Aktau (Shevchenko) 43.60700 51.2830 52 1996 89.58
Aktau (Shevchenko) 43.60700 51.2830 52 1997 302.75
Aktau (Shevchenko) 43.60700 51.2830 52 1998 91.16
Aktau (Shevchenko) 43.60700 51.2830 52 1999 0.00
Almaraz-1 39.80700 -5.6980 900 1981 1888.90
Almaraz-1 39.80700 -5.6980 900 1982 2322.60
Almaraz-1 39.80700 -5.6980 900 1983 3713.90
Almaraz-1 39.80700 -5.6980 900 1984 4820.50
Almaraz-1 39.80700 -5.6980 900 1985 4825.17
Almaraz-1 39.80700 -5.6980 900 1986 5425.02
Almaraz-1 39.80700 -5.6980 900 1987 7193.69
Almaraz-1 39.80700 -5.6980 900 1988 5879.59
Almaraz-1 39.80700 -5.6980 900 1989 6562.18
Almaraz-1 39.80700 -5.6980 900 1990 6460.66
Almaraz-1 39.80700 -5.6980 900 1991 7481.71
Almaraz-1 39.80700 -5.6980 900 1992 6379.06
Almaraz-1 39.80700 -5.6980 900 1993 6530.85
Almaraz-1 39.80700 -5.6980 900 1994 7448.60
Almaraz-1 39.80700 -5.6980 900 1995 6588.46
Almaraz-1 39.80700 -5.6980 900 1996 5904.30
Almaraz-1 39.80700 -5.6980 900 1997 6642.83
Almaraz-1 39.80700 -5.6980 900 1998 8032.46
Almaraz-1 39.80700 -5.6980 900 1999 6988.63
Almaraz-1 39.80700 -5.6980 900 2000 7471.57
Almaraz-1 39.80700 -5.6980 900 2001 8151.39
Almaraz-1 39.80700 -5.6980 900 2002 7427.99
Almaraz-1 39.80700 -5.6980 900 2003 7499.11
Almaraz-1 39.80700 -5.6980 900 2004 8185.69
Almaraz-1 39.80700 -5.6980 900 2005 7519.43
Almaraz-1 39.80700 -5.6980 900 2006 7152.42
Almaraz-1 39.80700 -5.6980 900 2007 8189.80
Almaraz-1 39.80700 -5.6980 900 2008 7190.76
Almaraz-1 39.80700 -5.6980 900 2009 6880.10
Almaraz-1 39.80700 -5.6980 900 2010 7884.25
Almaraz-1 39.80700 -5.6980 900 2011 7519.49
Almaraz-1 39.80700 -5.6980 900 2012 7346.07
Almaraz-1 39.80700 -5.6980 900 2013 7695.84
Almaraz-1 39.80700 -5.6980 900 2014 7252.45

Für die Datenanalyse möchte ich ausschließlich Reaktoren berücksichtigen, die sich in Europa befinden und reduziere die Datensätze auf die relevanten Länder.

data_wide_eu <-
  data_wide %>%
  filter(CountryName %in% c(
    "Austria","Belarus","Belgium","Bulgaria",
    "Czechia","Finland","France","Germany","Hungary",
    "Italy","Lithunia","Netherlands","Romania",
    "Slovakia","Slovenia","Spain","Sweden",
    "Switzerland","Turkey","Ukraine","United Kingdom")
    ) %>%
  mutate(StatusType = ifelse(
    StatusType %in% c("Cancelled Construction",
                      "Never Commissioned",
                      "Suspended Construction",
                      "Unknown"), 
    "Not Built", StatusType),
    StatusType = fct_relevel(StatusType, 
                             "Not Built", "Planned",
                             "Under Construction",
                             "Operational", "Shutdown")
    )

data_long_eu <-
  data_long %>%
  filter(CountryName %in% c(
    "Austria","Belarus","Belgium","Bulgaria",
    "Czechia","Finland","France","Germany","Hungary",
    "Italy","Lithunia","Netherlands","Romania",
    "Slovakia","Slovenia","Spain","Sweden",
    "Switzerland","Turkey","Ukraine","United Kingdom")
    )

data_oH_eu <- 
  data_oH %>%
  filter(CountryName %in% c(
    "Austria","Belarus","Belgium","Bulgaria",
    "Czechia","Finland","France","Germany","Hungary",
    "Italy","Lithunia","Netherlands","Romania",
    "Slovakia","Slovenia","Spain","Sweden",
    "Switzerland","Turkey","Ukraine","United Kingdom")
    )

Datenanalyse

Unten findet man eine Übersicht der europäischen Atomreaktoren. 103 Reaktoren wurden bereits stillgelegt und 7 Reaktoren sind nie in Betrieb gegangen bzw. haben das Planungsstadium verlassen. Dennoch befinden sich noch 141 Reaktoren in Betrieb und sogar 12 Reaktoren in Bau bzw. 9 in Planung.

data_wide_eu %>%
  group_by(StatusType) %>%
  summarise(anzahl = n()) %>%
  mutate(anteil = round(anzahl / sum(anzahl), digits = 2)) %>%
  ggplot(data = ., aes(x = "", y = anteil, fill = StatusType)) +
  geom_col(color = "black") +
  geom_text(aes(label = anzahl),
            position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("grey", "#3399FF","#FFCC00","#00CC00","#CC0000")) +
  labs(fill = "") +
  theme_void()

Für jedes europäische Land ist die geplante bzw. realisierte Leistung aller Reaktoren nachfolgend dargestellt. Besonders in Deutschland wurden bereits viele Reaktoren vom Netz genommen, während sich in Frankreich der Großteil der Reaktoren noch im Betrieb befindet.

data_wide_eu %>%
  group_by(CountryName) %>%
  summarise(tot_capa_country = sum(Capacity, na.rm = TRUE)/1000) %>%
  left_join(data_wide_eu %>%
              group_by(CountryName, StatusType) %>%
              summarise(tot_capa_status = sum(Capacity, na.rm = TRUE)/1000), 
            by = "CountryName") %>%
  ggplot(data = ., aes(x = reorder(CountryName, tot_capa_country), 
                       y = tot_capa_status, 
                       fill =StatusType)) +
  geom_bar(stat = "identity", color = "black") +
  coord_flip() +
  scale_y_continuous(breaks = seq(0,70,10)) +
  scale_fill_manual(values = c("grey", "#3399FF","#FFCC00","#00CC00","#CC0000")) +
  labs(x = "", y = "Total capacity (gigawatt)", fill = "")

Als Nächstes betrachte ich die ins Netz eingespeiste Energiemenge der europäischen Atommeiler. Auf der x-Achse habe ich die Reaktorunfälle von Tschernobyl im Jahr 1986 und Fukushima im Jahr 2011 in rot hervorgehoben. Nur Italien ist im Anchschluss an Tschernobyl vollständig aus der Kernergie ausgestiegen. Bei den anderen europäischen Ländern ist kein Rückgang der Nutzung der Atomkraft zu erkennen - in Frankreich ist diese sogar deutlich gestiegen. In Deutschland ist ein starker Rückgang der eingespeisten Energiemenge nach dem Reaktorunglück von Fukushima zu erkennen.

data_oH_eu %>%
  group_by(CountryName, year) %>%
  summarise(sum_ele_europe = sum(electricity, na.rm = T)/1000) %>%
  ggplot(data =., aes(x= year, y = sum_ele_europe, group = CountryName)) +
  geom_line() +
  geom_vline(xintercept=1986, color = "red") +
  geom_vline(xintercept = 2011, color = "red") +
  facet_wrap(. ~ CountryName) +
  scale_x_continuous(limits = c(1950, 2022),
                     breaks = seq(1960,2020,10)) +
  labs(x = "", y = "Electricity supplied (TW/h)") +
  theme(axis.text.x = element_text(angle = 90))

Zum Schluss möchte ich mir einen Überblick verschaffen, wie sich der Ausbau der Kernergie in Europa im Zeitverlauf verändert hat. Dazu nutze ich den Datensatz datal_long_eu, in welchem ich die Reaktordaten so transfomiert hatte, dass sich der Zeitpunkt des Baus, der Inbetriebesetzung oder der Stilllegung wie eine Zeitreihe verhält. Unten ist dargestellt bei wie vielen Reaktoren in einem Jahr mit dem Bau begonnen wurde bzw. wie viele Reaktoren in Betrieb gesetzt oder stillgelegt wurden. Zwischen 1970 und 1990 wurden die meisten Reaktoren gebaut bzw. in Betrieb genommen. Ab 1990 wurden zunehmend Reaktoren stillgelegt.

data_long_eu %>%
  ggplot(aes(x = Year, fill = TimeEvent_Animation)) +
  geom_bar(color = "black") +
  scale_x_continuous(limits = c(1950, 2022),
                     breaks = seq(1950,2022,10)) +
  scale_fill_manual(name = "", values = c("#00CC00","#CC0000","#FFCC00")) +
  labs(x = "", y = "Number of reactors")

Unten habe ich für Deutschland die Entwicklung der Atomreaktoren mit einer Leistung von mindestens 300 Megawatt auf einem Zeitstrahl dargestellt. Dafür nutze ich die Funktion geom_segment() mit der eine gerade Linie zwischen zwei Punkten gezeichnet werden kann. Das Ende des jeweiligen Ereignisses auf dem Zeitstrahl begrenze ich mithilfe der Funktion lead() auf das nächstfolgende Ereignis. Aktuell sind in Deutschland noch 7 Reaktoren am Netz. Besonders interessant finde ich das Kernkraftwerk Mülheim-Kärlich, welches nach seiner Inbetriebnahme nur etwa 1 Jahr am Netz war. Auch die nach dem Reaktorunglück von Fukushima (2011) stillgelegten Reaktoren können dieser Darstellung entnommen werden.

data_long_eu %>%
  group_by(Name) %>%
  mutate(End = lead(Year),
         End = ifelse(is.na(End),2021,End)) %>%
  filter(CountryName =="Germany" & Capacity >= 300) %>%
  ggplot() +
  geom_segment(aes(x = Year, xend = End, 
                   y = Name, yend = Name, 
                   col = TimeEvent_Animation), 
               lineend = "round", size = 2) +
  scale_color_manual(name = "", values = c("#00CC00","#CC0000","#FFCC00")) +
  scale_x_continuous(limits = c(1965, 2021),
                     breaks = seq(1965,2020,5)) +
  labs(x = "", y = "") +
  theme(axis.text.x = element_text(angle = 90))

Mit einer animierten Karte möchte ich diese Informationen für ganz Europa darstellen. Mit der Funktion shadow_mark() aus dem R-Paket ggmaps kann man steuern, dass Punkte, die ein mal auf einer Karte hinterlegt wurden, auch im Zeitverlauf auf der Karte verbleiben. So bleibt der Status eines Reaktors so lange gültig bis ein anderer Status eintritt. Da es am Standort eines Atomkraftwerks meist mehrere Reaktoren gibt, ist diese Darstellung nicht vollständig präzise, da die Reaktoren nicht unbedingt zur selben Zeit gebaut oder in Betrieb genommen werden. So kann ein zweiter (dritter, vierter, …) Reaktor an einem Standort den Status des ersten Reaktors überscheiben.

Get_Map_Country <- get_map(location = "Europe", zoom = 4, 
                           maptype = "stamen_toner_background", 
                           filename = "ggmapTemp", color = "bw", source = "stadia")

karte_europa <- ggmap(ggmap = Get_Map_Country)

karte_animation <- karte_europa + 
  geom_point(data = data_long_eu, 
             aes(x = Longitude, 
                 y = Latitude, 
                 fill = TimeEvent_Animation,
                 group = Year), 
             shape = 21, size = 3, alpha = 1.0) +
  transition_time(Year) +
  scale_fill_manual(values = c("#00FF00","#FF0000","#FFFF00")) +
  labs(title = "Reaktorstandorte in Europa im Jahr = {as.integer(frame_time)}",
       x = "Längengrad", 
       y = "Breitengrad",
       fill = "") +
  shadow_mark(past = TRUE) 

animate(karte_animation, nframes = 100, fps = 2,
        width = 800,
        height = 600)
Posted on:
September 8, 2021
Length:
16 minute read, 3253 words
Categories:
R Kartierung Webscraping
See Also: