Introducción

Esta información se deriva de fuentes del USGS. El USGS emite alertas inmediatas, flujos de datos y utilidades web que informan sobre sismos prácticamente al momento de ocurrir.

El conjunto de datos engloba información detallada de todos los sismos registrados en los últimos 30 días y recibe actualizaciones cada 15 minutos en el portal web del USGS.

El análisis

Durante la búsqueda de datos, se reveló que no todos los terremotos son de origen natural, y solo unos pocos son generados por actividades humanas, aunque en una cantidad muy reducida. Asimismo, se encontró que en un lapso de un mes, desde el 25 de febrero de 2019, más de 8500 sismos han tenido lugar en todo el mundo. De este número, solo un 2% se deben a factores como explosiones en canteras, eventos químicos o movimientos sísmicos relacionados con el hielo.

Al concluir el análisis, se intentó prever tanto terremotos naturales como otros eventos sísmicos no naturales (como aquellos relacionados con explosiones, detonaciones en canteras, etc.).

earthquake <- read.csv("all_month.csv")
glimpse(earthquake)
## Rows: 10,631
## Columns: 22
## $ time            <chr> "2023-02-27T02:06:06.435Z", "2023-02-27T01:51:31.620Z"…
## $ latitude        <dbl> 63.19850, 38.83450, 17.39010, -32.90730, 58.64360, -1.…
## $ longitude       <dbl> -149.37560, -122.81817, 147.53000, -178.86740, -154.31…
## $ depth           <dbl> 73.300, 1.520, 10.000, 45.006, 101.600, 42.456, 3.760,…
## $ mag             <dbl> 1.60, 0.71, 4.90, 5.10, 2.00, 5.50, 0.65, 2.00, 1.30, …
## $ magType         <chr> "ml", "md", "mb", "mb", "ml", "mww", "md", "ml", "ml",…
## $ nst             <int> NA, 14, 48, 45, NA, 132, 8, NA, NA, 11, NA, NA, NA, 46…
## $ gap             <dbl> NA, 61, 149, 153, NA, 57, 133, NA, NA, 224, NA, NA, NA…
## $ dmin            <dbl> NA, 0.0127600, 4.5680000, 3.7240000, NA, 2.5870000, 0.…
## $ rms             <dbl> 0.78, 0.01, 0.66, 0.96, 0.62, 0.87, 0.01, 0.31, 0.67, …
## $ net             <chr> "ak", "nc", "us", "us", "ak", "us", "nc", "ak", "ak", …
## $ id              <chr> "ak0232nyean7", "nc73852211", "us6000jrtu", "us6000jrt…
## $ updated         <chr> "2023-02-27T02:08:44.101Z", "2023-02-27T02:08:14.941Z"…
## $ place           <chr> "30 km SW of Cantwell, Alaska", "8km NW of The Geysers…
## $ type            <chr> "earthquake", "earthquake", "earthquake", "earthquake"…
## $ horizontalError <dbl> NA, 0.26, 13.28, 12.11, NA, 8.71, 0.62, NA, NA, 0.64, …
## $ depthError      <dbl> 0.600, 0.700, 1.911, 6.277, 0.700, 5.046, 1.870, 0.500…
## $ magError        <dbl> NA, 0.1300000, 0.0640000, 0.0990000, NA, 0.0930000, 0.…
## $ magNst          <int> NA, 15, 77, 33, NA, 11, 8, NA, NA, 9, NA, NA, NA, 52, …
## $ status          <chr> "automatic", "automatic", "reviewed", "reviewed", "aut…
## $ locationSource  <chr> "ak", "nc", "us", "us", "ak", "us", "nc", "ak", "ak", …
## $ magSource       <chr> "ak", "nc", "us", "us", "ak", "us", "nc", "ak", "ak", …
head(earthquake)
##                       time latitude longitude   depth  mag magType nst gap
## 1 2023-02-27T02:06:06.435Z  63.1985 -149.3756  73.300 1.60      ml  NA  NA
## 2 2023-02-27T01:51:31.620Z  38.8345 -122.8182   1.520 0.71      md  14  61
## 3 2023-02-27T01:35:49.082Z  17.3901  147.5300  10.000 4.90      mb  48 149
## 4 2023-02-27T01:31:15.500Z -32.9073 -178.8674  45.006 5.10      mb  45 153
## 5 2023-02-27T01:27:10.987Z  58.6436 -154.3143 101.600 2.00      ml  NA  NA
## 6 2023-02-27T01:26:06.458Z  -1.6972  120.2673  42.456 5.50     mww 132  57
##      dmin  rms net           id                  updated
## 1      NA 0.78  ak ak0232nyean7 2023-02-27T02:08:44.101Z
## 2 0.01276 0.01  nc   nc73852211 2023-02-27T02:08:14.941Z
## 3 4.56800 0.66  us   us6000jrtu 2023-02-27T02:18:44.040Z
## 4 3.72400 0.96  us   us6000jrtp 2023-02-27T02:03:50.040Z
## 5      NA 0.62  ak ak0232nxxdfe 2023-02-27T01:29:44.672Z
## 6 2.58700 0.87  us   us6000jrtm 2023-02-27T02:03:23.063Z
##                           place       type horizontalError depthError magError
## 1  30 km SW of Cantwell, Alaska earthquake              NA      0.600       NA
## 2     8km NW of The Geysers, CA earthquake            0.26      0.700    0.130
## 3        Mariana Islands region earthquake           13.28      1.911    0.064
## 4 south of the Kermadec Islands earthquake           12.11      6.277    0.099
## 5 92 km SSE of Kokhanok, Alaska earthquake              NA      0.700       NA
## 6  63 km WSW of Poso, Indonesia earthquake            8.71      5.046    0.093
##   magNst    status locationSource magSource
## 1     NA automatic             ak        ak
## 2     15 automatic             nc        nc
## 3     77  reviewed             us        us
## 4     33  reviewed             us        us
## 5     NA automatic             ak        ak
## 6     11  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 mapa que sigue se presentan las ubicaciones en las que se han producido los recientes sismos. La región del Pacífico, que se extiende desde naciones sudamericanas como Chile, Perú y Ecuador, recorre la costa occidental de los Estados Unidos y llega hasta Alaska, exhibe un alto nivel de actividad sísmica. No obstante, la magnitud de estos sismos tiende a oscilar en el rango de 1 a 5. Otro cinturón de actividad sísmica es evidente en países como Indonesia, Japón, Papua Nueva Guinea y Nueva Zelanda.

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="blue", 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 treinta principales ubicaciones donde se han registrado la mayoría de las actividades sísmicas incluyen tanto países como estados de EE. UU. Aunque aproximadamente el 35% de los terremotos han ocurrido en California y el 27% en Alaska, las magnitudes promedio son de 0.9 y 1.7. En contraste, naciones como Nueva Zelanda, Indonesia, Papua Nueva Guinea, Chile, Japón y Filipinas han experimentado un porcentaje menor de terremotos. Sin embargo, las magnitudes promedio de estos sismos 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 Alaska                       4244             1.25    39.9 
##  2 CA                           2867             1.04    27.0 
##  3 Hawaii                        428             2.09     4.03
##  4 Turkey                        263             4.52     2.47
##  5 Nevada                        248             0.808    2.33
##  6 Alaska Peninsula              219             0.158    2.06
##  7 Washington                    192             0.859    1.81
##  8 Texas                         179             2.18     1.68
##  9 Puerto Rico                   154             2.59     1.45
## 10 Utah                           99             1.14     0.93
## # ℹ 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 son resultado de diversas acciones humanas, como explosiones y trabajos en canteras, entre otros. No obstante, el 98% de las actividades sísmicas tienen su origen en los propios terremotos.

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="blue", 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:

