Synopsis

Understanding adverse weather events, their risk to human safety, and their financial burden is vital. With adverse weather events trending up in frequency, it is important to identify the most dangerous and economically challenging. Herein, we analyze adverse weather data collected from over 60 years. Due to the advancements in data collection, we narrowed our focus to just under 20 years. After careful consideration, I found that “excessive heat” is one of the most dangerous weather events and that it is increasing at a greater frequency than other adverse events. Hurricanes and flooding pose the greatest economic risk and are also increasing in frequency, albeit to a lesser extent. Steps should be taken in prediction, prevention, and protection against such adverse weather events.

Data Processing

Let’s start by setting up our initial global environment that we will be working in.

## Check our current working directory
#getwd()
## If it is not what we wanted set working directory
#setwd() 
## Clear our global environment to start
rm(list=ls())
## Load our usual libraries
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.4.4     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── 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(reshape2)
## 
## Attaching package: 'reshape2'
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(ggpubr)
## Get our Session Info for reproducibility
sessionInfo()
## R version 4.3.2 (2023-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 22621)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: America/Denver
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] ggpubr_0.6.0    reshape2_1.4.4  lubridate_1.9.3 forcats_1.0.0  
##  [5] stringr_1.5.1   purrr_1.0.2     readr_2.1.5     tidyr_1.3.1    
##  [9] tibble_3.2.1    ggplot2_3.4.4   tidyverse_2.0.0 dplyr_1.1.4    
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.8        utf8_1.2.4        generics_0.1.3    rstatix_0.7.2    
##  [5] stringi_1.8.3     hms_1.1.3         digest_0.6.34     magrittr_2.0.3   
##  [9] evaluate_0.23     grid_4.3.2        timechange_0.3.0  fastmap_1.1.1    
## [13] plyr_1.8.9        jsonlite_1.8.8    backports_1.4.1   fansi_1.0.6      
## [17] scales_1.3.0      jquerylib_0.1.4   abind_1.4-5       cli_3.6.2        
## [21] rlang_1.1.3       munsell_0.5.0     withr_3.0.0       cachem_1.0.8     
## [25] yaml_2.3.8        tools_4.3.2       tzdb_0.4.0        ggsignif_0.6.4   
## [29] colorspace_2.1-0  broom_1.0.5       vctrs_0.6.5       R6_2.5.1         
## [33] lifecycle_1.0.4   car_3.1-2         pkgconfig_2.0.3   pillar_1.9.0     
## [37] bslib_0.6.1       gtable_0.3.4      glue_1.7.0        Rcpp_1.0.12      
## [41] xfun_0.41         tidyselect_1.2.0  rstudioapi_0.15.0 knitr_1.45       
## [45] htmltools_0.5.7   carData_3.0-5     rmarkdown_2.25    compiler_4.3.2

A copy of the data was obtained from the coursera website at link:
https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2
More information on the Storm Data Dataset can be found here:
https://d396qusza40orc.cloudfront.net/repdata%2Fpeer2_doc%2Fpd01016005curr.pdf
or
https://d396qusza40orc.cloudfront.net/repdata%2Fpeer2_doc%2FNCDC%20Storm%20Events-FAQ%20Page.pdf

Data was obtained on 2024-02-29 15:33:00MST

# Create a directory to store our raw data
if(!file.exists("./data")){dir.create("./data")}
# Download the data to the directory
fileurl<-"https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
download.file(fileurl,destfile="./data/stormdata.csv.bz2",method="curl")
dateDownloaded<-date()
# We should be able to use read.csv to unzip a bz2 file
data<-read.csv("./data/stormdata.csv.bz2")

Just a general look at the data and there are a few things that I want to do off the bat to clean it up a little. We can narrow down a lot of our variables because we have a specific question in mind. I would also like variable headers that are a little easier to work with and I want to do something with the date and time columns. Let’s start with trimming the data set the column headers because that’s easy.

We are addressing two main questions here. Which types of weather are the most harmful to the populations health? Vital Data: event type, Fatalities, Injuries. The second question is across the US, which has the greatest Economic impact? Vital Data: event type, property damage, propdmgexp,cropdmg,cropdmgexp. So lets take these columns

subset<-c(2,7,8,23,24,25,26,27,28)
data<-data[,subset]
# Let's clean up the column names
colnames(data)<-c("date","state","event","deaths","injuries",
                  "property.damage","prop.damage.unit","crop.damage",
                  "crop.damage.unit")
# Let's fix our date problem for time series
data$date<-parse_date_time(data$date,"m/d/y H:M:S")

