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: TRUEyruta_archivo_localen 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")
}
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.
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.
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)
| 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.
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.
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.
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.
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")
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.
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)
| 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)
}
| 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.
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.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.
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.