The NOAA Storm Events Database is a record of extreme and/or rare weather events in the United States of America. Using these data it is possible to determine those storm events which, in the past, have had the greatest negative effects on local populations, specifically: loss of life, injuries, significant property damage, and disruption to commerce. This report illustrates those weather events which have caused significant health impacts and those which have caused significant economic impacts.
The database version used for this report contains data from April 1950 to November 2011.
Contents:
Data cleaning
Results
Data processing
The NOAA Storm Events Database records forty-eight categories of rare weather event, as described in this FAQ. However the database records 985 storm event categories, so data must be cleaned. This has been done by hand and is shown in the Data Processing section.
Some data could not be reclassified into any of the forty eight event categories and were discarded.
This amount of data loss due to event reclassification is unlikely to cause significant inaccuracy.
The data has been recorded data since mid last century. Since then there have been changes in both the database categories and in society that will affect an analysis of storm events:
Changes in dollar value, technology and population density may mean that storm events which caused significant impact on populations may no longer have the same effect. The reverse may also be true.
Changes the number of event categories recorded.
The first point suggests rejecting much older data. However the dataset provides no way to measure and suggest a cut-off. The second point, however, is measurable. The figure below presents the number of times a particular event category occurs in a given year.
Before 1993 there are only three recorded (reclassified) events – hail, thunderstorm wind, and tornado – after which the other forty-eight categories start to appear. Such a large change in the number of categories means the pre-1993 data should not be included with the post 1993 data as the hail, thunderstorm wind, and tornado categories would be weighted more heavily than other categories, and it would not be possible to compare proportions of outcomes due to pre and post 1993 events.
For these reasons, only data from 1993 onward has been used in this analysis.
Property and crop damage cost estimates have been presented as number in one column (PROPDMG or CROPDMG), and a mix of metric prefixes (“K” and “k” for kilo or “thousand”), first letters of rounded powers of ten (“H”, for “hundred”, “M” for million, “B” for billion), and expenentiators (2 for hundred, 6 for million) in another column (PROPDMGEXP or CROPDMGEXP). The number of the first column is multiplied by the second column to give a final result.
PROPDMGEXP and CROPDMGEXP values had to be converted to values consistently. Details of the process are in the Data Processing section. All values could be consistently converted – no data was lost in the process.
The NOAA database provides the numbers of injuries and fatalities due to extreme weather events, but “harm” is a difficult metric to analyse from these data. What are the injury severities and are they all similarly harmful (the FAQ only notes “The data does not have injury severity catergories, and the FAQ only notes”A directly-related weather injury is one that requires treatment by a first-responder or subsequent treatment at a medical facility“)? Do injuries cause more harm than fatalities? Should one be weighted more than the other?
Since we don’t have enough information to create a combined metric, injuries and fatalities are considered separtely. The following panel plot shows the distribution of the percentage of injuries and deaths due to extreme weather events. Events causing neither injury nor death have been discarded.
This overview illustrates two interesting points:
Consistently high harm levels and sudden extremes of harm may be both useful information to know. The tables below show the top five events for total injury or death from 1993 to 2011, and the top five events causing a yearly maxima.
| Order | Weather event | Fatalities | % of total fatalities | Weather event | Injuries | % of total injuries | |
|---|---|---|---|---|---|---|---|
| 1st | Excessive Heat | 2195 | 20.2% | Tornado | 23328 | 33.9% | |
| 2nd | Tornado | 1621 | 14.9% | Excessive Heat | 7109 | 10.3% | |
| 3rd | Flash flood | 1035 | 9.5% | Flood | 6795 | 9.9% | |
| 4th | Heat | 937 | 8.6% | Thunderstorm wind | 6184 | 9.0% | |
| 5th | Lightning | 817 | 7.5% | Lightning | 5231 | 7.6% |
| Year | Weather event | Fatalities | % yearly fatalities | Year | Weather event | Injuries | % yearly injuries | |
|---|---|---|---|---|---|---|---|---|
| 1995 | Heat | 687 | 46.1% | 2011 | Tornado | 6163 | 79.1% | |
| 2011 | Tornado | 587 | 58.6% | 1998 | Flood | 6130 | 54.8% | |
| 1999 | Excessive Heat | 502 | 55.3% | 1999 | Tornado | 1842 | 35.8% | |
| 2006 | Excessive Heat | 205 | 34.2% | 2008 | Tornado | 1690 | 62.5% | |
| 1998 | Excessive Heat | 168 | 24.5% | 1994 | Ice storm | 1631 | 39.2% |
Overview:
Summary:
The greatest economic consequences is also difficult to completely analyse using the NOAA dataset, since ecomomic costs of fatalities and injuries cannot be assessed. An estimate of the US$ value damage to crops and property is provided, but this is not indexed to account for changes in the value of the US$, median incomes or housing prices. Dollar values from different decades generally would not be directly compared in this manner.
However, for the purposes of this analysis we will assume the combination of these costs is a rough estimate of the overall economic impact of various weather events. Events causing no damage have been discarded.
“Total damage” is crop and property damage combined.
The panel plot shows:
Unlike the health effects of these extreme weather events, sudden spikes in damage costs seem much less common.
Many events affect crops and property equally, but some affect crops more (for example, drought) and some affect property more (for example, lightning).
The tables below show the top five weather for crop damage, property damge, and total damage for the period 1993 to 2011.
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Flood | 22.03 | 19% |
| Tornado | 19.93 | 18% |
| Flash flood | 14.71 | 13% |
| Hail | 13.60 | 12% |
| Hurricane/Typhoon | 10.94 | 10% |
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Drought | 12.45 | 37% |
| Flood | 5.68 | 17% |
| Hurricane/Typhoon | 3.99 | 12% |
| Hail | 2.47 | 7% |
| Flash flood | 1.35 | 4% |
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Flood | 27.70 | 19% |
| Tornado | 20.25 | 14% |
| Hail | 16.07 | 11% |
| Flash flood | 16.06 | 11% |
| Hurricane/Typhoon | 14.93 | 10% |
Summary:
This section presents and explains the code used in this analysis.
Data is downloaded and loaded into R at the data.table “data_dt”
setwd("/Users/andy/Coursera/DataScience/Reproducible_Research/RepData_PeerAssessment2")
download.file("https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2", destfile = "Stormdata.csv.bz2")
init_data_dt <- data.table(read.csv("Stormdata.csv.bz2", stringsAsFactors=F))
library(data.table)
library(lubridate)
library(scales)
library(ggplot2)
data_dt <- init_data_dt[, list(BGN_DATE, EVTYPE, FATALITIES, INJURIES,
PROPDMG, PROPDMGEXP, CROPDMG, CROPDMGEXP)]
Define the ‘year’ variable to allow annual summaries:
data_dt[, year := format(mdy_hms(BGN_DATE), "%Y")]
Next, EVTYPE variable reclassification:
data_dt <- data_dt[!grepl("SUMMARY", EVTYPE)]
data_dt[which(grepl("ASTRONOMICAL LOW TIDE", EVTYPE) == T), eventType := "Astronomical tide"]
data_dt[which(grepl("ASTRONOMICAL HIGH TIDE", EVTYPE) == T & is.na(eventType)), eventType := "Astronomical tide"]
data_dt[which(grepl("AVALANCHE", EVTYPE) == T & is.na(eventType)), eventType := "Avalanche"]
data_dt[which(grepl("BLIZZARD", EVTYPE) == T & is.na(eventType)), eventType := "Blizzard"]
data_dt[which(grepl("ICE STORM", EVTYPE) == T & is.na(eventType)), eventType := "Ice storm"]
data_dt[which(grepl("EXTREME COLD", EVTYPE) == T & is.na(eventType)), eventType := "Extreme cold/Wind chill"]
data_dt[which(grepl("EXTREME WINDCHILL", EVTYPE) == T & is.na(eventType)), eventType := "Extreme cold/Wind chill"]
data_dt[which(grepl("EXTREME WINDCHILL TEMPERATURES", EVTYPE) == T & is.na(eventType)), eventType := "Extreme cold/Wind chill"]
data_dt[which(grepl("WIND CHILL", EVTYPE) == T & is.na(eventType)), eventType := "Cold/Wind chill"]
data_dt[which(grepl("WINDCHILL", EVTYPE) == T & is.na(eventType)), eventType := "Cold/Wind chill"]
data_dt[which(grepl("WINTER STORM", EVTYPE) == T & is.na(eventType)), eventType := "Winter storm"]
data_dt[which(grepl("WINTER WEATHER", EVTYPE) == T & is.na(eventType)), eventType := "Winter weather"]
data_dt[which(grepl("MARINE THUNDERSTORM WIND", EVTYPE) == T & is.na(eventType)), eventType := "Marine thunderstorm wind"]
data_dt[which(grepl("MARINE TSTM WIND", EVTYPE) == T & is.na(eventType)), eventType := "Marine thunderstorm wind"]
data_dt[which(grepl("MARINE HAIL", EVTYPE) == T & is.na(eventType)), eventType := "Marine hail"]
data_dt[which(grepl("MARINE HIGH WIND", EVTYPE) == T & is.na(eventType)), eventType := "Marine high wind"]
data_dt[which(grepl("MARINE STRONG WIND", EVTYPE) == T & is.na(eventType)), eventType := "Marine strong wind"]
data_dt[which(grepl("THUNDERSTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUDERSTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDEERSTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDERESTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDERSTORMW", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDERSTROM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDERTSORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDERTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNDESTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("TUNDERSTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("THUNERSTORM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("STORM FORCE WINDS", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("TSTM", EVTYPE) == T & is.na(eventType)), eventType := "Thunderstorm wind"]
data_dt[which(grepl("COASTAL FLOOD", EVTYPE) == T & is.na(eventType)), eventType := "Coastal Flood"]
data_dt[which(grepl("LANDSLIDE", EVTYPE) == T & is.na(eventType)), eventType := "Debris flow"]
data_dt[which(grepl("MUDSLIDE", EVTYPE) == T & is.na(eventType)), eventType := "Debris flow"]
data_dt[which(grepl("MUD SLIDE", EVTYPE) == T & is.na(eventType)), eventType := "Debris flow"]
data_dt[which(grepl("DENSE FOG", EVTYPE) == T & is.na(eventType)), eventType := "Dense fog"]
data_dt[which(grepl("^FOG$", EVTYPE) == T & is.na(eventType)), eventType := "Dense fog"]
data_dt[which(grepl("DENSE SMOKE", EVTYPE) == T & is.na(eventType)), eventType := "Dense smoke"]
data_dt[which(grepl("DROUGHT", EVTYPE) == T & is.na(eventType)), eventType := "Drought"]
data_dt[which(grepl("DUST DEVIL", EVTYPE) == T & is.na(eventType)), eventType := "Dust devil"]
data_dt[which(grepl("DUST STORM", EVTYPE) == T & is.na(eventType)), eventType := "Dust storm"]
data_dt[which(grepl("EXCESSIVE HEAT", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("EXTREME HEAT", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("RECORD HEAT", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("HEAT WAVE", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("HEATBUST", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("HEATBURST", EVTYPE) == T & is.na(eventType)), eventType := "Excessive Heat"]
data_dt[which(grepl("^HEAT$", EVTYPE) == T & is.na(eventType)), eventType := "Heat"]
data_dt[which(grepl("FREEZING FOG", EVTYPE) == T & is.na(eventType)), eventType := "Freezing Fog"]
data_dt[which(grepl("FROST/FREEZE", EVTYPE) == T & is.na(eventType)), eventType := "Frost/Freeze"]
data_dt[which(grepl("FLASH FLOOD", EVTYPE) == T & is.na(eventType)), eventType := "Flash flood"]
data_dt[which(grepl("LAKESHORE FLOOD", EVTYPE) == T & is.na(eventType)), eventType := "Lakeshore flood"]
data_dt[which(grepl("FLOOD", EVTYPE) == T & is.na(eventType)), eventType := "Flood"]
data_dt[which(grepl("HAIL", EVTYPE) == T & is.na(eventType)), eventType := "Hail"]
data_dt[which(grepl("HEAVY RAIN", EVTYPE) == T & is.na(eventType)), eventType := "Heavy rain"]
data_dt[which(grepl("HEAVY SNOW", EVTYPE) == T & is.na(eventType)), eventType := "Heavy snow"]
data_dt[which(grepl("HIGH SURF", EVTYPE) == T & is.na(eventType)), eventType := "High surf"]
data_dt[which(grepl("HIGH SURF", EVTYPE) == T & is.na(eventType)), eventType := "High surf"]
data_dt[which(grepl("HEAVY SURF", EVTYPE) == T & is.na(eventType)), eventType := "High surf"]
data_dt[which(grepl("HIGH WIND", EVTYPE) == T & is.na(eventType)), eventType := "High wind"]
data_dt[which(grepl("HIGH WIND", EVTYPE) == T & is.na(eventType)), eventType := "High wind"]
data_dt[which(grepl("TYPHOON", EVTYPE) == T & is.na(eventType)), eventType := "Hurricane/Typhoon"]
data_dt[which(grepl("HURRICANE", EVTYPE) == T & is.na(eventType)), eventType := "Hurricane/Typhoon"]
data_dt[which(grepl("ICE STORM", EVTYPE) == T & is.na(eventType)), eventType := "Ice storm"]
data_dt[which(grepl("LAKE-EFFECT SNOW", EVTYPE) == T & is.na(eventType)), eventType := "Lake-Effect Snow"]
data_dt[which(grepl("LIGHTNING", EVTYPE) == T & is.na(eventType)), eventType := "Lightning"]
data_dt[which(grepl("LIGHTING", EVTYPE) == T & is.na(eventType)), eventType := "Lightning"]
data_dt[which(grepl("RIP CURRENT", EVTYPE) == T & is.na(eventType)), eventType := "Rip current"]
data_dt[which(grepl("SEICHE", EVTYPE) == T & is.na(eventType)), eventType := "Seiche"]
data_dt[which(grepl("SLEET", EVTYPE) == T & is.na(eventType)), eventType := "Sleet"]
data_dt[which(grepl("^WATERSPOUT", EVTYPE) == T & is.na(eventType)), eventType := "Waterspout"]
data_dt[which(grepl("^WATER SPOUT", EVTYPE) == T & is.na(eventType)), eventType := "Waterspout"]
data_dt[which(grepl("TORNADO", EVTYPE) == T & is.na(eventType)), eventType := "Tornado"]
data_dt[which(grepl("TORNDAO", EVTYPE) == T & is.na(eventType)), eventType := "Tornado"]
data_dt[which(grepl("$FUNNEL", EVTYPE) == T & is.na(eventType)), eventType := "Funnel cloud"]
data_dt[which(grepl("FUNNEL CLOUD", EVTYPE) == T & is.na(eventType)), eventType := "Funnel cloud"]
data_dt[which(grepl("STORM TIDE", EVTYPE) == T & is.na(eventType)), eventType := "Storm tide"]
data_dt[which(grepl("STORM SURGE", EVTYPE) == T & is.na(eventType)), eventType := "Storm tide"]
data_dt[which(grepl("STRONG WIND", EVTYPE) == T & is.na(eventType)), eventType := "Strong wind"]
data_dt[which(grepl("TROPICAL DEPRESSION", EVTYPE) == T & is.na(eventType)), eventType := "Tropical depression"]
data_dt[which(grepl("TROPICAL STORM", EVTYPE) == T & is.na(eventType)), eventType := "Tropical storm"]
data_dt[which(grepl("TSUNAMI", EVTYPE) == T & is.na(eventType)), eventType := "Tsunami"]
data_dt[which(grepl("VOLCANIC ASH", EVTYPE) == T & is.na(eventType)), eventType := "Volcanic ash"]
data_dt[which(grepl("WILDFIRE", EVTYPE) == T & is.na(eventType)), eventType := "Wildfire"]
data_dt[which(grepl("WILD FIRE", EVTYPE) == T & is.na(eventType)), eventType := "Wildfire"]
data_dt[which(grepl("WILD/FOREST FIRE", EVTYPE) == T & is.na(eventType)), eventType := "Wildfire"]
Converting damage costs to dollar values:
dmgexp <- c("", "h", "H", "k", "K", "m", "M", "B", 0:9)
dmgexp_vals <- c(0, 2, 2, 3, 3, 6, 6, 9, 0:9)
invisible(sapply(1:length(dmgexp), function(x){
data_dt[PROPDMGEXP == dmgexp[x], totalPropCost := PROPDMG * 10^dmgexp_vals[x]]
data_dt[CROPDMGEXP == dmgexp[x], totalCropCost := CROPDMG * 10^dmgexp_vals[x]]
}))
data_dt[PROPDMG == 0, totalPropCost := 0]
data_dt[CROPDMG == 0, totalCropCost := 0]
#### percent of events missed due to uninterpretable event classification
missedEvents <- percent(nrow(data_dt[is.na(eventType)])/nrow(data_dt))
#### percent of injuries missed due to uninterpretable event classification
missedInjuries <- percent(data_dt[is.na(eventType), sum(INJURIES)]/data_dt[, sum(INJURIES)])
#### percent of fatalities missed due to uninterpretable event classification
missedFatalities <- percent(data_dt[is.na(eventType), sum(FATALITIES)]/data_dt[, sum(FATALITIES)])
Event reclassification plot:
data_dt0 <- data_dt[!is.na(eventType) , list(N = .N), by=list(eventType, year)]
uniqueEvents0 <- sort(unique(data_dt0[!is.na(eventType), eventType]), decreasing=T)
data_dt0$eventType <- factor(data_dt0$eventType, levels=uniqueEvents0)
ggplot(data_dt0, aes(x=as.numeric(year),y=eventType, fill=N)) +
geom_tile() + ylab("") + xlab("Year") +
scale_x_continuous(breaks=seq(1960, 2010, 10)) +
scale_fill_distiller(name="No. of event\nobservations\nper year",
breaks = 10^(0:5), trans='log10',
palette = "YlGnBu", guide='colourbar') +
ggtitle(" NOAA Storm database weather events") +
theme_bw()
Injury and fatality plot. Fatalities and injuries are summarised by year and weather event:
library(reshape2)
data_dt1 <- data_dt[year >= 1993, list(FATALITIES = sum(na.omit(FATALITIES)), INJURIES=sum(na.omit(INJURIES))), by=list(eventType, year)]
data_dt1[, year := as.numeric(year)]
data_dt1 <- data_dt1[INJURIES > 0 | FATALITIES > 0]
data_dt1 <- data_dt1[order(-year, FATALITIES, INJURIES, decreasing=T)]
uniqueEvents1 <- sort(unique(data_dt1[!is.na(eventType), eventType]), decreasing=T)
data_dt1$eventType <- factor(data_dt1$eventType, levels=uniqueEvents1)
plot1Data <- melt(data_dt1[!is.na(eventType)], c("eventType", "year"))
plot1Data[, totalValue := sum(value), by=variable]
ggplot(plot1Data[value > 0], aes(x=as.numeric(year),y=eventType, fill=value/totalValue)) +
geom_tile() + ylab("") + xlab("Year") +
facet_wrap(~variable) +
scale_x_continuous(breaks=seq(1990, 2010, 5)) +
scale_fill_distiller(name="Percentage\nof total",
breaks = 10^(-5:0), labels=percent,
trans='log10',
palette = "YlGnBu", guide='colourbar') +
ggtitle("Distribution of injuries and fatalities caused by US weather events") +
theme_bw()
Injury and fatality tables:
library(knitr)
##### top events by year and in total
totals0 <- rbind(data_dt1[, list(Value = sum(FATALITIES), Variable = "Fatalities"), by= eventType],
data_dt1[, list(Value = sum(INJURIES), Variable = "Injuries"), by= eventType])
setnames(totals0, colnames(totals0)[1], "Weather event")
totals0[, total := sum(Value), by=Variable]
totals0[, "% of total" := percent(Value / total)]
library(dplyr)
totals <- totals0[, .SD[order(Value, decreasing=T)[1:5]], by=Variable]
totals <- totals[order(Variable, -Value)]
totalInjuryTable <- totals[Variable == "Injuries", list(`Weather event`, Injuries = as.character(Value), `% of total injuries` = `% of total`)]
totalFatalityTable <- totals[Variable == "Fatalities", list(`Weather event`, Fatalities = as.character(Value), `% of total fatalities` = `% of total`)]
maxima0 <- data_dt1[, list(eventType, year, FATALITIES, INJURIES)]
maxima0[, yearlyFatalities := sum(FATALITIES), by=year]
maxima0[, yearlyInjuries := sum(INJURIES), by=year]
setnames(maxima0, "year", "Year")
maximumFatalityTable <- maxima0[, .SD[which.max(FATALITIES),
list("Weather event" = eventType,
Fatalities = FATALITIES,
"% yearly fatalities" = percent(FATALITIES/yearlyFatalities))],
by=Year]
maximumFatalityTable <- maximumFatalityTable[order(Fatalities, decreasing=T)][1:5]
maximumInjuryTable <- maxima0[, .SD[which.max(INJURIES),
list("Weather event" = eventType,
Injuries = INJURIES,
"% yearly injuries" = percent(INJURIES/yearlyInjuries))],
by=Year]
maximumInjuryTable <- maximumInjuryTable[order(Injuries, decreasing=T)][1:5]
table_1 <- cbind(Order = c("1st", "2nd", "3rd", "4th", "5th"),
totalFatalityTable, " " = " ", totalInjuryTable)
table_2 <- cbind(maximumFatalityTable, " " = " ", maximumInjuryTable)
kable(table_1, format = "pandoc", caption = "Table 1: Total fatalities and injuries, 1993 to 2011")
| Order | Weather event | Fatalities | % of total fatalities | Weather event | Injuries | % of total injuries | |
|---|---|---|---|---|---|---|---|
| 1st | Excessive Heat | 2195 | 20.2% | Tornado | 23328 | 33.9% | |
| 2nd | Tornado | 1621 | 14.9% | Excessive Heat | 7039 | 10.2% | |
| 3rd | Flash flood | 1035 | 9.5% | Flood | 6794 | 9.9% | |
| 4th | Heat | 937 | 8.6% | Thunderstorm wind | 6184 | 9.0% | |
| 5th | Lightning | 817 | 7.5% | Lightning | 5231 | 7.6% |
kable(table_2, format = "pandoc", caption = "Table 2: Maximum yearly fatalities and injuries, 1993 to 2011")
| Year | Weather event | Fatalities | % yearly fatalities | Year | Weather event | Injuries | % yearly injuries | |
|---|---|---|---|---|---|---|---|---|
| 1995 | Heat | 687 | 46.1% | 2011 | Tornado | 6163 | 79.1% | |
| 2011 | Tornado | 587 | 58.6% | 1998 | Flood | 6130 | 54.8% | |
| 1999 | Excessive Heat | 502 | 55.3% | 1999 | Tornado | 1842 | 35.8% | |
| 2006 | Excessive Heat | 205 | 34.2% | 2008 | Tornado | 1690 | 62.5% | |
| 1998 | Excessive Heat | 168 | 24.5% | 1994 | Ice storm | 1631 | 39.2% |
Damage costs, summarised by year and weather event.
data_dt3_property <- data_dt[year >= 1993,
list("Total Damage" = sum(totalPropCost), type = "Property damage"),
by=list(year, eventType)]
data_dt3_property[, annualDamage := sum(`Total Damage`), by=year]
data_dt3_crop <- data_dt[year >= 1993,
list("Total Damage" = sum(totalCropCost), type = "Crop damage"),
by=list(year, eventType)]
data_dt3_crop[, annualDamage := sum(`Total Damage`), by=year]
data_dt3_combined <- data_dt[year >= 1993,
list("Total Damage" = sum(totalPropCost)+sum(totalCropCost), type = "Total damage"),
by=list(year, eventType)]
data_dt3_combined[, annualDamage := sum(`Total Damage`), by=year]
plot3data <- rbind(data_dt3_property, data_dt3_crop, data_dt3_combined)
plot3data <-plot3data[!is.na(eventType) & `Total Damage` > 0]
plot3data$eventType <- factor(plot3data$eventType,
levels = sort(unique(plot3data$eventType), decreasing=T))
Damage cost plot:
ggplot(plot3data, aes(x=as.numeric(year), y=eventType, fill = `Total Damage`/annualDamage)) +
geom_tile() + ylab("") + xlab("Year") +
facet_wrap(~type, nrow=1) +
scale_x_continuous(breaks=seq(1990, 2010, 5)) +
scale_fill_distiller(name="Percentage\nof total costs",
breaks = 10^(-5:0),
labels=function(x) paste0(round(10^(-5:0 + 2), 3),"%"),
trans='log10',
palette = "YlGnBu", guide='colourbar') +
ggtitle("Distribution of US$ damage costs caused by US weather events") +
theme_bw()
Damage cost tables:
table_3 <- data_dt3_property[, list("Billion US$ damage" = round(sum(`Total Damage`)/1e9, 2)), by = eventType]
table_3[, totalCost := sum(`Billion US$ damage`)]
table_3[, "% total damage" := paste0(round(100*`Billion US$ damage`/totalCost), "%")]
table_3 <- table_3[order(`Billion US$ damage`, decreasing=T), c(1, 2, 4), with=F][1:5]
setnames(table_3, "eventType", "Weather event")
table_4 <- data_dt3_crop[type == "Crop damage", list("Billion US$ damage" = round(sum(`Total Damage`)/1e9, 2)), by = eventType]
table_4[, totalCost := sum(`Billion US$ damage`)]
table_4[, "% total damage" := paste0(round(100*`Billion US$ damage`/totalCost), "%")]
table_4 <- table_4[order(`Billion US$ damage`, decreasing=T), c(1, 2, 4), with=F][1:5]
setnames(table_4, "eventType", "Weather event")
table_5 <- data_dt3_combined[type == "Total damage", list("Billion US$ damage" = round(sum(`Total Damage`)/1e9, 2)), by = eventType]
table_5[, totalCost := sum(`Billion US$ damage`)]
table_5[, "% total damage" := paste0(round(100*`Billion US$ damage`/totalCost), "%")]
table_5 <- table_5[order(`Billion US$ damage`, decreasing=T), c(1, 2, 4), with=F][1:5]
setnames(table_5, "eventType", "Weather event")
kable(table_3, format = "pandoc", caption = "Table 3: Total property damage costs, 1993 to 2011")
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Flood | 22.03 | 19% |
| Tornado | 19.93 | 18% |
| Flash flood | 14.71 | 13% |
| Hail | 13.60 | 12% |
| Hurricane/Typhoon | 10.94 | 10% |
kable(table_4, format = "pandoc", caption = "Table 4: Total crop damage costs, 1993 to 2011")
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Drought | 12.45 | 36% |
| Flood | 5.68 | 17% |
| Hurricane/Typhoon | 3.99 | 12% |
| Hail | 2.47 | 7% |
| Flash flood | 1.35 | 4% |
kable(table_5, format = "pandoc", caption = "Table 5: Total combined costs, 1993 to 2011")
| Weather event | Billion US$ damage | % total damage |
|---|---|---|
| Flood | 27.70 | 19% |
| Tornado | 20.25 | 14% |
| Hail | 16.07 | 11% |
| Flash flood | 16.06 | 11% |
| Hurricane/Typhoon | 14.93 | 10% |