4  Visualización

Presentamos un ejemplo para visualización de datos de sismos de Argentina de los últimos 10 años.

Cómo MidJourney imagina que se ilustra este problema bajo el prompt: /imagine a stunning illustration capturing seismic data visualization near the mountains in San Juan. Abstract seismic waves emanate from the mountains, indicating seismic energy, and seismograph traces overlay the landscape, displaying earthquake intensity. Data points scattered around signify seismic events of various magnitudes and depths.

Se llama sismo al proceso físico de liberación instantánea de energía acumulada en el interior de las rocas de la litósfera. La energía acumulada es producto de los esfuerzos tectónicos generados en las partes rígidas de la Tierra. Los sismos ocurren y han ocurrido históricamente, sin embargo, en la actualidad hay más registro de eventos sísmicos a causa de los avances tecnológicos que han permitido localizarlos y caracterizarlos con mayor exactitud.

El riesgo sísmico de una región es la probabilidad de consecuencias adversas ante un evento sísmico y resulta de la combinación entre la peligrosidad sísmica propia del lugar y de la vulnerabilidad de las construcciones.

Mapa de peligrosidad sísmica del INPRES.

El INPRES (Instituto Nacional para la Prevención Sísmica) afirma que no es posible, en el sentido amplio de la palarba, predecir un sismo (o terremoto, que en la jerga local alude a un sismo que ocasiona víctimas y daños severos). Se considera una predicción sísmica formal a aquella en la que se indica la fecha de ocurrencia, el lugar (coordenadas) de ocurrencia (con la profundidad) y el tamaño (magnitud), del evento por ocurrir. La sismología ha permitido conocer e identificar todas las regiones en el mundo que son potencialmente sísmicas, es decir, regiones donde siempre han ocurrido, ocurren y ocurrirán terremotos mientras la Tierra tenga vida. Aunque el tamaño de los terremotos que ocurrirán en alguna de estas regiones puede ser estimado de manera aproximada en función de datos históricos, sin embargo, la fecha del terremoto no puede ser determinada con exactitud.

Si bien hay estudios científicos sobre predicción sísmica que realizan países como China, Estados Unidos y Japón; la comunidad sismológica mundial en la actualidad, no ha logrado obtener, con rigor científico estricto, predicciones de terremotos.

A continuación, se muestran algunos posibles análisis para datos de sismos de Argentina durante los años 2012 a 2022, fuertemente relacionados con herramientas de visualización y descriptivas.

Código
rm(list=ls())
# Librerías necesarias
require(ggplot2)
require(tidyverse)
require(ggfortify)
require(plotly)
require(kableExtra)
require(vroom)
require(leaflet)
require(lubridate)
require(devtools)
options(scipen=999)

4.1 Exploración inicial

Los datos de sismos pueden obtenerse del buscador disponible en el INPRES, acá, en el que se registran eventos sísmicos en territorio argentino y diferentes variables asociadas a estos, en particular, si se trata de un sismo que se haya sentido o no.

Para lo que sigue, trabajamos con el dataset reducido sismos de la librería datosIC en el que se incluyen datos de sismos de diferente intensidad y magnitud en la región continental del país (excluyendo Tierra del Fuego) desde el 7 de enero de 2012, hasta el 18 de mayo de 2022. El dataset ha sido transformado a partir de datos scrappeados del buscador de sismos del INPRES, cortesía de Gustavo Juantorena. A continuación, se muestran 10 datos de dicho conjunto.

Código
devtools::install_github("daniellaparada/datosIC")
library(datosIC)
datos <- sismos
Dataset reducido
Fecha Hora Latitud Longitud Provincia Percibido Magnitud Profundidad
2022-05-18 13:09:56 -31.820 -67.040 San Juan FALSE 3.0 134
2022-05-18 10:18:34 -24.216 -67.139 Salta FALSE 3.2 185
2022-05-18 09:40:09 -31.262 -68.708 San Juan FALSE 3.3 104
2022-05-18 09:25:43 -32.521 -70.085 San Juan FALSE 2.7 112
2022-05-18 08:45:59 -28.192 -67.376 Catamarca FALSE 2.7 142
2022-05-18 08:42:33 -32.043 -70.030 San Juan FALSE 2.7 114
2022-05-17 23:22:48 -23.442 -66.846 Jujuy FALSE 3.6 210
2022-05-17 21:21:18 -23.503 -66.831 Jujuy FALSE 3.6 210
2022-05-17 17:17:58 -22.794 -66.228 Jujuy FALSE 4.0 273
2022-05-17 14:46:04 -31.505 -68.640 San Juan FALSE 2.7 103

La variable ´Percibido´ es la que registra si la intensidad del sismo fue percibida, o no, por la población del territorio afectado. Los sismos son más frecuentes de lo que, quizás, supongamos. El siguiente mapa ofrece una posible visualización para los sismos percibidos y no percibidos de los últimos 10 años. Dentro del mapa, es posible activar la capa topográfica para relacionar, por ejemplo, los sismos con el relieve del territorio.

Código
sismos_arg <- datos
pal1 <-
  colorNumeric(palette = c("deeppink2", "deeppink4"),
               domain = sismos_arg$Profundidad)
pal2 <-
  colorNumeric(palette = c("dodgerblue2", "dodgerblue4"),
               domain = sismos_arg$Profundidad)