We can see that the events variable is an absolute mess. I am going to clean up spelling errors to reduce the numbers of levels we have. I am also going to group similar events like hail together, so let’s continue the cleaning process of our data.

# Before we factor, lets eliminate any discrepancies based on character case
data$event<-tolower(data$event)
# In my exploration, I also noticed a few summary events, let's get rid of those
data$event<-gsub(".*summary.*","summary",data$event)
data<-filter(data,event!="summary")
# Let's organize and group events on like characteristics. This is a bit personal
data$event<-gsub(".*hurricane.*|.*storm surge.*","Hurricane",data$event)
data$event<-gsub(".*avalan.*","Avalanche",data$event)
data$event<-gsub(".*hail.*","Hail",data$event)
data$event<-gsub(".*thunder.*|.*tstm.*","Thunderstorm",data$event)
data$event<-gsub(".*wind.*|.*wnd.*","Winds",data$event)
data$event<-gsub(".*flood.*","Flood",data$event)
data$event<-gsub(".*blizzard.*","Blizzard",data$event)
data$event<-gsub(".*winter.*","Winter Storm",data$event)
data$event<-gsub(".*tropical.*","Tropical Storm",data$event)
data$event<-gsub(".*torn.*|.*nado.*|.*funnel.*","Tornado",data$event)
data$event<-gsub(".*lightning.*|.*lighting.*|.*ligntning.*","Lightning",data$event)
data$event<-gsub(".*fire.*","Fire",data$event)
data$event<-gsub(".*volc.*","Volcanic Erruption",data$event)
data$event<-gsub(".*snow.*","Snow",data$event)
data$event<-gsub(".*unseason.*","Unseasonable",data$event)
data$event<-gsub(".*record.*","Record",data$event)
data$event<-gsub(".*waterspout.*|.*spout.*","Waterspout",data$event)
data$event<-gsub(".*rip.*","Rip Current",data$event)
data$event<-gsub(".*mud.*|.*landslide.*","Land Slide",data$event)
data$event<-gsub(".*high.*|.*rough.*|.*rogue.*","High Surf/Swells",data$event)
data$event<-gsub(".*urban.*","Urban",data$event)
data$event<-gsub(".*burst.*","Microburst",data$event)
data$event<-gsub(".*rain.*|.*shower.*|.*precip.*","Heavy Percipitation",data$event)
data$event<-gsub(".*heat.*","Excessive Heat",data$event)
data$event<-gsub(".*ice storm.*","Ice Storm",data$event)
# Let's factor the event type because that is important
data$event<-as.factor(data$event)

We can also see that most adverse weather data is not recorded prior to 1993. So after my entire analysis from 1950-2011, I came back and only ran my analysis from 1993-2011. To prove this I will show 4 large adverse weather events and their recorded occurrences over our entire data set from 1950-2011.

data10<-filter(data,event == "Avalanche" |
                event == "Excessive Heat" |
                event == "Flood" |
                event == "High Surf/Swells" |
                event == "Lightning" |
                event == "Rip Current" |
                event == "Thunderstorm" |
                event == "Tornado" |
                event == "Winds" |
                event == "Winter Storm" |
                event == "Hail" |
                event == "Ice Storm" |
                event == "Tropical Storm"|
                event == "Hurricane")
data10<-mutate(data10,count=1)
year<-c(1950:1999,2000:2011)
tornado<-c(1:62)
flooding<-c(1:62)
excessive.heat<-c(1:62)
hurricane<-c(1:62)
data6<-data.frame(year)
data6<-cbind(data6,tornado,flooding,excessive.heat,hurricane)
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Tornado"]
  data6[data6$year==i,2]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Flood"]
  data6[data6$year==i,3]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Excessive Heat"]
  data6[data6$year==i,4]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Hurricane"]
  data6[data6$year==i,5]<-as.integer(value)
}

data6<-pivot_longer(data6,cols=c(2:5))
colnames(data6)<-c("Year","Event","value")
plot<-ggplot(data6,aes(x=Year,y=log(value),group=Event,color=Event))+geom_line(size=1.5)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
plot<-plot + labs(title="Recorded Occurences of Adverse Weather Event",x="Year",y="Frequency")
plot<-plot + theme_bw()
plot
## Warning: Removed 129 rows containing missing values (`geom_line()`).

So let’s filter our data for anything after 1993 so an accurate comparison can be made.

data<-filter(data,date>="1993-01-01")

Okay, that now looks way better with significantly less levels and more organization. Now, we want to know which events are the most catastrophic for human health, so lets create a data frame and organize the events by death and injury. In this analysis, I am going to weight deaths with a greater value.

