Tornadoes and excessive heat are the most harmful weather events for the US population

Synopsis

In this report the consequences of severe weather events for the population and economy of the US are investigated. This analysis focusses on events between 1993 and 2011, but also considers earlier events if recorded. The analysis shows that the number of recorded extreme weather events is increasing since 1950. The highest cumulative economic damages since 1993 were caused by floods and hurricanes. Excessive heat and tornadoes caused the highest number of deaths in the US population, and tornadoes and floods were responsible for most injuries.

For a professional overview about this subject have a look at the recent report from the World Meteorological Organisation The Atlas of Mortality and Economic Losses from Weather, Climate and Water Extremes 1970-2012

Data Processing

For the analysis the following information was available:

Loading the data

The database file was downloaded, uncompressed and loaded into the R statistical programming package. To save memory only fields required for the analysis were loaded:

conn <- bzfile("StormData.csv.bz2", open="r")
data <- read.csv(conn,
                 colClasses=c("NULL","character",rep("NULL",5),"character",rep("NULL",14),
                              "numeric","numeric","numeric","character","numeric","character",
                              rep("NULL",9)))
close(conn)

Preprocessing the data

In the original dataset some inconsistencies were discovered:

To fix these problems, the dataset was transformed to contain standardised date information, and the exponent information were changed into a multiplicative factor and integrated into the damage information (function format_exp). Property damage and crop damage (in USD) were added up to quantify total damage.

The specification of NWS Directive 10-1605 defines 48 weather event types. However, there were many ambiguous mappings of database entries to the weather event specification, e.g. “Hail” and “Thunderstorm Wind” were specified events, but the database contained a “Thunderstorm Winds Hail” entry. Some mappings of the weather event information were performed, but additional information from weather experts would be needed to fix all problems. For practical reasons events with a low number of occurrences were summarised in the category “Others”. The function format_evt provides an interface for further improvements, i.e. to match all present entry types to the 48 specified.

# re-format the exponent information
format_exp <- function(exp) {
    exp <- toupper(gsub("[^[:alnum:]]","0",exp))
    exp[exp=="B"] <- "9" # billion
    exp[exp=="M"] <- "6" # million
    exp[exp=="K"] <- "3" # kilo
    exp[exp=="H"] <- "2" # hundred
    exp[exp==""] <- "0"
    return(10^as.numeric(exp))
}

# weather events listed in NWS Directive 10-1605
events <- c("Astronomical Low Tide", "Avalanche", "Blizzard", "Coastal Flood", "Cold/Wind Chill", 
            "Debris Flow", "Dense Fog", "Dense Smoke", "Drought", "Dust Devil", "Dust Storm", 
            "Excessive Heat", "Extreme Cold/Wind Chill", "Flash Flood", "Flood", "Frost/Freeze", 
            "Funnel Cloud", "Freezing Fog", "Hail", "Heat", "Heavy Rain", "Heavy Snow", "High Surf", 
            "High Wind", "Hurricane (Typhoon)", "Ice Storm", "Lake-Effect Snow", "Lakeshore Flood", 
            "Lightning", "Marine Hail", "Marine High Wind", "Marine Strong Wind", "Marine Thunderstorm Wind", 
            "Rip Current", "Seiche", "Sleet", "Storm Surge/Tide", "Strong Wind", "Thunderstorm Wind", 
            "Tornado", "Tropical Depression", "Tropical Storm", "Tsunami", "Volcanic Ash", "Waterspout", 
            "Wildfire", "Winter Storm", "Winter Weather")
# order events according to decreasing length (to make sure that e.g. "Flash Flood" is not 
# combined with "Flood", and "Excessive Heat" is not combined with "Heat")
events <- events[order(nchar(events), decreasing=T)]

