Niniejszy raport przedstawia analizę bazy danych amerykańskiej Narodowej Administracji Oceanicznej i Atmosferycznej (NOAA) dotyczącą ekstremalnych zjawisk pogodowych zarejestrowanych w latach 1950–2011. Głównym celem badania jest identyfikacja zagrożeń meteorologicznych, które wywierają najbardziej destrukcyjny wpływ na zdrowie publiczne oraz gospodarkę Stanów Zjednoczonych. Perspektywa menedżera ds. zarządzania kryzysowego wymaga precyzyjnego rozróżnienia priorytetów budżetowych pomiędzy bezpośrednią ochronę życia a zabezpieczenie infrastruktury państwowej. Przeprowadzona analiza danych jednoznacznie wskazuje, że tornada stanowią najpoważniejsze zagrożenie dla zdrowia i życia populacji, odpowiadając za najwyższą łączną liczbę ofiar śmiertelnych oraz osób rannych. Z kolei pod kątem ogólnych strat finansowych, najbardziej niszczycielskim zjawiskiem okazały się powodzie, wyprzedzając huragany i tornada pod względem generowanych kosztów infrastrukturalnych. W specyficznym sektorze rolniczym głównym źródłem strat budżetowych i zniszczeń upraw pozostają natomiast długotrwałe susze. Wyniki te implikują potrzebę dwutorowej alokacji zasobów: rozwoju systemów wczesnego ostrzegania przed tornadami w celu ratowania ludzi oraz modernizacji zabezpieczeń hydrotechnicznych w celu ochrony mienia. Prezentowany raport zawiera kompletny kod źródłowy w języku R, zapewniający pełną reprodukowalność wszystkich przedstawionych tabel, transformacji oraz wykresów.
Na początku wczytuję surowe dane i wyświetlam kilka pierwszych rekordów aby się im przyjrzeć.
data <- read.csv("data_StormData.csv.bz2")
head(data)
## STATE__ BGN_DATE BGN_TIME TIME_ZONE COUNTY COUNTYNAME STATE EVTYPE
## 1 1 4/18/1950 0:00:00 0130 CST 97 MOBILE AL TORNADO
## 2 1 4/18/1950 0:00:00 0145 CST 3 BALDWIN AL TORNADO
## 3 1 2/20/1951 0:00:00 1600 CST 57 FAYETTE AL TORNADO
## 4 1 6/8/1951 0:00:00 0900 CST 89 MADISON AL TORNADO
## 5 1 11/15/1951 0:00:00 1500 CST 43 CULLMAN AL TORNADO
## 6 1 11/15/1951 0:00:00 2000 CST 77 LAUDERDALE AL TORNADO
## BGN_RANGE BGN_AZI BGN_LOCATI END_DATE END_TIME COUNTY_END COUNTYENDN
## 1 0 0 NA
## 2 0 0 NA
## 3 0 0 NA
## 4 0 0 NA
## 5 0 0 NA
## 6 0 0 NA
## END_RANGE END_AZI END_LOCATI LENGTH WIDTH F MAG FATALITIES INJURIES PROPDMG
## 1 0 14.0 100 3 0 0 15 25.0
## 2 0 2.0 150 2 0 0 0 2.5
## 3 0 0.1 123 2 0 0 2 25.0
## 4 0 0.0 100 2 0 0 2 2.5
## 5 0 0.0 150 2 0 0 2 2.5
## 6 0 1.5 177 2 0 0 6 2.5
## PROPDMGEXP CROPDMG CROPDMGEXP WFO STATEOFFIC ZONENAMES LATITUDE LONGITUDE
## 1 K 0 3040 8812
## 2 K 0 3042 8755
## 3 K 0 3340 8742
## 4 K 0 3458 8626
## 5 K 0 3412 8642
## 6 K 0 3450 8748
## LATITUDE_E LONGITUDE_ REMARKS REFNUM
## 1 3051 8806 1
## 2 0 0 2
## 3 0 0 3
## 4 0 0 4
## 5 0 0 5
## 6 0 0 6
Aby poznać w jakim zjawisku pogodowym ucierpiało najwięcej osób,
pogrupowałem dane po EVTYPE oraz stworzyłem 3 dodatkowe
kolumny:
FATALITIES_SUM - liczba zabitych przez dane zjawisko
pogodoweINJURIES_SUM - liczba rannych przez dane zjawisko
pogodoweINJURED - sumaryczna liczba poszkodowanych przez dane
zjawisko pogodoweharm_impact <- data %>%
group_by(EVTYPE) %>%
summarize(
FATALITIES_SUM = sum(FATALITIES, na.rm = TRUE),
INJURIES_SUM = sum(INJURIES, na.rm = TRUE),
INJURED = FATALITIES_SUM + INJURIES_SUM
) %>%
arrange(desc(INJURED))
head(harm_impact)
## # A tibble: 6 × 4
## EVTYPE FATALITIES_SUM INJURIES_SUM INJURED
## <chr> <dbl> <dbl> <dbl>
## 1 TORNADO 5633 91346 96979
## 2 EXCESSIVE HEAT 1903 6525 8428
## 3 TSTM WIND 504 6957 7461
## 4 FLOOD 470 6789 7259
## 5 LIGHTNING 816 5230 6046
## 6 HEAT 937 2100 3037
Następnie w celu obliczenia łącznych strat spowodowanych przez
poszczególne zjawisko pogodowe wyświetliłem wszystkie możliwe rzędy
wielkości w kolumnach PROPDMGEXPi CROPDMGEXP
.
data %>%
distinct(PROPDMGEXP)
## PROPDMGEXP
## 1 K
## 2 M
## 3
## 4 B
## 5 m
## 6 +
## 7 0
## 8 5
## 9 6
## 10 ?
## 11 4
## 12 2
## 13 3
## 14 h
## 15 7
## 16 H
## 17 -
## 18 1
## 19 8
data %>%
distinct(CROPDMGEXP)
## CROPDMGEXP
## 1
## 2 M
## 3 K
## 4 m
## 5 B
## 6 ?
## 7 0
## 8 k
## 9 2
Następnie przemapowałem kolumny PROPDMGEXP i
CROPDMGEXP w taki sposób aby watość tego współczynnika była
liczbą. Dodałem również 3 nowe kolumny:
PROP_BILLIONS_SUM - Suma szkód materialnych
wyrządzonych przez dane zjawisko pogodoweCROP_BILLIONS_SUM - Suma szkód rolniczych wyrządzonych
przez dane zjawisko pogodoweECONOMIC_LOSS - Całkowita suma szkód wyrządzonych przez
dane zjawisko pogodoweeconomic_losses <- data %>%
mutate(
PROPDMGEXP = toupper(trimws(PROPDMGEXP)),
PROPDMG_MULT = case_when(
PROPDMGEXP %in% c("K", "3") ~ 1000,
PROPDMGEXP %in% c("M", "6") ~ 1000000,
PROPDMGEXP %in% c("H", "2") ~ 100,
PROPDMGEXP == "B" ~ 1000000000,
PROPDMGEXP == "0" ~ 1,
PROPDMGEXP == "1" ~ 10,
PROPDMGEXP == "4" ~ 10000,
PROPDMGEXP == "5" ~ 100000,
PROPDMGEXP == "7" ~ 10000000,
PROPDMGEXP == "8" ~ 100000000,
PROPDMGEXP %in% c("+", "?", "-") ~ 0,
TRUE ~ 1
),
PROP_BILLIONS = (PROPDMG * PROPDMG_MULT) / 1e9
) %>%
mutate(
CROPDMGEXP = toupper(trimws(CROPDMGEXP)),
CROPDMG_MULT = case_when(
CROPDMGEXP == "K" ~ 1000,
CROPDMGEXP == "M" ~ 1000000,
CROPDMGEXP == "B" ~ 1000000000,
CROPDMGEXP %in% c("H", "2") ~ 100,
CROPDMGEXP == "0" ~ 1,
CROPDMGEXP == "?" ~ 0,
TRUE ~ 1
),
CROP_BILLIONS = (CROPDMG * CROPDMG_MULT) / 1e9
) %>%
group_by(EVTYPE) %>%
summarize(
PROP_BILLIONS_SUM = round(sum(PROP_BILLIONS, na.rm = TRUE), 4),
CROP_BILLIONS_SUM = round(sum(CROP_BILLIONS, na.rm = TRUE), 4),
ECONOMIC_LOSS = PROP_BILLIONS_SUM + CROP_BILLIONS_SUM
) %>%
arrange(desc(ECONOMIC_LOSS))
economic_losses
## # A tibble: 985 × 4
## EVTYPE PROP_BILLIONS_SUM CROP_BILLIONS_SUM ECONOMIC_LOSS
## <chr> <dbl> <dbl> <dbl>
## 1 FLOOD 145. 5.66 150.
## 2 HURRICANE/TYPHOON 69.3 2.61 71.9
## 3 TORNADO 56.9 0.415 57.4
## 4 STORM SURGE 43.3 0 43.3
## 5 HAIL 15.7 3.03 18.8
## 6 FLASH FLOOD 16.8 1.42 18.2
## 7 DROUGHT 1.05 14.0 15.0
## 8 HURRICANE 11.9 2.74 14.6
## 9 RIVER FLOOD 5.12 5.03 10.1
## 10 ICE STORM 3.94 5.02 8.97
## # ℹ 975 more rows
W cal zobrazowania skali poszkodowanych w zjawiskach pogodowych w USA przygotowane dane umieściłem na wykresie. W celu lepszej czytelności wyświetliłem tylko pierwsze 10 rekordów.
harm_impact %>%
head(20) %>%
ggplot(aes(x = reorder(EVTYPE, INJURED), y = INJURED)) +
geom_bar(stat = "identity", fill = "darkred") +
coord_flip() +
labs(
title = "20 zjawisk pogodowych o największym wpływie na zdrowie",
x = "Typ zjawiska (EVTYPE)",
y = "Łączna liczba poszkodowanych (Ofiary + Ranni)"
) +
theme_minimal()
Jak widzimy najbardziej destrukcyjnym i potężnym zajwiskiem pogodowym jest Tornado w którym było aż 96979 poszkodowanych.
w celu zobrazowania szkód wurządzonych przez żywioły, ponownie, wyświetliłem tylko 20 pierwszych rekordów.
economic_losses %>%
head(20) %>%
ggplot(aes(x = reorder(EVTYPE, ECONOMIC_LOSS), y = ECONOMIC_LOSS)) +
geom_bar(stat = "identity", fill = "pink") +
coord_flip() +
labs(
title = "Top 20 zjawisk pogodowych pod względem strat",
x = "Typ zjawiska (EVTYPE)",
y = "Łączna kwota strat w miliardach"
) +
theme_minimal()
Tutaj widzimy, że pierwsze dwa miejsca zajmują bardzo zbliżone do siebie zjawisko pogodowe. Oba te zjawiska są związane z Huragsanami