Streszczenie

Analiza dotyczy zbioru danych o burzach i innych ekstremalnych zjawiskach pogodowych. W pierwszej części omawiane są dane dotyczące zmarłych i rannych z powodu tych ekstremalnych zjawisk pogowych. Po każdej z tych dwóch sekcji jest wykres kołowy dotyczący odpowiednio liczby zmarłych i rannych. Następnie przechodzimy do analizy strat. Zostaje ona podzielona na straty dotyczące upraw i nieruchomości, a na końcu mamy wykres słupkowy 5 zjawisk, które generują największe straty.

Załadowanie odpowiednich bibliotek

Sprawdzanie czy biblioteki są dostępne, jeśli nie to zostają zainstalowane i wczytane.

list.of.packages <- c("ggplot2","dplyr","tidyverse")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
library(ggplot2)
library(tidyverse)
## Warning: pakiet 'tidyverse' został zbudowany w wersji R 4.5.3
## Warning: pakiet 'tidyr' został zbudowany w wersji R 4.5.3
## Warning: pakiet 'purrr' został zbudowany w wersji R 4.5.3
## Warning: pakiet 'dplyr' został zbudowany w wersji R 4.5.3
## Warning: pakiet 'forcats' został zbudowany w wersji R 4.5.3
## Warning: pakiet 'lubridate' został zbudowany w wersji R 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.0     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ lubridate 1.9.5     ✔ tibble    3.3.1
## ✔ purrr     1.2.1     ✔ tidyr     1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)

Przetwarzanie danych

Załadowanie danych

df<-read.csv("./data_StormData.csv.bz2")

Wyświetlenie pierwszych 6 wierszy

dims<-dim(df)
head(df)
##   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
cat("Wymiary zbioru danych to ",dims[1],"x",dims[2])
## Wymiary zbioru danych to  902297 x 37

Nazwy kolumn w zbiorze:

colnames(df)
##  [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"
cat("Mamy:",length(unique(df$EVTYPE)),"różnych typów zjawisk")
## Mamy: 985 różnych typów zjawisk

Zliczanie najbardziej śmiertelnych zjawisk

Zliczamy liczbę zmarłych grupując ich po rodzaju zjawiska i sortując malejąco

most_fatal_ev<-df%>%
  group_by(EVTYPE)%>%
  summarise(TOTAL_FATALITIES=sum(FATALITIES))%>%
  arrange(desc(TOTAL_FATALITIES))

6 najbardziej śmiertelnych zjawisk to:

head(most_fatal_ev)
## # A tibble: 6 × 2
##   EVTYPE         TOTAL_FATALITIES
##   <chr>                     <dbl>
## 1 TORNADO                    5633
## 2 EXCESSIVE HEAT             1903
## 3 FLASH FLOOD                 978
## 4 HEAT                        937
## 5 LIGHTNING                   816
## 6 TSTM WIND                   504

Sumujac wszystkie śmierci poza tornadem otrzymujemy:

cum_sum<-sum(most_fatal_ev[2:nrow(most_fatal_ev),2])
cum_sum
## [1] 9512
wz <- format((most_fatal_ev[1, 2]/cum_sum)[1,]*100,digits=3,nsmall=2)
bzw <- format((most_fatal_ev[1,2]/(cum_sum+most_fatal_ev[1,2]))[1,]*100,digits = 3,nsmall = 2)
cat("Śmierci z powodu tornad stanowią",wz,"% części śmierci spowodwanych z innych przyczyn oraz ",bzw,"% zgonów łącznie.")
## Śmierci z powodu tornad stanowią 59.22 % części śmierci spowodwanych z innych przyczyn oraz  37.19 % zgonów łącznie.

Tworzymy wykres kołowy dotyczący danych

ggplot(most_fatal_ev%>%slice(1:10), aes(x = "", y = TOTAL_FATALITIES, fill = EVTYPE)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) + 
  labs(
    title = "Proporcje śmierci przez zjawiska (top 10)",
    fill = "Rodzaj"
  ) +
  theme_void() +  
  theme(legend.position = "right")  

Najwięcej śmierci z powodu zjawisk atmosferycznych powodują tornada, następnie są to wysokie upały, powodzie, upały, błyskawice, silne wiatry oraz powodzie. ## Zliczanie rannych

Zliczamy liczbę rannych grupując ich po rodzaju zjawiska i sortując malejąco:

most_injury_ev<-df%>%
  group_by(EVTYPE)%>%
  summarise(TOTAL_INJURIES=sum(INJURIES))%>%
  arrange(desc(TOTAL_INJURIES))

6 zjawisk o najwyższej liczbie rannych

