Exploratory analysis of NOAA Storm Database reveals most deadly and costly severe weather events

Synopsis

Severe weather events cause loss of life and impact the economy. In this report, we explored the NOAA Storm Database and evaluated the life and economical damages caused by various severe weather events. We identified tornado as the most deadly event causing over 5000 casualties and flood as the most costly event causing 150 billion dollars of economical damages. Among all event types, drought caused the most significant damage to crop.

Data Processing

Raw data Raw data is obtained from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database (https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2). Additional information can be found in National Weather Service Storm Data Documentation (https://d396qusza40orc.cloudfront.net/repdata%2Fpeer2_doc%2Fpd01016005curr.pdf) and National Climatic Data Center Storm Events FAQ (https://d396qusza40orc.cloudfront.net/repdata%2Fpeer2_doc%2FNCDC%20Storm%20Events-FAQ%20Page.pdf).

Data analysis Data were processed using a PC installed with R Studio (v20.04.2) and R (v4.4.0). Installed packages include knitr, ggplot2, dplyr, tidyr, and lubridate. Step-by-step processing is described in the R Markdown below.

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(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggplot2)
library(tidyr)

data <- read.csv("repdata_data_StormData.csv")

# fatality
# group by EVTYPE, get group sum, then arrange
fatalRank <- data %>% group_by(EVTYPE) %>% summarize(fatalSum=sum(FATALITIES)) %>% arrange(desc(fatalSum))

# Table 1
print(fatalRank[1:20,])
## # A tibble: 20 × 2
##    EVTYPE                  fatalSum
##    <chr>                      <dbl>
##  1 TORNADO                     5633
##  2 EXCESSIVE HEAT              1903
##  3 FLASH FLOOD                  978
##  4 HEAT                         937
##  5 LIGHTNING                    816
##  6 TSTM WIND                    504
##  7 FLOOD                        470
##  8 RIP CURRENT                  368
##  9 HIGH WIND                    248
## 10 AVALANCHE                    224
## 11 WINTER STORM                 206
## 12 RIP CURRENTS                 204
## 13 HEAT WAVE                    172
## 14 EXTREME COLD                 160
## 15 THUNDERSTORM WIND            133
## 16 HEAVY SNOW                   127
## 17 EXTREME COLD/WIND CHILL      125
## 18 STRONG WIND                  103
## 19 BLIZZARD                     101
## 20 HIGH SURF                    101
print("Table 1. Severe weather event types causing most fatality")
## [1] "Table 1. Severe weather event types causing most fatality"
# Figure 1
par(mgp =c(3,0.8,0))
barplot(fatalRank[1:20,]$fatalSum,
        main="Figure 1. Most fatal severe weather events",
        xlab="",
        ylab="Fatality",
        names.arg=fatalRank[1:20,]$EVTYPE, cex.names=0.7, las=2)

# property damage (PROPDMG) and crop damage (CROPDMG)
# Note that PROPDMGEXP and CROPDMGEXP show the magnitude of damages, eg. K=10^3, M=10^6

convert_mag <- function(x) {
        mag <- switch(x,
                      "K"=1000,
                      "M"=1000000,
                      "B"=1000000000,
                      1)
        return(mag)
}

data$PROP <- data$PROPDMG * sapply(data$PROPDMGEXP, convert_mag)
data$CROP <- data$CROPDMG * sapply(data$CROPDMGEXP, convert_mag)

dmg <- data %>% group_by(EVTYPE) %>% summarize(property=sum(PROP), crop=sum(CROP)) %>% arrange(desc(property+crop))

# Table 2
print(dmg[1:20,])
## # A tibble: 20 × 3
##    EVTYPE                         property        crop
##    <chr>                             <dbl>       <dbl>
##  1 FLOOD                     144657709807   5661968450
##  2 HURRICANE/TYPHOON          69305840000   2607872800
##  3 TORNADO                    56925660790.   414953270
##  4 STORM SURGE                43323536000         5000
##  5 HAIL                       15727367053.  3025537890
##  6 FLASH FLOOD                16140812067.  1421317100
##  7 DROUGHT                     1046106000  13972566000
##  8 HURRICANE                  11868319010   2741910000
##  9 RIVER FLOOD                 5118945500   5029459000
## 10 ICE STORM                   3944927860   5022113500
## 11 TROPICAL STORM              7703890550    678346000
## 12 WINTER STORM                6688497251     26944000
## 13 HIGH WIND                   5270046295    638571300
## 14 WILDFIRE                    4765114000    295472800
## 15 TSTM WIND                   4484928495    554007350
## 16 STORM SURGE/TIDE            4641188000       850000
## 17 THUNDERSTORM WIND           3483121284    414843050
## 18 HURRICANE OPAL              3152846020      9000010
## 19 WILD/FOREST FIRE            3001829500    106796830
## 20 HEAVY RAIN/SEVERE WEATHER   2500000000            0
print("Table 2. Severe weather event types causing most economical damages")
## [1] "Table 2. Severe weather event types causing most economical damages"
# Figure 2
dmg[1:20,] %>% 
        gather(key="damage_type", value ="damage_amount", property, crop) %>%
        ggplot(aes(reorder(EVTYPE, -damage_amount, sum), damage_amount, fill=damage_type)) +
        geom_bar(stat="identity", position="stack") +
        labs(x="", y="damage amount in dollar value", fill="damage type", 
             title="Figure 2. Most economical costly severe weather event") +
        theme(axis.text.x=element_text(angle=75, hjust=1, vjust=1, size=8))

Results

Tornado causes most fatality Of all severe weather events, tornado is the most deadly event type, responsible for 5633 cases of fatality, nearly 3-fold of the second place excessive heat and 6-fold of the third place event flash flood, which are respectively responsible for 1903 and 978 cases of fatality (Table 1, Fig. 1).

Flood causes most economical losses Flood is the most costly event in term of economical loss, responsible for nearly 145 billion dollars of property and 5.7 billion dollars of crop damages (Table 2, Fig. 2). The second and third most costly events are hurricane/typhoon and tornado, for 69 billion, 57 billion dollar property and 2.6 billion, 0.4 billion crop losses respectively. Of note, tornado which is the no.1 cause of fatality also caused severe economical losses.

Property loss outweighs crop loss Properties suffer much more damage than crops across the board. Of the top 20 most costly event types, property damages significantly (at least 3x over) outweigh crop damages in 17 event types, with the exceptions seen in drought (14.0 billion crop outweighing 1.0 billion property), ice storm (5.0 billion crop outweighing 3.9 billion property), and river flood (5.0 billion crop in par with 5.1 billion property).