Entendemos que la ‘profundidad’ se refiere al punto de inicio de la ruptura en un terremoto. A partir del siguiente diagrama de caja, se observa que la mayoría de las actividades sísmicas no naturales se localizan principalmente en la superficie terrestre. En contraste, los terremotos suelen originarse a una profundidad de 10-20 km debajo de la superficie, e incluso pueden manifestarse a varios kilómetros de profundidad. Sin embargo, este patrón generalmente no se aplica a otros tipos 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 aspecto crucial es la magnitud. Mientras que un sismo natural puede exhibir magnitudes que oscilan entre 0 y 7 en la escala, los sismos generados por acciones humanas tienden a tener magnitudes significativamente más bajas, principalmente dentro del rango de 0 a 2.2 en la 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

Si experimenta vibraciones durante la madrugada, desde la medianoche hasta las 5 de la mañana, sería recomendable consultar las noticias en busca de información sobre posibles explosiones químicas en su zona. En caso de sentir que su mesa está temblando, podría estar relacionado con una detonación en una cantera cercana.

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 busca anticipar el tipo de actividad sísmica utilizando un conjunto limitado de características, tales como profundidad, magnitud, latitud y longitud. Aunque existen muchas más características en el conjunto de datos, a partir de este punto, emplearemos estos parámetros para efectuar una predicción básica.

