# ---------------------------------------------------------------------------
# 1) LECTURA Y LIMPIEZA DEL ARCHIVO
# ---------------------------------------------------------------------------
# El archivo original viene con cada registro (excepto el encabezado)
# envuelto entre comillas dobles adicionales (típico de una exportación
# "todo en una sola columna"). Aquí se limpia esa estructura antes de
# convertirlo en un data.frame tabular normal.

ruta_archivo <- "YDRAY-sismos.csv"   # <-- ajustar la ruta si es necesario

lineas <- readLines(ruta_archivo, encoding = "UTF-8", warn = FALSE)
lineas <- sub("^\ufeff", "", lineas)          # elimina BOM si existe
encabezado <- lineas[1]

cuerpo <- lineas[-1]
cuerpo <- ifelse(
  startsWith(cuerpo, "\"") & endsWith(cuerpo, "\""),
  substr(cuerpo, 2, nchar(cuerpo) - 1),
  cuerpo
)
cuerpo <- gsub("\"\"", "\"", cuerpo)

texto_limpio <- paste(c(encabezado, cuerpo), collapse = "\n")

sismos_raw <- read_csv(texto_limpio, show_col_types = FALSE)

# ---------------------------------------------------------------------------
# 2) PREPARACIÓN DE VARIABLES
# ---------------------------------------------------------------------------
sismos <- sismos_raw %>%
  mutate(
    time      = ymd_hms(time, tz = "UTC"),
    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(time), !is.na(mag), !is.na(depth))

# Filtro geográfico: sismos localizados en Colombia según el campo "place"
sismos_col <- sismos %>%
  filter(str_detect(place, regex("Colombia", ignore_case = TRUE)))

# Filtro temporal: últimos 20 años a partir de la fecha del informe
fecha_corte <- Sys.Date() - years(20)
sismos_col <- sismos_col %>% filter(fecha >= fecha_corte)

# Clasificación por rangos de magnitud (escala de Richter/momento)
sismos_col <- sismos_col %>%
  mutate(
    rango_mag = case_when(
      mag < 4.0                ~ "Menor (< 4.0)",
      mag >= 4.0 & mag < 5.0   ~ "Ligero (4.0 - 4.9)",
      mag >= 5.0 & mag < 6.0   ~ "Moderado (5.0 - 5.9)",
      mag >= 6.0 & mag < 7.0   ~ "Fuerte (6.0 - 6.9)",
      mag >= 7.0 & mag < 8.0   ~ "Mayor (7.0 - 7.9)",
      mag >= 8.0               ~ "Gran sismo (>= 8.0)"
    ),
    rango_mag = factor(rango_mag, levels = c(
      "Menor (< 4.0)", "Ligero (4.0 - 4.9)", "Moderado (5.0 - 5.9)",
      "Fuerte (6.0 - 6.9)", "Mayor (7.0 - 7.9)", "Gran sismo (>= 8.0)")),
    rango_prof = case_when(
      depth < 70                ~ "Superficial (< 70 km)",
      depth >= 70 & depth < 300 ~ "Intermedio (70 - 300 km)",
      depth >= 300               ~ "Profundo (>= 300 km)"
    ),
    rango_prof = factor(rango_prof, levels = c(
      "Superficial (< 70 km)", "Intermedio (70 - 300 km)", "Profundo (>= 300 km)"))
  )

n_total   <- nrow(sismos_col)
rango_fechas <- range(sismos_col$fecha)

1 Introducción

Un sismo (o terremoto) es una liberación súbita de energía acumulada en la corteza terrestre, generada principalmente por el desplazamiento brusco de bloques rocosos a lo largo de una falla geológica o por el choque y subducción entre placas tectónicas. Esta energía se propaga en forma de ondas sísmicas que se registran en superficie y que, dependiendo de su magnitud, profundidad y distancia al epicentro, pueden percibirse como una vibración leve o provocar daños severos en infraestructura y pérdida de vidas humanas.

Colombia se encuentra en una de las zonas de mayor actividad sísmica del planeta, debido a la interacción de las placas Nazca, Caribe y Suramericana, además de un sistema denso de fallas geológicas activas (Romeral, Bucaramanga-Santa Marta, Frontal Cordillera Oriental, entre otras). Este informe presenta una caracterización descriptiva de los sismos registrados en el territorio colombiano durante los últimos 20 años (06/09/2006 – 10/08/2026), con base en un catálogo sísmico de 691 eventos con magnitud reportada igual o superior a 4.5 (umbral de detección del catálogo fuente).

