Analiza danych dotyczących zjawisk meteorologicznych opiera się na badaniu wpływu różnych typów katastrof na zdrowie ludzkie oraz szkody materialne w Stanach Zjednoczonych. Skupiliśmy się na danych z bazy NOAA, koncentrując się na liczbie ofiar śmiertelnych i rannych, a także na stratach finansowych związanych z uszkodzeniami mienia i upraw. Badanie wykazało, że tornado jest najczęściej występującym i najbardziej śmiercionośnym zjawiskiem, powodującym liczne ofiary śmiertelne oraz rany. Następnie, powodzie okazały się jednym z najgroźniejszych zjawisk pod względem liczby rannych. Pod względem największego wpływu materialnego w postaci szkód finansowych, powodzie, huragany oraz tornada stanowią główne źródła strat. Powodzie generują ogromne straty w mieniu, huragany prowadzą do dużych zniszczeń w infrastrukturze, a tornada powodują ogromne straty w różnych regionach. Przeprowadzono również konwersję danych, aby ujednolicić jednostki i ułatwić porównanie między różnymi typami szkód. Szczególne wnioski płyną także z analizy proporcji szkód – top 3 zdarzenia odpowiadają za znaczną część łącznych strat finansowych. Dzięki wizualizacjom w postaci wykresów, analiza ta pozwala na łatwe porównanie zarówno wpływu na zdrowie, jak i skutków finansowych poszczególnych katastrof. Wyniki sugerują potrzebę zwiększenia działań prewencyjnych w regionach szczególnie narażonych na ekstremalne zjawiska atmosferyczne. Przeprowadzone analizy stanowią cenne narzędzie w ocenie ryzyka i planowaniu działań ochronnych.

Przetwarzanie danych

Dane są wczytywane bezpośrednio z pliku cv2.bz2 przy pomocy biblioteki readr

data <- read_csv("data_StormData.csv.bz2")
## Rows: 902297 Columns: 37
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (18): BGN_DATE, BGN_TIME, TIME_ZONE, COUNTYNAME, STATE, EVTYPE, BGN_AZI,...
## dbl (18): STATE__, COUNTY, BGN_RANGE, COUNTY_END, END_RANGE, LENGTH, WIDTH, ...
## lgl  (1): COUNTYENDN
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(data)
## # A tibble: 6 × 37
##   STATE__ BGN_DATE   BGN_TIME TIME_ZONE COUNTY COUNTYNAME STATE EVTYPE BGN_RANGE
##     <dbl> <chr>      <chr>    <chr>      <dbl> <chr>      <chr> <chr>      <dbl>
## 1       1 4/18/1950… 0130     CST           97 MOBILE     AL    TORNA…         0
## 2       1 4/18/1950… 0145     CST            3 BALDWIN    AL    TORNA…         0
## 3       1 2/20/1951… 1600     CST           57 FAYETTE    AL    TORNA…         0
## 4       1 6/8/1951 … 0900     CST           89 MADISON    AL    TORNA…         0
## 5       1 11/15/195… 1500     CST           43 CULLMAN    AL    TORNA…         0
## 6       1 11/15/195… 2000     CST           77 LAUDERDALE AL    TORNA…         0
## # ℹ 28 more variables: BGN_AZI <chr>, BGN_LOCATI <chr>, END_DATE <chr>,
## #   END_TIME <chr>, COUNTY_END <dbl>, COUNTYENDN <lgl>, END_RANGE <dbl>,
## #   END_AZI <chr>, END_LOCATI <chr>, LENGTH <dbl>, WIDTH <dbl>, F <dbl>,
## #   MAG <dbl>, FATALITIES <dbl>, INJURIES <dbl>, PROPDMG <dbl>,
## #   PROPDMGEXP <chr>, CROPDMG <dbl>, CROPDMGEXP <chr>, WFO <chr>,
## #   STATEOFFIC <chr>, ZONENAMES <chr>, LATITUDE <dbl>, LONGITUDE <dbl>,
## #   LATITUDE_E <dbl>, LONGITUDE_ <dbl>, REMARKS <chr>, REFNUM <dbl>

Dodajemy kolumnę zsumowującą liczbę osób zranionych i zabitych

data <- data %>%
  mutate(FATAL_OR_INJURED = FATALITIES + INJURIES)

data$FATAL_OR_INJURED[1:5]
## [1] 15  0  2  2  2

Podsumowanie wpływu na zdrowie 10 najbardziej wpływowych zjawisk

danger_summary <- data %>%
  group_by(EVTYPE) %>%
  summarise(FATAL_OR_INJURED = sum(FATAL_OR_INJURED, na.rm = TRUE)) %>%
  arrange(desc(FATAL_OR_INJURED)) %>%
  slice(1:10)

