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
For the analysis the following information was available:
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)
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")
}
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")
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")
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 |