Introducción

Este conjunto de datos se toma del USGS. El USGS proporciona notificaciones en tiempo real, feeds y servicios web sobre terremotos justo después de que sucedan.

El conjunto de datos contiene detalles de todos los terremotos que han sucedido en los últimos 30 días y se actualiza cada 15 minutos en el sitio web de USGS.

El análisis

Mientras se buscaron los datos, se presentó el hecho de que no todos los terremotos son naturales y pocos son causados por humanos, aunque muy pequeños en números. También se descubrió que en un período de un mes de febrero del 25 de febrero de 2019 más de 8500 terremotos han ocurrido en todo el mundo. Fuera de los cuales solo el 2% son causados debido a la explosión de la cantera, la explosión química, los terremotos de hielo, etc.

Al final del análisis, se trató de predecir terremotos y otros terremotos no naturales (actividades sísmicas relacionadas con explosión, explosión de cantera, etc.).

earthquake <- read.csv("all_month.csv")
glimpse(earthquake)
## Rows: 8,161
## Columns: 22
## $ time            <chr> "2019-03-11T04:30:18.250Z", "2019-03-11T04:24:26.536Z"…
## $ latitude        <dbl> 33.52100, 61.06940, 38.77333, 65.01810, 37.29130, 35.1…
## $ longitude       <dbl> -116.7945, -151.8329, -122.7435, -148.7292, -117.5088,…
## $ depth           <dbl> 2.82, 105.60, 1.16, 8.60, 6.90, 5.00, 6.20, 48.70, 2.5…
## $ mag             <dbl> 0.44, 1.10, 0.73, 1.60, 0.70, 1.80, 1.70, 1.90, 0.56, …
## $ magType         <chr> "ml", "ml", "md", "ml", "ml", "mb_lg", "ml", "ml", "md…
## $ nst             <int> 18, NA, 5, NA, 8, NA, 30, NA, 10, NA, NA, NA, NA, NA, …
## $ gap             <dbl> 53.00, NA, 213.00, NA, 176.36, 64.00, 93.14, NA, 77.00…
## $ dmin            <dbl> 0.009898, NA, 0.011220, NA, 0.375000, 0.219000, 0.1370…
## $ rms             <dbl> 0.1400, 0.2500, 0.0100, 0.5100, 0.2800, 0.5100, 0.3300…
## $ net             <chr> "ci", "ak", "nc", "ak", "nn", "us", "nn", "ak", "nc", …
## $ id              <chr> "ci38263479", "ak01937u587x", "nc73150441", "ak01937u2…
## $ updated         <chr> "2019-03-11T04:33:55.886Z", "2019-03-11T04:27:53.474Z"…
## $ place           <chr> "11km NE of Aguanga, CA", "51km NW of Nikiski, Alaska"…
## $ type            <chr> "earthquake", "earthquake", "earthquake", "earthquake"…
## $ horizontalError <dbl> 0.25, NA, 1.55, NA, NA, 1.10, NA, NA, 0.42, 5.80, NA, …
## $ depthError      <dbl> 1.02, 1.50, 0.70, 0.20, 24.50, 1.70, 0.70, 1.50, 1.31,…
## $ magError        <dbl> 0.129, NA, 0.230, NA, NA, 0.255, NA, NA, NA, 0.080, NA…
## $ magNst          <int> 11, NA, 2, NA, NA, 4, NA, NA, 1, 15, NA, NA, 11, 60, 1…
## $ status          <chr> "automatic", "automatic", "automatic", "automatic", "a…
## $ locationSource  <chr> "ci", "ak", "nc", "ak", "nn", "us", "nn", "ak", "nc", …
## $ magSource       <chr> "ci", "ak", "nc", "ak", "nn", "us", "nn", "ak", "nc", …
head(earthquake)
##                       time latitude longitude  depth  mag magType nst    gap
## 1 2019-03-11T04:30:18.250Z 33.52100 -116.7945   2.82 0.44      ml  18  53.00
## 2 2019-03-11T04:24:26.536Z 61.06940 -151.8329 105.60 1.10      ml  NA     NA
## 3 2019-03-11T04:22:42.690Z 38.77333 -122.7435   1.16 0.73      md   5 213.00
## 4 2019-03-11T04:13:42.538Z 65.01810 -148.7292   8.60 1.60      ml  NA     NA
## 5 2019-03-11T04:10:13.520Z 37.29130 -117.5088   6.90 0.70      ml   8 176.36
## 6 2019-03-11T04:04:12.620Z 35.12500  -97.6175   5.00 1.80   mb_lg  NA  64.00
##       dmin  rms net           id                  updated
## 1 0.009898 0.14  ci   ci38263479 2019-03-11T04:33:55.886Z
## 2       NA 0.25  ak ak01937u587x 2019-03-11T04:27:53.474Z
## 3 0.011220 0.01  nc   nc73150441 2019-03-11T04:35:03.494Z
## 4       NA 0.51  ak ak01937u2wii 2019-03-11T04:22:11.915Z
## 5 0.375000 0.28  nn   nn00679736 2019-03-11T04:12:55.866Z
## 6 0.219000 0.51  us   us1000jdf2 2019-03-11T04:14:36.922Z
##                            place       type horizontalError depthError magError
## 1         11km NE of Aguanga, CA earthquake            0.25       1.02    0.129
## 2     51km NW of Nikiski, Alaska earthquake              NA       1.50       NA
## 3     1km ESE of The Geysers, CA earthquake            1.55       0.70    0.230
## 4      38km WNW of Ester, Alaska earthquake              NA       0.20       NA
## 5  52km SSW of Goldfield, Nevada earthquake              NA      24.50       NA
## 6 3km ESE of Blanchard, Oklahoma earthquake            1.10       1.70    0.255
##   magNst    status locationSource magSource
## 1     11 automatic             ci        ci
## 2     NA automatic             ak        ak
## 3      2 automatic             nc        nc
## 4     NA automatic             ak        ak
## 5     NA automatic             nn        nn
## 6      4  reviewed             us        us

