Streszczenie

Analiza została przeprowadzona na podstawie danych pochodzących z bazy NOAA Storm Events Database, udostępnionych w pliku repdata_data_StormData.csv.bz2. Celem było zbadanie wpływu ekstremalnych zjawisk pogodowych na zdrowie ludności oraz straty ekonomiczne w Stanach Zjednoczonych w latach 1950–2011. Dane zostały wczytane bezpośrednio z surowego pliku CSV i przetworzone w języku R. Analiza obejmowała obliczenie liczby ofiar śmiertelnych oraz rannych w wyniku różnych typów zjawisk pogodowych. Dodatkowo oszacowano łączne straty w mieniu i uprawach, uwzględniając przeliczniki wielkości strat zapisane w danych. W wyniku agregacji wyłoniono dziesięć typów zjawisk najbardziej szkodliwych dla zdrowia ludności oraz powodujących największe straty ekonomiczne. Wizualizacja danych została wykonana w postaci dwóch wykresów słupkowych przedstawiających odpowiednio wpływ na zdrowie i straty ekonomiczne. Analiza wykazała, że tornada były najgroźniejszym zjawiskiem dla zdrowia, powodując najwięcej ofiar. Największe straty ekonomiczne spowodowały powodzie, znacząco przewyższając inne zjawiska pod względem wartości szkód.

Przetwarzanie danych

Wczytanie i sprawdzenie struktury danych

W pierwszej kolejności dane zostały wczytane bezpośrednio z surowego pliku repdata_data_StormData.csv.bz2, pochodzącego z bazy NOAA Storm Events Database. Do wczytania danych wykorzystano funkcję read_csv() z pakietu readr. Po zaimportowaniu danych przeprowadzono wstępną eksplorację przy użyciu funkcji str() oraz names(), aby uzyskać informacje o strukturze zbioru, liczbie zmiennych i ich typach. Pozwoliło to na świadome zaplanowanie dalszych etapów przetwarzania.

# Wczytanie danych z surowego pliku
storm_data <- read_csv("repdata_data_StormData.csv.bz2", show_col_types = FALSE)

# Podgląd struktury danych
str(storm_data)

# Sprawdzenie nazw kolumn
names(storm_data)

Analiza wpływu na zdrowie

W celu analizy skutków zdrowotnych wybrano kolumny EVTYPE (typ zjawiska), FATALITIES (liczba ofiar śmiertelnych) oraz INJURIES (liczba rannych). Następnie dane zostały zgrupowane według typu zjawiska (group_by(EVTYPE)), a dla każdej grupy obliczono łączną liczbę ofiar śmiertelnych i rannych (summarise()). Aby umożliwić czytelne przedstawienie wyników na wykresie, dane przekształcono do formatu “długiego” (pivot_longer()), gdzie każdy wiersz odpowiadał jednej kategorii ofiar (zgony lub ranni). Dodatkowo, w celu poprawy przejrzystości wykresu, kategorie zmieniono na polskie odpowiedniki (“Zgony” oraz “Ranni”) przy użyciu funkcji recode().

# Przygotowanie danych zdrowotnych
health_data <- storm_data %>%
  select(EVTYPE, FATALITIES, INJURIES) %>%
  group_by(EVTYPE) %>%
  summarise(
    Total_Fatalities = sum(FATALITIES, na.rm = TRUE),
    Total_Injuries = sum(INJURIES, na.rm = TRUE),
    Total_Impact = Total_Fatalities + Total_Injuries
  ) %>%
  arrange(desc(Total_Impact)) %>%
  slice_head(n = 10)

# Zmiana formatu na długi
health_long <- health_data %>%
  select(EVTYPE, Total_Fatalities, Total_Injuries) %>%
  pivot_longer(cols = c(Total_Fatalities, Total_Injuries),
               names_to = "Impact_Type",
               values_to = "Count")

# Tłumaczenie nazw na polski
health_long$Impact_Type <- recode(health_long$Impact_Type,
                                  "Total_Fatalities" = "Zgony",
                                  "Total_Injuries" = "Ranni")

health_long
## # A tibble: 20 × 3
##    EVTYPE            Impact_Type Count
##    <chr>             <chr>       <dbl>
##  1 TORNADO           Zgony        5633
##  2 TORNADO           Ranni       91346
##  3 EXCESSIVE HEAT    Zgony        1903
##  4 EXCESSIVE HEAT    Ranni        6525
##  5 TSTM WIND         Zgony         504
##  6 TSTM WIND         Ranni        6957
##  7 FLOOD             Zgony         470
##  8 FLOOD             Ranni        6789
##  9 LIGHTNING         Zgony         816
## 10 LIGHTNING         Ranni        5230
## 11 HEAT              Zgony         937
## 12 HEAT              Ranni        2100
## 13 FLASH FLOOD       Zgony         978
## 14 FLASH FLOOD       Ranni        1777
## 15 ICE STORM         Zgony          89
## 16 ICE STORM         Ranni        1975
## 17 THUNDERSTORM WIND Zgony         133
## 18 THUNDERSTORM WIND Ranni        1488
## 19 WINTER STORM      Zgony         206
## 20 WINTER STORM      Ranni        1321

