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.
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"
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
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
)
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)
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.
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).
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.
Powodzie (Flood) generują największe straty ekonomiczne – przekraczające 150 miliardów USD. Kolejne miejsca zajmują huragany (Hurricane/Typhoon) i burze nawalne (Storm Surge).
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 |