# re-format the event type information (to match NWS Directive 10-1605)
format_evt <- function(evt) {
    evt <- toupper(evt)
    evt <- gsub("TSTM","THUNDERSTORM", evt)
    for (i in events) {
        evt[grep(paste0(".*",gsub("[[:punct:]]",".*",toupper(i)),".*"), evt, perl=T)] <- i
    }                                                                                             # see chapter:
    evt[grep(".*L STREAM.*|^RAIN$", evt, perl=T)] <- "Heavy Rain"                                 # 7.21
    evt[grep(".*FIRE.*", evt, perl=T)] <- "Wildfire"                                              # 7.46
    evt[grep(".*(RECORD|EXTREME).*(COLD|WIND.*CHILL).*", evt, perl=T)] <- "Extreme Cold/Wind Chill"  # 7.13
    evt[grep("^SNOW$|(RECORD|EXTREME).*SNOWFALL", evt, perl=T)] <- "Heavy Snow"                   # 7.22
    evt[grep(".*LANDSL.*|.*MUD.*SL.*", evt, perl=T)] <- "Debris Flow"                             # p. 1, 7.6
    evt[grep("^[FV]OG$", evt, perl=T)] <- "Dense Fog"                                             # 7.7
    evt[grep("^WINDS?$|GUSTY.*", evt, perl=T)] <- "Strong Wind"                                   # 7.38
    evt[grep(".*SURGE.*", evt, perl=T)] <- "Storm Surge/Tide"                                     # 7.37
    evt[grep("FREEZING RAIN|LIGHT SNOW|WINTRY|MODERATE SN.*", evt, perl=T)] <- "Winter Weather"   # 7.48
    evt[grep(".*BURST.*|.*UNDE.*|.*ERST.*", evt, perl=T)] <- "Thunderstorm Wind"                  # 7.39
    evt[grep(".*HURRICANE.*|.*TYPHOON.*", evt, perl=T)] <-  "Hurricane (Typhoon)"                 # 7.25
    evt[grep(".*WARM.*", evt, perl=T)] <- "Heat"                                                  # 7.20
    evt[grep(".*HIGH TIDE.*|.*SURF", evt, perl=T)] <- "High Surf"                                 # 7.23
    evt[grep(".*FREEZE.*|.*FROST.*|.*COLD.*|^ICE$|.*ICY.*", evt, perl=T)] <- "Frost/Freeze"       # 7.17
    evt[grep(".*DRY.*", evt, perl=T)] <- "Drought"                                                # 7.9
    evt[grep(".*FUNNEL.*", evt, perl=T)] <- "Funnel Cloud"                                        # 7.18
    evt[grep(".*GLAZE.*", evt, perl=T)] <- "Freezing Fog"                                         # 7.16
    evt[grep("[A-Z ]{3,}|\\?", evt, perl=T)] <- "Other"
    return(factor(evt))
}

data <- transform(data, BGN_DATE=as.Date(strptime(BGN_DATE, "%m/%d/%Y %H:%M:%S")), 
                        EVTYPE=format_evt(EVTYPE),
                        DAMAGE=PROPDMG*format_exp(PROPDMGEXP) + CROPDMG*format_exp(CROPDMGEXP),
                        CNT=1)           # add "counter" column

c(sum(data$CNT[data$EVTYPE=="Other"]), sum(data$CNT))
## [1]    989 902297

(989 events out of a total of 9.023 × 105 could not be assigned to any of the 48 specified weather events).

The Storm Events Database changed the way it recorded events over time. Therefore the data were separated into three groups for this analysis: weather events before 1955 (group 1), events between 1955 and 1993 (group 2), and events after 1993 (group 3).

years <- as.numeric(format(data$BGN_DATE, "%Y"))

damage <- aggregate(data[,c("FATALITIES","INJURIES","DAMAGE","CNT")], by=list(data$EVTYPE, years), sum)
colnames(damage)[1:2] <- c("EVENT","YEAR")
damage <- cbind(damage, group=factor(ifelse(damage$YEAR<1955, 1, ifelse(damage$YEAR<1993, 2, 3)), ordered=T))

# plot function used later in the results part
plot_years <- function(events=c("Tornado","Thunderstorm Wind","Hail"), 
                       categ="FATALITIES", col=c("red","blue","darkgreen")) {
    cnt <- 1
    for (i in events) {
        lines(damage[damage$EVENT==i, "YEAR"], damage[damage$EVENT==i, categ], col=col[cnt], lwd=2)
        cnt <- cnt+1
    }
    legend("topleft", legend=events, col=col, lwd=2, bty="n")
}

Results

Frequency of weather events increases since 1950

Climate change is an issue of intense discussion. Using the three weather events with the longest historical records, hail, tornado, and thunderstorm wind, this plot shows the increase of the annual frequency of these severe events over time.

t <- aggregate(damage[damage$group==2, "CNT"], 
               by=list(damage$EVENT[damage$group==2]), sum)
par(mgp=c(2,0.7,0), mar=c(3,3,3,0), cex=1)
plot(damage[damage$EVENT==t[1,1], "YEAR"], damage[damage$EVENT==t[1,1], "CNT"], type="n",
     xlab="year", ylab="events per year", xlim=range(years), ylim=c(0,max(damage[damage$EVENT %in% t[1:3,1], "CNT"])),
     main="Weather events from 1950 - 2011")
plot_years(categ="CNT")

plot of chunk overview

Excessive heat and tornadoes are most harmful to the US population