Analiza strat ekonomicznych

W drugiej części analizy skupiono się na ekonomicznych skutkach zjawisk pogodowych. Wybrano kolumny związane ze stratami materialnymi: PROPDMG, PROPDMGEXP (straty w mieniu oraz ich mnożniki) i CROPDMG, CROPDMGEXP (straty w uprawach oraz ich mnożniki). Ponieważ wartości w kolumnach PROPDMGEXP i CROPDMGEXP były zapisane jako symbole oznaczające rzędy wielkości (np. K, M, B), utworzono funkcję convert_exp(), która zamieniała te symbole na odpowiednie potęgi dziesięciu. Następnie obliczono rzeczywiste wartości strat w mieniu (PROP_DAMAGE) oraz w uprawach (CROP_DAMAGE) poprzez przemnożenie podstawowych wartości strat przez odpowiadające im przeliczniki. Podobnie jak w analizie zdrowotnej, dane zagregowano według typu zjawiska, a następnie przekształcono do formatu “długiego”, umożliwiającego czytelną wizualizację. Nazwy kategorii strat zostały przetłumaczone na język polski jako “Straty w mieniu” oraz “Straty w uprawach”.

# Przygotowanie danych ekonomicznych
economic_data <- storm_data %>%
  select(EVTYPE, PROPDMG, PROPDMGEXP, CROPDMG, CROPDMGEXP)

# Funkcja konwertująca mnożniki
convert_exp <- function(exp) {
  if (exp %in% c('h', 'H')) return(10^2)
  if (exp %in% c('k', 'K')) return(10^3)
  if (exp %in% c('m', 'M')) return(10^6)
  if (exp %in% c('b', 'B')) return(10^9)
  if (exp %in% c('0')) return(10^0)
  if (exp %in% c('1')) return(10^1)
  if (exp %in% c('2')) return(10^2)
  if (exp %in% c('3')) return(10^3)
  if (exp %in% c('4')) return(10^4)
  if (exp %in% c('5')) return(10^5)
  if (exp %in% c('6')) return(10^6)
  if (exp %in% c('7')) return(10^7)
  if (exp %in% c('8')) return(10^8)
  else return(1)
}

# Konwersja wartości strat
economic_data <- economic_data %>%
  mutate(
    PROPDMGEXP = sapply(PROPDMGEXP, convert_exp),
    CROPDMGEXP = sapply(CROPDMGEXP, convert_exp),
    PROP_DAMAGE = PROPDMG * PROPDMGEXP,
    CROP_DAMAGE = CROPDMG * CROPDMGEXP,
    TOTAL_DAMAGE = PROP_DAMAGE + CROP_DAMAGE
  )

# Agregacja danych
economic_summary <- economic_data %>%
  group_by(EVTYPE) %>%
  summarise(
    Total_Property_Damage = sum(PROP_DAMAGE, na.rm = TRUE),
    Total_Crop_Damage = sum(CROP_DAMAGE, na.rm = TRUE)
  ) %>%
  mutate(
    Total_Damage = Total_Property_Damage + Total_Crop_Damage
  ) %>%
  arrange(desc(Total_Damage)) %>%
  slice_head(n = 10)

# Zmiana formatu na długi
economic_long <- economic_summary %>%
  select(EVTYPE, Total_Property_Damage, Total_Crop_Damage) %>%
  pivot_longer(cols = c(Total_Property_Damage, Total_Crop_Damage),
               names_to = "Damage_Type",
               values_to = "Damage")

# Tłumaczenie nazw na polski
economic_long$Damage_Type <- recode(economic_long$Damage_Type,
                                    "Total_Property_Damage" = "Straty w mieniu",
                                    "Total_Crop_Damage" = "Straty w uprawach")