head(most_injury_ev)
## # A tibble: 6 × 2
##   EVTYPE         TOTAL_INJURIES
##   <chr>                   <dbl>
## 1 TORNADO                 91346
## 2 TSTM WIND                6957
## 3 FLOOD                    6789
## 4 EXCESSIVE HEAT           6525
## 5 LIGHTNING                5230
## 6 HEAT                     2100

Sumujac wszystkie śmierci poza tornadem otrzymujemy:

cum_sum<-sum(most_injury_ev[2:nrow(most_injury_ev),2])
cum_sum
## [1] 49182
stosunek<-format((most_injury_ev[1,2]/cum_sum)[1,],digits=3)
cat("Stosunek rannych z powodu tornada do łącznej sumy rannych z powodów innych to :",stosunek)
## Stosunek rannych z powodu tornada do łącznej sumy rannych z powodów innych to : 1.86

Tworzymy wykres kołowy dotyczący rannych.

ggplot(most_injury_ev%>%slice(1:10), aes(x = "", y = TOTAL_INJURIES, fill = EVTYPE)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) + 
  labs(
    title = "Proporcje rannych przez zjawiska (top 10)",
    fill = "Rodzaj"
  ) +
  theme_void() +  
  theme(legend.position = "right")  

Największą liczbę rannych cechują tornada, a w pierwszej 10-tce znajdują się też burze z piorunami, porażenia piorunami, silne wiatry, zamiecie, powodzie oraz wysokie upały. ## Największe straty ekonomiczne

Zliczamy straty, tj. z upraw i zniszczonych nieruchomości, oraz sumujemy obydwie kategorie i po niej sortujemy malejąco.

economic_dmgs <- df%>%
  group_by(EVTYPE)%>%
  summarise(PropertyDMG = sum(PROPDMG), CropDMG = sum(CROPDMG))%>%
  mutate(total_dmg = PropertyDMG + CropDMG)%>%
  arrange(desc(total_dmg))

Pierwsze na liście jest tornado:

economic_dmgs[1,]
## # A tibble: 1 × 4
##   EVTYPE  PropertyDMG CropDMG total_dmg
##   <chr>         <dbl>   <dbl>     <dbl>
## 1 TORNADO    3212258. 100019.  3312277.

Ponownie tornada mają największy negatywny wpływ na ekonomie.

economic_dmgs%>%
  arrange(desc(PropertyDMG))%>%slice(1)
## # A tibble: 1 × 4
##   EVTYPE  PropertyDMG CropDMG total_dmg
##   <chr>         <dbl>   <dbl>     <dbl>
## 1 TORNADO    3212258. 100019.  3312277.

Tornada prowadzą też w stratach dotyczących nieruchomości.

economic_dmgs%>%
  arrange(desc(CropDMG))%>%slice(1)
## # A tibble: 1 × 4
##   EVTYPE PropertyDMG CropDMG total_dmg
##   <chr>        <dbl>   <dbl>     <dbl>
## 1 HAIL       688693. 579596.  1268290.

Za to w stratach dotyczącyh upraw największy wpływ ma grad.

Wybieramy pieć zjawisk o największej sumie strat i przetwarzamy jee na dane w formacie “long”.

top_5_dmg <- economic_dmgs %>%
  arrange(desc(total_dmg)) %>%
  slice(1:5)  

top_5_long <- top_5_dmg %>%
  pivot_longer(
    cols = c(PropertyDMG, CropDMG),
    names_to = "Rodzaj",
    values_to = "Wartość"
  )

Tworzymy wykres słupkowy zawierający powyższe dane, podzielone na straty w obu kategoriach.

ggplot(top_5_long, aes(x = EVTYPE, y = Wartość, fill = Rodzaj)) +
  geom_col(position = "dodge") +
  labs(
    title = "5 zjawisk o najwyższych stratach",
    x = "Zjawisko",
    y = "Wartość",
    fill = "Rodzaj"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotate x-axis labels

W ierwszej piątce zjawisk, które powodują największe straty ekonomiczne są tornada, powodzie, silne wiatry, i grad.

Wyniki

Okazuje się, że tornada są najgorszą formą ekstremalnych zjawisk. Spowodowały, w okresie 1950-2011, najwięcej śmierci i rannych. Drugie miejsce pod względem śmierci ma tylko około 2000, gdzie tornada mają prawie 3 razy więcej zgonów, na poziomie 5600. Jeśli dotyczy to rannych, to mamy jeszcze większą przewagę tornad, gdzie rannych z ich powodu jest prawie 2 razy więcej niż suma całej pozostałej reszty. Łącznie z powodu tornad, w okresie 60 lat, było 91 tys. osób. Liczone zostały tylko straty na nieruchomościach i uprawach. W stratach ekonomicznych ponownie tornada powodują ich najwięcej, jeśli chodzi o straty ssumowane w obu kategoriach. Prowadzą też w kategorii nieruchomości, ale jeśli chodzi o uprawy to jednak grad spowodował ich w tym okresie więcej.