mapa_arg <- sismos_arg %>%
  leaflet(options = leafletOptions(attributionControl = FALSE)) %>%
  addTiles(group = "OSM (default)") %>%
  addProviderTiles("OpenTopoMap",
                   group = "Topográfico",
                   options = providerTileOptions(opacity = 0.5)) %>%
  addCircleMarkers(
    data = sismos_arg %>%
      filter(Percibido == FALSE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 0.15,
    radius =  ~ Magnitud,
    color = ~ pal2(Profundidad),
    stroke = FALSE,
    group = "Sismos no percibidos"
  ) %>%
  addCircleMarkers(
    data = sismos_arg %>%
      filter(Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 0.15,
    radius =  ~ Magnitud,
    color = ~ pal1(Profundidad),
    stroke = FALSE,
    group = "Sismos percibidos"
  ) %>%
  addLayersControl(
    baseGroups = c("OSM (default)", "Topográfico"),
    overlayGroups = c("Sismos no percibidos", "Sismos percibidos"),
    options = layersControlOptions(collapsed = TRUE)
  )

mapa_arg

El radio de cada punto indica la magnitud del sismo, mientras que la intensidad del color, su profundidad. Los sismos también se clasifican de acuerdo con la profundidad de su foco: desde la corteza terreste y hasta 70 km de profundidad, son superficiales; entre los 70 y los 450 km de profundidad, son intermedios; y para más de 450 km profundidad, profundos. Los más profundos, en el mapa, se ubican en la capa de sismos no percibidos (azul) sobre la falla que recorre en línea más o menos vertical las provincias de Salta y Santiago del Estero. Profundidades intermedias se encuentran, mayoritariamente, en el oeste de Jujuy. El resto, en general, corresponde a profundidades superficiales.

Las provincias de San Juan, Salta, Jujuy, La Rioja, Mendoza, Catamarca, y Córdoba son aquellas que registran más de 1000 eventos durante el período observado. El siguiente mapa ofrece una visualización de sismos para dichas provincias, indicando con color su magnitud.

Código
top <-
  c("San Juan",
    "Salta",
    "Jujuy",
    "La Rioja",
    "Mendoza",
    "Catamarca",
    "Córdoba")
pal3 <-
  colorNumeric(
    palette = c("gold", "sienna1", "firebrick", "darkred", "orangered4"),
    domain = sismos_arg$Magnitud
  )

mapa_arg_top <- sismos_arg %>%
  leaflet(options = leafletOptions(attributionControl = FALSE)) %>%
  addTiles(group = "OSM (default)") %>%
  addProviderTiles("OpenTopoMap",
                   group = "Topográfico",
                   options = providerTileOptions(opacity = 0.5)) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[1]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[1]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[2]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[2]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[3]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[3]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[4]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[4]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[5]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[5]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[6]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[6]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[7]),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[7]
  ) %>%
  addLayersControl(
    baseGroups = c("OSM (default)", "Topográfico"),
    overlayGroups = top,
    options = layersControlOptions(collapsed = TRUE)
  )
mapa_arg_top

La percepción del sismo por parte de la población no está únicamente asociada a la magnitud y/o profundidad. Por ejemplo, un sismo de magnitud 2.6 y profundidad de 7 km en Córdoba es percibido, mientras que otro, de magnitud 2.7 y profundidad de 12 km en Catamarca no es percibido. Lo mismo ocurre para magnitudes y/o profundidades mayores. El siguiente mapa ofrece una visualización similar al anterior, pero restringido únicamente a los sismos percibidos del conjunto de datos.

Código
mapa_arg_top_perc <- sismos_arg %>%
  leaflet(options = leafletOptions(attributionControl = FALSE)) %>%
  addTiles(group = "OSM (default)") %>%
  addProviderTiles("OpenTopoMap",
                   group = "Topográfico",
                   options = providerTileOptions(opacity = 0.5)) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[1],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[1]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[2],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[2]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[3],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[3]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[4],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[4]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[5],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[5]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[6],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[6]
  ) %>%
  addCircles(
    data = sismos_arg %>%
      filter(Provincia == top[7],
             Percibido == TRUE),
    lng = ~ Longitud,
    lat = ~ Latitud,
    fillOpacity = 1,
    color =  ~ pal3(Magnitud),
    stroke = FALSE,
    group = top[7]
  ) %>%
  addLayersControl(
    baseGroups = c("OSM (default)", "Topográfico"),
    overlayGroups = top,
    options = layersControlOptions(collapsed = TRUE)
  )
mapa_arg_top_perc

Allí puede verse que, mientras que en San Juan los sismos percibidos parecen ser de magnitudes altas, en Córdoba ocurre lo contrario.

Por otro lado, la profundidad de los sismos guarda estrecha relación con la configuración geológica y tecnótica de su ubicación geográfica. El gráfico que sigue toma los eventos de las provincias con más registros y exhibe la relación entre la profundidad del sismo y los paralelos de su ubicación de registro. Llamativo resulta ver que la actividad sísmica disminuye en las profundidades que separan los sismos superficiales de los intermedios. Como veíamos, las mayores profundidades se detectan en las provincias de Salta y Jujuy, con la excepción de una pequeña región entre paralelos en San Juan.