economic_long
## # A tibble: 20 × 3
##    EVTYPE            Damage_Type              Damage
##    <chr>             <chr>                     <dbl>
##  1 FLOOD             Straty w mieniu   144657709807 
##  2 FLOOD             Straty w uprawach   5661968450 
##  3 HURRICANE/TYPHOON Straty w mieniu    69305840000 
##  4 HURRICANE/TYPHOON Straty w uprawach   2607872800 
##  5 TORNADO           Straty w mieniu    56947380676.
##  6 TORNADO           Straty w uprawach    414953270 
##  7 STORM SURGE       Straty w mieniu    43323536000 
##  8 STORM SURGE       Straty w uprawach         5000 
##  9 HAIL              Straty w mieniu    15735267513.
## 10 HAIL              Straty w uprawach   3025954473 
## 11 FLASH FLOOD       Straty w mieniu    16822723978.
## 12 FLASH FLOOD       Straty w uprawach   1421317100 
## 13 DROUGHT           Straty w mieniu     1046106000 
## 14 DROUGHT           Straty w uprawach  13972566000 
## 15 HURRICANE         Straty w mieniu    11868319010 
## 16 HURRICANE         Straty w uprawach   2741910000 
## 17 RIVER FLOOD       Straty w mieniu     5118945500 
## 18 RIVER FLOOD       Straty w uprawach   5029459000 
## 19 ICE STORM         Straty w mieniu     3944927860 
## 20 ICE STORM         Straty w uprawach   5022113500

Wyniki

Analiza wpływu na zdrowie

# Wykres ofiar
ggplot(health_long, aes(x = reorder(EVTYPE, Count), y = Count, fill = Impact_Type)) +
  geom_bar(stat='identity') +
  coord_flip() +
  labs(
    x = "Typ zjawiska",
    y = "Liczba osób poszkodowanych (zgony + ranni)",
    fill = "Typ ofiar",
    title = "Top 10 typów zjawisk pogodowych najbardziej szkodliwych\ndla zdrowia ludności w Stanach Zjednoczonych (1950–2011)"
  ) +
  scale_fill_manual(values = c("Zgony" = "#FF6F61", "Ranni" = "#00BFC4")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Na podstawie wygenerowanego wykresu stwierdzono, że największy wpływ na zdrowie ludności w Stanach Zjednoczonych miały tornada. Tornada spowodowały zdecydowanie największą liczbę poszkodowanych, zarówno pod względem liczby rannych, jak i ofiar śmiertelnych. Łączna liczba ofiar tornad była ponad dziesięciokrotnie wyższa niż dla drugiego w kolejności typu zjawiska – fali upałów. W dalszej kolejności największe skutki zdrowotne powodowały: silne wiatry burzowe, powodzie oraz wyładowania atmosferyczne. Wśród pierwszej dziesiątki dominowały zjawiska związane z wiatrem i burzami, takie jak wiatr burzowy oraz burza zimowa.

W analizowanych przypadkach liczba rannych znacząco przewyższała liczbę ofiar śmiertelnych, co wskazuje na wysokie ryzyko odniesienia obrażeń przy relatywnie niższym, choć nadal istotnym, ryzyku śmierci.

Wyniki wskazują, że działania prewencyjne powinny koncentrować się przede wszystkim na ochronie przed skutkami tornad oraz fal upałów.

Analiza strat ekonomicznych

# Wykres strat
ggplot(economic_long, aes(x = reorder(EVTYPE, Damage), y = Damage, fill = Damage_Type)) +
  geom_bar(stat='identity') +
  coord_flip() +
  labs(
    x = "Typ zjawiska",
    y = "Straty ekonomiczne (USD)",
    fill = "Rodzaj strat",
    title = "Top 10 typów zjawisk pogodowych powodujących największe\n straty ekonomiczne w Stanach Zjednoczonych (1950–2011)"
  ) +
  scale_fill_manual(values = c(
    "Straty w mieniu" = "#00BFC4",
    "Straty w uprawach" = "#FF6F61"
  )) +
  theme_minimal()

Analiza strat ekonomicznych na podstawie wykresu wykazała, że największe szkody w Stanach Zjednoczonych w latach 1950–2011 spowodowały powodzie, które wygenerowały straty przekraczające 150 miliardów dolarów, znacznie przewyższając wszystkie inne typy zjawisk. Na drugim miejscu znalazły się huragany i tajfuny, które odpowiadały za bardzo wysokie koszty, głównie w wyniku zniszczeń mienia. Trzecim typem zjawiska pod względem wysokości strat były tornada, a kolejnymi: sztormowe fale przypływowe oraz grad. Wśród dziesięciu najkosztowniejszych typów zdarzeń znalazły się także: gwałtowne powodzie, susze, huragany, powodzie rzeczne oraz burze lodowe.

W większości przypadków dominowały straty w mieniu, natomiast w przypadku suszy obserwowano odwrotną sytuację — susze generowały głównie straty w uprawach, stanowiące większość łącznych strat ekonomicznych związanych z tym zjawiskiem. Wysoki udział strat w uprawach zauważono również w przypadku burzy lodowych oraz powodzi rzecznych.

Wyniki jednoznacznie wskazują, że ekstremalne zjawiska wodne, takie jak powodzie i tajfuny, były głównym źródłem strat ekonomicznych w analizowanym okresie, natomiast susze miały największy wpływ na sektor rolniczy.