## Let's get a calculation of total deaths and injuries based on event over the time period
data1<-tapply(data$deaths,data$event,FUN=sum)
data2<-tapply(data$injuries,data$event,FUN=sum)
## Let's make a data.frame with this data
event<-names(data1)
deaths<-as.vector(data1)
injuries<-as.vector(data2)
data3<-data.frame(event)
data3<-cbind(data3,deaths,injuries)
## Let's organize based on mortality of events and take the top 10
topdeaths<-arrange(data3,desc(deaths))
topdeaths<-topdeaths[1:10,]
topdeaths2<-melt(topdeaths,value.name="value")
## Using event as id variables
## Let's plot death and injury based on top deaths using ggplot2
plot1<-ggplot(topdeaths2,aes(x=event,y=log(value),fill=variable)) + geom_bar(stat="identity",position="dodge") + theme_bw() + theme(axis.text.x=element_text(angle=45,hjust=1.0)) + labs(title="Top 10 Adverse Weather Events",x="Weather Event",y="Incidents (Log)")

Now, I think it would be interesting to see some more detailed data relating to deaths from adverse weather events. We will create a box plot to show some more detail on deaths related to these adverse weather events.

## Let's take data and filter it based on the top 10 events
data4<-filter(data,event == "Avalanche" |
                event == "Excessive Heat" |
                event == "Flood" |
                event == "High Surf/Swells" |
                event == "Lightning" |
                event == "Rip Current" |
                event == "Thunderstorm" |
                event == "Tornado" |
                event == "Winds" |
                event == "Winter Storm")
plot2<-ggplot(data4,aes(x=event,y=log10(deaths),fill=deaths))+geom_boxplot()+theme_bw()+theme(axis.text.x=element_text(angle=45,hjust=1))+labs(title="Distribution of Deaths",x="Weather Event",y="Deaths (Log10)")

While creating this boxplot to look at deaths due to specific weather events, there was one event that killed 583 people in IL on July 12, 1995. This seems like an extraordinary amount of people to die in a single event, so I looked into the news to make sure it wasn’t an error. Apparently over 500 people died in Chicago. Quite sad.

data10<-filter(data,event == "Avalanche" |
                event == "Excessive Heat" |
                event == "Flood" |
                event == "High Surf/Swells" |
                event == "Lightning" |
                event == "Rip Current" |
                event == "Thunderstorm" |
                event == "Tornado" |
                event == "Winds" |
                event == "Winter Storm" |
                event == "Hail" |
                event == "Ice Storm" |
                event == "Tropical Storm"|
                event == "Hurricane")
Avalanche<-sum(data10$event=="Avalanche")
Heat<-sum(data10$event=="Excessive Heat")
Flood<-sum(data10$event=="Flood")
Surf<-sum(data10$event=="High Surf/Swells")
Lightning<-sum(data10$event=="Lightning")
Rip<-sum(data10$event=="Rip Current")
Thunderstorm<-sum(data10$event=="Thunderstorm")
Tornado<-sum(data10$event=="Tornado")
Winds<-sum(data10$event=="Winds")
Winter<-sum(data10$event=="Winter Storm")
Hail<-sum(data10$event=="Hail")
IceStorm<-sum(data10$event=="Ice Storm")
TropicalStorm<-sum(data10$event=="Tropical Storm")
Hurricane<-sum(data10$event=="Hurricane")
Names<-c("Avalanche","Excessive Heat","Flood","High Surf/Swells","Lightning","Rip Current","Thunderstorm","Tornado","Winds","Winter Storm","Hail","Ice Storm","Tropical Storm","Hurricane")
Frequency<-c(Avalanche,Heat,Flood,Surf,Lightning,Rip,Thunderstorm,Tornado,Winds,Winter,Hail,IceStorm,TropicalStorm,Hurricane)
data5<-data.frame(Names)
data5<-cbind(data5,Frequency)
plot3<-ggplot(data5,aes(x=Names,y=log(Frequency))) + geom_bar(stat="identity",position="dodge",fill="steelblue") + theme_bw() + theme(axis.text.x=element_text(angle=45,hjust=1.0)) + labs(title="Frequency of Adverse Weather",x="Weather Event",y="Frequency (Log)")

Now we can see that even though Thunderstorms are quite frequent, risk of death is actually quite low respectively. Excessive heat is far less frequent then Tornado’s however, relative risk of death is high in both.

I keep coming back to the importance of quantify the frequency of events per year. Not only is this important in telling us when the event started to be recorded, but also if we are trending worse. Let’s just do it for the four worst (Tornado,flooding,Excessive Heat,Hurricane). This is ultimately what made me narrow down my timeline of data.