2 Descripción por magnitud y profundidad

2.1 Distribución por rangos de magnitud

tabla_mag <- sismos_col %>%
  count(rango_mag) %>%
  mutate(porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  rename(`Rango de magnitud` = rango_mag, `N° de sismos` = n, `%` = porcentaje)

kable(tabla_mag, align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Rango de magnitud N° de sismos %
Ligero (4.0 - 4.9) 569 82.3%
Moderado (5.0 - 5.9) 109 15.8%
Fuerte (6.0 - 6.9) 11 1.6%
Mayor (7.0 - 7.9) 2 0.3%
ggplot(sismos_col, 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 = "OrRd") +
  labs(title = "Número de sismos por rango de magnitud",
       x = "Rango de magnitud", y = "N° de sismos") +
  theme_minimal() +
  theme(legend.position = "none", axis.text.x = element_text(angle = 20, hjust = 1))

2.2 Distribución por rangos de profundidad

tabla_prof <- sismos_col %>%
  count(rango_prof) %>%
  mutate(porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  rename(`Rango de profundidad` = rango_prof, `N° de sismos` = n, `%` = porcentaje)

kable(tabla_prof, align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Rango de profundidad N° de sismos %
Superficial (< 70 km) 371 53.7%
Intermedio (70 - 300 km) 319 46.2%
Profundo (>= 300 km) 1 0.1%
ggplot(sismos_col, 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 = "Número de sismos por rango de profundidad",
       x = "Rango de profundidad", y = "N° de sismos") +
  theme_minimal() +
  theme(legend.position = "none")

2.3 Relación magnitud-profundidad

ggplot(sismos_col, aes(x = depth, y = mag, color = rango_mag)) +
  geom_point(alpha = 0.6, size = 2) +
  scale_color_brewer(palette = "OrRd") +
  labs(title = "Relación entre magnitud y profundidad",
       x = "Profundidad (km)", y = "Magnitud", color = "Rango de magnitud") +
  theme_minimal()

Lectura: la mayoría de los sismos de mayor magnitud tienden a concentrarse en profundidades específicas asociadas al proceso de subducción de la placa Nazca (foco superficial e intermedio), mientras que los eventos profundos corresponden al llamado nido sísmico de Bucaramanga, una de las concentraciones de sismicidad intermedia-profunda más activas del mundo.

3 Descripción temporal

3.1 Frecuencia de ocurrencia según intensidad

Se calcula el tiempo promedio (en días) transcurrido entre sismos consecutivos de cada rango de magnitud, como una aproximación a la “periodicidad” de ocurrencia.

frecuencia_temporal <- sismos_col %>%
  arrange(rango_mag, time) %>%
  group_by(rango_mag) %>%
  summarise(
    n_sismos = n(),
    dias_promedio_entre_eventos = ifelse(n() > 1,
      round(as.numeric(difftime(max(time), min(time), units = "days")) / (n() - 1), 1),
      NA_real_)
  ) %>%
  rename(`Rango de magnitud` = rango_mag, `N° de sismos` = n_sismos,
         `Días promedio entre eventos` = dias_promedio_entre_eventos)

kable(frecuencia_temporal, align = "lcc") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Rango de magnitud N° de sismos Días promedio entre eventos
Ligero (4.0 - 4.9) 569 12.8
Moderado (5.0 - 5.9) 109 66.0
Fuerte (6.0 - 6.9) 11 665.8
Mayor (7.0 - 7.9) 2 5061.8

3.2 Serie de tiempo anual

serie_anual <- sismos_col %>% count(anio)

ggplot(serie_anual, aes(x = anio, y = n)) +
  geom_col(fill = "#2c7fb8") +
  geom_smooth(method = "loess", se = FALSE, color = "firebrick", linewidth = 0.8) +
  scale_x_continuous(breaks = pretty_breaks(n = 10)) +
  labs(title = "Serie de tiempo anual de sismos en Colombia",
       x = "Año", y = "N° de sismos registrados") +
  theme_minimal()

sismos_col %>%
  count(anio, rango_mag) %>%
  ggplot(aes(x = anio, y = n, fill = rango_mag)) +
  geom_col(position = "stack") +
  scale_fill_brewer(palette = "OrRd") +
  scale_x_continuous(breaks = pretty_breaks(n = 10)) +
  labs(title = "Serie de tiempo anual por rango de magnitud",
       x = "Año", y = "N° de sismos", fill = "Rango de magnitud") +
  theme_minimal()

3.3 Distribución mensual (estacionalidad)

ggplot(sismos_col, aes(x = mes)) +
  geom_bar(fill = "#41ab5d") +
  labs(title = "Distribución mensual de sismos (todos los años)",
       x = "Mes", y = "N° de sismos") +
  theme_minimal()

No se observa un patrón estacional propiamente dicho (los sismos no dependen de las estaciones del año, a diferencia de fenómenos hidrometeorológicos); las variaciones mes a mes reflejan más bien la ocurrencia de secuencias de réplicas o enjambres sísmicos puntuales.

4 Descripción espacial

4.1 Mapa de ubicación de los epicentros

mapa_col <- map_data("world", region = c("Colombia", "Ecuador", "Peru",
                                          "Venezuela", "Panama", "Brazil"))

ggplot() +
  geom_polygon(data = mapa_col, aes(x = long, y = lat, group = group),
               fill = "gray92", color = "gray60", linewidth = 0.2) +
  geom_point(data = sismos_col, aes(x = longitude, y = latitude,
                                     size = mag, color = depth), alpha = 0.65) +
  coord_quickmap(xlim = c(-82, -66), ylim = c(-5, 13)) +
  scale_color_viridis_c(option = "plasma", direction = -1, name = "Profundidad (km)") +
  scale_size_continuous(name = "Magnitud", range = c(1, 6)) +
  labs(title = "Localización de epicentros sísmicos en Colombia",
       subtitle = paste0("Periodo: ", format(rango_fechas[1], "%Y"), " - ", format(rango_fechas[2], "%Y")),
       x = "Longitud", y = "Latitud") +
  theme_minimal()

4.2 Zonas con mayor frecuencia de eventos

Para identificar las zonas más activas se agrupan los sismos en celdas espaciales de 0.5° x 0.5° (aprox. 55 km) y se listan los sitios más recurrentes según el campo de ubicación descriptiva del catálogo (place).

sismos_col <- sismos_col %>%
  mutate(
    celda_lat = round(latitude / 0.5) * 0.5,
    celda_lon = round(longitude / 0.5) * 0.5
  )

top_celdas <- sismos_col %>%
  count(celda_lat, celda_lon, sort = TRUE) %>%
  slice_head(n = 10) %>%
  rename(`Latitud (centro celda)` = celda_lat,
         `Longitud (centro celda)` = celda_lon,
         `N° de sismos` = n)

kable(top_celdas, align = "ccc",
      caption = "Top 10 celdas geográficas con mayor concentración de sismos") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Top 10 celdas geográficas con mayor concentración de sismos
Latitud (centro celda) Longitud (centro celda) N° de sismos
7.0 -73.0 131
6.5 -73.0 88
5.5 -77.5 18
6.0 -77.5 14
3.5 -74.0 13
4.5 -76.0 13
4.0 -76.5 12
5.0 -76.0 11
7.0 -77.0 11
2.5 -79.5 10
# Extrae una referencia de sitio/ubicación aproximada a partir del texto "place"
sitios <- sismos_col %>%
  mutate(sitio = str_trim(str_replace(place, "^[0-9]+\\s*km\\s*[A-Z]*\\s*of\\s*", ""))) %>%
  count(sitio, sort = TRUE) %>%
  slice_head(n = 10) %>%
  rename(`Localidad de referencia` = sitio, `N° de sismos` = n)

kable(sitios, align = "lc",
      caption = "Top 10 localidades de referencia con mayor número de sismos") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Top 10 localidades de referencia con mayor número de sismos
Localidad de referencia N° de sismos
Cepitá, Colombia 116
Jordán, Colombia 48
Nuquí, Colombia 28
Mosquera, Colombia 23
Aratoca, Colombia 20
Bahía Solano, Colombia 19
Pizarro, Colombia 17
Riosucio, Colombia 16
Santa Genoveva de Docordó, Colombia 15
Salahonda, Colombia 14
ggplot() +
  geom_polygon(data = mapa_col, aes(x = long, y = lat, group = group),
               fill = "gray92", color = "gray60", linewidth = 0.2) +
  stat_density_2d(data = sismos_col, aes(x = longitude, y = latitude, fill = after_stat(level)),
                   geom = "polygon", alpha = 0.5) +
  scale_fill_viridis_c(option = "inferno", direction = -1, name = "Densidad") +
  coord_quickmap(xlim = c(-82, -66), ylim = c(-5, 13)) +
  labs(title = "Densidad espacial de la actividad sísmica",
       x = "Longitud", y = "Latitud") +
  theme_minimal()

Lectura: la mayor concentración de eventos se ubica históricamente en el occidente del país (costa Pacífica, eje cafetero, Chocó y Santanderes), coincidiendo con el borde de subducción de la placa Nazca y el sistema de fallas de Bucaramanga-Santa Marta.

5 Explicación geológica y física

La sismicidad de Colombia está determinada por su posición en el llamado Cinturón de Fuego del Pacífico, donde convergen tres placas tectónicas:

  • Placa de Nazca, que se subduce (se hunde) bajo la placa Suramericana a lo largo de la costa del Pacífico, generando sismos de origen interplaca (superficiales, en la zona de contacto) e intraplaca (intermedios y profundos, dentro de la placa que desciende).
  • Placa del Caribe, que interactúa con el norte del país (región Caribe y noroccidente), asociada a sismicidad más superficial y moderada.
  • Placa Suramericana, sobre la cual se ubica la mayor parte del territorio nacional y que contiene un denso sistema de fallas corticales activas (Romeral, Frontal, Palestina, Bucaramanga-Santa Marta, entre otras) responsables de sismos superficiales cercanos a centros poblados.

Físicamente, cuando el esfuerzo acumulado en una falla supera la resistencia friccional de la roca, se produce una ruptura súbita que libera energía elástica en forma de ondas sísmicas (P, S y superficiales). La magnitud cuantifica la energía liberada en el foco, mientras que la profundidad determina qué tan atenuada llega esa energía a la superficie: sismos superficiales (< 70 km), aunque suelen ser de menor magnitud, tienden a producir mayor daño relativo por estar más cerca de la infraestructura, mientras que sismos profundos (> 300 km), como los del nido sísmico de Bucaramanga, pueden alcanzar magnitudes considerables sin que ello implique necesariamente daño severo en superficie, debido a la atenuación de las ondas en su trayecto.

6 Conclusiones y recomendaciones

6.1 Conclusiones generales

  • Colombia presenta una actividad sísmica frecuente y persistente en el tiempo, concentrada principalmente en la región occidental y suroccidental del país (Pacífico, eje cafetero y Santanderes), coherente con su entorno tectónico de subducción y fallamiento activo.
  • La mayoría de los eventos registrados en el catálogo corresponden a magnitudes ligeras a moderadas, mientras que los sismos de gran magnitud son estadísticamente poco frecuentes pero de alto impacto potencial.
  • Existe una asociación clara entre profundidad focal y localización tectónica: los sismos superficiales se asocian a fallas corticales activas cercanas a centros urbanos, y los intermedios/profundos al proceso de subducción y al nido sísmico de Bucaramanga.
  • La serie de tiempo anual no muestra una tendencia estrictamente creciente o decreciente sostenida; las variaciones interanuales responden más a secuencias sísmicas puntuales (enjambres o réplicas) que a un cambio estructural en la actividad de fondo.

6.2 Recomendaciones para la toma de decisiones

  1. Priorizar el monitoreo y reforzamiento estructural en las zonas identificadas con mayor densidad de epicentros (occidente y suroccidente del país), donde la coincidencia entre sismicidad superficial y alta densidad poblacional incrementa el riesgo.
  2. Actualizar y aplicar de forma estricta la Norma Sismo Resistente (NSR-10 o la vigente al momento) en las regiones de mayor amenaza identificadas, especialmente en obras de infraestructura crítica (hospitales, colegios, vías, redes de servicios públicos).
  3. Fortalecer los sistemas de alerta temprana y los planes de contingencia municipal/departamental, con énfasis en los departamentos del eje cafetero, Chocó, Nariño, Cauca, Valle del Cauca y Santander.
  4. Mantener y ampliar la densidad de la red de monitoreo sismológico (Servicio Geológico Colombiano) para mejorar la magnitud de detección y la precisión de la localización epicentral, lo que permite estudios de amenaza más robustos.
  5. Incorporar los resultados de este tipo de análisis descriptivo en los Planes de Ordenamiento Territorial (POT) y en la planificación de nuevos proyectos de infraestructura, evitando la construcción no controlada sobre fallas activas conocidas.
  6. Promover la cultura de gestión del riesgo en la población de las zonas de mayor recurrencia, mediante simulacros periódicos y difusión de protocolos de respuesta ante sismos.

Nota metodológica: este informe se basa en el catálogo sísmico anexo, filtrado a eventos localizados en Colombia (según el campo place) durante los últimos 20 años, con magnitud igual o superior a 4.5 (umbral de detección/reporte del catálogo fuente). Los resultados deben interpretarse como una caracterización descriptiva y no reemplazan un estudio de amenaza sísmica detallado.