Generalidades sobre las variables y factores acerca de los terremotos

Análisis exploratorio

Hay alrededor de siete terremotos que tinene una magnitud que es mayor a seis en la escala de richter.

Extracción de características:

A partir de ahora, extraeré dos características de los datos que son,

  1. Ubicación del terremoto (estado/país, etc.)

  2. Hora del día en ‘hora’

Desde la trama de línea a continuación podemos ver que el número máximo de terremotos que han sucedido a una hora particular. La medianoche parece ser la hora más popular del día cuando la mayoría de los terremotos han sucedido. La noche 5 p.m ve el número total más bajo de terremotos en un día. Cuando vemos la magnitud máxima en cada hora, entonces la mañana 8-9 a.m. tiene el terremoto más impactante de alrededor de 7.

#Location
earthquake$location <- sub('.*,\\s*','', earthquake$place)

#Time of the day in 'Hour'
earthquake$hour <- ymd_hms(earthquake$time)
earthquake$hour <- hour(earthquake$hour)

#Visualizing the number of quakes that have happened at a particular time
earthquake %>% 
filter(!is.na(mag))%>%
group_by(hour)%>%
summarise(count = length(id),max_magnitude = max(mag))%>%
ggplot(aes(hour,count, color = max_magnitude))+geom_line()+
scale_color_viridis(direction = -1)+
scale_x_continuous(breaks=seq(0,23,1))+
xlab("Time of the day")+
ylab("Number of earthquakes")+
ggtitle("Number of quakes as per time of the day")+
theme_bw()+
theme(plot.title = element_text(hjust = 0.5))

En el siguiente mapa podemos ver esos lugares donde han sucedido los últimos terremotos. El cinturón del Pacífico que comienza desde países sudamericanos como Chile, Perú, Ecuador que pasa por la costa oeste de Estados Unidos y luego Alaska muestra muchas actividades sísmicas. Sin embargo, la magnitud está más o menos en el rango de 1-5. El próximo cinturón de actividades sísmicas se puede ver en países como Indonesia, Japón, Papua Nueva Guinea y Newzealand.

Los siguientes son los terremotos más prominentes que han sucedido con mayor magnitud de 6 y más. (Entre el 18 de febrero 19 y 18 de marzo de 19) 1. Lugar: 115 km ESE de Palora, ** Ecuador Magnitud: 7.5 ** Hora: 2019-02-22 10:17:22

  1. Lugar: 27 km nne de Azangaro, ** Perú Magnitud: 7 ** Hora: 2019-03-01 08:50:41

  2. Lugar: 116 km SE de L’Sperance Rock, ** Nueva Zelanda Magnitud: 6.4 ** Hora: 2019-03-06 15:46:14

  3. Lugar: 49 km NW de Namatanai, ** Papua Nueva Guinea Magnitud: 6.4 ** Hora: 2019-02-17 14:35:55

  4. Lugar: 28 km s de Cliza, ** Bolivia Magnitud: 6.3 ** Hora: 2019-03-15 05:03:50

  5. Lugar: 260 km SE de Lambasa, ** Fiji Magnitud: 6.2 ** Hora: 2019-03-10 08:12:25

  6. Lugar: 140 km SSW de Kulumadau, ** Papua Nueva Guinea Magnitud: 6.1 ** Hora: 2019-03-10 12:48:00

