[Github repo for the project] (https://github.com/harishmani09/RepData_PeerAssignment2)

Analysis of NOAA storm data for takeaways

Synopsis

this is analysis of the storm database by NOAA. This is required for fulfillment of Project 2, Reproducible Research, data science course from Johns Hopkins University. The objective of the EDA is to study the weather events and find out which event types are most harmful for with respect to population health and which weather events cause max economic losses

Data is a available from url: url

Data Processing

Data loading

Download the raw data and load it in a dataframe in R studio

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(data.table)
## 
## Attaching package: 'data.table'
## 
## The following objects are masked from 'package:lubridate':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## 
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## 
## The following object is masked from 'package:purrr':
## 
##     transpose
library(R.utils)
## Loading required package: R.oo
## Loading required package: R.methodsS3
## R.methodsS3 v1.8.2 (2022-06-13 22:00:14 UTC) successfully loaded. See ?R.methodsS3 for help.
## R.oo v1.27.0 (2024-11-01 18:00:02 UTC) successfully loaded. See ?R.oo for help.
## 
## Attaching package: 'R.oo'
## 
## The following object is masked from 'package:R.methodsS3':
## 
##     throw
## 
## The following objects are masked from 'package:methods':
## 
##     getClasses, getMethods
## 
## The following objects are masked from 'package:base':
## 
##     attach, detach, load, save
## 
## R.utils v2.13.0 (2025-02-24 21:20:02 UTC) successfully loaded. See ?R.utils for help.
## 
## Attaching package: 'R.utils'
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## The following object is masked from 'package:utils':
## 
##     timestamp
## 
## The following objects are masked from 'package:base':
## 
##     cat, commandArgs, getOption, isOpen, nullfile, parse, use, warnings
library(lubridate)

#download the file from the given url 
if (!file.exists('StormData.csv.bz2')){
    url <- "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
    download.file(url,'StormData.csv.bz2')
    bunzip2('StormData.csv.bz2','stormData.csv',remove=FALSE)
}

#read the file in r
data <- read_csv('stormData.csv')
## Rows: 902297 Columns: 37
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (18): BGN_DATE, BGN_TIME, TIME_ZONE, COUNTYNAME, STATE, EVTYPE, BGN_AZI,...
## dbl (18): STATE__, COUNTY, BGN_RANGE, COUNTY_END, END_RANGE, LENGTH, WIDTH, ...
## lgl  (1): COUNTYENDN
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#examine data using names and glimpse functions 
names(data)
##  [1] "STATE__"    "BGN_DATE"   "BGN_TIME"   "TIME_ZONE"  "COUNTY"    
##  [6] "COUNTYNAME" "STATE"      "EVTYPE"     "BGN_RANGE"  "BGN_AZI"   
## [11] "BGN_LOCATI" "END_DATE"   "END_TIME"   "COUNTY_END" "COUNTYENDN"
## [16] "END_RANGE"  "END_AZI"    "END_LOCATI" "LENGTH"     "WIDTH"     
## [21] "F"          "MAG"        "FATALITIES" "INJURIES"   "PROPDMG"   
## [26] "PROPDMGEXP" "CROPDMG"    "CROPDMGEXP" "WFO"        "STATEOFFIC"
## [31] "ZONENAMES"  "LATITUDE"   "LONGITUDE"  "LATITUDE_E" "LONGITUDE_"
## [36] "REMARKS"    "REFNUM"
glimpse(data)
## Rows: 902,297
## Columns: 37
## $ STATE__    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ BGN_DATE   <chr> "4/18/1950 0:00:00", "4/18/1950 0:00:00", "2/20/1951 0:00:0…
## $ BGN_TIME   <chr> "0130", "0145", "1600", "0900", "1500", "2000", "0100", "09…
## $ TIME_ZONE  <chr> "CST", "CST", "CST", "CST", "CST", "CST", "CST", "CST", "CS…
## $ COUNTY     <dbl> 97, 3, 57, 89, 43, 77, 9, 123, 125, 57, 43, 9, 73, 49, 107,…
## $ COUNTYNAME <chr> "MOBILE", "BALDWIN", "FAYETTE", "MADISON", "CULLMAN", "LAUD…
## $ STATE      <chr> "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL",…
## $ EVTYPE     <chr> "TORNADO", "TORNADO", "TORNADO", "TORNADO", "TORNADO", "TOR…
## $ BGN_RANGE  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ BGN_AZI    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ BGN_LOCATI <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_DATE   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_TIME   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ COUNTY_END <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ COUNTYENDN <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_RANGE  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ END_AZI    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_LOCATI <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ LENGTH     <dbl> 14.0, 2.0, 0.1, 0.0, 0.0, 1.5, 1.5, 0.0, 3.3, 2.3, 1.3, 4.7…
## $ WIDTH      <dbl> 100, 150, 123, 100, 150, 177, 33, 33, 100, 100, 400, 400, 2…
## $ F          <dbl> 3, 2, 2, 2, 2, 2, 2, 1, 3, 3, 1, 1, 3, 3, 3, 4, 1, 1, 1, 1,…
## $ MAG        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ FATALITIES <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0,…
## $ INJURIES   <dbl> 15, 0, 2, 2, 2, 6, 1, 0, 14, 0, 3, 3, 26, 12, 6, 50, 2, 0, …
## $ PROPDMG    <dbl> 25.0, 2.5, 25.0, 2.5, 2.5, 2.5, 2.5, 2.5, 25.0, 25.0, 2.5, …
## $ PROPDMGEXP <chr> "K", "K", "K", "K", "K", "K", "K", "K", "K", "K", "M", "M",…
## $ CROPDMG    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ CROPDMGEXP <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ WFO        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ STATEOFFIC <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ ZONENAMES  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ LATITUDE   <dbl> 3040, 3042, 3340, 3458, 3412, 3450, 3405, 3255, 3334, 3336,…
## $ LONGITUDE  <dbl> 8812, 8755, 8742, 8626, 8642, 8748, 8631, 8558, 8740, 8738,…
## $ LATITUDE_E <dbl> 3051, 0, 0, 0, 0, 0, 0, 0, 3336, 3337, 3402, 3404, 0, 3432,…
## $ LONGITUDE_ <dbl> 8806, 0, 0, 0, 0, 0, 0, 0, 8738, 8737, 8644, 8640, 0, 8540,…
## $ REMARKS    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ REFNUM     <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …

Data Massaging

We convert event time from character to date time and change EVTYPE and State to factor for our analysis

storm_data <- data |>
    mutate(BGN_DATE = mdy_hms(BGN_DATE)) |> 
    mutate(EVTYPE = as.factor(EVTYPE)) |>
    mutate(STATE = as.factor(STATE)) |>
    glimpse()
## Rows: 902,297
## Columns: 37
## $ STATE__    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ BGN_DATE   <dttm> 1950-04-18, 1950-04-18, 1951-02-20, 1951-06-08, 1951-11-15…
## $ BGN_TIME   <chr> "0130", "0145", "1600", "0900", "1500", "2000", "0100", "09…
## $ TIME_ZONE  <chr> "CST", "CST", "CST", "CST", "CST", "CST", "CST", "CST", "CS…
## $ COUNTY     <dbl> 97, 3, 57, 89, 43, 77, 9, 123, 125, 57, 43, 9, 73, 49, 107,…
## $ COUNTYNAME <chr> "MOBILE", "BALDWIN", "FAYETTE", "MADISON", "CULLMAN", "LAUD…
## $ STATE      <fct> AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,…
## $ EVTYPE     <fct> "TORNADO", "TORNADO", "TORNADO", "TORNADO", "TORNADO", "TOR…
## $ BGN_RANGE  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ BGN_AZI    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ BGN_LOCATI <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_DATE   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_TIME   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ COUNTY_END <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ COUNTYENDN <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_RANGE  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ END_AZI    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ END_LOCATI <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ LENGTH     <dbl> 14.0, 2.0, 0.1, 0.0, 0.0, 1.5, 1.5, 0.0, 3.3, 2.3, 1.3, 4.7…
## $ WIDTH      <dbl> 100, 150, 123, 100, 150, 177, 33, 33, 100, 100, 400, 400, 2…
## $ F          <dbl> 3, 2, 2, 2, 2, 2, 2, 1, 3, 3, 1, 1, 3, 3, 3, 4, 1, 1, 1, 1,…
## $ MAG        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ FATALITIES <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0,…
## $ INJURIES   <dbl> 15, 0, 2, 2, 2, 6, 1, 0, 14, 0, 3, 3, 26, 12, 6, 50, 2, 0, …
## $ PROPDMG    <dbl> 25.0, 2.5, 25.0, 2.5, 2.5, 2.5, 2.5, 2.5, 25.0, 25.0, 2.5, …
## $ PROPDMGEXP <chr> "K", "K", "K", "K", "K", "K", "K", "K", "K", "K", "M", "M",…
## $ CROPDMG    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ CROPDMGEXP <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ WFO        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ STATEOFFIC <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ ZONENAMES  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ LATITUDE   <dbl> 3040, 3042, 3340, 3458, 3412, 3450, 3405, 3255, 3334, 3336,…
## $ LONGITUDE  <dbl> 8812, 8755, 8742, 8626, 8642, 8748, 8631, 8558, 8740, 8738,…
## $ LATITUDE_E <dbl> 3051, 0, 0, 0, 0, 0, 0, 0, 3336, 3337, 3402, 3404, 0, 3432,…
## $ LONGITUDE_ <dbl> 8806, 0, 0, 0, 0, 0, 0, 0, 8738, 8737, 8644, 8640, 0, 8540,…
## $ REMARKS    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ REFNUM     <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
#some quick summaries 
summary(storm_data$FATALITIES)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##   0.0000   0.0000   0.0000   0.0168   0.0000 583.0000
summary(storm_data$INJURIES)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##    0.0000    0.0000    0.0000    0.1557    0.0000 1700.0000
summary(storm_data$PROPDMG)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    0.00    0.00   12.06    0.50 5000.00
summary(storm_data$CROPDMG)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   0.000   1.527   0.000 990.000

Results

Casualities from event type

damage_data <- storm_data |>
    group_by(EVTYPE) |>
    summarise(
        FATALITIES = sum(FATALITIES),
        INJURIES = sum(INJURIES)
        ) |>
    arrange(desc(FATALITIES)) |>
    slice(1:10) |>
    print()
## # A tibble: 10 × 3
##    EVTYPE         FATALITIES INJURIES
##    <fct>               <dbl>    <dbl>
##  1 TORNADO              5633    91346
##  2 EXCESSIVE HEAT       1903     6525
##  3 FLASH FLOOD           978     1777
##  4 HEAT                  937     2100
##  5 LIGHTNING             816     5230
##  6 TSTM WIND             504     6957
##  7 FLOOD                 470     6789
##  8 RIP CURRENT           368      232
##  9 HIGH WIND             248     1137
## 10 AVALANCHE             224      170
damage_data_lg <- damage_data |>
    pivot_longer(
        cols=!EVTYPE,
        names_to = 'harm_type',
        values_to = 'count'
    ) 
    
damage_data_lg |> ggplot(aes(x=EVTYPE,y=count,fill = harm_type)) + 
    geom_col() + theme(axis.text.x = element_text(angle = 90,color='red',face='bold')) +
    labs(
        title='Top 10 events with maximum casualities',
        x='Event Type',
        y='Incidents',
        caption='Storm Data from NOAA from 1990 onwards'
         )

#tornados are the biggest culprint and cause maximum casualtities. 

Trend of casualties from Tornado over the years

tornado_data <- data |> 
    filter(EVTYPE=='TORNADO') |>
    mutate(BGN_DATE = mdy_hms(BGN_DATE)) |>
    mutate(BGN_DATE = year(BGN_DATE))|>
    group_by(BGN_DATE) |>
    summarise(FATALITIES = sum(FATALITIES),
              INJURIES=sum(INJURIES)) |>
    print()
## # A tibble: 62 × 3
##    BGN_DATE FATALITIES INJURIES
##       <int>      <dbl>    <dbl>
##  1     1950         70      659
##  2     1951         34      524
##  3     1952        230     1915
##  4     1953        519     5131
##  5     1954         36      715
##  6     1955        129      926
##  7     1956         83     1355
##  8     1957        193     1976
##  9     1958         67      535
## 10     1959         58      734
## # ℹ 52 more rows
tornado_data_longer <- tornado_data |>
    pivot_longer(
        cols=!BGN_DATE,
        names_to = 'harm_type',
        values_to = 'count') |>
    print()
## # A tibble: 124 × 3
##    BGN_DATE harm_type  count
##       <int> <chr>      <dbl>
##  1     1950 FATALITIES    70
##  2     1950 INJURIES     659
##  3     1951 FATALITIES    34
##  4     1951 INJURIES     524
##  5     1952 FATALITIES   230
##  6     1952 INJURIES    1915
##  7     1953 FATALITIES   519
##  8     1953 INJURIES    5131
##  9     1954 FATALITIES    36
## 10     1954 INJURIES     715
## # ℹ 114 more rows
tornado_data_longer |> 
    ggplot(aes(x=BGN_DATE, y=count,fill=harm_type)) +
    geom_smooth(method='auto') + 
    facet_grid(rows=vars(harm_type)) +
    theme(axis.text.x = element_text(angle=90)) + 
    labs(x='Year',y='Incidents',title='Casulaties per year due to tornado')
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

#fatalites and injuries from tornado seem to be rising over the years

Economic Damages due to Storm Events

we now caculate the damages to property and crop due to event type. Tornado clearly seems to have caused the most damage to property

#we filter out colmn which we require for analysis
data_sub <- data |> 
    select(EVTYPE,FATALITIES,INJURIES, PROPDMG,PROPDMGEXP,CROPDMG,CROPDMGEXP)


unique(data$PROPDMGEXP)
##  [1] "K" "M" NA  "B" "m" "+" "0" "5" "6" "?" "4" "2" "3" "h" "7" "H" "-" "1" "8"
#we create a mapping vector to correctly map the property and crop exp with the figures as expenses are coded in thds,millions or billions etc 

mapping_vec <- c("K"=1000,"k"=1000,'M'=1e6,'m'=1e6,'h'=100,'H'=100,'B'=1e9,'b'=1e9,'+'=0,'?'=0,'-'=0,"0"=0,'1'=1*10,'2'=2*10,'3'=3*10,'4'=4*10,'5'=5*10,'6'=6*10,'7'=7*10,'8'=10*8,'9'=9*10)

#getting the correct damage figure
data_sub <- data_sub |>
    mutate(
        property_damage = mapping_vec[data$PROPDMGEXP],
        crop_damage = mapping_vec[data$CROPDMGEXP],
        prop_dmg = PROPDMG*property_damage,
        crop_dmg = CROPDMG*crop_damage,
        na.rm=TRUE
        ) |>
    print()
## # A tibble: 902,297 × 12
##    EVTYPE  FATALITIES INJURIES PROPDMG PROPDMGEXP CROPDMG CROPDMGEXP
##    <chr>        <dbl>    <dbl>   <dbl> <chr>        <dbl> <chr>     
##  1 TORNADO          0       15    25   K                0 <NA>      
##  2 TORNADO          0        0     2.5 K                0 <NA>      
##  3 TORNADO          0        2    25   K                0 <NA>      
##  4 TORNADO          0        2     2.5 K                0 <NA>      
##  5 TORNADO          0        2     2.5 K                0 <NA>      
##  6 TORNADO          0        6     2.5 K                0 <NA>      
##  7 TORNADO          0        1     2.5 K                0 <NA>      
##  8 TORNADO          0        0     2.5 K                0 <NA>      
##  9 TORNADO          1       14    25   K                0 <NA>      
## 10 TORNADO          0        0    25   K                0 <NA>      
## # ℹ 902,287 more rows
## # ℹ 5 more variables: property_damage <dbl>, crop_damage <dbl>, prop_dmg <dbl>,
## #   crop_dmg <dbl>, na.rm <lgl>
#getting the top damage causing event types
economic_loss_storm <- data_sub |>
    mutate(EVTYPE=as.factor(EVTYPE)) |>
    group_by(EVTYPE) |>
    summarise(prop_dmg=sum(prop_dmg),
              crop_dmg=sum(crop_dmg),
              total_damage=prop_dmg+crop_dmg
              ) |>
    arrange(desc(total_damage)) |>
    slice(1:10) |>
    print()
## # A tibble: 10 × 4
##    EVTYPE                          prop_dmg crop_dmg total_damage
##    <fct>                              <dbl>    <dbl>        <dbl>
##  1 TORNADOES, TSTM WIND, HAIL    1600000000  2500000   1602500000
##  2 HIGH WINDS/COLD                110500000  7000000    117500000
##  3 HURRICANE OPAL/HIGH WINDS      100000000 10000000    110000000
##  4 WINTER STORM HIGH WINDS         60000000  5000000     65000000
##  5 Heavy Rain/High Surf            13500000  1500000     15000000
##  6 LAKESHORE FLOOD                  7540000        0      7540000
##  7 HIGH WINDS HEAVY RAINS           7500000    10000      7510000
##  8 FOREST FIRES                     5000000   500000      5500000
##  9 FLASH FLOODING/FLOOD             1750000   175000      1925000
## 10 HEAVY SNOW/HIGH WINDS & FLOOD    1500000    20000      1520000
# 
economic_loss_storm_lg <- economic_loss_storm |> 
    select(-total_damage) |>
    pivot_longer(!EVTYPE,names_to = 'damage_to',values_to = 'Value') |>
    print()
## # A tibble: 20 × 3
##    EVTYPE                        damage_to      Value
##    <fct>                         <chr>          <dbl>
##  1 TORNADOES, TSTM WIND, HAIL    prop_dmg  1600000000
##  2 TORNADOES, TSTM WIND, HAIL    crop_dmg     2500000
##  3 HIGH WINDS/COLD               prop_dmg   110500000
##  4 HIGH WINDS/COLD               crop_dmg     7000000
##  5 HURRICANE OPAL/HIGH WINDS     prop_dmg   100000000
##  6 HURRICANE OPAL/HIGH WINDS     crop_dmg    10000000
##  7 WINTER STORM HIGH WINDS       prop_dmg    60000000
##  8 WINTER STORM HIGH WINDS       crop_dmg     5000000
##  9 Heavy Rain/High Surf          prop_dmg    13500000
## 10 Heavy Rain/High Surf          crop_dmg     1500000
## 11 LAKESHORE FLOOD               prop_dmg     7540000
## 12 LAKESHORE FLOOD               crop_dmg           0
## 13 HIGH WINDS HEAVY RAINS        prop_dmg     7500000
## 14 HIGH WINDS HEAVY RAINS        crop_dmg       10000
## 15 FOREST FIRES                  prop_dmg     5000000
## 16 FOREST FIRES                  crop_dmg      500000
## 17 FLASH FLOODING/FLOOD          prop_dmg     1750000
## 18 FLASH FLOODING/FLOOD          crop_dmg      175000
## 19 HEAVY SNOW/HIGH WINDS & FLOOD prop_dmg     1500000
## 20 HEAVY SNOW/HIGH WINDS & FLOOD crop_dmg       20000
# graph of the damage causing event types
economic_loss_storm_lg |> ggplot(aes(x=EVTYPE,y=Value,fill = damage_to)) +
    geom_col() +
    theme(axis.text.x = element_text(angle=90,vjust = 1,hjust=0) ) +
    scale_y_continuous(labels = scales::dollar_format(prefix = '$',scale=1e-3,suffix='K'))+
    labs(x='Event Type', y='Damage in thd dollars',title='Total value of damages to crop and property due to storm events')