E por que no Canadá? Porque o país oferece um dos portais de dados abertos mais completos, organizados e precisos do mundo, com dados sobre quase tudo que acontece no país, desde dados sobre câncer de mama até dados sobre terremotos. Usaremos o registro histórico de terremotos usando os dados mantidos pelo Earthquakes Canada, o departamento responsável pelo assunto. A série é composta por 4 conjuntos de dados de terremotos. Cada conjunto de dados contém os terremotos agrupados por década; 1980-1989, 1990-1999, 2000-2009, 2010-2019. No entanto, o Banco de Dados Nacional de Terremotos disponibiliza dados de boletins sísmicos a partir de 1985 em diante. Para obter uma lista completa dos terremotos atuais e históricos, visite http://www.earthquakescanada.nrcan.gc.ca/.

#pacotes 

#install.packages("dplyr")
#install.packages("lubridate")
#install.packages("leaflet")
#install.packages("rvest")
#Biblioteca

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(leaflet)
library(rvest)


library(rstatix)                                
## 
## Attaching package: 'rstatix'
## The following object is masked from 'package:stats':
## 
##     filter
library(emmeans)
library(ggplot2)
library(knitr)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(htmltools)
#Desativa warnings de mudanças futuras nos pacotes

options(warn = -1)

A base de dados vai ser do Canadá site oficial de dados abertos ### Especificamente estamos usando este dataset: ######https://open.canada.ca/data/en/dataset/4cedd37e-0023-41fe-8eff-bea45385e469

Define a url e onde vamos baixar os dados no formato csv

# Define a url e onde vamos baixar os dados no formato csv
url <- "http://ftp.maps.canada.ca/pub/nrcan_rncan/Earthquakes_Tremblement-de-terre/canadian-earthquakes_tremblements-de-terre-canadien/eqarchive-en.csv"

####Carregamos os dados a partir da web

# Carregamos os dados a partir da web
df_terremotos <- read.csv(url)
kable(head(df_terremotos))
date latitude longitude depth magnitude magnitude.type place X X.1
1985-01-01T11:01:00+0000 47.000 -66.600 5.0 1.9 MN 61 km E from Plaster Rock NB
1985-01-01T12:34:37+0000 78.800 -102.330 18.0 3.2 MN 26 km E from Isachsen NU
1985-01-02T00:13:06+0000 48.880 -122.994 22.5 1.2 ML 21 km SW from White Rock BC
1985-01-02T00:56:59+0000 50.022 -121.554 18.0 1.0 ML 56 km W from Merritt BC
1985-01-02T05:03:03+0000 49.459 -66.752 18.0 1.8 MN 40 km N from Cap-Chat QC
1985-01-02T06:43:51+0000 50.609 -130.344 10.0 2.8 ML 202 km W from Port Hardy BC

###Dimensões do dataset (Linhas x Colunas)

dim(df_terremotos)
## [1] 101365      9

Visualizar os dados:

View(df_terremotos)

###Análise Exploratória e Limpeza dos Dados

O dataset tem todos os dados históricos de terremotos. Vamos filtrar e retornar somente os dados de 2019. Gravaremos o resultado do filtro em outro dataset.

df_terremotos_2019 <- df_terremotos %>% 
  filter(year(date) == 2019)

####Dimensão do Dataset

dim(df_terremotos_2019)
## [1] 4800    9

DIminuimos a quatidade de dados

View(df_terremotos_2019)
As colunas X e X.1 não tem informação relevante. Vamos removê-las.
names(df_terremotos_2019)
## [1] "date"           "latitude"       "longitude"      "depth"         
## [5] "magnitude"      "magnitude.type" "place"          "X"             
## [9] "X.1"
df_terremotos_2019 <- df_terremotos_2019[,-c(8,9)]

###Dimensões do Dataset

dim(df_terremotos_2019)
## [1] 4800    7

Agora temos dentrodo nosso Dataset 4800 linhas e 7 colunas

###Tipos de Dados

str(df_terremotos_2019)
## 'data.frame':    4800 obs. of  7 variables:
##  $ date          : chr  "2019-01-01T13:02:19+0000" "2019-01-02T08:48:18+0000" "2019-01-02T10:05:41+0000" "2019-01-03T05:16:01+0000" ...
##  $ latitude      : num  49.1 46.7 74.4 47.8 53 ...
##  $ longitude     : num  -91.7 -76 -85.6 -69.8 -132.6 ...
##  $ depth         : num  2 18 18 22.5 16.3 3 18 18.9 20.4 21.9 ...
##  $ magnitude     : num  1.7 1.7 2.1 1.1 2 2.5 3.1 2.5 1.7 2.5 ...
##  $ magnitude.type: chr  "MN" "MN" "MN" "MN" ...
##  $ place         : chr  "41 N from Atikokan" "34 N from Maniwaki" "97 W from Dundas Harbour" "CHARLEVOIX SEISMIC ZONE" ...

Ao analisar os dados de terremoto, a magnitude é uma informação relevante.

Aqui tem detalhes sobre a escala da magnitude de terremotos: http://www.geo.mtu.edu/UPSeis/magnitude.html

Vamos analisar a variável magnitude em mais detalhes:

###Tipo de Variavel

str(df_terremotos_2019$magnitude)
##  num [1:4800] 1.7 1.7 2.1 1.1 2 2.5 3.1 2.5 1.7 2.5 ...

####PLotar um Histograma

hist(df_terremotos_2019$magnitude)

Do total de terremotos em 2019 podemos verificar que a grande maioria foi de magnitude 2, o que praticamente não causa danos, ainda mais se o epicentro for distante de áreas urbanas.

####Calculo estatístico