Dodajemy kolumny ujednolicające wartości zniszczeń mienia oraz wartości zniszczeń upraw(w miliardach USD). Dodatkowo tworzymy kolumnę zsumowującą dwie poprzednie

convert_to_billions <- function(value, exp) {
  exp <- toupper(exp)
  multiplier <- case_when(
    exp == "K" ~ 1e-6,   
    exp == "M" ~ 1e-3, 
    exp == "B" ~ 1,    
    TRUE ~ 1e-6   
  )
  return(value * multiplier)
}

data <- data %>%
  mutate(
    PROPDMG_B = convert_to_billions(PROPDMG, PROPDMGEXP),
    CROPDMG_B = convert_to_billions(CROPDMG, CROPDMGEXP),
    TOTAL_DAMAGE_B = PROPDMG_B + CROPDMG_B
  )

data[1:5, c("PROPDMG_B", "CROPDMG_B")]
## # A tibble: 5 × 2
##   PROPDMG_B CROPDMG_B
##       <dbl>     <dbl>
## 1 0.000025          0
## 2 0.0000025         0
## 3 0.000025          0
## 4 0.0000025         0
## 5 0.0000025         0

Podsumowanie szkód wykonanych przez 10 najbardziej wpływowych zjawisk

damage_summary <- data %>%
  group_by(EVTYPE) %>%
  summarise(TOTAL_DAMAGE_B = sum(TOTAL_DAMAGE_B, na.rm = TRUE)) %>%
  arrange(desc(TOTAL_DAMAGE_B)) %>%
  slice(1:10)

Wykresy obrazujące ilość rannych i śmierci w zależności od rodzaju zjawiska

ggplot(danger_summary, aes(x = reorder(EVTYPE, FATAL_OR_INJURED), y=FATAL_OR_INJURED)) +
  geom_bar(stat = "identity", fill = "steelblue") + 
  coord_flip() + 
  labs(
    title = "Top 10 katastrof wg ilości rannych i śmierci",
    x = "Typ zdarzenia",
    y = "Liczba rannych i śmierci"
  ) + 
  theme_minimal()

Procent śmierci i rannych generowanych przez najistotniejsze zjawistko

top_1_event <- danger_summary %>%
  slice(1)

total_damage_all <- sum(danger_summary$FATAL_OR_INJURED, na.rm = TRUE)

# Krok 4: Oblicz procent szkód generowanych przez top 1 zdarzenie
top_1_percentage <- (top_1_event$FATAL_OR_INJURED / total_damage_all) * 100

# Krok 5: Drukowanie wyników z tekstem
cat("Procent śmierci i rannych generowanych przez top 1 zdarzenie (", top_1_event$EVTYPE, "): ", round(top_1_percentage, 2), "%\n")
## Procent śmierci i rannych generowanych przez top 1 zdarzenie ( TORNADO ):  70.7 %

Wykresy obrazujące ilość szkód materialnych w zależności od rodzaju zjawiska

ggplot(damage_summary, aes(x = reorder(EVTYPE, TOTAL_DAMAGE_B), y=TOTAL_DAMAGE_B)) + 
  geom_bar(stat = "identity", fill = "steelblue") + 
  coord_flip() + 
  labs(
    title = "Top 10 katastrof wg wartości szkód (w miliardach USD)",
    x = "Typ zdarzenia", 
    y = "Suma szkód (mld USD)"
  ) + 
  theme_minimal()

Procent szkód generowanych przez najistotniesze zjawiska

top_3_events <- damage_summary %>%
  slice(1:3)

total_damage_all <- sum(damage_summary$TOTAL_DAMAGE_B, na.rm = TRUE)

top_3_percentage <- sum(top_3_events$TOTAL_DAMAGE_B) / total_damage_all * 100

cat("Procent szkód generowanych przez top 3 zdarzenia:(", top_3_events$EVTYPE[1], ",", 
    top_3_events$EVTYPE[2], ",",
    top_3_events$EVTYPE[3], ") :",
    round(top_3_percentage, 2), "%\n")
## Procent szkód generowanych przez top 3 zdarzenia:( FLOOD , HURRICANE/TYPHOON , TORNADO ) : 68.53 %

Wyniki

Analiza pokazuje, że najniebezpieczniejszym zjawiskiem dla zdrowia ludzi są tornada, odpowiadają one za 70% wszystkich wypadków. Największy wpływ na stan materialny mają powodzie, huragany i tornada. Ich sumaryczny wpływ to 68.5% wszystkich zjawisk.