Streszczenie

Niniejszy raport przedstawia analizę bazy danych NOAA Storm Database, obejmującej ekstremalne zjawiska pogodowe w Stanach Zjednoczonych w latach 1950–2011. Celem analizy jest identyfikacja typów zdarzeń pogodowych, które są najbardziej szkodliwe dla zdrowia ludności oraz powodują największe straty ekonomiczne. Dane zawierają informacje o ofiarach śmiertelnych, rannych oraz szkodach majątkowych i rolnych. Analiza wykazała, że tornada są zdecydowanie najbardziej niebezpiecznym zjawiskiem pod względem liczby ofiar śmiertelnych i rannych. W zakresie strat ekonomicznych największe zniszczenia powodują powodzie, huragany oraz tornada. Przetwarzanie danych obejmowało dekodowanie wykładników szkód majątkowych zapisanych w formie literowej. Wyniki przedstawiono w formie wykresów słupkowych, które umożliwiają szybkie porównanie poszczególnych typów zdarzeń. Raport może stanowić podstawę do priorytetyzacji zasobów przez urzędników ds. zarządzania kryzysowego. Zjawiska takie jak tornada i powodzie powinny być traktowane jako priorytetowe w planowaniu ochrony ludności i infrastruktury. Kompletność danych wzrasta wraz z upływem czasu, co należy uwzględniać przy interpretacji wyników historycznych.

Przetwarzanie danych

Wczytanie danych

Dane wczytywane są bezpośrednio z pliku skompresowanego .bz2. R obsługuje dekompresję automatycznie przy użyciu funkcji read.csv().

library(tidyverse)

storm <- read.csv("data_StormData.csv.bz2", stringsAsFactors = FALSE)
dim(storm)
## [1] 902297     37
names(storm)
##  [1] "STATE__"    "BGN_DATE"   "BGN_TIME"   "TIME_ZONE"  "COUNTY"    
##  [6] "COUNTYNAME" "STATE"      "EVTYPE"     "BGN_RANGE"  "BGN_AZI"   
## [11] "BGN_LOCATI" "END_DATE"   "END_TIME"   "COUNTY_END" "COUNTYENDN"
## [16] "END_RANGE"  "END_AZI"    "END_LOCATI" "LENGTH"     "WIDTH"     
## [21] "F"          "MAG"        "FATALITIES" "INJURIES"   "PROPDMG"   
## [26] "PROPDMGEXP" "CROPDMG"    "CROPDMGEXP" "WFO"        "STATEOFFIC"
## [31] "ZONENAMES"  "LATITUDE"   "LONGITUDE"  "LATITUDE_E" "LONGITUDE_"
## [36] "REMARKS"    "REFNUM"

Wybór istotnych kolumn

Do analizy niezbędne są kolumny dotyczące: typu zdarzenia, ofiar śmiertelnych, rannych oraz szkód majątkowych i rolnych (wraz z wykładnikami).

storm_sel <- storm %>%
  select(EVTYPE, FATALITIES, INJURIES, PROPDMG, PROPDMGEXP, CROPDMG, CROPDMGEXP)

head(storm_sel)
##    EVTYPE FATALITIES INJURIES PROPDMG PROPDMGEXP CROPDMG CROPDMGEXP
## 1 TORNADO          0       15    25.0          K       0           
## 2 TORNADO          0        0     2.5          K       0           
## 3 TORNADO          0        2    25.0          K       0           
## 4 TORNADO          0        2     2.5          K       0           
## 5 TORNADO          0        2     2.5          K       0           
## 6 TORNADO          0        6     2.5          K       0

Dekodowanie wykładników szkód

Kolumny PROPDMGEXP i CROPDMGEXP zawierają litery oznaczające rząd wielkości szkód: - K / k = tysiące (×1 000) - M / m = miliony (×1 000 000) - B / b = miliardy (×1 000 000 000) - Cyfry 1–8 = potęgi dziesiątki - Pozostałe (puste, ?, +, -) = ×1

decode_exp <- function(exp) {
  case_when(
    exp %in% c("K", "k") ~ 1e3,
    exp %in% c("M", "m") ~ 1e6,
    exp %in% c("B", "b") ~ 1e9,
    exp == "H" | exp == "h" ~ 1e2,
    exp %in% as.character(1:8) ~ 10^as.numeric(exp),
    TRUE ~ 1
  )
}

storm_clean <- storm_sel %>%
  mutate(
    prop_dmg_total = PROPDMG * decode_exp(PROPDMGEXP),
    crop_dmg_total = CROPDMG * decode_exp(CROPDMGEXP),
    econ_dmg_total = prop_dmg_total + crop_dmg_total
  )

Agregacja danych

Sumujemy ofiary śmiertelne, rannych oraz straty ekonomiczne według typu zdarzenia.

health_summary <- storm_clean %>%
  group_by(EVTYPE) %>%
  summarise(
    fatalities = sum(FATALITIES, na.rm = TRUE),
    injuries   = sum(INJURIES,   na.rm = TRUE),
    total_harm = fatalities + injuries
  ) %>%
  arrange(desc(total_harm))