Código
ggplotly(
  ggplot(
    data = sismos_arg %>%
      filter(Provincia == top),
    aes(
      x = Latitud,
      y = Profundidad,
      colour = Provincia,
      key = Magnitud
    )
  ) +
    labs(x = "Latitud", y = "Profundidad") +
    geom_point() +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

Conocimiento sobre la configuración tectónica permite interpretaciones más profundas. Por ejemplo, la zona norte de Mendoza ubicada entre los paralelos -32.5 y -33.5 y donde se ubica parte del Gran Mendoza, se encuentra en la región de mayor peligrosidad sísmica según INPRES. Lo que ocurre es que allí se da la convergencia entre la placa Sudamericana y la placa de Nazca, que se extiende a lo largo de la fosa Peruano-Chilena y en su movimiento en la dirección Este, subduce debajo de la Sudamericana, que se mueve en sentido opuesto. Dicho mecanismo induce un régimen de esfuerzos compresionales a la placa Sudamericana y que resultan responsables de la orientación y sentido del desplazamiento de las fallas lo que, como consecuencia, caracteriza la sismicidad de la zona.

El siguiente gráfico muestra la profundidad en relación con la longitud de la ubicación del foco para la zona norte de Mendoza ubicada entre los paralelos -32.5° y -33.5°, zona de subducción entre la placa de Nazca y la Sudamericana (zona de Benioff). Un análisis experto puede halar en el gráfico evidencia de la placa de Nazca subducida y moviéndose en dirección Este respecto a la placa Sudamericana (más detalle sobre esto puede consultarse acá).

Código
ggplotly(
  ggplot(
    data = sismos_arg %>%
      filter(Provincia == "Mendoza",
             Latitud < -32.5,
             Latitud > -33.5),
    aes(
      x = Longitud,
      y = Profundidad,
      colour = Magnitud,
      key = Profundidad
    )
  ) +
    labs(x = "Longitud (entre latitudes -32,50º y -33,50º)", y = "Profundidad") +
    geom_point() +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

La tabla que sigue resume, por provincia, la cantidad de sismos registrados, los percibidos, así como la magnitud y profundidad mediana. De las provincias con mayor cantidad de eventos registrados, Jujuy y Salta registran los sismos más profundos, mientras que Córdoba registra sismos superficiales, con una intensidad mediana de 2.8, y es de las provincias con mayor tasa de sismos percibidos de entre las de mayor cantidad de eventos registrados. San Juan registra muchos sismos, más de la mitad de ellos de profundidad media a profunda, pero con una tasa de percepción relativamente baja, como Salta y Jujuy.

Resumen por provincias
Provincia n nperc Magmed Profmed
Buenos Aires 7 5 3.7 31
Catamarca 3317 109 2.8 139
Chaco 3 0 3.3 231
Chubut 1 0 3.8 169
Corrientes 2 0 3.7 267
Córdoba 1145 313 2.8 21
Entre Ríos 1 0 3.8 32
Formosa 3 0 3.8 342
Jujuy 5270 64 3.2 223
La Pampa 5 4 3.6 22
La Rioja 4616 166 2.8 114
Mendoza 4319 303 2.7 31
Neuquén 231 66 3.0 8
Río Negro 1 0 2.9 98
Salta 5781 61 3.2 195
San Juan 29920 619 2.7 106
San Luis 568 69 2.8 22
Santa Cruz 46 22 3.0 14
Santiago del Estero 255 59 3.2 30
Tucumán 326 46 2.8 27
Porcentaje de sismos percibidos para casos de más de 1000 eventos
Provincia pperc
Catamarca 3.286102
Córdoba 27.336244
Jujuy 1.214421
La Rioja 3.596187
Mendoza 7.015513
Salta 1.055181
San Juan 2.068850

4.2 Análisis para el caso de San Juan

San Juan registra casi 30.000 eventos para el período considerado de poco más de 10 años, con una mediana de 8 sismos diarios. Un histograma para la cantidad diaria de sismos se observa a continuación.

Código
sismos_arg <- sismos_arg %>%
  mutate(FechaHora = paste(Fecha, Hora, sep = " "))
sismos_arg$FechaHora <- ymd_hms(sismos_arg$FechaHora)

sismos_SJ <- sismos_arg %>%
  filter(Provincia == "San Juan") %>%
  arrange(FechaHora)

sismos_SJ_dia <- sismos_SJ %>%
  group_by(Fecha) %>%
  count()

ggplotly(
  ggplot(data = sismos_SJ_dia, aes(x = n, key = n)) +
    labs(x = "Cantidad de sismos por día",
         y = "") +
    geom_histogram(fill = "dodgerblue", alpha = 0.9) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

En el histograma puede verse que hay por lo menos una observación que supera los 100 sismos diarios. En efecto, se trata del terremoto del 18 de enero de 2021 en La Rinconada, San Juan, en el que se reportaron colapsos de viviendas de adobe, grietas distensivas a lo largo del eje de la Ruta Nacional 40, derrumbes parciales, y otros daños serios principalmente en los Departamentos de Pocito y Sarmiento. Durante las 72 hs posteriores al terremoto de magnitud 6.4, se registraron más de 150 réplicas de magnitudes entre 2.5 y 5.3. Más información acá.

El siguiente gráfico muestra la cantidad de sismos diarios. Puede apreciarse las réplicas de tal terremoto en las observaciones que corresponden a los días entre el 19 y el 23 de enero de 2021.

Código
ggplotly(
  ggplot(data = sismos_SJ_dia, aes(
    x = Fecha, y = n, key = Fecha
  )) +
    labs(x = "Fecha (días)", y = "Cantidad de sismos (día)") +
    geom_point(colour = "deeppink3") +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

Como vimos, San Juan registra más de 600 sismos percibidos durante el período, algo más que el 2% del total de sismos registrados. La frecuencia con la que se perciben tales sismos es alta. Eso puede observarse en el histograma para la cantidad de días transcurridos entre un sismo percibido y otro.

Código
df <- sismos_SJ %>%
  filter(Percibido == TRUE)

# Tiempo transcurrido entre dos percibidos (días)
tiempo <- c()
for (i in 1:(nrow(df) - 1))
  tiempo[i] <-
  difftime(df$FechaHora[i + 1], df$FechaHora[i], units = "days")

datos <- data.frame(tiempo)
ggplotly(
  ggplot(data = datos, aes(x = tiempo, key = tiempo)) +
    labs(x = "Días transcurridos entre un sismo percibido y otro",
         y = "Cantidad") +
    geom_histogram(fill = "dodgerblue", alpha = 0.9) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

Córdoba y Mendoza, registrando cerca del 27% y 7% de sismos percibidos respecto del total, respectivamente, tienen una frecuencia ligeramente más espaciada que la de San Juan.

Código
sismos_COR <- sismos_arg %>%
  filter(Provincia == "Córdoba") %>%
  arrange(FechaHora)

df <- sismos_COR %>%
  filter(Percibido == TRUE)

# Tiempo transcurrido entre dos percibidos (días)
tiempo <- c()
for (i in 1:(nrow(df) - 1))
  tiempo[i] <-
  difftime(df$FechaHora[i + 1], df$FechaHora[i], units = "days")

datos <- data.frame(tiempo)
ggplotly(
  ggplot(data = datos, aes(x = tiempo, key = tiempo)) +
    labs(x = "Días transcurridos entre un sismo percibido y otro (Córdoba, n=313)",
         y = "Cantidad") +
    geom_histogram(fill = "dodgerblue3", alpha = 0.9) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)
Código
sismos_MZ <- sismos_arg %>%
  filter(Provincia == "Mendoza") %>%
  arrange(FechaHora)

df <- sismos_MZ %>%
  filter(Percibido == TRUE)

# Tiempo transcurrido entre dos percibidos (días)
tiempo <- c()
for (i in 1:(nrow(df) - 1))
  tiempo[i] <-
  difftime(df$FechaHora[i + 1], df$FechaHora[i], units = "days")

datos <- data.frame(tiempo)
ggplotly(
  ggplot(data = datos, aes(x = tiempo, key = tiempo)) +
    labs(x = "Días transcurridos entre un sismo percibido y otro (Mendoza, n=303)",
         y = "Cantidad") +
    geom_histogram(fill = "dodgerblue4", alpha = 0.9) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

4.2.1 Gutenberg-Richter

La ley de Gutenberg-Richter es una fórmula que permite cuantificar la relación entre la frecuencia y la magnitud de la actividad sísmica de una región. La relación fue inicialmente propuesta por Charles Francis Richter y Beno Gutenberg hace más de 70 años y es aun objeto de caracterización de sismos, pues se ha mostrado relativamente invariante por región y en el tiempo.

N es un número de sismos de magnitud mayor que M durante un período de tiempo “t”, logN es un logaritmo del número de sismos con magnitud M La ley establece que la recurrencia sísmica de magnitud mayor o igual a \(M\) durante un período de tiempo \(t\), en una región, se relaciona con la cantidad de sismos, \(N\), de magnitud mayor que \(M\) durante el período, a través de

\[ \log _{10} N=a-b M, \]

donde \(a\) y \(b\) son constantes determinadas por la naturaleza sísmica de la región, en general, a partir de datos históricos.

Ajustamos los datos de San Juan al modelo de Gutenberg-Richter para estimar las constantes \(a\) y \(b\). En el siguiente gráfico puede verse la cantidad \(N\) de sismos de magnitud mayor que \(M\) por año (escala logarítmica en base 10). Como los años 2012 y 2022 no están completos para el año calendario, reducimos los datos al período 2013-2021.

Código
sismos_SJ <- sismos_SJ %>%
  mutate(Año = format(Fecha, format = "%Y"))

df <- sismos_SJ %>%
  filter(Año > 2012,
         Año < 2022) %>%
  group_by(Año, Magnitud) %>%
  summarize(n = n())


df2 <- df %>%
  group_by(Año) %>%
  arrange(-Magnitud) %>%
  summarize(Magnitud = Magnitud,
            nacum = cumsum(n))

ggplotly(
  ggplot(data = df2, aes(
    x = Magnitud, y = log(nacum, 10), colour = Año, key = nacum
  )) +
    labs(x = "Magnitud", y = "(Log 10) Cantidad acumulada de sismos") +
    geom_point() +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

La estimación por mínimos cuadrados de \(a\) y de \(b\) puede verse a continuación.

Código
ajuste <- lm(log(nacum, 10) ~ Magnitud, data = df2)
a <- round(ajuste$coefficients[1], 4)
b <- -round(ajuste$coefficients[2], 4)

Los coeficientes estimados son \(6.1812\) para \(a\), y \(1.1433\) para \(b\). El coeficiente \(b\) suele ser aproximadamente igual a \(1\) para sismos tectónicos. Como los datos con los que se estimó son de frecuencia anual, la cantidad \(a/b\) puede interpretarse como, en promedio y una vez al año, la ocurrencia de un terremoto de magnitud \(a/b\) o superior. En este caso, \(a/b=5.4065\), lo que sugiere que, en promedio, una vez al año se registra en San Juan un terremoto de magnitud aproximada \(5.4\) o superior.

En el siguiente gráfico se superpone, en azul, la curva estimada de Gutenberg-Richter

\[ \log _{10} N=6.1812-1.1433 M, \]

a partir de los datos de San Juan.

Código
ggplotly(
  ggplot(data = df2, aes(
    x = Magnitud,
    y = log(nacum, 10),
    key = Año
  )) +
    labs(x = "Magnitud", y = "(Log 10) Cantidad de sismos") +
    geom_point(colour = "deeppink3") +
    geom_abline(
      intercept = a,
      slope = -b,
      colour = "dodgerblue"
    ) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

4.2.2 Estimación de la probabiblidad de ocurrencia de futuros sismos

Del análisis de los resultados de la tasa o frecuencia media de ocurrencia por unidad de tiempo, suele derivarse la estimación de la probabilidad de ocurrencia de futuros eventos sísmicos en la región estudiada, bajo el supuesto fundamental de que el nivel de actividad sísmica de los últimos años se mantendrá aproximadamente igual, en promedio, para los próximos años.

Para evaluar dicho riesgo sísmico, se modela la probabilidad con una distribución de Poisson, pues se supone que los eventos sísmicos se producen de un modo aleatorio e independiente, donde los tiempos de origen, las coordenadas de los focos y las magnitudes son variables independientes entre sí. Es decir, que la ocurrencia de un evento sísmico no tiene influencia en la ocurrencia de otro, y que la probabilidad de que dos eventos sucedan en el mismo sitio y al mismo tiempo es casi nula.

En general, tales hipótesis no concuerdan completamente con la naturaleza física de la acumulación de energía en zonas sísmicas. Sin embargo, y a pesar de estas limitaciones, este modelo provee una medida del riesgo sísmico relativamente sencilla, interpretable y típicamente usada por la comunidad experta para proveer una cuantificación de riesgo aceptable para las regiones.

Entonces, bajo este modelo, la probabilidad de ocurrencia de al menos un sismo de magnitud mayor que \(M\) en los próximos \(t\) años se calcula como \[ P(t)=1-e^{-N_1(M) \times t} . \] donde \(N_1(M)=10^{(a-b M \log t)}\). Luego, el número promedio de años para que un sismo de magnitud mayor que \(M\) ocurra está dado por \[ T_R=\frac{1}{N_1(M)}. \] Tomando como referencia la estimación de \(a\) y \(b\) obtenida para San Juan, la estimación de la probabilidad de ocurrencia de al menos un sismo de magnitud mayor que \(M\) en San Juan en los próximos \(t\) años, para \(t\in\{1,5,10,20\}\), se observa en el siguiente gráfico.

Código
magnitudes <- seq(3, 6.5, by = 0.01)
tiempos <- c(1, 5, 10, 20)

N1_m <- 10 ^ (a - b * magnitudes - log(1, 10))
p_m <- function(t, N1m) {
  1 - exp(-N1m * t)
}

probas <- matrix(c(
  magnitudes,
  p_m(1, N1_m),
  p_m(5, N1_m),
  p_m(10, N1_m),
  p_m(100, N1_m)
), ncol = 5)

colnames(probas) <- c("Magnitud", "t_1", "t_5", "t_10", "t_20")
probas <- data.frame(probas)

ggplotly(
  ggplot() +
    labs(x = "Magnitud", y = "Probabilidad estimada") +
    geom_line(data = probas, aes(
      x = Magnitud, y = t_1, color = "t=1"
    )) +
    geom_line(data = probas, aes(
      x = Magnitud, y = t_5, color = "t=5"
    )) +
    geom_line(data = probas, aes(
      x = Magnitud, y = t_10, color = "t=10"
    )) +
    geom_line(data = probas, aes(
      x = Magnitud, y = t_20, color = "t=20"
    )) +
    scale_colour_manual(
      name = 'Tiempos',
      values = c(
        't=1' = 'gold',
        't=5' = 'sienna1',
        "t=10" = "firebrick3",
        "t=20" = "darkred"
      ),
      labels = c('t=1', 't=5', 't=10', 't=20')
    ) +
    theme_classic(),
  source = "select"
)

Así, por ejemplo, la probabilidad estimada de que un sismo de magnitud superior a 6 ocurra en San Juan ocurra en los próximos 5 años es de casi \(0.65\), aumenta a \(0.88\) para los próximos 10 años y es de casi \(1\) para los próximos 20. En efecto, los únicos sismos registrados en los datos de tal magnitud son los de noviembre de 2016 y enero de 2021. Sismos de magnitud superior a 4.5 en San Juan son casi seguros para los próximos años, en todos los casos.

Sismos de magnitud superior a 6 en San Juan, desde 2013 a 2021
Fecha Hora Latitud Longitud Provincia Percibido Magnitud Profundidad FechaHora Año
2016-11-20 17:57:44 -31.630 -68.663 San Juan TRUE 6.3 107 2016-11-20 17:57:44 2016
2021-01-18 23:46:20 -31.854 -68.963 San Juan TRUE 6.4 8 2021-01-18 23:46:20 2021

5 Acerca de los datos

A continuación, se detallan aspectos de los datasets que conformaron el dataset reducido para el desarrollo del ejemplo, a la vez que se incluyen las fuentes de los datos y el código utilizado para pre-procesarlo con la sintaxis de tidyverse. De esta forma, puede fácilmente replicarse y/o adaptarse si así se lo desea.

El dataset reducido con el que se desarrolló el ejemplo y que surge de tal pre-procesamiento, es sismos de la librería datosIC.

5.1 Sobre el dataset completo de sismos

Los datos de este ejemplo corresponden a datos scrappeados del buscador de sismos del INPRES, cuyo buscador está disponible acá. En el dataset sismos_all.csv, disponible acá, en el que se registran eventos sísmicos en territorio argentino y diferentes variables asociadas a estos, en particular, si se trata de un sismo que se haya sentido o no.

Los sismos registrados en INPRES pueden estar revisados por un sismólogo y, posiblemente a razón de ello, algunas inconsistencias en la nomenclatura de las provincias es hallada. El siguiente código toma el dataset completo sismos_all.csv y:

  • convierte en variable la percepción del sismo teniendo en cuenta que la intensidad solo se registra para sismos percibidos,
  • limpia y unifica el formato de fecha de los eventos,
  • extrae la información de profundidad, eliminando las unidades que forman parte del dato,
  • filtra los datos para obtener los datos del territorio continental argentino (excluyendo a Tierra del Fuego),
  • y recodifica los nombres de las provincias para unificar su identificación.
Código
# importo datos de sismos
sismos <- vroom("./fuente/04_visualizacion/sismos_all.csv")
sismos$Fecha <- as.Date(sismos$Fecha, tryFormats = c("%d/%m/%Y"))

# info de casi 10 años
min(sismos$Fecha)
max(sismos$Fecha)

# dummy para los percibidos
sismos <- sismos %>%
  mutate(
    Percibido = !is.na(Intensidad),
    Magnitud = Magn.,
    Profundidad = Profund.
  )

# quito las unidades km. en intensidad
sismos$Profundidad <- as.numeric(str_sub(sismos$Profundidad, 1,-4))

# sismos en Argentina Continental (saco TdF porque se corre mucho el mapa)
sismos_arg <- sismos %>%
  filter(
    Provincia != "OCEANO PACIFICO",
    Provincia != "CHILE",
    Provincia != "MAULE - CHILE",
    Provincia != "REPÚBLICA DE CHILE",
    Provincia != "REPUBLICA DE CHILE",
    Provincia != "SUR DE CHILE",
    Provincia != "TFAIAS",
    Provincia != "NORTH ISLAND, NEW ZEALAND",
    Provincia != "REGION NOT FOUND.",
    Provincia != "PERU",
    Provincia != "PENINSULA ANTARTICA",
    Provincia != "PASAJE DE DRAKE",
    Provincia != "NORTHWEST OF KURIL ISLANDS",
    Provincia != "NTARTIDA",
    Provincia != "MAR DE SCOTIA",
    Provincia != "MAR ARGENTINO",
    Provincia != "ISLAS SANDWICH DEL SUR",
    Provincia != "ISLAS SANDWICH",
    Provincia != "ISLAS SHETLAND",
    Provincia != "ISLAS SHETLAND DEL SUR",
    Provincia != "ESTRECHO DE DRAKE",
    Provincia != "FILIPINAS",
    Provincia != "I.SANDWICH DEL SUR",
    Provincia != "SECTOR ANTARTICO",
    Provincia != "IS. SHETLAND DEL SUR",
    Provincia != "ISLAS GEORGIA DEL SUR",
    Provincia != "ISLAS GEORGIAS DEL SUR",
    Provincia != "ISLAS GEORGIAS y SANDWICH DEL SUR",
    Provincia != "ISLAS GIORGIA Y SANDWICH DEL SUR",
    Provincia != "ISLAS ORCADAS",
    Provincia != "ISLAS ORCADAS DEL SUR",
    Provincia != "ATLANTICO SUR",
    Provincia != "BOLIVIA",
    Provincia != "PARAGUAY",
    Provincia != "LIM. ARG-CHILE",
    Provincia != "LIM.ARGENTINA-CHILE",
    Provincia != "LIM.CHILE-ARGENTINA",
    Provincia != "LIMITE ARGENTINA-CHILE",
    Provincia != "LIMITE ARGENTINA CHILE",
    Provincia != "TIERRA DEL FUEGO",
    Provincia != "ISLAS GEORGIAS Y SANDWICH DEL SUR"
  )

table(sismos_arg$Provincia)

# recodifico provincias
sismos_arg <- sismos_arg %>%
  mutate(
    Provincia = recode(
      Provincia,
      "BUENOS AIRES" = "Buenos Aires",
      "CATAMARCA" = "Catamarca",
      "CATAMARCA}" = "Catamarca",
      "CATAMARCA LIM. TUCUMAN" = "Catamarca",
      "CATAMARCA(LIM.CON TUCUMAN)" = "Catamarca",
      "CATAMARCA(LIM.CON TUCUMÁN)" = "Catamarca",
      "CHACO" = "Chaco",
      "CHUBUT" = "Chubut",
      "CORDOBA" = "Córdoba",
      "CORDOBA(LIM.CON SAN LUIS)" = "Córdoba",
      "CORDOBA LIM. SAN LUIS" = "Córdoba",
      "CORRIENTES" = "Corrientes",
      "ENTRE RIOS" = "Entre Ríos",
      "FORMOSA" = "Formosa",
      "jujuy" = "Jujuy",
      "JUJUY" = "Jujuy",
      "JUJUY(LIM.CON SALTA)" = "Jujuy",
      "LA PAMPA" = "La Pampa",
      "LA RIOJA" = "La Rioja",
      "LA RIOJA LIM. SAN JUAN" = "La Rioja",
      "LA RIOJA(LIM.CON CATAMARCA)" = "La Rioja",
      "LA RIOJA(LIM.CON SAN JUAN)" = "La Rioja",
      "LIM. CATAMARCA-TUCUMAN" = "Catamarca",
      "LIM. LA RIOJA - SAN JUAN" = "La Rioja",
      "LIMITE CATAMARCA - TUCUMAN" = "Catamarca",
      "LIMITE CORDOBA - SAN LUIS" = "Córdoba",
      "LIMITE JUJUY-SALTA" = "Jujuy",
      "LIMITE JUJUY - SALTA" = "Jujuy",
      "LIMITE LA RIOJA-CATAMARCA" = "La Rioja",
      "LIMITE MENDOZA-SAN JUAN" = "Mendoza",
      "LIMITE MENDOZA - SAN JUAN" = "Mendoza",
      "LIMITE SALTA-JUJUY" = "Salta",
      "LIMITE SALTA - CATAMARCA" = "Salta",
      "LIMITE SALTA - JUJUY" = "Salta",
      "LIMITE SAN JUAN-MENDOZA" = "San Juan",
      "LIMITE SAN JUAN - LA RIOJA" = "San Juan",
      "LIMITE SAN JUAN - MENDOZA" = "San Juan",
      "LIMITE SAN JUAN SAN LUIS" = "San Juan",
      "LIMITE SAN LUIS-SAN JUAN" = "San Luis",
      "LIMITE TUCUMAN - CATAMARCA" = "Tucumán",
      "MENDOZa" = "Mendoza",
      "MENDOZA" = "Mendoza",
      "MENDOZA(LIM.CON SAN JUAN)" = "Mendoza",
      "MENDOZA}" = "Mendoza",
      "MMENDOZA" = "Mendoza",
      "NEUQUEN" = "Neuquén",
      "RIO NEGRO" = "Río Negro",
      "SALTA" = "Salta",
      "SALTA (limite con Jujuy)" = "Salta",
      "SALTA LIM. JUJUY" = "Salta",
      "SALTA(LIM.CON JUJUY)" = "Salta",
      "SALTA(LIM.CON TUCUMAN)" = "Salta",
      "SAN JUAN LIM. MENDOZA" = "San Juan",
      "SAN JUAN (LIM.CON SAN LUIS)" = "San Juan",
      "SAN JUAN LIM. LA RIOJA" = "San Juan",
      "SAN JUAN LIM.CON SAN LUIS" = "San Juan",
      "SAN JUAN LIM.CON MENDOZA" = "San Juan",
      "SAN JUAN LIM. MENDOZA" = "San Juan",
      "SAN JUAN(LIM.ARG-CHI)" = "San Juan",
      "SAN JUAN(LIM.CON LA RIOJA)" = "San Juan",
      "LIMITE SAN JUAN - SAN LUIS" = "San Juan",
      "LIMITE SAN JUAN LA RIOJA" = "San Juan",
      "SAN JUAN(LIM.CON MENDOZA)" = "San Juan",
      "SAN JUA" = "San Juan",
      "SAn JUAN" = "San Juan",
      "SAN JUAN" = "San Juan",
      "LIMITE SAN JUAN MENDOZA" = "San Juan",
      "SAN JUAN(LIM.CON SAN LUIS)" = "San Juan",
      "SAN LUIS" = "San Luis",
      "SANTA CRUZ" = "Santa Cruz",
      "SANTIAGO DEL ESTERO" = "Santiago del Estero",
      "SGO.DEL ESTERO LIM.CON CATAMARCA" = "Santiago del Estero",
      "TUCUMAN" = "Tucumán",
      "TUCUMÁN" = "Tucumán",
      "TUCUMAN LIM. SALTA" = "Tucumán",
      "TUCUMAN(LIM.CON CATAMARCA)" = "Tucumán"
    )
  )

sort(-table(sismos_arg$Provincia))

# Elijo variables
sismos_arg <- sismos_arg %>%
  select(c(2, 3, 4, 5, 9, 10, 11, 12))

5.1.1 Dataset pre-procesado: sismos

Para limpiar y reducir los datos al estudio de interés, se crea un dataset reducido, sismos, a partir de los datos scrappeados del buscador del INPRES. Se incluyen datos de sismos de diferente intensidad y magnitud en la región continental del país (excluyendo Tierra del Fuego) desde el 7 de enero de 2012, hasta el 18 de mayo de 2022, y se dispone de las siguientes variables.

  • Fecha: fecha del evento sísmico, en el formato año-mes-día.
  • Hora: hora del evento sísmico, en el formato hora-minuto-segundo.
  • Latitud: latitud del evento registrado.
  • Longitud: longitud del evento registrado.
  • Provincia: nombre de la provincia del evento registrado.
  • Percibido: TRUE si la magnitud fue percibida, FALSE si no lo fue.
  • Magnitud: magnitud del sismo en la escala de Richter.
  • Profundidad: profundidad (km) registrada del sismo.

El dataset sismos está disponible en la librería datosIC.

Código
library(datosIC)
data(sismos)
Dataset reducido disponible en la librería 'datosIC'.
Fecha Hora Latitud Longitud Provincia Percibido Magnitud Profundidad
2022-05-18 13:09:56 -31.820 -67.040 San Juan FALSE 3.0 134
2022-05-18 10:18:34 -24.216 -67.139 Salta FALSE 3.2 185
2022-05-18 09:40:09 -31.262 -68.708 San Juan FALSE 3.3 104
2022-05-18 09:25:43 -32.521 -70.085 San Juan FALSE 2.7 112
2022-05-18 08:45:59 -28.192 -67.376 Catamarca FALSE 2.7 142
2022-05-18 08:42:33 -32.043 -70.030 San Juan FALSE 2.7 114
2022-05-17 23:22:48 -23.442 -66.846 Jujuy FALSE 3.6 210
2022-05-17 21:21:18 -23.503 -66.831 Jujuy FALSE 3.6 210
2022-05-17 17:17:58 -22.794 -66.228 Jujuy FALSE 4.0 273
2022-05-17 14:46:04 -31.505 -68.640 San Juan FALSE 2.7 103
Código
sessionInfo()
R version 4.2.3 (2023-03-15 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22621)

Matrix products: default

locale:
[1] LC_COLLATE=Spanish_Argentina.utf8  LC_CTYPE=Spanish_Argentina.utf8   
[3] LC_MONETARY=Spanish_Argentina.utf8 LC_NUMERIC=C                      
[5] LC_TIME=Spanish_Argentina.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] datosIC_0.0.0.9000 devtools_2.4.5     usethis_2.1.6      leaflet_2.1.2     
 [5] vroom_1.6.1        kableExtra_1.3.4   plotly_4.10.1      ggfortify_0.4.16  
 [9] lubridate_1.9.2    forcats_1.0.0      stringr_1.5.0      dplyr_1.1.2       
[13] purrr_1.0.1        readr_2.1.4        tidyr_1.3.0        tibble_3.2.1      
[17] tidyverse_2.0.0    ggplot2_3.4.2     

loaded via a namespace (and not attached):
 [1] httr_1.4.5              pkgload_1.3.2           bit64_4.0.5            
 [4] jsonlite_1.8.4          viridisLite_0.4.2       shiny_1.7.4            
 [7] highr_0.10              yaml_2.3.7              remotes_2.4.2          
[10] sessioninfo_1.2.2       pillar_1.9.0            glue_1.6.2             
[13] digest_0.6.31           promises_1.2.0.1        rvest_1.0.3            
[16] leaflet.providers_1.9.0 colorspace_2.1-0        htmltools_0.5.5        
[19] httpuv_1.6.9            pkgconfig_2.0.3         xtable_1.8-4           
[22] scales_1.2.1            webshot_0.5.5           processx_3.8.0         
[25] svglite_2.1.1           later_1.3.0             tzdb_0.3.0             
[28] timechange_0.2.0        farver_2.1.1            generics_0.1.3         
[31] ellipsis_0.3.2          cachem_1.0.7            withr_2.5.0            
[34] lazyeval_0.2.2          cli_3.6.1               magrittr_2.0.3         
[37] crayon_1.5.2            mime_0.12               memoise_2.0.1          
[40] evaluate_0.20           ps_1.7.4                fs_1.6.1               
[43] fansi_1.0.4             xml2_1.3.5              pkgbuild_1.4.0         
[46] profvis_0.3.7           tools_4.2.3             data.table_1.14.8      
[49] prettyunits_1.1.1       hms_1.1.3               lifecycle_1.0.3        
[52] munsell_0.5.0           callr_3.7.3             compiler_4.2.3         
[55] systemfonts_1.0.4       rlang_1.1.0             grid_4.2.3             
[58] rstudioapi_0.14         htmlwidgets_1.6.2       crosstalk_1.2.0        
[61] miniUI_0.1.1.1          labeling_0.4.2          rmarkdown_2.21         
[64] gtable_0.3.4            curl_5.0.0              R6_2.5.1               
[67] gridExtra_2.3           knitr_1.42              fastmap_1.1.1          
[70] bit_4.0.5               utf8_1.2.3              stringi_1.7.12         
[73] Rcpp_1.0.10             vctrs_0.6.1             urlchecker_1.0.1       
[76] tidyselect_1.2.0        xfun_0.39              

6 Referencias