bins=seq(1, 8.0, by=1.0)
palette = colorBin( palette="YlOrBr", domain=earthquake$mag, na.color="transparent", bins=bins)

d=leaflet(earthquake) %>% 
  addTiles()  %>% 
  setView( lng = 166.45, lat = 21, zoom = 1.25) %>%
  addProviderTiles(providers$Esri.WorldImagery) %>%
  addCircleMarkers(~longitude, ~latitude, 
    fillColor = ~palette(mag), fillOpacity = 0.7, color="white", radius=3, stroke=FALSE,
     popup = paste("Place:", earthquake$place, "<br>",
            "Magnitude:", earthquake$mag, "<br>",
            "Time:", earthquake$time, "<br>")) %>%
  addLegend( pal=palette, values=~mag, opacity=0.9, title = "Magnitude", position = "bottomright" )

htmlwidgets::saveWidget(d, "d.html")
display_html('<iframe src="d.html" width=100% height=450></iframe>')

Las 30 ubicaciones principales donde han tenido lugar la mayoría de las actividades sísmicas, algunas son países y algunos son estados de EE. UU. Aunque alrededor del 35% de los terremotos han sucedido en California y el 27% en Alaska, la magnitud promedio no es de 0.9 y 1.7 respectivamente. En comparación con estos lugares, países como Newzealand, Indonesia, Papua Nueva Guinea, Chile, Japón y Filiipines han recibido mucho menos porcentaje de terremotos, sin embargo, las magnitudes promedio de estos Earthqaukes están por encima de 4.4

earthquake %>% 
group_by(location) %>% 
filter(!(is.na(mag)))%>%
summarise(Number_of_quakes = length(location), 
          Average_Magnitude = mean(mag))%>%
mutate(Percent = round(prop.table(Number_of_quakes)*100,2))%>%
arrange(desc(Number_of_quakes))%>% top_n(25, Number_of_quakes)
## # A tibble: 25 × 4
##    location    Number_of_quakes Average_Magnitude Percent
##    <chr>                  <int>             <dbl>   <dbl>
##  1 CA                      2643             1.02    32.4 
##  2 Alaska                  2551             1.72    31.3 
##  3 Nevada                   480             0.776    5.88
##  4 Utah                     480             1.39     5.88
##  5 Puerto Rico              269             2.37     3.3 
##  6 Hawaii                   241             1.83     2.95
##  7 Montana                  174             1.27     2.13
##  8 Washington               114             1.06     1.4 
##  9 Indonesia                102             4.60     1.25
## 10 California                86             0.980    1.05
## # ℹ 15 more rows

Se sabe que la profundidad es la distancia donde el terremoto comienza a romperse. Es interesante plantearse si una profundidad mayor conduce a un terremoto de mayor magnitud. Trazé el trazado de magnitud de dispersión a continuación frente a la profundidad y descubrí que un número considerable de terremotos que son de magnitud entre 4-5 solo tienen profundidades más grandes. Incluso las profundidades de los terremotos que tienen más de 6 en magnitud están dispersas. Los terremotos de menor magnitud generalmente ocurren dentro de 200 km de profundidad.

ggplot(earthquake, aes(mag,depth,color = hour))+
geom_jitter(alpha = 0.5)+
gghighlight(max(depth>200)| max(mag>4))+
scale_x_continuous(breaks=seq(0,9,1))+
scale_color_viridis(direction = -1)+
theme_bw()+
xlab('Magnitude')+
ylab('Depth')+
ggtitle('Magnitude Vs. Depth in Km')+
theme(plot.title = element_text(hjust = 0.5))

Las actividades sísmicas se producen debido a otras actividades humanas, como la explosión, la cantera, etc. Sin embargo, el 98% de las actividades sísmicas ocurren debido al terremoto.

earthquake %>%
group_by(type)%>%
summarise(count = length(type))%>%
mutate(Percent = prop.table(count*100))%>%
ggplot(aes(type,Percent, fill = type))+
geom_col()+theme_bw()+
xlab('Type of Seismic Activity')+
ylab('Percent')+
ggtitle('Percent of Seismic Activity')+
theme(plot.title = element_text(hjust = 0.5))

