Data ja RStudio tutkimuksessa
Jälkitehtävä 2b


Tutkimuskysymykset:

Minkä tyyppiset sääilmiöt (EVTYPE muuttuja) ovat olleet kaikkein vahingollisimpia ihmisten terveydelle USA:ssa?
Minkä tyyppiset sääilmiöt ovat aiheuttaneet kaikkein eniten kuolemantapauksia USA:ssa?
Minkä tyyppiset sääilmiöt ovat aiheuttaneet kaikkein suurimmat taloudelliset tappiot USA:ssa?

#luetaan datasta tarvittavat sarakkeet
rcols <- c('STATE', 'EVTYPE', 'FATALITIES', 'INJURIES', 'PROPDMG', 'PROPDMGEXP', 'CROPDMG',  'CROPDMGEXP')
storm.data = read.csv(bzfile('raakadataa/StormData.csv.bz2'), header=T, stringsAsFactors=F)[, rcols]

Käsittelen ensin kuolemat, joka on omassa sarakkeessaan ja tuntuu siten yksinkertaisimmalta.
Poistan muut sarakkeet ja tehdään taulukko:

#valitaan EVTYPE ja FATALITIES
fatal_data <- storm.data
fatal_data2 <- fatal_data[, c(2, 3)]

#poitetaan nollarivit, että saadaan tiiviimpää tulosta
fatal_einollia <- fatal_data2[- grep("0", fatal_data2$FATALITIES),]

#tehdään table
library(data.table)
fatal_table <- data.table(fatal_einollia)

# Summataan yhteen 
numeric_cols <- which(sapply(fatal_table, is.numeric))
falalities <- fatal_table[, lapply(.SD, sum), by = "EVTYPE", .SDcols = numeric_cols]

Taulukko kuolemista

##                         EVTYPE FATALITIES
##   1:                   TORNADO       5173
##   2:                 TSTM WIND        504
##   3:                      HAIL         15
##   4:              WINTER STORM        206
##   5: HURRICANE OPAL/HIGH WINDS          2
##  ---                                     
## 163:        MARINE STRONG WIND         14
## 164:             COASTAL FLOOD          3
## 165:          STORM SURGE/TIDE         11
## 166:          MARINE HIGH WIND          1
## 167:                   TSUNAMI         33

Data.tablesta en saanut diagrammia tehtyä, joten palataan data.frameen

#lasketaan kuolemat yhteen
lask_kuol <- aggregate(FATALITIES ~ EVTYPE, data = fatal_data2, sum)

#valitaan yli kahden sadan kuoleman ilmiöt
kuolemat_yli200 <- lask_kuol[ which(lask_kuol$FATALITIES > 200),]

#Tehdään EVTYPE-kentästä faktor
kuolemat_yli200<-transform(kuolemat_yli200, EVTYPE = factor(EVTYPE))

#Tehdään kaavio

library(ggplot2)

#teemasetti
theme_set(theme_minimal())


#ggplot
ggplot_kuolemat<-ggplot(kuolemat_yli200,aes(x=factor(EVTYPE),
                          y=kuolemat_yli200$FATALITIES, fill = factor(EVTYPE)), 
                          color=factor(EVTYPE)) +   geom_bar(stat="identity")