Para comenzar, se procederá a preparar el conjunto de datos con miras a la predicción. Se agruparán todas las actividades sísmicas que no sean terremotos naturales en una única categoría, dado que se ha observado que la mayoría de estos otros sismos presentan aproximadamente el mismo rango en cuanto a 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         0         0         0
quake <- quake[!is.na(quake$mag),]
#Now look at the data
head(quake)
##   latitude longitude   depth  mag hour       type
## 1  63.1985 -149.3756  73.300 1.60    2 Earthquake
## 2  38.8345 -122.8182   1.520 0.71    1 Earthquake
## 3  17.3901  147.5300  10.000 4.90    1 Earthquake
## 4 -32.9073 -178.8674  45.006 5.10    1 Earthquake
## 5  58.6436 -154.3143 101.600 2.00    1 Earthquake
## 6  -1.6972  120.2673  42.456 5.50    1 Earthquake

Se emplearán máquinas de vectores de soporte para llevar a cabo una predicción, y anticipamos un problema de desequilibrio de clases en esta situación, ya que en nuestro conjunto de datos el 98% de las observaciones corresponden a terremotos naturales, mientras que solo el 2% de las observaciones se atribuyen a otros tipos de sismos.

Inicialmente, se generará el modelo sin abordar el desequilibrio de clases, y posteriormente se procederá a utilizar la biblioteca Rose para abordar el problema del desequilibrio en las clases.

table(quake$type)
## 
## Earthquake Otherquake 
##      10446        185
# 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  63.19850 -149.3756 73.300 1.60    2 Earthquake
## 2  38.83450 -122.8182  1.520 0.71    1 Earthquake
## 3  17.39010  147.5300 10.000 4.90    1 Earthquake
## 4 -32.90730 -178.8674 45.006 5.10    1 Earthquake
## 6  -1.69720  120.2673 42.456 5.50    1 Earthquake
## 7  38.79883 -122.7945  3.760 0.65    1 Earthquake
table(train$type)
## 
## Earthquake Otherquake 
##       7312        130
table(test$type)
## 
## Earthquake Otherquake 
##       3134         55
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       3134         55
##   Otherquake          0          0
##                                             
##                Accuracy : 0.9828            
##                  95% CI : (0.9776, 0.987)   
##     No Information Rate : 0.9828            
##     P-Value [Acc > NIR] : 0.5358            
##                                             
##                   Kappa : 0                 
##                                             
##  Mcnemar's Test P-Value : 0.0000000000003305
##                                             
##             Sensitivity : 1.0000            
##             Specificity : 0.0000            
##          Pos Pred Value : 0.9828            
##          Neg Pred Value :    NaN            
##              Prevalence : 0.9828            
##          Detection Rate : 0.9828            
##    Detection Prevalence : 1.0000            
##       Balanced Accuracy : 0.5000            
##                                             
##        'Positive' Class : Earthquake        
## 

En la predicción previa, se evidencia de manera clara una limitación. Todos los terremotos se pronostican de forma correcta, lo que resulta en una alta sensibilidad (verdaderos positivos). No obstante, ninguno de los ‘otros tipos de sismos’ se predice de manera precisa, lo cual resulta en una especificidad de 0 (verdaderos negativos).

Tratando el desequilibrio de la clase:

Ahora, se recurre al paquete Rose (Random Over-Sampling Examples) para abordar el desafío del desequilibrio de clases mediante técnicas de sobremuestreo, submuestreo o una combinación de ambos. Empecemos por explorar el sobremuestreo.

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       3020          1
##   Otherquake        114         54
##                                              
##                Accuracy : 0.9639             
##                  95% CI : (0.9569, 0.9701)   
##     No Information Rate : 0.9828             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.4705             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.9636             
##             Specificity : 0.9818             
##          Pos Pred Value : 0.9997             
##          Neg Pred Value : 0.3214             
##              Prevalence : 0.9828             
##          Detection Rate : 0.9470             
##    Detection Prevalence : 0.9473             
##       Balanced Accuracy : 0.9727             
##                                              
##        'Positive' Class : Earthquake         
## 

Es evidente un aumento sustancial en la especificidad. De los 55 sismos de otro tipo en nuestros datos de prueba, 47 son pronosticados de manera acertada, aunque se produce una predicción incorrecta para 150 sismos. La implementación del sobremuestreo ha demostrado ser efectiva al tratar el desequilibrio en la clase y ha elevado considerablemente nuestra especificidad al 85%.