summary(df_terremotos_2019)
##      date              latitude       longitude           depth       
##  Length:4800        Min.   :40.81   Min.   :-146.45   Min.   :-0.540  
##  Class :character   1st Qu.:48.25   1st Qu.:-132.24   1st Qu.: 0.000  
##  Mode  :character   Median :50.50   Median :-122.69   Median : 8.720  
##                     Mean   :52.84   Mean   :-108.08   Mean   : 9.601  
##                     3rd Qu.:55.35   3rd Qu.: -78.11   3rd Qu.:18.000  
##                     Max.   :82.61   Max.   : -39.32   Max.   :92.710  
##    magnitude     magnitude.type        place          
##  Min.   :-1.00   Length:4800        Length:4800       
##  1st Qu.: 1.60   Class :character   Class :character  
##  Median : 2.00   Mode  :character   Mode  :character  
##  Mean   : 2.05                                        
##  3rd Qu.: 2.40                                        
##  Max.   : 6.70

Média e Mediana quase idênticas, indicando que essa variável segue uma distribuição normal.

Mas perceba que o valor mínimo é de -1. A escala de magnitude não considera esse valor e, portanto,

##vamos remover esses registros.

####Primeiro, vamos checar o total de registros por valor de magnitude

df_terremotos_2019 %>% 
  count(magnitude) %>% 
  head(10)
##    magnitude  n
## 1       -1.0  1
## 2       -0.7  1
## 3       -0.6  1
## 4       -0.5  1
## 5       -0.3  2
## 6       -0.2  1
## 7       -0.1  3
## 8        0.0 13
## 9        0.1  5
## 10       0.2  8

Temos a quantidade de registo apresentado por sua magnitude.

Tenho alguns poucos registros com magnitude negativa e alguns com zero. Vou remove-los.

df_ter_2019_filtro <- df_terremotos_2019[df_terremotos_2019$magnitude > 0, ]

####Dimensões do novo Dataset

dim(df_ter_2019_filtro)
## [1] 4777    7

Para não deixar os gráficos muitos poluídos, vou remover os registros dos terremotos com magnitudes extremas. Observe que terremotos com magnitude menor que 1 e maior que 5 ocorreram poucas vezes e assim podemos retirá-los do mapa. Essa é uma escolha do analista e fique à vontade para deixar esses registros se você desejar.

df_ter_2019_filtro <- df_ter_2019_filtro[df_ter_2019_filtro$magnitude >= 1,]
df_ter_2019_filtro <- df_ter_2019_filtro[df_ter_2019_filtro$magnitude >= 5,]

####Dimensões do Dataset

dim(df_ter_2019_filtro)
## [1] 18  7

####Visualizar os Dados

head(df_ter_2019_filtro)
##                          date latitude longitude depth magnitude magnitude.type
## 532  2019-02-14T00:34:40+0000  50.5478 -130.2955    10       5.3             Mw
## 1182 2019-04-22T21:44:41+0000  50.0303 -130.2778    10       5.6             Mw
## 1788 2019-07-04T04:30:41+0000  51.0831 -130.7587    10       6.3             Mw
## 1798 2019-07-05T12:58:24+0000  51.0175 -130.9853    10       5.5             Mw
## 1806 2019-07-06T03:32:39+0000  48.8671 -129.4745    10       5.0             Mw
## 2567 2019-08-29T15:07:59+0000  43.5716 -127.8086    12       6.7             Mw
##                                   place
## 532          198 km W of Port Hardy, BC
## 1182         205 km W of Port Alice, BC
## 1788 217 km SW of Bella Bella, BC. Felt
## 1798       234 km SW of Bella Bella, BC
## 1806        223 km SW of Port Alice, BC
## 2567    383 km W of Eugene, Oregon, USA

####Resumo Estatístico

summary(df_ter_2019_filtro)
##      date              latitude       longitude          depth      
##  Length:18          Min.   :43.57   Min.   :-139.8   Min.   : 4.54  
##  Class :character   1st Qu.:50.35   1st Qu.:-137.0   1st Qu.:10.00  
##  Mode  :character   Median :50.78   Median :-130.5   Median :10.00  
##                     Mean   :53.12   Mean   :-132.9   Mean   :10.94  
##                     3rd Qu.:58.29   3rd Qu.:-130.1   3rd Qu.:10.00  
##                     Max.   :59.12   Max.   :-127.8   Max.   :35.00  
##    magnitude     magnitude.type        place          
##  Min.   :5.000   Length:18          Length:18         
##  1st Qu.:5.225   Class :character   Class :character  
##  Median :5.550   Mode  :character   Mode  :character  
##  Mean   :5.639                                        
##  3rd Qu.:6.075                                        
##  Max.   :6.700

####Histograma

hist(df_ter_2019_filtro$magnitude)

Mudei um pouco o shape dos dados, mas isso não é problema, pois não faremos Machine Learning aqui. O principal objetivo é plotar esses dados em um mapa.

##Plot dos Dados em Mapa

E então começamos a adicionar as demais camadas

Vamos incluir pontos ao mapa, usando o dataset com os dados de terremotos em 2019 no Canadá.

# Vamos incluir pontos ao mapa, usando o dataset com os dados de terremotos em 2019 no Canadá.
?addCircleMarkers
## starting httpd help server ... done
leaflet() %>%
  addTiles() %>%
  addCircleMarkers(data = df_ter_2019_filtro)
## Assuming "longitude" and "latitude" are longitude and latitude, respectively
# Precisamos formatar o mapa, claro.
leaflet() %>%
  addTiles() %>%
  addCircleMarkers(data = df_ter_2019_filtro,
                   fillColor = "green",
                   fillOpacity = 0.8,
                   color = "black",
                   weight = 1,
                   radius = 3)
## Assuming "longitude" and "latitude" are longitude and latitude, respectively