Cuando visualizamos estas actividades sesísmicas de acuerdo con su tipo, encontramos que la mayoría de las actividades sísmicas además de un terremoto tienen lugar en EE. UU. (Principalmente Ca y Alaska, Nevada, Washington), Canadá. Sin embargo, Alaska experimenta muchos terrenos de hielo. Haga clic en el mapa para saber más.

pal <- colorFactor(palette = "Accent",domain = earthquake$type)

e=leaflet(earthquake) %>% 
  addTiles()  %>% 
  setView( lng = -119.417931, lat = 50.778259, zoom = 3) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(~longitude, ~latitude, 
    fillColor = ~pal(type), fillOpacity = 0.5, color="white", radius=3, stroke=FALSE,
     popup = paste("Place:", earthquake$place, "<br>",
            "Magnitude:", earthquake$mag, "<br>",
            "Time:", earthquake$time, "<br>",
            "Type:", earthquake$type, "<br>")) %>%
  addLegend( pal=pal, values=~type, opacity=0.9, title = "Type", position = "bottomright" )


htmlwidgets::saveWidget(e, "e.html")
display_html('<iframe src="e.html" width=100% height=450></iframe>')

¿Cómo notar la diferencia entre terremotos y otros terremotos?

Profundidad:

Sabemos que la ‘profundidad’ es donde el terremoto comienza a romperse. Podemos ver en el diagrama de caja a continuación que la mayoría de las actividades sísmicas no relacionadas con la naturaleza ocurren principalmente en la superficie de la tierra. Por otro lado, los terremotos se producen principalmente 10-20 km debajo de la superficie y pueden ocurrir hasta varios kilómetros debajo de la superficie de la tierra. Pero este generalmente no es el caso con otro tipo de actividades sísmicas.

ggplot(earthquake, aes('',depth, color = type))+geom_boxplot()+
scale_y_continuous(limits = c(0, 100))+theme_bw()+
xlab('Type of Seismic Activity')+
ggtitle('Depth of Seismic Activity')

Magnitud

El siguiente parámetro importante aquí es la magnitud. Mientras que un terremoto natural puede tener una magnitud que varía de 0-7 en una escala. La magnitud de los terremotos hechos por humanos es mucho menor y mayormente flota alrededor de 0-2.2 en una escala de Richter.

ggplot(earthquake, aes('',mag, color = type))+geom_boxplot()+
scale_y_continuous(limits = c(0, 8))+theme_bw()+
xlab('Type of Seismic Activity')+
ggtitle('Magnitude of Seismic Activity')

# Momento del día

Bueno, si experimenta sacudidas después de la medianoche hasta las 5 de la mañana, considere revisar las noticias para una explosión química en su área. Si su mesa está temblando, entonces puede ser su explosión de cantera.

ggplot(earthquake, aes('',hour, color = type))+geom_boxplot()+
scale_y_continuous(limits = c(0, 24))+theme_bw()+
xlab('Type of Seismic Activity')+
ggtitle('Time of Seismic Activity')

Predicción

En la siguiente sección se está tratando de predecir el tipo de actividad sísmica utilizando pocas características, como profundidad, magnitud, latitud y longitud. Hay muchas más características presentes en el conjunto de datos, pero a partir de ahora usemos estos parámetros para hacer una predicción básica.

En primer lugar, se plantea preparar el conjunto de datos para la predicción. Clasificaré todas las actividades sísmicas que no son terremotos naturales en una categoría, ya que se vio que la mayoría de los otros terremotos tienen más o menos el mismo rango de profundidad, magnitud y ubicación.

#Choosing the relevant columns
quake <- earthquake[,c(2,3,4,5,24,15)]

#Categorising the type
quake$type <- ifelse(quake$type == 'earthquake', 'Earthquake', 'Otherquake')

#quake[,c(1:5)] <- scale(quake[,c(1:5)])

#Converting our target column 'type' into a factor
quake$type <- factor(quake$type)

#Checking and removing any row having NA
colSums(is.na(quake))
##  latitude longitude     depth       mag      hour      type 
##         0         0         0         4         0         0
quake <- quake[!is.na(quake$mag),]
#Now look at the data
head(quake)
##   latitude longitude  depth  mag hour       type
## 1 33.52100 -116.7945   2.82 0.44    4 Earthquake
## 2 61.06940 -151.8329 105.60 1.10    4 Earthquake
## 3 38.77333 -122.7435   1.16 0.73    4 Earthquake
## 4 65.01810 -148.7292   8.60 1.60    4 Earthquake
## 5 37.29130 -117.5088   6.90 0.70    4 Earthquake
## 6 35.12500  -97.6175   5.00 1.80    4 Earthquake