For the time from Jan. 1950 to Jan. 1955 only tornadoes were recorded and therefore a comparison with other weather events was not possible. In this period 1865 weather events were recorded. 889 people died and 8944 were injured due to tornadoes.

t <- aggregate(damage[damage$group==1,c("FATALITIES","INJURIES")], 
               by=list(damage$EVENT[damage$group==1]), sum)
colnames(t) <- c(""," Fatalities ","| Injuries ")
kable(t)
Fatalities | Injuries
Tornado 889 8944
sum(damage$CNT[damage$group==1])

[1] 1865

Between Jan. 1955 and Jan. 1993 three kinds of weather events were recorded: hail, tornado, and thunderstorm wind. During this period 1.8569 × 105 weather events were recorded in total. Tornadoes were the primary cause for fatalities and injuries due to weather events.

t <- aggregate(damage[damage$group==2,c("FATALITIES","INJURIES")], 
               by=list(damage$EVENT[damage$group==2]), sum)
t <- t[order(t$FATALITIES, decreasing=T),]
rownames(t) <- 1:length(rownames(t))
colnames(t) <- c(""," Fatalities ","| Injuries ")
kable(t)
Fatalities | Injuries
Tornado 3123 59092
Thunderstorm Wind 263 3326
Hail 5 401
sum(damage$CNT[damage$group==2])

[1] 185694

Since 1993 many more categories of weather events were recorded. Between Jan. 1993 and Nov. 2011 in total 7.1474 × 105 events were recorded. The two main causes of fatalities were extreme heat and tornadoes, the two main causes of injuries were tornadoes and floods.

t = aggregate(damage[damage$group==3,c("FATALITIES","INJURIES")], 
              by=list(damage$EVENT[damage$group==3]), sum)
tb <- t[order(t$FATALITIES, decreasing=T),]
rownames(tb) <- 1:length(rownames(tb))
colnames(tb) <- c(""," Fatalities "," Injuries ")
kable(tb[1:6, c(1,2)])
Fatalities
Excessive Heat 1922
Tornado 1621
Heat 1252
Flash Flood 1035
Lightning 817
Rip Current 577
tb <- t[order(t$INJURIES, decreasing=T),]
rownames(tb) <- 1:length(rownames(tb))
colnames(tb) <- c(""," Fatalities "," Injuries ")
kable(tb[1:6, c(1,3)])
Injuries
Tornado 23328
Flood 6795
Excessive Heat 6525
Thunderstorm Wind 6213
Lightning 5232
Heat 2703
sum(damage$CNT[damage$group==3])

[1] 714738

This plot shows the annual development of the three most harmful weather events with respect to fatalities and injuries, respectively. The most harmful weather events were determined from the data record between Jan. 1993 and Nov. 2011. If records of earlier events were available, these were depicted as well.

par(mfrow=c(2,1), mgp=c(2,0.7,0), mar=c(3,3,3,0), cex=1)
tb <- t[order(t$FATALITIES, decreasing=T),]
plot(damage[damage$EVENT==tb[1,1], "YEAR"], damage[damage$EVENT==tb[1,1], "FATALITIES"], type="n",
     xlab="year", ylab="fatalities per year", xlim=range(years), ylim=c(0,max(damage[damage$EVENT %in% tb[1:3,1], "FATALITIES"])),
     main="Fatalities")
plot_years(events=tb[1:3,1])
tb <- t[order(t$INJURIES, decreasing=T),]
plot(damage[damage$EVENT==tb[1,1], "YEAR"], damage[damage$EVENT==tb[1,1], "INJURIES"], type="n",
     xlab="year", ylab="injuries per year", xlim=range(years), ylim=c(0,max(damage[damage$EVENT %in% tb[1:3,1], "INJURIES"])),
     main="Injuries")
plot_years(events=tb[1:3,1], categ="INJURIES")

plot of chunk pophealth

Floods and hurricanes cause largest economic consequences in US

Starting from Jan. 1993 detailed records of economic damages are available for the US. The data were given in USD and were not corrected for inflation. The highest damages were caused by floods and hurricanes.

t = aggregate(damage[damage$group==3, "DAMAGE"], 
              by=list(damage$EVENT[damage$group==3]), sum)
tb <- t[order(t[,2], decreasing=T),]
rownames(tb) <- 1:length(rownames(tb))
colnames(tb) <- c(""," Damage (in USD)")
kable(tb[1:6, c(1,2)])
Damage (in USD)
Flood 1.610e+11
Hurricane (Typhoon) 9.076e+10
Storm Surge/Tide 4.797e+10
Tornado 2.677e+10
Flash Flood 1.912e+10
Hail 1.902e+10