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.
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
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"
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
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
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.
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.