Se usarán máquinas de vectores de soporte para hacer una predicción y anticipo un problema de desequilibrio de clase aquí porque en nuestro conjunto de datos el 98% de las observaciones son terremotos naturales y solo el 2% de las observaciones pertenecen a otros terremotos.

Primero se hallará el modelo sin manejar el desequilibrio de la clase y luego se pasará a usar la biblioteca de Rose para tratar el problema del desequilibrio de la clase.

table(quake$type)
## 
## Earthquake Otherquake 
##       8005        152
# splitting the data between train and test
set.seed(1234)

indices = sample.split(quake$type, SplitRatio = 0.7)

train = quake[indices,]

test = quake[!(indices),]

head(train)
##   latitude longitude  depth  mag hour       type
## 1 33.52100 -116.7945   2.82 0.44    4 Earthquake
## 2 61.06940 -151.8329 105.60 1.10    4 Earthquake
## 3 38.77333 -122.7435   1.16 0.73    4 Earthquake
## 4 65.01810 -148.7292   8.60 1.60    4 Earthquake
## 6 35.12500  -97.6175   5.00 1.80    4 Earthquake
## 7 37.28320 -117.4962   6.20 1.70    3 Earthquake
table(train$type)
## 
## Earthquake Otherquake 
##       5604        106
table(test$type)
## 
## Earthquake Otherquake 
##       2401         46
set.seed(1234)
#Using RBF Kernel
Model_RBF <- ksvm(type~ ., data = train, scale = FALSE, kernel = "rbfdot")
Eval_RBF <- predict(Model_RBF, test[,-6])

  #confusion matrix - RBF Kernel
  confusionMatrix(Eval_RBF,test$type)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   Earthquake Otherquake
##   Earthquake       2401         46
##   Otherquake          0          0
##                                           
##                Accuracy : 0.9812          
##                  95% CI : (0.975, 0.9862) 
##     No Information Rate : 0.9812          
##     P-Value [Acc > NIR] : 0.5391          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : 0.00000000003247
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.0000          
##          Pos Pred Value : 0.9812          
##          Neg Pred Value :    NaN          
##              Prevalence : 0.9812          
##          Detection Rate : 0.9812          
##    Detection Prevalence : 1.0000          
##       Balanced Accuracy : 0.5000          
##                                           
##        'Positive' Class : Earthquake      
## 

En la predicción anterior se puede ver claramente el defecto. Todos los terremotos se predicen correctamente, lo que hace que la sensibilidad (verdaderos positivos) sea realmente alta. Sin embargo, ninguno de los ‘otros terremotos’ se predice correctamente que conduce a una especificidad 0 (verdadero negativo).

Tratando el desequilibrio de la clase:

Ahora se utiliza el paquete Rose (al azar sobre ejemplos de muestreo) para tratar el problema de desequilibrio de clases utilizando el muestreo, bajo muestreo y ambos. Comencemos primero con exceso de muestreo.

set.seed(1234)
over <- ovun.sample(type~., data = train, method="over", N= 11640)$data
set.seed(1234)
#Using RBF Kernel
Model_RBF <- ksvm(type~ ., data = over, scale = FALSE, kernel = "rbfdot")
Eval_RBF <- predict(Model_RBF, test[,-6])

  #confusion matrix - RBF Kernel
  confusionMatrix(Eval_RBF,test$type)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   Earthquake Otherquake
##   Earthquake       2285          4
##   Otherquake        116         42
##                                              
##                Accuracy : 0.951              
##                  95% CI : (0.9416, 0.9592)   
##     No Information Rate : 0.9812             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.3941             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.9517             
##             Specificity : 0.9130             
##          Pos Pred Value : 0.9983             
##          Neg Pred Value : 0.2658             
##              Prevalence : 0.9812             
##          Detection Rate : 0.9338             
##    Detection Prevalence : 0.9354             
##       Balanced Accuracy : 0.9324             
##                                              
##        'Positive' Class : Earthquake         
## 

Podemos ver claramente un aumento significativo en la especificidad. 47 de los 55 otros terremotos en nuestros datos de prueba se predicen correctamente, aunque 150 terremotos se predicen incorrectamente. La introducción sobre el muestreo realmente ha ayudado a tratar el desequilibrio de la clase y ha aumentado significativamente nuestra especificidad al 85%.