data10<-mutate(data10,count=1)
year<-c(1993:1999,2000:2011)
tornado<-c(1:19)
flooding<-c(1:19)
excessive.heat<-c(1:19)
hurricane<-c(1:19)
data6<-data.frame(year)
data6<-cbind(data6,tornado,flooding,excessive.heat,hurricane)
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Tornado"]
  data6[data6$year==i,2]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Flood"]
  data6[data6$year==i,3]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Excessive Heat"]
  data6[data6$year==i,4]<-as.integer(value)
}
for (i in year){
  test<-data10[grep(i,data10$date),]
  test1<-tapply(test$count,test$event,FUN=sum)
  value<-test1["Hurricane"]
  data6[data6$year==i,5]<-as.integer(value)
}

data6<-pivot_longer(data6,cols=c(2:5))
colnames(data6)<-c("Year","Event","value")
plot4<-ggplot(data6,aes(x=Year,y=log(value),group=Event,color=Event))+geom_line(size=1.5)+geom_smooth(method="lm",se=FALSE,linetype="dashed",size=0.75)
plot4<-plot4 + labs(title="Recorded Occurences of Event",x="Year",y="Frequency")
plot4<-plot4 + theme_bw()

Now, lets get into the second part of our question. The economic burden. We will approach this in a very similar way to the first problem but first we need to clean up the units of property damage and crop damage.

#The units here are all over the place, so let's clean that up based on what we can tell
data$prop.damage.unit<-gsub("m","M",data$prop.damage.unit)
data$prop.damage.unit<-gsub("h","H",data$prop.damage.unit)
data$prop.damage.unit<-gsub("-","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("0","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("1","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("2","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("3","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("4","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("5","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("6","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("7","",data$prop.damage.unit)
data$prop.damage.unit<-gsub("8","",data$prop.damage.unit)

# Let's do the same for crop damage
data$crop.damage.unit<-gsub("k","K",data$crop.damage.unit)
data$crop.damage.unit<-gsub("m","M",data$crop.damage.unit)
data$crop.damage.unit<-gsub("0","",data$crop.damage.unit)
data$crop.damage.unit<-gsub("2","",data$crop.damage.unit)

We then have to iterate through to multiply the damage by the damage unit to make sure that we have the proper value to all damage estimates.

unit<-c("","H","K","M","B")
propcost<-data.frame()
for (i in unit){
  tempdata<-data[grep(i,data$prop.damage.unit),]
  if (i=="H"){
    tempdata$property.damage<-tempdata$property.damage*100
    propcost<-rbind(propcost,tempdata)
  } else if(i=="K"){
    tempdata$property.damage<-tempdata$property.damage*1000
    propcost<-rbind(propcost,tempdata)
  } else if(i=="M"){
    tempdata$property.damage<-tempdata$property.damage*1000000
    propcost<-rbind(propcost,tempdata)
  } else if(i=="B"){
    tempdata$property.damage<-tempdata$property.damage*1000000000
    propcost<-rbind(propcost,tempdata)
  } else{
    tempdata$property.damage<-tempdata$property.damage
    propcost<-rbind(propcost,tempdata)
  }
}


cropcost<-data.frame()
for (i in unit){
  tempdata<-data[grep(i,data$crop.damage.unit),]
  if (i=="H"){
    tempdata$crop.damage<-tempdata$crop.damage*100
    cropcost<-rbind(cropcost,tempdata)
  } else if(i=="K"){
    tempdata$crop.damage<-tempdata$crop.damage*1000
    cropcost<-rbind(cropcost,tempdata)
  } else if(i=="M"){
    tempdata$crop.damage<-tempdata$crop.damage*1000000
    cropcost<-rbind(cropcost,tempdata)
  } else if(i=="B"){
    tempdata$crop.damage<-tempdata$crop.damage*1000000000
    cropcost<-rbind(cropcost,tempdata)
  } else{
    tempdata$crop.damage<-tempdata$crop.damage
    cropcost<-rbind(cropcost,tempdata)
  }
}
cropcost<-filter(cropcost,crop.damage>1000)

Approaching the start of this problem the same way we approached the human risk we can organize the data based on property damage and crop damage.

## Let's get a calculation of total cost for property and crops based on event over the enitre time period
propcost1<-tapply(propcost$property.damage,propcost$event,FUN=sum)
cropcost<-tapply(cropcost$crop.damage,cropcost$event,FUN=sum)
## Let's make a data.frame with this data
event<-names(propcost1)
property.damage<-as.vector(propcost1)
crop.damage<-as.vector(cropcost)
data7<-data.frame(event)
data7<-cbind(data7,property.damage,crop.damage)
## Let's organize based on property damage of events and take the top 10
toppropdamage<-arrange(data7,desc(property.damage))
toppropdamage<-toppropdamage[1:10,]
topprop2<-melt(toppropdamage,value.name="value")
## Using event as id variables
## Let's plot property and Crop damage based on top 10 events using ggplot2
plot5<-ggplot(topprop2,aes(x=event,y=log(value),fill=variable)) + geom_bar(stat="identity",position="dodge") + theme_bw() + theme(axis.text.x=element_text(angle=45,hjust=1.0)) + labs(title="Top 10 Adverse Weather Events",x="Weather Event",y="Dollar Cost (Log)")

We can see here that floods and hurricanes carry significantly more economic burden compared to other adverse weather events.

## Let's take data and filter it based on the top 10 events
propcost<-filter(propcost,event == "Fire" |
                event == "Flood" |
                event == "Hail" |
                event == "Hurricane" |
                event == "Ice Storm" |
                event == "Thunderstorm" |
                event == "Tornado" |
                event == "Tropical Storm" |
                event == "Winds" |
                event == "Winter Storm")
plot6<-ggplot(propcost,aes(x=event,y=log(property.damage),fill=property.damage))+geom_boxplot()+theme_bw()+theme(axis.text.x=element_text(angle=45,hjust=1))+labs(title="Distribution of Property Damage",x="Weather Event",y="Dollar Cost (Log)")

Interestingly, looking at the box plot, the median flood is actually quite a bit lower than Hurricanes. So it looks like low cost flooding may be more common than low economic cost hurricanes. It also looks like ice storms are pretty expensive when they occur.

Results

Our data set ranges back to 1950. However, upon analysis we see a lot of the adverse weather events such as Excessive Heat, were not properly documented until much later. Due to this fact, we reduced our data set to events after 1993 for proper comparison, we can see a clear distinction in the top 10 adverse weather events for human health/safety in the United States. The risk of death and injury from Excessive Heat is significant. Flooding and Tornado’s appear to be equally as dangerous in terms of death and injury.

Population Risk Due to Adverse Weather: 1993-2011

figure1 <- ggarrange(plot1, plot2, plot3, plot4,
                    labels = c("A", "B", "C", "D"),
                    ncol = 2, nrow = 2)
## Warning: Removed 426298 rows containing non-finite values (`stat_boxplot()`).
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?
## `geom_smooth()` using formula = 'y ~ x'
figure1

Figure 1: The Top 10 Adverse Weather Events based on Human Safety in the United States of America from 1993 - 2011. A) Bar Chart of Deaths and Injuries due to the top 10 adverse weather events on a Logarithmic Scale. B) Box Plot showing distribution of deaths due to adverse weather events. C) Frequency of recorded adverse weather events from 1993-2011. D) Trends of adverse weather events from 1993 - 2011.

