This analysis uses the U.S. National Oceanic and Atmospheric Administration’s (NOAA) Storm Database to answer the following questions:
Note that the database contains events from years between 1950 and 2011.
The analysis relies on the Storm Data Preparation instruction document issued by the National Weather Service department of NOAA.
The storm data is read into object D, which is used throughout the analysis as the source of data. Results of data transformations are saved in this object.
download.file("https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2",
"StormData.csv.bz2")
D <- read.csv("StormData.csv.bz2", stringsAsFactors = FALSE, nrows = 1e6)
There are two major steps of data processing in this analysis:
These steps are detailed in the following sections.
Property and crop damages are stored in four columns in the original dataset:
Damage expression is an empty string or a single-character value, which specifies the multiplier of the damage value. Based on the Storm Data Preparation document, valid values are the empty string (no multiplication), K (thousands), M (millions) and B (billions).
In spite of this, the dataset contains several other expression characters:
Property and crop damage values are made directly comparable with the help of the clean.dollars function.
Damage values with non-valid expression are ignored by this analysis and therefore these values are replaced with zero, regardless of the original damage value.
Damage values with valid expression are on the other hand multiplied according to the expression (see above).
clean.dollars <- function(dollar.vector, dollar.exp)
{
valid.exp <- c("", "K", "M", "B")
dollar.vector <- replace(dollar.vector, !(dollar.exp %in% valid.exp), 0)
dollar.exp <- replace(dollar.exp, !(dollar.exp %in% valid.exp), "")
dollar.exp <- replace(dollar.exp, dollar.exp == "", "U")
value.map <- c(U = 1, K = 1e3, M = 1e6, B = 1e9)
for (v in names(value.map))
{
dollar.vector[dollar.exp == v] <-
dollar.vector[dollar.exp == v] * value.map[v]
}
return(dollar.vector)
}
The transformation is made on both PROPDMG and CROPDMG variables.
D$PROPDMG <- clean.dollars(D$PROPDMG, D$PROPDMGEXP)
D$CROPDMG <- clean.dollars(D$CROPDMG, D$CROPDMGEXP)
Also, all the expressions are set to U, which denotes the damage values have been set to unit values in the dataset; this is done only for the sake of clarity, because in practice damage expressions are not used further in this analysis.
D$PROPDMGEXP <- "U"
D$CROPDMGEXP <- "U"
Finally, a new column called ALLDMG is created in the dataset, which is simply the sum of PROPDMG and CROPDMG in each row.
D$ALLDMG <- D$PROPDMG + D$CROPDMG
Valid event types are defined by the Storm Data Preparation instructions. These are listed in the valid.events object.
valid.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')
The dataset has a column called EVTYPE, which specifies the type of the weather event the record is about. Just like in case of the damage expressions, this also contains non-valid event types, but here situation is much worse: there are 985 different values. These include variants which are same except for the casing or typos, synonyms, mixed types, new types, free-text comments etc.
Here are 20 examples from the dataset: DRY MIRCOBURST WINDS, Dust Devil, EXCESSIVE WETNESS, HAIL/WIND, HIGH WIND, Ice Fog, Record Cold, RECORD COOL, RECORD/EXCESSIVE HEAT, RIVER FLOOD, SNOW SHOWERS, SNOW/RAIN/SLEET, Summary of March 23, THUNDERSTORM DAMAGE, THUNDERSTORM HAIL, THUNDERSTORM WINDS HEAVY RAIN, THUNDERSTORM WINDS SMALL STREA, TORRENTIAL RAIN, VOLCANIC ASH, VOLCANIC ASH.
First of all, both the list of valid events and the events in the dataset are converted to upper case. The original EVTYPE column is retained in the dataset, the upper case variants are put to a new column called EVTYPE2. Note that all the further transformations are done on this column.
valid.events <- toupper(valid.events)
D$EVTYPE2 <- toupper(D$EVTYPE)
Then some very general statistics is calculated about the wrong event types.
valid.count <- sum(table(D$EVTYPE2)[valid.events], na.rm = TRUE)
valid.percent <- round(valid.count / nrow(D) * 100, 2)
Based on this, the dataset has 902297 observations, and out of these 635439 pieces have a non-valid event type; this is approximately 70.42% of the data, which implies a clean-up is seriously needed.
Making the event types upper case has a good effect in itself. The following snippet calculates the measure of enhancement, which is simply the difference between the previous number of different event types and the current number. Similar statistic will be used throughout the complete event type transformation process.
begin.count <- length(unique(D$EVTYPE))
ev.count <- list(prev = length(unique(D$EVTYPE)),
cur = length(unique(D$EVTYPE2)),
diff = length(unique(D$EVTYPE)) - length(unique(D$EVTYPE2)))
Upper casing unified 985 different event types into 898 pieces, which is a decrease by 87.
The dataset contains a large number of records about weather events with no damage, i.e. where fatalities, injuries, property damage and crop damage are all 0. These records can be ignored and thus removed, because they do not affect the outcome of the analysis.
A new function called update.evcount is introduced which updates the ev.count counter list after a transformation step is completed. This function is used in all further steps of data processing.
update.evcount <- function(prev.count, cur.count)
{
list(prev = prev.count,
cur = cur.count,
diff = prev.count - cur.count)
}
Zero-damage records are removed with a simple call to dplyr::filter function. Some statistics is also calculated here.
nrow.old <- nrow(D)
D <- D %>% filter(FATALITIES != 0 | INJURIES != 0 | PROPDMG != 0 | CROPDMG != 0)
nrow.diff <- nrow.old - nrow(D)
nrow.diffpc <- round(nrow.diff / nrow.old * 100, 2)
ev.count <- update.evcount(ev.count$cur, length(unique(D$EVTYPE2)))
This action removed 647908 records, i.e. approximately 71.81% of the data, and also unified 898 different event types into 443 pieces, which is a decrease by 455.
This step takes the list of unique event type strings, and removes junk characters and words.
A new function called update.evtype2 is introduced which updates the EVTYPE2 column of the dataset with the new names, line by line. This function is used in several steps of the data processing.
update.evtype2 <- function(evtype2, old.values, new.values)
{
for (i in 1:nrow(D))
{
index <- i
evtype2[[index]] <- new.values[old.values == evtype2[index]]
}
return(evtype2)
}
The junk removal consists of the following steps:
evtypes.orig <- sort(unique(D$EVTYPE2))
evtypes.new <- gsub("[^A-Z]", " ", evtypes.orig)
evtypes.new <- gsub("^ +| +$", "", evtypes.new)
evtypes.new <- gsub("([A-Z]) +([A-Z])", "\\1 \\2", evtypes.new)
evtypes.new <- gsub(" [A-Z]{1}$", "", evtypes.new)
evtypes.new <- gsub(" (AND|ON) ", " ", evtypes.new)
D$EVTYPE2 <- update.evtype2(D$EVTYPE2, evtypes.orig, evtypes.new)
ev.count <- update.evcount(ev.count$cur, length(unique(D$EVTYPE2)))
Junk removal unified 443 different event types into 373 pieces, which is a decrease by 70.
Several event types in the dataset differ only in pluralization, which are usually unnecessary duplicates of other event types.
First a list of suspected plurals is created by creating a vector of unique words of the event types, and then words ending with an S character are filtered out.
all.tokens <- strsplit(unique(D$EVTYPE2), split = " ")
all.tokens <- sort(unique(unlist(all.tokens)))
plurals <- grep("[A-Z]+S( |$)", all.tokens, value = TRUE)
This gives the following result: CONDITIONS, CURRENTS, FIRES, FLOES, FLOODS, GRASS, HAZARDOUS, JAMS, LANDSLIDES, MUDSLIDES, RAINS, ROADS, SEAS, SLIDES, SQUALLS, STORMS, SWELLS, TEMPERATURES, THUNDERSTORMS, THUNDERSTORMWINDS, TORNADOES, TREES, WAVES, WETNESS, WILDFIRES, WINDS, WINDSS, WINS.
Out of these HAZARDOUS and WETNESS are not pluralized words, and therefore they are removed from the plural list. WINDSS has two S characters at the end most probably by mistake, and as it has the same stem as WINDS, which is already on the list, WINDSS is also removed. For the remaining words, the trailing S character is simply removed to obtain the single form.
plurals <- plurals[!(plurals %in% c("HAZARDOUS", "WETNESS", "WINDSS"))]
singles <- gsub("S$", "", plurals)
Finally, the list of single word forms is used to build a regular expression, which is used to replace plurals to singles in the list of event types. The EVTYPE2 column is updated with the results.
evtypes.orig <- sort(unique(D$EVTYPE2))
regex.str <- paste0("(", paste(singles, collapse = "|"), ")", "S+( |$)")
evtypes.new <- gsub(regex.str, "\\1\\2", evtypes.orig)
D$EVTYPE2 <- update.evtype2(D$EVTYPE2, evtypes.orig, evtypes.new)
ev.count <- update.evcount(ev.count$cur, length(unique(D$EVTYPE2)))
Changing plural words to single words unified 373 different event types into 341 pieces, which is a decrease by 32.
Note: This step cannot handle special plural forms (like minima and maxima). However, this should not be an issue as no such event type was observed in the dataset.
The result of the previous steps was checked manually for further possible enhancement of the set of event types. The result of the analysis is shown in the table below. This table is stored in the replacement.table data frame. For the sake of clarity, the R script of this is not echoed here, only the content of the replacement table is shown below.
| From | To | Type | |
|---|---|---|---|
| 1 | UNNAMED | synonym | |
| 2 | AVALANCE | AVALANCHE | correction |
| 3 | BLOWING SNOW | BLIZZARD | synonym |
| 4 | BRUSH FIRE | WILDFIRE | synonym |
| 5 | COASTAL SURGE | STORM SURGE TIDE | synonym |
| 6 | COASTALSTORM | COASTAL STORM | correction |
| 7 | DRY MICROBURST WIND | DRY MICROBURST | synonym |
| 8 | EROSION CSTL FLOOD | COASTAL FLOOD EROSION | correction |
| 9 | EXTREME COLD | EXTREME COLD WIND CHILL | synonym |
| 10 | EXTREME WINDCHILL | EXTREME COLD WIND CHILL | synonym |
| 11 | FLASH FLOOD FLOOD | FLASH FLOOD | correction |
| 12 | FLASH FLOOD FROM ICE JAM | ICE JAM FLOOD | correction |
| 13 | FLASH FLOOD THUNDERSTORM WI | FLASH FLOOD THUNDERSTORM WIND | correction |
| 14 | FLOOD FLASH | FLASH FLOOD | correction |
| 15 | FLOOD FLASH FLOOD | FLASH FLOOD | correction |
| 16 | FLOOD FLASHFLOOD | FLASH FLOOD | correction |
| 17 | FLOOD RIVER FLOOD | FLOOD | correction |
| 18 | FLOODING | FLOOD | general |
| 19 | FOREST FIRE | WILDFIRE | synonym |
| 20 | FREEZE | FROST FREEZE | synonym |
| 21 | FREEZING RAIN | SLEET | synonym |
| 22 | FROST | FROST FREEZE | synonym |
| 23 | GRAS FIRE | WILDFIRE | synonym |
| 24 | GROUND BLIZZARD | BLIZZARD | correction |
| 25 | GUSTY WIND HVY RAIN | GUSTY WIND HEAVY RAIN | correction |
| 26 | HAIL DAMAGE | HAIL | correction |
| 27 | HAILSTORM | HAIL | synonym |
| 28 | HARD FREEZE | FROST FREEZE | synonym |
| 29 | HAZARDOUS SURF | HIGH SURF | synonym |
| 30 | HEAVY SNOW SQUALL | BLIZZARD | synonym |
| 31 | HEAVY SURF HIGH SURF | HIGH SURF | correction |
| 32 | HIGH SQUALL | HIGH WIND | synonym |
| 33 | HIGH SWELL | HIGH SURF | synonym |
| 34 | HIGH WAVE | HIGH SURF | synonym |
| 35 | HIGH WIND DAMAGE | HIGH WIND | correction |
| 36 | HURRICANE EDOUARD | HURRICANE | correction |
| 37 | HURRICANE EMILY | HURRICANE | correction |
| 38 | HURRICANE ERIN | HURRICANE | correction |
| 39 | HURRICANE FELIX | HURRICANE | correction |
| 40 | HURRICANE GORDON | HURRICANE | correction |
| 41 | HURRICANE HURRICANE | HURRICANE | correction |
| 42 | HURRICANE OPAL | HURRICANE | correction |
| 43 | HURRICANE OPAL HIGH WIND | HURRICANE HIGH WIND | correction |
| 44 | HVY RAIN | HEAVY RAIN | correction |
| 45 | ICE JAM FLOOD | ICE JAM FLOOD | correction |
| 46 | ICE JAM FLOOD MINOR | ICE JAM FLOOD | correction |
| 47 | ICE ON ROAD | ICY ROAD | correction |
| 48 | ICE ROAD | ICY ROAD | correction |
| 49 | LAKE FLOOD | LAKESHORE FLOOD | correction |
| 50 | LATE SEASON SNOW | SNOW | synonym |
| 51 | LIGHT FREEZING RAIN | SLEET | synonym |
| 52 | LIGHT SNOWFALL | LIGHT SNOW | synonym |
| 53 | LIGHTING | LIGHTNING | correction |
| 54 | LIGHTNING FIRE | LIGHTNING | correction |
| 55 | LIGHTNING INJURY | LIGHTNING | correction |
| 56 | LIGHTNING THUNDERSTORM WIN | LIGHTNING THUNDERSTORM WIND | correction |
| 57 | LIGHTNING WAUSEON | LIGHTNING | correction |
| 58 | LIGNTNING | LIGHTNING | correction |
| 59 | LOW TEMPERATURE | COLD WIND CHILL | synonym |
| 60 | MAJOR FLOOD | FLOOD | correction |
| 61 | MARINE MISHAP | MARINE ACCIDENT | synonym |
| 62 | MICROBURST WIND | MICROBURST | synonym |
| 63 | MINOR FLOOD | FLOOD | correction |
| 64 | MIXED PERCIP | MIXED PERCIPITATION | correction |
| 65 | MUD SLIDE | LANDSLIDE | synonym |
| 66 | MUD SLIDEURBAN FLOOD | MUD SLIDE URBAN FLOOD | correction |
| 67 | MUDSLIDE | LANDSLIDE | synonym |
| 68 | RECORD COLD | EXTREME COLD WIND CHILL | synonym |
| 69 | RECORD EXCESSIVE HEAT | EXCESSIVE HEAT | correction |
| 70 | RECORD HEAT | EXCESSIVE HEAT | correction |
| 71 | RIP CURRENTHEAVY SURF | RIP CURRENT HIGH SURF | correction |
| 72 | RIVER FLOOD | FLOOD | correction |
| 73 | RIVER STREAM FLOOD | FLOOD | correction |
| 74 | ROCK SLIDE | LANDSLIDE | synonym |
| 75 | ROUGH SURF | HIGH SURF | synonym |
| 76 | RURAL FLOOD | FLOOD | correction |
| 77 | SEVERE THUNDERSTORM WIND | THUNDERSTORM WIND | correction |
| 78 | SMALL HAIL | HAIL | correction |
| 79 | SNOW BLOWING SNOW | BLIZZARD | synonym |
| 80 | SNOW FREEZING RAIN | SNOW SLEET | synonym |
| 81 | SNOW HEAVY SNOW | HEAVY SNOW | synonym |
| 82 | SNOW SLEET FREEZING RAIN | SNOW SLEET | correction |
| 83 | SNOW SQUALL | BLIZZARD | synonym |
| 84 | SNOWMELT FLOOD | FLOOD | synonym |
| 85 | STORM FORCE WIND | THUNDERSTORM WIND | synonym |
| 86 | STORM SURGE | HIGH SURF | synonym |
| 87 | THUDERSTORM WIND | THUNDERSTORM WIND | correction |
| 88 | THUNDEERSTORM WIND | THUNDERSTORM WIND | correction |
| 89 | THUNDERESTORM WIND | THUNDERSTORM WIND | correction |
| 90 | THUNDERSTORM DAMAGE TO | THUNDERSTORM | correction |
| 91 | THUNDERSTORM HAIL | HAIL | correction |
| 92 | THUNDERSTORM WIN | THUNDERSTORM WIND | correction |
| 93 | THUNDERSTORM WIND AND | THUNDERSTORM WIND | correction |
| 94 | THUNDERSTORM WIND AWNING | THUNDERSTORM WIND | correction |
| 95 | THUNDERSTORM WIND DAMAGE | THUNDERSTORM WIND | correction |
| 96 | THUNDERSTORM WIND FUNNEL CLOU | THUNDERSTORM WIND FUNNEL CLOUD | correction |
| 97 | THUNDERSTORM WIND HAIL | THUNDERSTORM WIND HAIL | correction |
| 98 | THUNDERSTORM WIND MPH | THUNDERSTORM WIND | correction |
| 99 | THUNDERSTORM WIND TREE | THUNDERSTORM WIND | correction |
| 100 | THUNDERSTORM WINDSHAIL | THUNDERSTORM WIND HAIL | correction |
| 101 | THUNDERSTORMW | THUNDERSTORM WIND | correction |
| 102 | THUNDERSTORMWIND | THUNDERSTORM WIND | correction |
| 103 | THUNDERSTROM WIND | THUNDERSTORM WIND | correction |
| 104 | THUNDERTORM WIND | THUNDERSTORM WIND | correction |
| 105 | THUNERSTORM WIND | THUNDERSTORM WIND | correction |
| 106 | TIDAL FLOOD | FLOOD | synonym |
| 107 | TORNADOE | TORNADO | correction |
| 108 | TORNADOE THUNDERSTORM WIND HAIL | TORNADO THUNDERSTORM WIND HAIL | correction |
| 109 | TORNDAO | TORNADO | correction |
| 110 | TROPICAL STORM | TROPICAL DEPRESSION | synonym |
| 111 | TROPICAL STORM ALBERTO | TROPICAL DEPRESSION | correction |
| 112 | TROPICAL STORM DEAN | TROPICAL DEPRESSION | correction |
| 113 | TROPICAL STORM GORDON | TROPICAL DEPRESSION | correction |
| 114 | TROPICAL STORM JERRY | TROPICAL DEPRESSION | correction |
| 115 | TSTM | THUNDERSTORM | general |
| 116 | TUNDERSTORM WIND | THUNDERSTORM WIND | correction |
| 117 | TYPHOON | HURRICANE | general |
| 118 | UNSEASONABLE COLD | UNSEASONABLY COLD | correction |
| 119 | UNSEASONABLY WARM DRY | UNSEASONABLY WARM | correction |
| 120 | URBAN FLOOD | FLASH FLOOD | synonym |
| 121 | URBAN SMALL | FLASH FLOOD | correction |
| 122 | URBAN SMALL STREAM | FLASH FLOOD | correction |
| 123 | URBAN SMALL STREAM FLOOD | FLASH FLOOD | correction |
| 124 | URBAN SMALL STREAM FLOODIN | FLASH FLOOD | correction |
| 125 | URBAN SML STREAM FLD | FLASH FLOOD | correction |
| 126 | WARM WEATHER | HEAT | synonym |
| 127 | WILD FIRE | WILDFIRE | correction |
| 128 | WILD FOREST FIRE | WILDFIRE | correction |
| 129 | WIND DAMAGE | WIND | correction |
| 130 | WIND STORM | THUNDERSTORM WIND | correction |
| 131 | WINTER WEATHER MIX | WINTER WEATHER | correction |
| 132 | WINTRY MIX | WINTER WEATHER | correction |
The Type column indicates the nature of replacement:
Replacements are made on the result of the previous step.
First the general replacements are made. In this case replacement is made on sub-strings of event type strings.
evtypes.orig <- sort(unique(D$EVTYPE2))
evtypes.new <- evtypes.orig
R <- replacement.table %>% filter(Type == "general")
for (i in 1:nrow(R))
{
evtypes.new <- gsub(R$From[i], R$To[i], evtypes.new)
}
After this, the synonym and correction replacements are made. Here the replacement is made only if From exactly matches the event type string.
R <- replacement.table %>% filter(Type %in% c("synonym", "correction"))
for (i in 1:nrow(R))
{
evtypes.new <- gsub(paste0("^", R$From[i], "$"), R$To[i], evtypes.new)
}
Finally the EVTYPE2 column in the dataset, and the count statistics are updated.
D$EVTYPE2 <- update.evtype2(D$EVTYPE2, evtypes.orig, evtypes.new)
ev.count <- update.evcount(ev.count$cur, length(unique(D$EVTYPE2)))
These replacements unified 341 different event types into 212 pieces, which is a decrease by 129.
Up to this point, the original 985 pieces of event type were unified into 212 pieces.
Further unification would require deeper understanding of the topic, and also a deeper analysis of the remarks to understand the non-valid event types. These are not done in this analysis.
This analysis deals with the following questions:
The answers to these questions require different variables from the dataset, but they can be constructed in the same way.
top.n <- 10
selector <- c("FATALITIES", "INJURIES", "PROPDMG", "CROPDMG", "ALLDMG")
ylabels <- c("Fatalities (people)", "Injuries (people)",
"Property damage ($ billion)", "Crop damage ($ billion)",
"Total damage ($ billion)")
names(ylabels) <- selector
The plots will show the 10 most harmful weather events for damage types FATALITIES, INJURIES, PROPDMG, CROPDMG, ALLDMG. All of these are totals across the whole United States, per weather event.
First, a grouping by EVTYPE2 is created for each of the damage types. In case of PROPDMG, CROPDMG and ALLDMG, values are divided by one billion.
tops <- list()
for (s in selector)
{
D.grouped <- D %>%
select(EVTYPE2, DATA = s) %>%
group_by(EVTYPE2) %>%
summarise(DATA = sum(DATA)) %>%
arrange(desc(DATA)) %>%
mutate(EVTYPE2 = factor(EVTYPE2, EVTYPE2))
if (s %in% c("PROPDMG", "CROPDMG", "ALLDMG"))
D.grouped <- D.grouped %>% mutate(DATA = DATA / 1e9)
tops[[s]] <- D.grouped[1:top.n,]
}
For each of the top 10 tables, a column plot is created (but not yet shown), which will be used on the final figures.
grobs <- list()
for (s in selector)
{
col.plot <- ggplot(tops[[s]], aes(EVTYPE2, DATA)) +
geom_col(fill = I("steelblue")) +
theme_light() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
xlab("Weather event") +
ylab(ylabels[s])
grobs[[s]] <- ggplotGrob(col.plot)
}
The following table shows the top 10 most harmful weather events with respect to population health in the US. Values are given in people.
| Weather event | Fatalities | Weather event | Injuries | |
|---|---|---|---|---|
| 1 | TORNADO | 5633 | TORNADO | 91364 |
| 2 | EXCESSIVE HEAT | 1922 | THUNDERSTORM WIND | 9400 |
| 3 | FLASH FLOOD | 1064 | FLOOD | 6795 |
| 4 | HEAT | 937 | EXCESSIVE HEAT | 6575 |
| 5 | LIGHTNING | 817 | LIGHTNING | 5231 |
| 6 | THUNDERSTORM WIND | 706 | HEAT | 2102 |
| 7 | RIP CURRENT | 572 | ICE STORM | 1975 |
| 8 | FLOOD | 482 | FLASH FLOOD | 1879 |
| 9 | EXTREME COLD WIND CHILL | 305 | WILDFIRE | 1608 |
| 10 | HIGH WIND | 283 | HIGH WIND | 1440 |
The same result is summarised on the figure below.
Figure 1. Most harmful weather events across the US (population health)
The following table shows the top 10 most harmful weather events with respect to the economy in the US. Values are given in billion dollars.
| Weather event | Property damage | Weather event | Crop damage | Weather event | Total damage | |
|---|---|---|---|---|---|---|
| 1 | FLOOD | 150.118974 | DROUGHT | 13.9725660 | FLOOD | 160.847331 |
| 2 | HURRICANE | 85.236335 | FLOOD | 10.7283579 | HURRICANE | 90.732453 |
| 3 | TORNADO | 56.930432 | HURRICANE | 5.4961178 | TORNADO | 57.345394 |
| 4 | HIGH SURF | 43.423376 | ICE STORM | 5.0221135 | HIGH SURF | 43.423381 |
| 5 | FLASH FLOOD | 16.989379 | HAIL | 3.0464705 | HAIL | 19.015614 |
| 6 | HAIL | 15.969144 | FROST FREEZE | 1.6300110 | FLASH FLOOD | 18.531344 |
| 7 | THUNDERSTORM WIND | 9.714430 | FLASH FLOOD | 1.5419653 | DROUGHT | 15.018672 |
| 8 | WILDFIRE | 8.496628 | EXTREME COLD WIND CHILL | 1.3300230 | THUNDERSTORM WIND | 10.903024 |
| 9 | TROPICAL DEPRESSION | 7.716128 | THUNDERSTORM WIND | 1.1885947 | ICE STORM | 8.967041 |
| 10 | WINTER STORM | 6.688997 | HEAVY RAIN | 0.7939028 | WILDFIRE | 8.899910 |
The same result is summarised on the figure below.
Figure 2. Most harmful weather events across the US (impact on economy)
The analysis shows that tornados are the most harmful weather events with respect to population health - both from deaths and injuries point of view. It is also clearly visible that the impact of tornados on population health is much higher than any other weather event.
Regarding economic consequences, flood is the leading weather event for property damage and total damage. Drought is the leading weather event for crop damage, but flood is also there as second, with a relatively close value to drought.