1 Introducción

Este informe caracteriza descriptivamente la actividad sísmica de magnitud igual o superior a 4.5 registrada en el territorio colombiano (incluyendo su plataforma marítima) entre 2000 y 2026 (27 años). Se filtra a partir de magnitud 4.5 porque es el umbral a partir del cual el catálogo internacional (USGS) tiene mejor completitud histórica para Colombia; por debajo de ese umbral el catálogo está sesgado hacia años recientes por mejoras en las redes de monitoreo, lo que distorsionaría las comparaciones temporales.

Cada gráfico y tabla de este informe va acompañado de un párrafo de análisis descriptivo generado automáticamente a partir de los datos, para facilitar su lectura e interpretación.

Nota sobre la fuente de datos: el catálogo oficial y más completo de sismicidad en Colombia es el del Servicio Geológico Colombiano (SGC) (https://sismicidad.sgc.gov.co). Este informe usa por defecto el catálogo público del USGS (ComCat), filtrado geográficamente a Colombia, como fuente reproducible vía API. Si dispones del catálogo oficial del SGC en CSV, cambia usar_archivo_local: TRUE y ruta_archivo_local en el encabezado YAML (columnas mínimas: time, latitude, longitude, depth, mag, place).

descargar_usgs_colombia <- function(fecha_inicio, fecha_fin, bbox, mag_minima) {
  anios <- seq(year(fecha_inicio), year(fecha_fin))
  resultados <- list()

  for (i in seq_along(anios)) {
    a <- anios[i]
    ini <- max(as.Date(paste0(a, "-01-01")), fecha_inicio)
    fin <- min(as.Date(paste0(a, "-12-31")), fecha_fin)
    if (ini > fin) next

    url <- paste0(
      "https://earthquake.usgs.gov/fdsnws/event/1/query?",
      "format=csv",
      "&starttime=", ini,
      "&endtime=", fin,
      "&minlatitude=", bbox$minlat, "&maxlatitude=", bbox$maxlat,
      "&minlongitude=", bbox$minlon, "&maxlongitude=", bbox$maxlon,
      "&minmagnitude=", mag_minima,
      "&orderby=time"
    )

    intento <- tryCatch({
      resp <- httr::GET(url, httr::timeout(60))
      if (httr::status_code(resp) == 200) {
        txt <- httr::content(resp, as = "text", encoding = "UTF-8")
        if (nchar(trimws(txt)) > 0) read_csv(txt, show_col_types = FALSE) else NULL
      } else NULL
    }, error = function(e) NULL)

    if (!is.null(intento) && nrow(intento) > 0) resultados[[length(resultados) + 1]] <- intento
  }

  if (length(resultados) == 0) return(NULL)
  bind_rows(resultados) %>% distinct(id, .keep_all = TRUE)
}

datos_crudos <- NULL
fuente_datos <- "USGS (ComCat) vía API"

if (isTRUE(params$usar_archivo_local)) {
  if (file.exists(params$ruta_archivo_local)) {
    datos_crudos <- read_csv(params$ruta_archivo_local, show_col_types = FALSE) %>%
      filter(mag >= params$mag_minima)
    fuente_datos <- paste("Archivo local:", params$ruta_archivo_local)
  }
} else {
  datos_crudos <- descargar_usgs_colombia(fecha_inicio, fecha_fin, bbox, params$mag_minima)
}

# Si no hubo internet / archivo, se genera un set simulado SOLO para que el informe
# se pueda compilar de extremo a extremo. Debe reemplazarse por datos reales.
usando_datos_simulados <- FALSE
if (is.null(datos_crudos) || nrow(datos_crudos) == 0) {
  usando_datos_simulados <- TRUE
  fuente_datos <- "⚠ DATOS SIMULADOS (no se pudo descargar ni encontrar archivo local)"
  set.seed(123)
  n <- 900
  fechas_sim <- as.POSIXct(fecha_inicio) + runif(n, 0, as.numeric(difftime(fecha_fin, fecha_inicio, units = "secs")))
  datos_crudos <- tibble(
    time = fechas_sim,
    latitude = pmin(pmax(rnorm(n, mean = 4.5, sd = 3), -4.5), 13.5),
    longitude = pmin(pmax(rnorm(n, mean = -74.5, sd = 3), -82), -66.8),
    depth = pmin(rexp(n, rate = 1/60), 650),
    mag = pmin(pmax(rgamma(n, shape = 6, rate = 1.1), 4.5), 8.0),
    place = "Zona simulada, Colombia"
  )
}

datos <- datos_crudos %>%
  mutate(
    time = as_datetime(time),
    fecha = as_date(time),
    anio = year(time),
    mes = month(time, label = TRUE, abbr = TRUE),
    hora = hour(time),
    mag = as.numeric(mag),
    depth = as.numeric(depth)
  ) %>%
  filter(!is.na(mag), !is.na(depth), !is.na(latitude), !is.na(longitude), mag >= params$mag_minima) %>%
  mutate(
    rango_mag = case_when(
      mag < 5   ~ "4.5–4.9",
      mag < 6   ~ "5.0–5.9 (Moderado)",
      mag < 7   ~ "6.0–6.9 (Fuerte)",
      TRUE      ~ "≥7.0 (Mayor)"
    ),
    rango_mag = factor(rango_mag, levels = c("4.5–4.9", "5.0–5.9 (Moderado)", "6.0–6.9 (Fuerte)", "≥7.0 (Mayor)")),
    rango_prof = case_when(
      depth <= 70  ~ "Superficial (0–70 km)",
      depth <= 300 ~ "Intermedio (70–300 km)",
      TRUE         ~ "Profundo (>300 km)"
    ),
    rango_prof = factor(rango_prof, levels = c("Superficial (0–70 km)", "Intermedio (70–300 km)", "Profundo (>300 km)"))
  )

n_total <- nrow(datos)

Fuente de datos utilizada: USGS (ComCat) vía API
Número total de eventos analizados (M ≥ 4.5): 1,838

if (usando_datos_simulados) {
  cat("\n\n> ⚠️ **Advertencia:** no fue posible obtener datos reales (sin conexión a internet o archivo local no encontrado). ",
      "Este documento se compiló con datos **simulados únicamente para fines demostrativos** del código y de los textos de análisis automático. ",
      "Reemplace la fuente de datos (parámetros `usar_archivo_local` / `ruta_archivo_local`) antes de usar este informe para toma de decisiones.\n\n")
}

2 Descripción de los sismos por rangos de magnitud y profundidad

2.1 Distribución por magnitud

tabla_mag <- datos %>%
  count(rango_mag, name = "n_eventos") %>%
  mutate(porcentaje = percent(n_eventos / sum(n_eventos), accuracy = 0.1))

kable(tabla_mag, col.names = c("Rango de magnitud", "N° de eventos", "% del total"),
      align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Rango de magnitud N° de eventos % del total
4.5–4.9 1422 77.4%
5.0–5.9 (Moderado) 364 19.8%
6.0–6.9 (Fuerte) 43 2.3%
≥7.0 (Mayor) 9 0.5%
ggplot(datos, aes(x = rango_mag, fill = rango_mag)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4, size = 3.3) +
  scale_fill_brewer(palette = "YlOrRd") +
  labs(title = paste0("Distribución de sismos por rango de magnitud (M ≥ ", params$mag_minima, ")"),
       x = "Rango de magnitud", y = "Número de eventos") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "none", axis.text.x = element_text(angle = 15, hjust = 1))

mag_dom <- tabla_mag %>% slice_max(n_eventos, n = 1)
mag_mayor7 <- datos %>% filter(mag >= 7) %>% nrow()
cat(glue(
  "> **Análisis:** de los {comma(n_total)} sismos con M ≥ {params$mag_minima} registrados en el período, ",
  "el rango **{mag_dom$rango_mag}** concentra la mayor proporción con **{mag_dom$n_eventos} eventos ({mag_dom$porcentaje})**. ",
  "Esto confirma el patrón esperado de la ley de Gutenberg–Richter: a mayor magnitud, menor frecuencia de ocurrencia. ",
  "{ifelse(mag_mayor7 > 0, paste0('Se registraron **', mag_mayor7, ' sismos de magnitud ≥7.0**, eventos de gran severidad que, aunque poco frecuentes, concentran el mayor potencial de daño.'), 'No se registraron sismos de magnitud igual o superior a 7.0 en el período analizado, lo cual es consistente con la baja frecuencia histórica de este tipo de eventos.')}"
), "\n\n")

Análisis: de los 1,838 sismos con M ≥ 4.5 registrados en el período, el rango 4.5–4.9 concentra la mayor proporción con 1422 eventos (77.4%). Esto confirma el patrón esperado de la ley de Gutenberg–Richter: a mayor magnitud, menor frecuencia de ocurrencia. Se registraron 9 sismos de magnitud ≥7.0, eventos de gran severidad que, aunque poco frecuentes, concentran el mayor potencial de daño.

2.2 Distribución por profundidad

tabla_prof <- datos %>%
  count(rango_prof, name = "n_eventos") %>%
  mutate(porcentaje = percent(n_eventos / sum(n_eventos), accuracy = 0.1))

kable(tabla_prof, col.names = c("Rango de profundidad", "N° de eventos", "% del total"),
      align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Rango de profundidad N° de eventos % del total
Superficial (0–70 km) 1192 64.9%
Intermedio (70–300 km) 645 35.1%
Profundo (>300 km) 1 0.1%
ggplot(datos, aes(x = rango_prof, fill = rango_prof)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4, size = 3.3) +
  scale_fill_brewer(palette = "Blues") +
  labs(title = "Distribución de sismos por rango de profundidad",
       x = "Rango de profundidad", y = "Número de eventos") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "none")

prof_dom <- tabla_prof %>% slice_max(n_eventos, n = 1)
prof_superf_pct <- tabla_prof %>% filter(rango_prof == "Superficial (0–70 km)") %>% pull(porcentaje)
prof_superf_pct <- ifelse(length(prof_superf_pct) == 0, "0%", prof_superf_pct)
cat(glue(
  "> **Análisis:** predominan los sismos de profundidad **{prof_dom$rango_prof}**, con {prof_dom$n_eventos} eventos ({prof_dom$porcentaje}). ",
  "Los eventos **superficiales (0–70 km)** representan el **{prof_superf_pct}** del total; esta categoría es la de mayor relevancia para la gestión del riesgo, ya que al liberar su energía más cerca de la superficie tienden a generar mayor intensidad percibida y daño potencial que sismos de igual magnitud pero mayor profundidad."
), "\n\n")

Análisis: predominan los sismos de profundidad Superficial (0–70 km), con 1192 eventos (64.9%). Los eventos superficiales (0–70 km) representan el 64.9% del total; esta categoría es la de mayor relevancia para la gestión del riesgo, ya que al liberar su energía más cerca de la superficie tienden a generar mayor intensidad percibida y daño potencial que sismos de igual magnitud pero mayor profundidad.

2.3 Relación magnitud–profundidad

tabla_cruce <- datos %>%
  count(rango_prof, rango_mag) %>%
  pivot_wider(names_from = rango_mag, values_from = n, values_fill = 0)

kable(tabla_cruce, caption = "Número de eventos por profundidad y magnitud") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Número de eventos por profundidad y magnitud
rango_prof 4.5–4.9 5.0–5.9 (Moderado) 6.0–6.9 (Fuerte) ≥7.0 (Mayor)
Superficial (0–70 km) 891 261 36 4
Intermedio (70–300 km) 531 102 7 5
Profundo (>300 km) 0 1 0 0
ggplot(datos, aes(x = depth, y = mag)) +
  geom_point(alpha = 0.4, color = "#c0392b") +
  geom_smooth(method = "loess", se = FALSE, color = "black", linewidth = 0.6) +
  labs(title = "Relación entre profundidad y magnitud",
       x = "Profundidad (km)", y = "Magnitud") +
  theme_minimal(base_size = 12)

correlacion <- suppressWarnings(cor(datos$depth, datos$mag, use = "complete.obs"))
fuerza_corr <- case_when(
  abs(correlacion) < 0.1 ~ "prácticamente nula",
  abs(correlacion) < 0.3 ~ "débil",
  abs(correlacion) < 0.5 ~ "moderada",
  TRUE ~ "fuerte"
)
direccion_corr <- ifelse(correlacion >= 0, "positiva (a mayor profundidad, tienden a registrarse magnitudes ligeramente mayores)",
                          "negativa (a mayor profundidad, tienden a registrarse magnitudes ligeramente menores)")
cat(glue(
  "> **Análisis:** la correlación entre profundidad y magnitud es **{fuerza_corr}** (r = {round(correlacion,2)}) y de dirección **{direccion_corr}**. ",
  "En términos prácticos, esto indica que la magnitud de un sismo en Colombia **no depende fuertemente de qué tan profundo ocurre**; ambas variables deben analizarse de forma independiente en la evaluación de la amenaza sísmica."
), "\n\n")

Análisis: la correlación entre profundidad y magnitud es prácticamente nula (r = -0.08) y de dirección negativa (a mayor profundidad, tienden a registrarse magnitudes ligeramente menores). En términos prácticos, esto indica que la magnitud de un sismo en Colombia no depende fuertemente de qué tan profundo ocurre; ambas variables deben analizarse de forma independiente en la evaluación de la amenaza sísmica.


3 Descripción temporal

3.1 Frecuencia de ocurrencia según intensidad (magnitud)

Se calcula el intervalo promedio (en días) entre eventos consecutivos para cada rango de magnitud, es decir, “cada cuánto ocurre” un sismo de determinada intensidad.

frecuencia_mag <- datos %>%
  arrange(rango_mag, time) %>%
  group_by(rango_mag) %>%
  summarise(
    n_eventos = n(),
    dias_totales = as.numeric(difftime(max(time), min(time), units = "days")),
    intervalo_promedio_dias = ifelse(n_eventos > 1, round(dias_totales / (n_eventos - 1), 1), NA)
  ) %>%
  mutate(
    frecuencia_texto = case_when(
      is.na(intervalo_promedio_dias) ~ "Insuficientes datos",
      intervalo_promedio_dias < 1   ~ paste0("~", round(dias_totales / n_eventos * 24, 1), " horas"),
      intervalo_promedio_dias < 30  ~ paste0("~", intervalo_promedio_dias, " días"),
      intervalo_promedio_dias < 365 ~ paste0("~", round(intervalo_promedio_dias/30,1), " meses"),
      TRUE ~ paste0("~", round(intervalo_promedio_dias/365,1), " años")
    )
  )

kable(frecuencia_mag %>% select(rango_mag, n_eventos, frecuencia_texto),
      col.names = c("Rango de magnitud", "N° eventos", "Frecuencia promedio (cada cuánto ocurre)"),
      align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Rango de magnitud N° eventos Frecuencia promedio (cada cuánto ocurre)
4.5–4.9 1422 ~6.8 días
5.0–5.9 (Moderado) 364 ~26.7 días
6.0–6.9 (Fuerte) 43 ~7.4 meses
≥7.0 (Mayor) 9 ~2.7 años
mas_frecuente <- frecuencia_mag %>% filter(!is.na(intervalo_promedio_dias)) %>% slice_min(intervalo_promedio_dias, n = 1)
menos_frecuente <- frecuencia_mag %>% filter(!is.na(intervalo_promedio_dias)) %>% slice_max(intervalo_promedio_dias, n = 1)
cat(glue(
  "> **Análisis:** los sismos de rango **{mas_frecuente$rango_mag}** son los más frecuentes, ocurriendo en promedio cada **{mas_frecuente$frecuencia_texto}**, mientras que los de rango **{menos_frecuente$rango_mag}** son los más espaciados en el tiempo, con una recurrencia promedio de **{menos_frecuente$frecuencia_texto}**. ",
  "Esta relación inversa entre magnitud y frecuencia es la base conceptual de los modelos de amenaza sísmica: eventos más intensos son estadísticamente más raros, pero deben planearse con mayor margen de seguridad dado su impacto potencial."
), "\n\n")

Análisis: los sismos de rango 4.5–4.9 son los más frecuentes, ocurriendo en promedio cada ~6.8 días, mientras que los de rango ≥7.0 (Mayor) son los más espaciados en el tiempo, con una recurrencia promedio de ~2.7 años. Esta relación inversa entre magnitud y frecuencia es la base conceptual de los modelos de amenaza sísmica: eventos más intensos son estadísticamente más raros, pero deben planearse con mayor margen de seguridad dado su impacto potencial.

3.2 Serie de tiempo anual

todos_anios <- tibble(anio = seq(params$anio_inicio, as.integer(format(fecha_fin, "%Y"))))
serie_anual <- datos %>%
  count(anio, name = "n_eventos") %>%
  right_join(todos_anios, by = "anio") %>%
  mutate(n_eventos = replace_na(n_eventos, 0)) %>%
  arrange(anio)

ggplot(serie_anual, aes(x = anio, y = n_eventos)) +
  geom_col(fill = "#2980b9") +
  geom_smooth(method = "loess", se = FALSE, color = "#c0392b", linewidth = 0.8) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
  labs(title = paste0("Número de sismos por año (M ≥ ", params$mag_minima, ")"), x = "Año", y = "Número de eventos") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

modelo_tendencia <- lm(n_eventos ~ anio, data = serie_anual)
pendiente <- coef(modelo_tendencia)[["anio"]]
tendencia_texto <- case_when(
  pendiente > 0.05 ~ "una tendencia creciente",
  pendiente < -0.05 ~ "una tendencia decreciente",
  TRUE ~ "una tendencia relativamente estable, sin cambios sustanciales"
)
anio_max <- serie_anual %>% slice_max(n_eventos, n = 1)
anio_min <- serie_anual %>% filter(n_eventos == min(n_eventos)) %>% slice(1)
promedio_anual <- round(mean(serie_anual$n_eventos), 1)
cat(glue(
  "> **Análisis:** en promedio se registran **{promedio_anual} sismos por año** con M ≥ {params$mag_minima}. La serie muestra **{tendencia_texto}** a lo largo del período ",
  "(pendiente ≈ {round(pendiente,2)} eventos/año). El año con mayor actividad fue **{anio_max$anio}**, con {anio_max$n_eventos} eventos, mientras que **{anio_min$anio}** registró la menor cantidad ({anio_min$n_eventos} eventos). ",
  "Se recomienda interpretar la tendencia con cautela, ya que puede verse influenciada por mejoras en la cobertura de las redes sismológicas y no necesariamente por un cambio real en la actividad tectónica de fondo."
), "\n\n")

Análisis: en promedio se registran 68.1 sismos por año con M ≥ 4.5. La serie muestra una tendencia creciente a lo largo del período (pendiente ≈ 1.86 eventos/año). El año con mayor actividad fue 2016, con 122 eventos, mientras que 2002 registró la menor cantidad (37 eventos). Se recomienda interpretar la tendencia con cautela, ya que puede verse influenciada por mejoras en la cobertura de las redes sismológicas y no necesariamente por un cambio real en la actividad tectónica de fondo.

serie_anual_mag <- datos %>%
  group_by(anio) %>%
  summarise(magnitud_promedio = mean(mag), magnitud_maxima = max(mag))

ggplot(serie_anual_mag, aes(x = anio)) +
  geom_line(aes(y = magnitud_promedio, color = "Magnitud promedio"), linewidth = 0.9) +
  geom_line(aes(y = magnitud_maxima, color = "Magnitud máxima"), linewidth = 0.9, linetype = "dashed") +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
  scale_color_manual(values = c("Magnitud promedio" = "#27ae60", "Magnitud máxima" = "#8e44ad")) +
  labs(title = "Evolución anual de la magnitud", x = "Año", y = "Magnitud", color = NULL) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top", axis.text.x = element_text(angle = 45, hjust = 1))

anio_mag_max <- serie_anual_mag %>% slice_max(magnitud_maxima, n = 1)
rango_prom <- range(serie_anual_mag$magnitud_promedio)
cat(glue(
  "> **Análisis:** la magnitud promedio anual se mantiene relativamente estable, oscilando entre **{round(rango_prom[1],2)} y {round(rango_prom[2],2)}**, lo cual es esperable dado que el filtro de magnitud mínima (≥{params$mag_minima}) ",
  "acota naturalmente la variabilidad. El evento de mayor magnitud del período se registró en **{anio_mag_max$anio}**, con una magnitud máxima de **{round(anio_mag_max$magnitud_maxima,1)}**. ",
  "La ausencia de una tendencia sostenida al alza en la magnitud máxima anual sugiere que no hay evidencia, dentro de este período, de una escalada progresiva en la severidad de los sismos."
), "\n\n")

Análisis: la magnitud promedio anual se mantiene relativamente estable, oscilando entre 4.67 y 4.95, lo cual es esperable dado que el filtro de magnitud mínima (≥4.5) acota naturalmente la variabilidad. El evento de mayor magnitud del período se registró en 2016, con una magnitud máxima de 7.8. La ausencia de una tendencia sostenida al alza en la magnitud máxima anual sugiere que no hay evidencia, dentro de este período, de una escalada progresiva en la severidad de los sismos.

3.3 Patrón mensual (estacionalidad)

tabla_mensual <- datos %>% count(mes)

ggplot(tabla_mensual, aes(x = mes, y = n, fill = n)) +
  geom_col() +
  scale_fill_gradient(low = "#aed6f1", high = "#1b4f72") +
  labs(title = "Distribución de sismos por mes del año", x = "Mes", y = "Número de eventos") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "none")

mes_max <- tabla_mensual %>% slice_max(n, n = 1)
mes_min <- tabla_mensual %>% slice_min(n, n = 1)
cv_mensual <- round(sd(tabla_mensual$n) / mean(tabla_mensual$n) * 100, 1)
patron_texto <- ifelse(cv_mensual < 25,
                        "una distribución relativamente uniforme a lo largo del año, sin una estacionalidad marcada",
                        "cierta variabilidad estacional, con algunos meses notablemente más activos que otros")
cat(glue(
  "> **Análisis:** el mes de **{mes_max$mes}** concentra el mayor número de eventos ({mes_max$n}), mientras que **{mes_min$mes}** registra el menor ({mes_min$n}). ",
  "El coeficiente de variación mensual es de **{cv_mensual}%**, lo que indica {patron_texto}. Esto es consistente con la naturaleza tectónica (no climática) del fenómeno sísmico, que en principio no debería mostrar estacionalidad; ",
  "diferencias notorias entre meses suelen deberse más a la ocurrencia puntual de secuencias de réplicas que a un patrón estructural."
), "\n\n")

Análisis: el mes de ene concentra el mayor número de eventos (195), mientras que jul registra el menor (128). El coeficiente de variación mensual es de 11.8%, lo que indica una distribución relativamente uniforme a lo largo del año, sin una estacionalidad marcada. Esto es consistente con la naturaleza tectónica (no climática) del fenómeno sísmico, que en principio no debería mostrar estacionalidad; diferencias notorias entre meses suelen deberse más a la ocurrencia puntual de secuencias de réplicas que a un patrón estructural.


4 Descripción espacial: zonas de mayor frecuencia

4.1 Mapa interactivo de eventos

paleta_mag <- colorNumeric(palette = "YlOrRd", domain = datos$mag)

leaflet(datos) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  setView(lng = -74.3, lat = 4.5, zoom = 5) %>%
  addCircleMarkers(
    lng = ~longitude, lat = ~latitude,
    radius = ~pmax(3, mag * 1.6),
    color = ~paleta_mag(mag),
    stroke = FALSE, fillOpacity = 0.55,
    popup = ~paste0("<b>Magnitud:</b> ", mag,
                     "<br><b>Profundidad:</b> ", depth, " km",
                     "<br><b>Fecha:</b> ", fecha,
                     "<br><b>Lugar:</b> ", place)
  ) %>%
  addLegend("bottomright", pal = paleta_mag, values = ~mag, title = "Magnitud")

4.2 Mapa de densidad (zonas calientes)

leaflet(datos) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  setView(lng = -74.3, lat = 4.5, zoom = 5) %>%
  addHeatmap(lng = ~longitude, lat = ~latitude, intensity = ~mag,
             blur = 18, max = 0.6, radius = 14)
cat(glue(
  "> **Análisis:** los dos mapas anteriores muestran la ubicación georreferenciada de los {comma(n_total)} eventos y su densidad espacial. ",
  "La actividad se concentra visiblemente sobre el eje andino y la región Pacífica, coherente con las principales fuentes sismogénicas del país: la zona de subducción del Pacífico (placa Nazca), el sistema de fallas de los Andes y el llamado Nido Sísmico de Bucaramanga, un cuerpo de sismicidad intermedia-profunda muy activo en la región de Santander."
), "\n\n")

Análisis: los dos mapas anteriores muestran la ubicación georreferenciada de los 1,838 eventos y su densidad espacial. La actividad se concentra visiblemente sobre el eje andino y la región Pacífica, coherente con las principales fuentes sismogénicas del país: la zona de subducción del Pacífico (placa Nazca), el sistema de fallas de los Andes y el llamado Nido Sísmico de Bucaramanga, un cuerpo de sismicidad intermedia-profunda muy activo en la región de Santander.

4.3 Zonas de mayor frecuencia (agregación por celdas)

Se agrupan los eventos en celdas de ~0.5° (~55 km) de latitud/longitud para identificar los clústeres de mayor actividad.

zonas <- datos %>%
  mutate(
    lat_celda = round(latitude / 0.5) * 0.5,
    lon_celda = round(longitude / 0.5) * 0.5
  ) %>%
  count(lat_celda, lon_celda, name = "n_eventos") %>%
  arrange(desc(n_eventos)) %>%
  slice_head(n = 15)

kable(zonas, col.names = c("Latitud (centro celda)", "Longitud (centro celda)", "N° de eventos"),
      align = "ccc", caption = "Top 15 zonas de mayor concentración sísmica") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Top 15 zonas de mayor concentración sísmica
Latitud (centro celda) Longitud (centro celda) N° de eventos
7.0 -73.0 163
6.5 -73.0 106
-1.5 -77.5 37
-1.0 -81.0 25
-4.0 -81.0 22
-1.5 -78.0 22
0.5 -80.0 22
1.0 -79.5 22
5.5 -77.5 21
-0.5 -80.5 19
-1.5 -81.0 18
13.0 -81.0 18
6.0 -77.5 17
-4.0 -80.5 16
-1.0 -80.5 15
zona_top <- zonas %>% slice_max(n_eventos, n = 1)
top3_pct <- percent(sum(zonas$n_eventos[1:min(3,nrow(zonas))]) / n_total, accuracy = 0.1)
cat(glue(
  "> **Análisis:** la celda ubicada aproximadamente en **({zona_top$lat_celda}, {zona_top$lon_celda})** concentra la mayor actividad, con {zona_top$n_eventos} eventos. ",
  "Las **3 zonas más activas concentran en conjunto el {top3_pct}** de todos los sismos M ≥ {params$mag_minima} del período analizado, lo que evidencia una distribución espacial **altamente concentrada** más que uniforme, y debería orientar la priorización de estudios de amenaza sísmica local."
), "\n\n")

Análisis: la celda ubicada aproximadamente en (7, -73) concentra la mayor actividad, con 163 eventos. Las 3 zonas más activas concentran en conjunto el 16.6% de todos los sismos M ≥ 4.5 del período analizado, lo que evidencia una distribución espacial altamente concentrada más que uniforme, y debería orientar la priorización de estudios de amenaza sísmica local.

if ("place" %in% names(datos)) {
  lugares <- datos %>%
    filter(!is.na(place)) %>%
    mutate(lugar_limpio = str_trim(str_remove(place, "^[0-9]+\\s*km\\s*[A-Za-z]*\\s*of\\s*"))) %>%
    count(lugar_limpio, sort = TRUE) %>%
    slice_head(n = 15)

  kable(lugares, col.names = c("Lugar de referencia", "N° de eventos"), align = "lc",
        caption = "Top 15 lugares de referencia con más sismos reportados") %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
}
Top 15 lugares de referencia con más sismos reportados
Lugar de referencia N° de eventos
Cepitá, Colombia 141
Alianza Cristiana, Peru 74
Jordán, Colombia 54
Palora, Ecuador 52
Bahía de Caráquez, Ecuador 38
Esmeraldas, Ecuador 32
Nuquí, Colombia 31
Mosquera, Colombia 28
Aratoca, Colombia 27
Muisne, Ecuador 27
Pizarro, Colombia 27
Jaqué, Panama 26
Bahía Solano, Colombia 25
Puyo, Ecuador 25
Salinas, Ecuador 23
if (exists("lugares") && nrow(lugares) > 0) {
  lugar_top <- lugares %>% slice_max(n, n = 1)
  cat(glue(
    "> **Análisis:** el lugar de referencia con más eventos reportados es **{lugar_top$lugar_limpio}**, con {lugar_top$n} sismos, lo cual coincide con las celdas de mayor concentración identificadas en el análisis por cuadrícula anterior."
  ), "\n\n")
}

Análisis: el lugar de referencia con más eventos reportados es Cepitá, Colombia, con 141 sismos, lo cual coincide con las celdas de mayor concentración identificadas en el análisis por cuadrícula anterior.


5 Conclusiones generales y recomendaciones

mag_max_evt <- datos %>% slice_max(mag, n = 1)
pct_superficiales <- tabla_prof %>% filter(rango_prof == "Superficial (0–70 km)") %>% pull(porcentaje)
pct_superficiales <- ifelse(length(pct_superficiales) == 0, "0%", pct_superficiales)

5.1 Conclusiones

  • Entre 2000 y 2026 se registraron 1,838 sismos de magnitud ≥ 4.5 en el territorio colombiano y sus zonas adyacentes, con un promedio de 68.1 eventos por año.
  • La distribución de magnitudes sigue el comportamiento esperado según la ley de Gutenberg–Richter: el rango 4.5–4.9 es el más frecuente (77.4%), y la frecuencia decrece rápidamente hacia las magnitudes mayores.
  • El 64.9% de los eventos son de profundidad superficial (0–70 km), la categoría de mayor relevancia para la gestión del riesgo por su mayor potencial de daño relativo.
  • No se encontró una correlación relevante entre profundidad y magnitud (r = -0.08), por lo que ambas variables deben gestionarse de forma independiente.
  • El evento de mayor magnitud del período fue de 7.8, ocurrido el 16/04/2016 (27 km SSE of Muisne, Ecuador).
  • La serie anual muestra una tendencia creciente, y el patrón mensual no evidencia una estacionalidad estructural fuerte (coeficiente de variación de 11.8%), consistente con el origen tectónico del fenómeno.
  • La actividad sísmica está espacialmente concentrada: las 3 zonas más activas agrupan el 16.6% de los eventos, coincidiendo con las principales fuentes sismogénicas conocidas del país (zona de subducción del Pacífico, sistema andino de fallas y Nido Sísmico de Bucaramanga).

5.2 Recomendaciones para la toma de decisiones - Priorizar estudios de microzonificación sísmica en las zonas identificadas con mayor frecuencia de eventos (celdas y lugares “top”), especialmente donde coinciden con centros urbanos. - Reforzar la normativa y supervisión de construcción sismorresistente (NSR-10 y sus actualizaciones) en las regiones de mayor concentración de sismos superficiales, dado su mayor potencial destructivo relativo. - Fortalecer los sistemas de alerta temprana y monitoreo en los clústeres de alta frecuencia detectados, integrando información del Servicio Geológico Colombiano para mayor completitud del catálogo (especialmente para magnitudes menores a 4.5, excluidas aquí por razones de completitud histórica). - Mantener planes de preparación para sismos de gran magnitud (≥7.0) aun cuando su frecuencia histórica en el período sea baja, dado su elevado potencial de impacto. - Actualizar este análisis periódicamente (idealmente cada año) para hacer seguimiento a cambios en los patrones espacio-temporales de la sismicidad y ajustar la gestión del riesgo en consecuencia. - Complementar este análisis descriptivo con estudios probabilísticos de amenaza sísmica (PSHA) antes de tomar decisiones normativas o de inversión en infraestructura crítica, ya que este informe tiene un alcance exclusivamente descriptivo.

5.2 ¿Se puede predecir un sismo?

Para responder esta pregunta, es importante diferenciar dos conceptos que suelen confundirse cuando hablamos de sismos: predecir y pronosticar.

En sismología, predecir un sismo significa determinar con precisión, antes de que ocurra, cuándo sucederá (fecha y hora), dónde ocurrirá (ubicación específica) y qué magnitud tendrá. Actualmente, no es posible realizar este tipo de predicción de manera confiable.

Por otro lado, pronosticar un sismo consiste en estimar la probabilidad de que ocurra un evento sísmico de determinada magnitud en una región específica durante un periodo de tiempo establecido. Este enfoque sí es utilizado en sismología y permite evaluar el riesgo sísmico de diferentes zonas.

En la seccion 3.1 “Frecuencia de ocurrencia según intensidad (magnitud)”,se calcula el intervalo promedio entre sismos de cada rango de magnitud, por ejemplo, un sismo de magnitud 4.5–4.9 ocurre en promedio cada 6.8 días, mientras que uno de magnitud ≥7.0 ocurre en promedio cada 2.7 años. Esto estadisticamente permite estimar con qué frecuencia se espera un evento de cierta magnitud, pero no indica en qué fecha exacta ocurrirá el próximo. Es decir no existe un patrón que permita anticipar el momento puntual de cada sismo individual

por otra parte tenemos la sección 3.3 “estacionalidad” Si los sismos tuvieran una estacionalidad marcada como ocurre con fenómenos climáticos, esto podría dar pistas sobre épocas de mayor riesgo. Sin embargo, el informe muestra que el coeficiente de variación mensual es de 11,9%, con una distribución relativamente uniforme a lo largo del año (el mes con más eventos, enero, tiene 195; el de menos, julio, 128). Esto tiene que ver mas que todo con temas tectónicos del fenómeno sísmico, que no depende de ciclos estacionales como el clima, y confirma que tampoco hay una señal temporal aprovechable para anticipar cuándo ocurrirá el próximo evento.

por ultimo la sección 2.3 “Relación magnitud-profundidad”, donde se calcula una correlación prácticamente nula entre ambas variables (r = -0.09). Esto es relevante porque muestra que ni siquiera una variable física fácilmente medible, como la profundidad a la que ocurre un sismo, permite anticipar su severidad. Si tal correlación fuera fuerte, podría pensarse en usar la profundidad como una señal de alerta temprana sobre la magnitud esperada; al ser casi nula, confirma que ambas variables deben tratarse de forma independiente y que no hay allí ninguna pista predictiva aprovechable.

En conclusión, según la evidencia de este informe, los sismos no se pueden predecir en el sentido estricto (fecha, lugar y magnitud exactos), pero sí se pueden pronosticar en términos probabilísticos, identificando las zonas de mayor recurrencia histórica y estimando la frecuencia esperada de eventos de cada magnitud. Esta distinción es la que debe orientar la gestión del riesgo sísmico, priorizando la preparación y los sistemas de respuesta rápida por encima de intentos de anticipación puntual.

Informe generado automáticamente en R Markdown. Fuente de datos: USGS (ComCat) vía API. Filtro: magnitud ≥ 4.5. Ventana temporal: 2000 – 2026.