Log scales were chosen due to the large range of death and injuries in particular events. For example, the 1995 heat wave that killed nearly 600 people in Chicago. When looking at Fig.1B we can see that overwhelmingly, most incidents result in zero deaths (median death of zero in nearly all of the top 10 adverse events). However, severe occurrences of excessive heat, flooding and Tornados all result in significant deaths. This shows that prediction of severe events is still vital to the health and safety of the US population. Most concerning is that deaths from excessive heat are high in comparison to it’s relatively low occurrence. However, excessive heat is trending higher at a faster rate than any other adverse weather event.

Economic Impact of Adverse Weather: 1993-2011

figure2 <- ggarrange(plot5, plot6, plot3, plot4,
                    labels = c("A", "B", "C", "D"),
                    ncol = 2, nrow = 2)
## Warning: Removed 613540 rows containing non-finite values (`stat_boxplot()`).
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?
## `geom_smooth()` using formula = 'y ~ x'
figure2

Figure 2: The Top 10 Adverse Weather Events based on Economic Impact in the United States of America from 1993 - 2011. A) Bar Chart of property damage and crop damage doe to the top 10 most economically damaging weather events on a logarithmic scale. B) Box Plot showing distribution of property damage cost due to adverse weather. C) Frequency of recorded adverse weather events from 1993-2011. D) Trend of the frequency of the top adverse weather events.

A true comparison of economic impact shows that water damage due to hurricanes and flooding is by far the most detrimental. Significant efforts need to be made to predict and protect property and crops from the increasing frequency of hurricanes.