Synopsis

This analysis uses the U.S. National Oceanic and Atmospheric Administration’s (NOAA) Storm Database to answer the following questions:

  1. Across the United States, which types of events are most harmful with respect to population health?
  2. Across the United States, which types of events have the greatest economic consequences?

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.

Data Processing

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:

  1. Based on the Storm Data Preparation document, the property and crop damages should be stored as pairs of value and expression in each record, where expression should indicate the magnitude of the value. For example, the value 100 with the expression M means 100 million. This data processing step sets all value to value * expression, and all expressions to U, which indicates the magnitude of the expression is 1. Furthermore a new variable is added to the dataset, which is simply the sum of property and crop damage values.
  2. Based on the Storm Data Preparation document, there should be only a certain number of different weather event types in the dataset (valid event types). However, this is not true in practice: there are way more event types than expected (non-valid event types). The aim of this step is to unite as much non-valid event types as possible into as less event types (not necessarily valid ones) as possible.

These steps are detailed in the following sections.

Transformation of property and crop damages

Property and crop damages are stored in four columns in the original dataset:

  • PROPDMG: the value of property damage;
  • PROPDMGEXP: the expression of property damage;
  • CROPDMG: the value of crop damage;
  • CROPDMGEXP: the expression of crop damage.

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:

  • PROPDMGEXP: , -, ?, +, 0, 1, 2, 3, 4, 5, 6, 7, 8, B, h, H, K, m, M
  • CROPDMGEXP: , ?, 0, 2, B, k, K, m, M

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

Transformation of event types

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.

Upper case event types

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.

Remove zero-damage records

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.

Remove junk from event type strings

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:

  1. non-alphabetical characters are replaced by spaces;
  2. leading and trailing spaces are removed;
  3. excessive spaces between alphabetical characters are removed (i.e. multiple spaces to single space);
  4. space followed by a single character is removed;
  5. AND and ON between two other words are removed.
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.

Change plurals to singles

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.

Replacement of specific words

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:

  • general: it is a replacement of a deviation frequent among event types;
  • synonym: the two terms have the same meaning;
  • correction: this indicates a correction of a typo, duplication, etc.

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.

Summary of Data Processing

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.

Results

This analysis deals with the following questions:

  1. Across the United States, which types of events are most harmful with respect to population health?
  2. Across the United States, which types of events have the greatest economic consequences?

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)
}

Question 1: Across the United States, which types of events are most harmful with respect to population health?

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)*

Figure 1. Most harmful weather events across the US (population health)

Question 2: Across the United States, which types of events have the greatest economic consequences?

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)*

Figure 2. Most harmful weather events across the US (impact on economy)

Summary of Results

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.