econ_summary <- storm_clean %>%
  group_by(EVTYPE) %>%
  summarise(econ_dmg = sum(econ_dmg_total, na.rm = TRUE)) %>%
  arrange(desc(econ_dmg))

top_health <- head(health_summary, 10)
top_econ   <- head(econ_summary,   10)

Wyniki

Pytanie 1: Które zjawiska są najbardziej szkodliwe dla zdrowia?

Poniższy wykres przedstawia 10 typów zdarzeń pogodowych powodujących najwięcej ofiar (śmiertelnych i rannych łącznie).

top_health_long <- top_health %>%
  pivot_longer(cols = c(fatalities, injuries),
               names_to  = "typ",
               values_to = "liczba") %>%
  mutate(
    EVTYPE = factor(EVTYPE, levels = rev(top_health$EVTYPE)),
    typ    = recode(typ, fatalities = "Ofiary śmiertelne", injuries = "Ranni")
  )

ggplot(top_health_long, aes(x = EVTYPE, y = liczba, fill = typ)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  scale_fill_manual(values = c("Ofiary śmiertelne" = "#d62728",
                               "Ranni"             = "#ff7f0e")) +
  labs(
    title = "Zdarzenia pogodowe najbardziej szkodliwe dla zdrowia (Top 10)",
    x     = "Typ zdarzenia",
    y     = "Liczba osób",
    fill  = NULL
  ) +
  theme_bw()
Rysunek 1. Dziesięć typów zdarzeń pogodowych powodujących największą liczbę ofiar (śmiertelnych i rannych łącznie) w USA w latach 1950–2011. Tornada dominują zdecydowanie nad pozostałymi zjawiskami.

Rysunek 1. Dziesięć typów zdarzeń pogodowych powodujących największą liczbę ofiar (śmiertelnych i rannych łącznie) w USA w latach 1950–2011. Tornada dominują zdecydowanie nad pozostałymi zjawiskami.

Tornada są zdecydowanie najgroźniejszym zjawiskiem – spowodowały ponad 91 000 rannych i ponad 5 600 ofiar śmiertelnych. Na dalszych miejscach znajdują się fale upałów (Excessive Heat) i powodzie (Flood).

Pytanie 2: Które zjawiska powodują największe straty ekonomiczne?

Wykres poniżej przedstawia 10 typów zdarzeń powodujących największe straty ekonomiczne (majątkowo-rolne łącznie).

top_econ_plot <- top_econ %>%
  mutate(
    EVTYPE  = factor(EVTYPE, levels = rev(EVTYPE)),
    econ_B  = econ_dmg / 1e9
  )

ggplot(top_econ_plot, aes(x = EVTYPE, y = econ_B)) +
  geom_bar(stat = "identity", fill = "#1f77b4") +
  coord_flip() +
  labs(
    title = "Zdarzenia pogodowe powodujące największe straty ekonomiczne (Top 10)",
    x     = "Typ zdarzenia",
    y     = "Straty ekonomiczne (miliardy USD)"
  ) +
  theme_bw()
Rysunek 2. Dziesięć typów zdarzeń pogodowych powodujących największe straty ekonomiczne (majątkowe i rolne łącznie) w USA w latach 1950–2011. Powodzie generują straty rzędu setek miliardów dolarów.

Rysunek 2. Dziesięć typów zdarzeń pogodowych powodujących największe straty ekonomiczne (majątkowe i rolne łącznie) w USA w latach 1950–2011. Powodzie generują straty rzędu setek miliardów dolarów.

Powodzie (Flood) generują największe straty ekonomiczne – przekraczające 150 miliardów USD. Kolejne miejsca zajmują huragany (Hurricane/Typhoon) i burze nawalne (Storm Surge).

Podsumowanie wyników

library(knitr)

cat("### Top 5 – szkodliwość dla zdrowia\n")
## ### Top 5 – szkodliwość dla zdrowia
kable(top_health[1:5, c("EVTYPE","fatalities","injuries","total_harm")],
      col.names = c("Typ zdarzenia", "Ofiary śmiertelne", "Ranni", "Łącznie"),
      format.args = list(big.mark = " "))
Typ zdarzenia Ofiary śmiertelne Ranni Łącznie
TORNADO 5 633 91 346 96 979
EXCESSIVE HEAT 1 903 6 525 8 428
TSTM WIND 504 6 957 7 461
FLOOD 470 6 789 7 259
LIGHTNING 816 5 230 6 046
cat("### Top 5 – straty ekonomiczne\n")
## ### Top 5 – straty ekonomiczne
kable(top_econ[1:5, ] %>% mutate(econ_dmg = round(econ_dmg / 1e9, 2)),
      col.names = c("Typ zdarzenia", "Straty ekonomiczne (mld USD)"),
      format.args = list(big.mark = " "))
Typ zdarzenia Straty ekonomiczne (mld USD)
FLOOD 150.32
HURRICANE/TYPHOON 71.91
TORNADO 57.36
STORM SURGE 43.32
HAIL 18.76