Streszczenie

Niniejsza analiza bada bazę danych NOAA Storm Database, obejmującą 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 liczbie ofiar śmiertelnych, liczbie rannych oraz szacunkowych stratach materialnych. Analiza wykazała, że tornada stanowią zdecydowanie największe zagrożenie dla życia i zdrowia ludności, odpowiadając za największą liczbę ofiar śmiertelnych i rannych łącznie. Wśród zjawisk powodujących najwyższe straty ekonomiczne dominują powodzie, huragany oraz sztormy. Dane z wcześniejszych lat są mniej kompletne, co może wpływać na ogólne statystyki — nowsze rekordy są bardziej szczegółowe i dokładne. Analiza uwzględnia zarówno bezpośrednie szkody majątkowe (PROPDMG), jak i straty w uprawach (CROPDMG), wyrażone w ujednoliconej jednostce dolarów. Wyniki wskazują na konieczność szczególnego przygotowania służb ratunkowych na tornada oraz systemów ochrony infrastruktury i rolnictwa przed powodziami i huraganami. Prezentowane wyniki mogą służyć jako podstawa do priorytetyzacji zasobów w zarządzaniu kryzysowym. Analiza obejmuje pełen zakres surowych danych źródłowych bez żadnego zewnętrznego przetwarzania wstępnego.


Przetwarzanie danych

Wczytanie wymaganych pakietów

library(dplyr)
## Warning: pakiet 'dplyr' został zbudowany w wersji R 4.5.3
## 
## Dołączanie pakietu: 'dplyr'
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     filter, lag
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
## Warning: pakiet 'tidyr' został zbudowany w wersji R 4.5.3
library(scales)
## Warning: pakiet 'scales' został zbudowany w wersji R 4.5.3

Wczytanie danych

Dane wczytywane są bezpośrednio ze skompresowanego pliku .csv.bz2, za pomocą funkcji read.csv().

dane <- read.csv("data_StormData.csv.bz2", stringsAsFactors = FALSE)

names(dane)
##  [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 zmiennych

Do analizy potrzebne są jedynie kolumny dotyczące typu zdarzenia, szkód zdrowotnych i ekonomicznych.

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

head(dane)
##    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

Przetwarzanie danych szkód ekonomicznych

Kolumny PROPDMGEXP i CROPDMGEXP zawierają litery oznaczające rząd wielkości: K, M, B. Musimy je przekształcić na liczby.

convert_exp <- function(exp) {
  exp <- toupper(trimws(exp))
  
  result <- rep(1, length(exp))
  
  result[exp == "H"] <- 1e2
  result[exp == "K"] <- 1e3
  result[exp == "M"] <- 1e6
  result[exp == "B"] <- 1e9
  
  is_digit <- exp %in% as.character(0:9)
  result[is_digit] <- 10 ^ as.numeric(exp[is_digit])
  
  return(result)
}

dane$PROPDMGEXP <- convert_exp(dane$PROPDMGEXP)
dane$CROPDMGEXP <- convert_exp(dane$CROPDMGEXP)

dane$PROPDMG <- dane$PROPDMG * dane$PROPDMGEXP
dane$CROPDMG <- dane$CROPDMG * dane$CROPDMGEXP
dane$ALLDMG <- dane$PROPDMG + dane$CROPDMG

Wyniki

Pytanie 1: Które typy zjawisk są najbardziej szkodliwe dla zdrowia ludności?

health <- dane %>%
  group_by(EVTYPE) %>%
  summarise(HARM = sum(FATALITIES, na.rm = TRUE) + sum(INJURIES, na.rm = TRUE)) %>%
  arrange(desc(HARM))

top10_health <- head(health, 10)
ggplot(top10_health, aes(x = HARM, y = reorder(EVTYPE, HARM))) +
  geom_col(fill = "steelblue") +
  labs(title = "Top 10 zjawisk najbardziej szkodliwych dla zdrowia", x = "Liczba ofiar i rannych", y = "Typ zjawiska")

Tornada są zdecydowanie najbardziej niebezpiecznym zjawiskiem pod względem ofiar. Drugie miejsce zajmuje nadmierne ciepło.


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

economics <- dane %>%
  group_by(EVTYPE) %>%
  summarise(total_loss = sum(ALLDMG, na.rm = TRUE)) %>%
  arrange(desc(total_loss))

top10_economics <- head(economics, 10)
ggplot(top10_economics, aes(x = total_loss / 1e9, y = reorder(EVTYPE, total_loss))) +
  geom_col(fill = "steelblue") +
  labs(title = "Top 10 zjawisk powodujących największe straty ekonomiczne", x = "Straty [mld USD]", y = "Typ zjawiska")

Powodzie odpowiadają za największe łączne straty ekonomiczne, przekraczające 150 mld USD.