Celem analizy było zbadanie wpływu ekstremalnych zjawisk pogodowych
na zdrowie ludności oraz gospodarkę Stanów Zjednoczonych na podstawie
danych NOAA Storm Database. W analizie wykorzystano dane obejmujące lata
1950–2011, zawierające informacje o rodzaju zjawiska, liczbie ofiar
śmiertelnych, liczbie rannych oraz stratach materialnych. Dane zostały
wczytane bezpośrednio z oryginalnego pliku .csv.bz2 oraz
poddane podstawowemu przetwarzaniu i agregacji. W celu oceny wpływu
zjawisk na zdrowie publiczne przeanalizowano łączną liczbę ofiar
śmiertelnych i rannych dla każdego typu zdarzenia. Następnie obliczono
całkowite straty ekonomiczne uwzględniające szkody majątkowe oraz straty
w uprawach. Wyniki przedstawiono za pomocą tabel i wykresów słupkowych.
Analiza wykazała, że tornada należą do najbardziej niebezpiecznych
zjawisk pod względem liczby ofiar i rannych. Największe straty
ekonomiczne powodowały natomiast powodzie, huragany oraz sztormy.
Uzyskane wyniki mogą wspierać planowanie działań związanych z
zarządzaniem kryzysowym i alokacją zasobów.
Dane zostały pobrane z bazy NOAA Storm Database i wczytane
bezpośrednio z oryginalnego pliku skompresowanego .csv.bz2.
Do importu danych wykorzystano funkcję fread() z pakietu
data.table, która umożliwia szybkie wczytywanie dużych
zbiorów danych oraz automatyczne rozpoznawanie typów zmiennych.
Po wczytaniu danych przeprowadzono podstawowe przetwarzanie
obejmujące wybór zmiennych istotnych dla analizy oraz konwersję wartości
strat ekonomicznych do wspólnej jednostki liczbowej. W bazie danych
wielkości szkód zapisane są w dwóch kolumnach: wartość liczbową
(PROPDMG, CROPDMG) oraz oznaczenie jednostki
(PROPDMGEXP, CROPDMGEXP). Oznaczenia takie jak
K, M oraz B zostały odpowiednio
przekształcone na tysiące, miliony i miliardy.
Wpływ zjawisk pogodowych na zdrowie ludności oceniono na podstawie
łącznej liczby ofiar śmiertelnych (FATALITIES) oraz rannych
(INJURIES) dla każdego typu zdarzenia
(EVTYPE). Straty ekonomiczne obliczono jako sumę szkód
majątkowych i strat w uprawach.
Do agregacji i wizualizacji danych wykorzystano pakiety
dplyr oraz ggplot2.
knitr::opts_chunk$set(echo = TRUE)
str(storm_data)
## Classes 'data.table' and 'data.frame': 902297 obs. of 37 variables:
## $ STATE__ : num 1 1 1 1 1 1 1 1 1 1 ...
## $ BGN_DATE : chr "4/18/1950 0:00:00" "4/18/1950 0:00:00" "2/20/1951 0:00:00" "6/8/1951 0:00:00" ...
## $ BGN_TIME : chr "0130" "0145" "1600" "0900" ...
## $ TIME_ZONE : chr "CST" "CST" "CST" "CST" ...
## $ COUNTY : num 97 3 57 89 43 77 9 123 125 57 ...
## $ COUNTYNAME: chr "MOBILE" "BALDWIN" "FAYETTE" "MADISON" ...
## $ STATE : chr "AL" "AL" "AL" "AL" ...
## $ EVTYPE : chr "TORNADO" "TORNADO" "TORNADO" "TORNADO" ...
## $ BGN_RANGE : num 0 0 0 0 0 0 0 0 0 0 ...
## $ BGN_AZI : chr "" "" "" "" ...
## $ BGN_LOCATI: chr "" "" "" "" ...
## $ END_DATE : chr "" "" "" "" ...
## $ END_TIME : chr "" "" "" "" ...
## $ COUNTY_END: num 0 0 0 0 0 0 0 0 0 0 ...
## $ COUNTYENDN: logi NA NA NA NA NA NA ...
## $ END_RANGE : num 0 0 0 0 0 0 0 0 0 0 ...
## $ END_AZI : chr "" "" "" "" ...
## $ END_LOCATI: chr "" "" "" "" ...
## $ LENGTH : num 14 2 0.1 0 0 1.5 1.5 0 3.3 2.3 ...
## $ WIDTH : num 100 150 123 100 150 177 33 33 100 100 ...
## $ F : int 3 2 2 2 2 2 2 1 3 3 ...
## $ MAG : num 0 0 0 0 0 0 0 0 0 0 ...
## $ FATALITIES: num 0 0 0 0 0 0 0 0 1 0 ...
## $ INJURIES : num 15 0 2 2 2 6 1 0 14 0 ...
## $ PROPDMG : num 25 2.5 25 2.5 2.5 2.5 2.5 2.5 25 25 ...
## $ PROPDMGEXP: chr "K" "K" "K" "K" ...
## $ CROPDMG : num 0 0 0 0 0 0 0 0 0 0 ...
## $ CROPDMGEXP: chr "" "" "" "" ...
## $ WFO : chr "" "" "" "" ...
## $ STATEOFFIC: chr "" "" "" "" ...
## $ ZONENAMES : chr "" "" "" "" ...
## $ LATITUDE : num 3040 3042 3340 3458 3412 ...
## $ LONGITUDE : num 8812 8755 8742 8626 8642 ...
## $ LATITUDE_E: num 3051 0 0 0 0 ...
## $ LONGITUDE_: num 8806 0 0 0 0 ...
## $ REMARKS : chr "" "" "" "" ...
## $ REFNUM : num 1 2 3 4 5 6 7 8 9 10 ...
## - attr(*, ".internal.selfref")=<externalptr>
knitr::opts_chunk$set(echo = TRUE)
summary(storm_data)
## STATE__ BGN_DATE BGN_TIME TIME_ZONE
## Min. : 1.0 Length:902297 Length:902297 Length:902297
## 1st Qu.:19.0 Class :character Class :character Class :character
## Median :30.0 Mode :character Mode :character Mode :character
## Mean :31.2
## 3rd Qu.:45.0
## Max. :95.0
##
## COUNTY COUNTYNAME STATE EVTYPE
## Min. : 0.0 Length:902297 Length:902297 Length:902297
## 1st Qu.: 31.0 Class :character Class :character Class :character
## Median : 75.0 Mode :character Mode :character Mode :character
## Mean :100.6
## 3rd Qu.:131.0
## Max. :873.0
##
## BGN_RANGE BGN_AZI BGN_LOCATI END_DATE
## Min. : 0.000 Length:902297 Length:902297 Length:902297
## 1st Qu.: 0.000 Class :character Class :character Class :character
## Median : 0.000 Mode :character Mode :character Mode :character
## Mean : 1.484
## 3rd Qu.: 1.000
## Max. :3749.000
##
## END_TIME COUNTY_END COUNTYENDN END_RANGE
## Length:902297 Min. :0 Mode:logical Min. : 0.0000
## Class :character 1st Qu.:0 NA's:902297 1st Qu.: 0.0000
## Mode :character Median :0 Median : 0.0000
## Mean :0 Mean : 0.9862
## 3rd Qu.:0 3rd Qu.: 0.0000
## Max. :0 Max. :925.0000
##
## END_AZI END_LOCATI LENGTH WIDTH
## Length:902297 Length:902297 Min. : 0.0000 Min. : 0.000
## Class :character Class :character 1st Qu.: 0.0000 1st Qu.: 0.000
## Mode :character Mode :character Median : 0.0000 Median : 0.000
## Mean : 0.2301 Mean : 7.503
## 3rd Qu.: 0.0000 3rd Qu.: 0.000
## Max. :2315.0000 Max. :4400.000
##
## F MAG FATALITIES INJURIES
## Min. :0.00 Min. : 0.0 Min. : 0.00000 Min. : 0.0000
## 1st Qu.:0.00 1st Qu.: 0.0 1st Qu.: 0.00000 1st Qu.: 0.0000
## Median :1.00 Median : 50.0 Median : 0.00000 Median : 0.0000
## Mean :0.91 Mean : 46.9 Mean : 0.01678 Mean : 0.1557
## 3rd Qu.:1.00 3rd Qu.: 75.0 3rd Qu.: 0.00000 3rd Qu.: 0.0000
## Max. :5.00 Max. :22000.0 Max. :583.00000 Max. :1700.0000
## NA's :843563
## PROPDMG PROPDMGEXP CROPDMG CROPDMGEXP
## Min. : 0.00 Length:902297 Min. : 0.000 Length:902297
## 1st Qu.: 0.00 Class :character 1st Qu.: 0.000 Class :character
## Median : 0.00 Mode :character Median : 0.000 Mode :character
## Mean : 12.06 Mean : 1.527
## 3rd Qu.: 0.50 3rd Qu.: 0.000
## Max. :5000.00 Max. :990.000
##
## WFO STATEOFFIC ZONENAMES LATITUDE
## Length:902297 Length:902297 Length:902297 Min. : 0
## Class :character Class :character Class :character 1st Qu.:2802
## Mode :character Mode :character Mode :character Median :3540
## Mean :2875
## 3rd Qu.:4019
## Max. :9706
## NA's :47
## LONGITUDE LATITUDE_E LONGITUDE_ REMARKS
## Min. :-14451 Min. : 0 Min. :-14455 Length:902297
## 1st Qu.: 7247 1st Qu.: 0 1st Qu.: 0 Class :character
## Median : 8707 Median : 0 Median : 0 Mode :character
## Mean : 6940 Mean :1452 Mean : 3509
## 3rd Qu.: 9605 3rd Qu.:3549 3rd Qu.: 8735
## Max. : 17124 Max. :9706 Max. :106220
## NA's :40
## REFNUM
## Min. : 1
## 1st Qu.:225575
## Median :451149
## Mean :451149
## 3rd Qu.:676723
## Max. :902297
##
knitr::opts_chunk$set(echo = TRUE)
convert_exp <- function(exp) {
case_when(
exp == "K" ~ 1e3,
exp == "M" ~ 1e6,
exp == "B" ~ 1e9,
)
}
storm_data <- storm_data %>%
mutate(
PROPDMG_TOTAL = PROPDMG * convert_exp(PROPDMGEXP),
CROPDMG_TOTAL = CROPDMG * convert_exp(CROPDMGEXP),
TOTAL_DAMAGE = PROPDMG_TOTAL + CROPDMG_TOTAL,
)
knitr::opts_chunk$set(echo = TRUE)
health_damage <- storm_data %>%
group_by(EVTYPE) %>%
summarise(
fatalities = sum(FATALITIES, na.rm=TRUE),
injuries = sum(INJURIES, na.rm=TRUE),
) %>%
arrange(desc(fatalities + injuries))
head(health_damage)
## # A tibble: 6 × 3
## EVTYPE fatalities injuries
## <chr> <dbl> <dbl>
## 1 TORNADO 5633 91346
## 2 EXCESSIVE HEAT 1903 6525
## 3 TSTM WIND 504 6957
## 4 FLOOD 470 6789
## 5 LIGHTNING 816 5230
## 6 HEAT 937 2100
economic_damage <- storm_data %>%
group_by(EVTYPE) %>%
summarise(
total_damage = sum(TOTAL_DAMAGE, na.rm=TRUE)
) %>%
arrange(desc(total_damage))
head(economic_damage, 10)
## # A tibble: 10 × 2
## EVTYPE total_damage
## <chr> <dbl>
## 1 FLOOD 138007444500
## 2 HURRICANE/TYPHOON 29348167800
## 3 TORNADO 16520148150
## 4 HURRICANE 12405268000
## 5 RIVER FLOOD 10108369000
## 6 HAIL 10019978590
## 7 FLASH FLOOD 8715295130
## 8 ICE STORM 5925147300
## 9 STORM SURGE/TIDE 4641493000
## 10 THUNDERSTORM WIND 3813647990
knitr::opts_chunk$set(echo = TRUE)
health_top <- storm_data %>%
group_by(EVTYPE) %>%
summarise(
health_total_damage = sum(FATALITIES + INJURIES, na.rm = TRUE)
) %>%
arrange(desc(health_total_damage)) %>%
slice_head(n=10)
ggplot( data=health_top, aes(x=EVTYPE, y=health_total_damage)) +
geom_col(fill="blue") +
coord_flip() +
labs(
title = "Najbardziej szkodliwe zjawiska pogodowe dla zdrowia",
x = "Typ zjawiska",
y = "Liczba ofiar i rannych"
) +
theme_gray()
knitr::opts_chunk$set(echo = TRUE)
economic_top <- economic_damage %>%
slice_head(n=10)
ggplot( data=economic_top, aes(x=EVTYPE, y=total_damage / 1e9)) +
geom_col(fill="red") +
coord_flip() +
labs(
title = "Zjawiska powodujące największe straty ekonomiczne",
x = "Typ zjawiska",
y = "Straty ekonomiczne [mld USD]"
) +
theme_gray()