Streszczenie

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.

Przetwarzanie danych

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:

harm_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:

economic_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

Wyniki

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