ggplot_kuolemat <- ggplot_kuolemat + xlab("Sääilmiö") + 
  ylab("Kuolemat") + ggtitle("Sääilmiöiden aiheuttamat kuolemat (yli 200 tapausta)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))

Eniten kuolemia aiheuttaa tornado.


Seuraavaksi tutkitaan kaikkia terveyshaittoja:

#valitaan EVTYPE ja FATALITIES -kentät
terveyshaitat <- storm.data[, c(2, 3, 4)]

#lasketaan yhteen kuolemat ja vammat
lask_terveyshaitat <- aggregate(FATALITIES + INJURIES ~ EVTYPE, data = terveyshaitat, sum)
colnames(lask_terveyshaitat)[colnames(lask_terveyshaitat)=="FATALITIES + INJURIES"] <- "terveysvahingot"

# valitaan yli tuhannen tapauksen ilmiöt
vammat_yli1000 <- lask_terveyshaitat[ which(lask_terveyshaitat$terveysvahingot > 1000),]

## Tehdään taas EVTYPE-kentästä faktor
vammat_yli1000<-transform(vammat_yli1000, EVTYPE = factor(EVTYPE))

#tehdään kaavio

#teemasetti
theme_set(theme_minimal())

#ggplot
ggplot_vammat<-ggplot(vammat_yli1000,aes(x=factor(EVTYPE),
                                            y=vammat_yli1000$terveysvahingot, fill = factor(EVTYPE)), 
                        color=factor(EVTYPE)) +   geom_bar(stat="identity")
ggplot_vammat <- ggplot_vammat + xlab("Sääilmiö") + 
  ylab("Terveysvahingot") + ggtitle("Sääilmiöiden aiheuttamat terveysvahingot (yli 1000 tapausta)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))

Tornadot aiheuttavat eniten terveysvahinkoja.


Seuraavaksi tutkitaan taloudelliset tappiot.

Taulukon lukuja ei voi suoraaan laskea yhteen, koska niissä on erikseen kerroin. Tarvitaan laskukaava, lainattu osoitteesta: https://rstudio-pubs-static.s3.amazonaws.com/51815_5b766efe012646799965da2309ab389a.html

# Muutetaan kertoimet numeeriseen muotoon
unit2num <- function(u) {
  u <- switch(u,
              '+' = {0}, '-' = {0}, '?' = {0},
              'h' = {2}, 'H' = {2},
              'k' = {3}, 'K' = {3},
              'm' = {6}, 'M' = {6},
              'b' = {9}, 'B' = {9},
              u)
  if(u == '' | u == ' ') 0
  else as.integer(u)
}

# Tehdään tyhjistä kentistä nollia
sanitize_nums <- function(x) {
  if(x == '' | x == ' ') 0
  else as.numeric(x)
}

# PROPDMG * PROPDMGEXP
storm.data$PROPDMG <- apply(data.frame(storm.data$PROPDMG, storm.data$PROPDMGEXP), 1, function(x) { sanitize_nums(x[1])*10^unit2num(x[2]) })

# CROPDMG * CROPDMGEXP
storm.data$CROPDMG <- apply(data.frame(storm.data$CROPDMG, storm.data$CROPDMGEXP), 1, function(x) { sanitize_nums(x[1])*10^unit2num(x[2]) })

Nyt storm.datassa on tuhojen numeroarvot kerrottu oikein. Tehdään tästä oma data.frame ja jatketaan tutkimista sillä.

#valitaan EVTYPE ja PROPDMG ja CROPDMG -kentät
taloushaitat <- storm.data[, c(2, 5, 7)]

#lasketaan yhteen DMG:t
lask_taloushaitat <- aggregate(PROPDMG + CROPDMG ~ EVTYPE, data = taloushaitat, sum)

#nimetään kenttä uudelleen
colnames(lask_taloushaitat)[colnames(lask_taloushaitat)=="PROPDMG + CROPDMG"] <- "talousvahingot"

#valitaan yli 10 miljardin tuhon aiheuttaneet ilmiöt
taloushaitat_yli10mrd <- lask_taloushaitat[ which(lask_taloushaitat$talousvahingot > 10000000000),]

## Tehdään taas EVTYPE-kentästä faktor
taloushaitat_yli10mrd<-transform(taloushaitat_yli10mrd, EVTYPE = factor(EVTYPE))

#tehdään kaavio

#teemasetti
theme_set(theme_minimal())

#ggplot
ggplot_talous<-ggplot(taloushaitat_yli10mrd,aes(x=factor(EVTYPE),
                                         y=taloushaitat_yli10mrd$talousvahingot, fill = factor(EVTYPE)), 
                      color=factor(EVTYPE)) +   geom_bar(stat="identity")
ggplot_talous <- ggplot_talous + xlab("Sääilmiö") + 
  ylab("Taloudelliset vahingot") + ggtitle("Sääilmiöiden aiheuttamat taloudelliset vahingot (yli 10 mrd vahingot)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))

Eniten taloudellisia vahinkoja ovat aiheuttaneet tulvat.

Tehdään vielä USA:n kartta, jossa taloudelliset vahingot näkyvät osavaltioittain.
Ohje osoitteessa: https://rstudio-pubs-static.s3.amazonaws.com/51815_5b766efe012646799965da2309ab389a.html

# osavaltioden nimet
state.data <- data.frame(state.abb, state.name)

#asennetaan paketit ja otetaan kirjastot käyttöön

library(plyr)
library(maps)
## 
## Attaching package: 'maps'
## The following object is masked from 'package:plyr':
## 
##     ozone
library(mapproj) #Warning message: package 'mapproj' was built under R version 3.4.4
## Warning: package 'mapproj' was built under R version 3.4.4
library(RColorBrewer)
library(ggplot2)

#tehdaan data.frame, jossa vahingot, ilmiö ja osavaltio
aggr <- aggregate(CROPDMG + PROPDMG ~ EVTYPE + STATE, data = storm.data, sum)
#nimetään kentät
names(aggr) <- c('EVTYPE', 'STATE', 'ECON_IMPACT')

unique_causes <- unique(storm.data$EVTYPE)
#asetetaan siemenluku
set.seed(7722)
#värit, tein tällä kertaa terrain-väreillä
colors <- sample(colorRampPalette(c(terrain.colors(23)))(n = length(unique_causes)))

# valitaan tuhoisin ilmiö joka osavaltiossa 
saggr <- ddply(aggr, 'STATE', function (X) {  X$EVTYPE[X$ECON_IMPACT == max(X$ECON_IMPACT)][1] })
unique_causes <- unique(saggr$V1)

# väri liitetään ilmiöön
saggr$color <- sapply(saggr$V1, function(x) { colors[match(x, unique_causes)] })

# karttaa varten tarvitaan osavaltioiden nimet
saggr$STATE_NAME <- state.data$state.name[match(saggr$STATE, state.data$state.abb)]

# käytetään state-mappiä kartan tekemiseen
map("state", col = saggr$color, region = saggr$STATE_NAME, fill = TRUE, lty = 0, resolution = 0, projection="polyconic")
map("state", col = "black", fill = FALSE, add = TRUE, lty = 1, lwd = 1, projection="polyconic")

# selite tulee vasempaan reunaan
legend("left", unique_causes, fill = colors, cex=.60, bty = 'n')

Kartta ei ole kovin havainnollinen, joten tehdään vielä Plotlyllä kartta, jossa on tiedot myös osavaltioista.

#library(plotly)

#saggr$hover <- with(saggr, paste("Tuhoisin ilmiö", V1, "<br>State", STATE))

#plot_ly(saggr, z = saggr$V1, text = saggr$hover, locations = saggr$STATE, 
#        type = 'choropleth', locationmode = 'USA-states', 
#        marker = list(line = borders), showscale = FALSE) %>% 
#  layout(title = 'Osavaltiot ja eniten tuhoja aiheuttaneet ilmiöt', geo = map_options)

Tämä ei nyt enää jostain syystä toiminutkaan, joten tässä linkki lopputulokseen: http://rpubs.com/JennyKo/375773


Vastaukset alussa esitettyihin kysymyksiin: