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.
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)
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
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.
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.