1 Introducción

Colombia se ubica en una de las zonas de mayor actividad sísmica del mundo, como resultado de la interacción entre las placas tectónicas de Nazca, Caribe y Suramericana. Esta condición geológica hace que el monitoreo y la comprensión de los patrones de sismicidad sean clave tanto para la gestión del riesgo como para la planeación territorial.

El presente informe realiza un análisis descriptivo de los sismos ocurridos en el país durante los últimos 20 años, con base en el catálogo de eventos con magnitud ≥ 4.5 reportado por el Servicio Geológico de los Estados Unidos (USGS). El objetivo no es explicar las causas geológicas de la sismicidad, sino caracterizar el comportamiento observado de los sismos desde cuatro ángulos complementarios:sus rangos de magnitud y profundidad, su comportamiento en el tiempo (frecuencia según intensidad y serie anual), su distribución espacial (zonas de mayor concentración), un análisis complementario (relación frecuencia-magnitud y estacionalidad), seguido de las conclusiones y recomendaciones derivadas del análisis.

2 Carga y limpieza de datos

El archivo de anexo viene en formato “catálogo USGS” (una consulta de sismos), por lo que primero se valida que las columnas queden bien separadas antes de trabajar con ellas.

ruta <- "sismos.xlsx"
crudo <- read_excel(ruta)

# Si el excel quedó con todo el contenido en una sola columna (texto tipo CSV),
# se vuelve a separar usando coma como delimitador.
if (ncol(crudo) == 1) {
  texto_csv <- paste(names(crudo), paste(crudo[[1]], collapse = "\n"), sep = "\n")
  sismos <- read_csv(texto_csv, show_col_types = FALSE)
} else {
  sismos <- crudo
}

sismos <- sismos %>%
  mutate(
    time  = ymd_hms(time, tz = "UTC"),
    anio  = year(time),
    mes   = month(time, label = TRUE, abbr = TRUE),
    lugar = str_remove(place, ", Colombia$")
  ) %>%
  filter(!is.na(time), !is.na(mag), !is.na(depth)) %>%
  arrange(time)

# Ventana de 20 años a partir de la fecha del último registro
anio_max <- max(sismos$anio, na.rm = TRUE)
sismos <- sismos %>% filter(anio >= anio_max - 19)

glimpse(sismos)
## Rows: 180
## Columns: 25
## $ time            <dttm> 2007-03-06 13:05:12, 2007-03-12 09:17:19, 2007-04-24 …
## $ latitude        <dbl> 2.082, 3.889, 5.626, 3.714, 3.800, 4.178, 5.059, 5.759…
## $ longitude       <dbl> -76.495, -74.726, -75.891, -75.620, -75.589, -76.333, …
## $ depth           <dbl> 43.1, 54.0, 52.6, 15.4, 35.0, 140.8, 95.3, 24.3, 68.9,…
## $ mag             <dbl> 5.2, 4.6, 5.1, 4.7, 4.8, 4.8, 4.7, 5.0, 4.8, 4.7, 5.9,…
## $ magType         <chr> "mwc", "mb", "mwc", "mb", "mb", "mb", "mb", "mwc", "mb…
## $ nst             <dbl> 132, 44, 181, 158, 143, 9, 16, 269, 62, 108, 466, 22, …
## $ gap             <dbl> 73.4, 61.7, 50.8, 46.6, 38.2, 130.9, 80.6, 59.1, 138.9…
## $ dmin            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ rms             <dbl> 1.00, 1.17, 1.11, 1.08, 0.94, 1.43, 1.14, 0.84, 1.28, …
## $ net             <chr> "us", "us", "us", "us", "us", "us", "us", "us", "us", …
## $ id              <chr> "usp000f66x", "usp000f6jc", "usp000fafp", "usp000fcv4"…
## $ updated         <dttm> 2022-05-02 20:02:02, 2014-11-07 01:31:51, 2022-05-02 …
## $ place           <chr> "23 km SE of Paispamba, Colombia", "3 km NW of Tres Es…
## $ type            <chr> "earthquake", "earthquake", "earthquake", "earthquake"…
## $ horizontalError <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ depthError      <dbl> 7.6, NA, NA, NA, NA, 10.8, 9.4, NA, 11.8, NA, 6.2, 9.7…
## $ magError        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ magNst          <dbl> NA, 11, NA, 51, 61, 1, 2, NA, 48, 66, NA, 1, 128, NA, …
## $ status          <chr> "reviewed", "reviewed", "reviewed", "reviewed", "revie…
## $ locationSource  <chr> "us", "us", "us", "us", "us", "us", "us", "us", "us", …
## $ magSource       <chr> "gcmt", "us", "gcmt", "us", "us", "us", "us", "gcmt", …
## $ anio            <dbl> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2008, …
## $ mes             <ord> mar, mar, abr, may, jul, ago, ago, sept, mar, mar, may…
## $ lugar           <chr> "23 km SE of Paispamba", "3 km NW of Tres Esquinas", "…

Nota: la base solo incluye sismos reportados por USGS con magnitud ≥ 4.5. El Servicio Geológico Colombiano (SGC) registra muchos más eventos de menor magnitud cada año; por eso este informe describe la sismicidad moderada a fuerte, no la actividad sísmica total del país.


3 Descripción por rangos de magnitud y profundidad

3.1 Rangos de magnitud

sismos <- sismos %>%
  mutate(rango_mag = cut(
    mag,
    breaks = c(4.5, 5.0, 5.5, 6.0, 6.5, 8.0),
    labels = c("4.5–4.9 (moderado)", "5.0–5.4 (moderado-fuerte)",
               "5.5–5.9 (fuerte)", "6.0–6.4 (fuerte)", "6.5+ (mayor)"),
    right = FALSE, include.lowest = TRUE
  ))

tabla_mag <- sismos %>%
  count(rango_mag, name = "n_sismos") %>%
  mutate(porcentaje = percent(n_sismos / sum(n_sismos)))

kable(tabla_mag, col.names = c("Rango de magnitud", "N° de sismos", "%")) %>%
  kable_styling(full_width = FALSE)
Rango de magnitud N° de sismos %
4.5–4.9 (moderado) 132 73.33%
5.0–5.4 (moderado-fuerte) 29 16.11%
5.5–5.9 (fuerte) 14 7.78%
6.0–6.4 (fuerte) 3 1.67%
6.5+ (mayor) 2 1.11%
ggplot(sismos, aes(x = rango_mag, fill = rango_mag)) +
  geom_bar() +
  labs(title = "Sismos por rango de magnitud", x = NULL, y = "N° de sismos") +
  theme_minimal() +
  theme(legend.position = "none", axis.text.x = element_text(angle = 25, hjust = 1))

3.2 Rangos de profundidad

Se usa la clasificación estándar en sismología: superficial (0–70 km), intermedia (70–300 km) y profunda (> 300 km).

sismos <- sismos %>%
  mutate(rango_prof = cut(
    depth,
    breaks = c(0, 70, 300, Inf),
    labels = c("Superficial (0–70 km)", "Intermedia (70–300 km)", "Profunda (>300 km)"),
    right = TRUE, include.lowest = TRUE
  ))

tabla_prof <- sismos %>%
  count(rango_prof, name = "n_sismos") %>%
  mutate(porcentaje = percent(n_sismos / sum(n_sismos)))

kable(tabla_prof, col.names = c("Rango de profundidad", "N° de sismos", "%")) %>%
  kable_styling(full_width = FALSE)
Rango de profundidad N° de sismos %
Superficial (0–70 km) 104 58%
Intermedia (70–300 km) 76 42%
ggplot(sismos, aes(x = rango_prof, fill = rango_prof)) +
  geom_bar() +
  labs(title = "Sismos por rango de profundidad", x = NULL, y = "N° de sismos") +
  theme_minimal() +
  theme(legend.position = "none")

3.3 Relación magnitud–profundidad

ggplot(sismos, aes(x = depth, y = mag, color = rango_prof)) +
  geom_point(alpha = 0.7, size = 2) +
  labs(title = "Magnitud vs. profundidad de los sismos",
       x = "Profundidad (km)", y = "Magnitud", color = "Rango de profundidad") +
  theme_minimal()


4 Descripción temporal

4.1 Frecuencia según intensidad (¿cada cuánto ocurren?)

Para cada rango de magnitud se calcula el tiempo promedio (en días) que pasa entre un sismo y el siguiente de esa misma categoría.

tiempo_entre <- sismos %>%
  arrange(rango_mag, time) %>%
  group_by(rango_mag) %>%
  mutate(dias_desde_anterior = as.numeric(difftime(time, lag(time), units = "days"))) %>%
  summarise(
    n_sismos          = n(),
    promedio_dias     = round(mean(dias_desde_anterior, na.rm = TRUE), 1),
    mediana_dias      = round(median(dias_desde_anterior, na.rm = TRUE), 1),
    .groups = "drop"
  )

kable(tiempo_entre,
      col.names = c("Rango de magnitud", "N° de sismos", "Promedio días entre eventos", "Mediana días entre eventos")) %>%
  kable_styling(full_width = FALSE)
Rango de magnitud N° de sismos Promedio días entre eventos Mediana días entre eventos
4.5–4.9 (moderado) 132 53.4 39.9
5.0–5.4 (moderado-fuerte) 29 253.5 186.7
5.5–5.9 (fuerte) 14 467.3 356.9
6.0–6.4 (fuerte) 3 804.0 804.0
6.5+ (mayor) 2 5061.8 5061.8

4.2 Serie de tiempo anual

serie_anual <- sismos %>% count(anio, name = "n_sismos")

ggplot(serie_anual, aes(x = anio, y = n_sismos)) +
  geom_col(fill = "steelblue") +
  geom_smooth(method = "loess", se = FALSE, color = "firebrick", linewidth = 0.8) +
  labs(title = "Serie de tiempo anual de sismos en Colombia",
       subtitle = paste0("Periodo ", min(sismos$anio), "–", max(sismos$anio)),
       x = "Año", y = "N° de sismos") +
  theme_minimal()

sismos %>%
  count(anio, rango_mag) %>%
  ggplot(aes(x = anio, y = n, fill = rango_mag)) +
  geom_col() +
  labs(title = "Sismos por año, según rango de magnitud",
       x = "Año", y = "N° de sismos", fill = "Rango de magnitud") +
  theme_minimal()


5 Análisis descriptivo complementario (otro punto de vista)

Los capítulos anteriores describen la sismicidad por magnitud/profundidad, en el tiempo y en el espacio por separado. Aquí se cruzan esas variables desde dos ángulos adicionales: la relación frecuencia-magnitud (qué tan raros son los sismos grandes frente a los pequeños) y la estacionalidad (si hay meses o momentos del día con más reportes).

5.1 Relación frecuencia-magnitud (ley de Gutenberg-Richter)

En sismología, la forma más estándar de describir qué tan frecuentes son los sismos grandes frente a los pequeños es graficar el logaritmo del número acumulado de eventos contra la magnitud. Una relación lineal decreciente es lo esperado: confirma que, como en cualquier catálogo sísmico, los eventos grandes son mucho menos frecuentes que los pequeños.

gr <- sismos %>%
  arrange(mag) %>%
  mutate(mag_redondeada = floor(mag * 10) / 10) %>%
  count(mag_redondeada, name = "n_igual") %>%
  arrange(desc(mag_redondeada)) %>%
  mutate(n_acumulado = cumsum(n_igual),
         log_n_acumulado = log10(n_acumulado))

ggplot(gr, aes(x = mag_redondeada, y = log_n_acumulado)) +
  geom_point(color = "darkred", size = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "steelblue", linetype = "dashed") +
  labs(title = "Relación frecuencia-magnitud (Gutenberg-Richter)",
       subtitle = "log10(N° de sismos con magnitud ≥ M) vs. magnitud (M)",
       x = "Magnitud (M)", y = "log10(N acumulado)") +
  theme_minimal()

La pendiente de esta recta (parámetro b en la literatura sísmica) da una idea de la proporción relativa entre sismos pequeños y grandes en el catálogo: aquí es de aproximadamente -0.74. Valores más negativos indican que los sismos grandes son proporcionalmente más raros frente a los pequeños.

5.2 Estacionalidad: ¿hay meses u horas con más reportes?

sismos %>%
  count(mes) %>%
  ggplot(aes(x = mes, y = n)) +
  geom_col(fill = "seagreen") +
  labs(title = "Sismos por mes del año (todos los años agregados)",
       x = "Mes", y = "N° de sismos") +
  theme_minimal()

sismos %>%
  mutate(hora = hour(time)) %>%
  count(hora) %>%
  ggplot(aes(x = hora, y = n)) +
  geom_col(fill = "purple") +
  scale_x_continuous(breaks = seq(0, 23, 2)) +
  labs(title = "Sismos por hora del día (UTC)",
       x = "Hora (UTC)", y = "N° de sismos") +
  theme_minimal()

Nota: a diferencia del mes, la hora del día no tiene una causa física esperada (los sismos no “saben” qué hora es); si se ve algún patrón por hora, es más probable que refleje horarios de mayor cobertura/reporte de las estaciones sismológicas que un fenómeno geológico real.


6 Descripción espacial

6.1 Mapa interactivo

pal <- colorNumeric(palette = "YlOrRd", domain = sismos$mag)

leaflet(sismos) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng = ~longitude, lat = ~latitude,
    radius = ~rescale(mag, to = c(3, 12)),
    color = ~pal(mag), stroke = FALSE, fillOpacity = 0.7,
    popup = ~paste0("<b>", lugar, "</b><br>",
                     "Magnitud: ", mag, "<br>",
                     "Profundidad: ", depth, " km<br>",
                     "Fecha: ", as.Date(time))
  ) %>%
  addLegend("bottomright", pal = pal, values = ~mag, title = "Magnitud")

6.2 Zonas de mayor frecuencia

top_zonas <- sismos %>%
  count(lugar, sort = TRUE) %>%
  slice_head(n = 10)

kable(top_zonas, col.names = c("Zona (referencia USGS)", "N° de sismos")) %>%
  kable_styling(full_width = FALSE)
Zona (referencia USGS) N° de sismos
Colombia 3
8 km NNE of Lejanías 2
0 km SW of Ansermanuevo 1
1 km ESE of Saldaña 1
1 km N of Argelia 1
1 km NE of Lejanías 1
1 km SW of Guacarí 1
1 km WNW of Vergara 1
10 km E of El Calvario 1
10 km E of San Pablo 1
ggplot(top_zonas, aes(x = reorder(lugar, n), y = n)) +
  geom_col(fill = "darkorange") +
  coord_flip() +
  labs(title = "10 zonas con mayor frecuencia de sismos", x = NULL, y = "N° de sismos") +
  theme_minimal()

6.3 Mapa estático de densidad

colombia <- ne_countries(scale = "medium", country = "Colombia", returnclass = "sf")

ggplot() +
  geom_sf(data = colombia, fill = "grey95", color = "grey50") +
  stat_density_2d(
    data = sismos, aes(x = longitude, y = latitude, fill = after_stat(level)),
    geom = "polygon", alpha = 0.5
  ) +
  geom_point(data = sismos, aes(x = longitude, y = latitude, size = mag),
             color = "black", alpha = 0.4) +
  scale_fill_viridis_c(option = "inferno") +
  coord_sf(xlim = c(-82, -66), ylim = c(-5, 13)) +
  labs(title = "Densidad espacial de sismos en Colombia",
       x = "Longitud", y = "Latitud", fill = "Densidad", size = "Magnitud") +
  theme_minimal()


7 Conclusiones generales y recomendaciones

  1. La actividad sísmica en Colombia se concentra en zonas y profundidades específicas, no distribuidas al azar. La mayoría de los eventos son de profundidad Superficial (0–70 km) y se agrupan alrededor de Colombia, lo que confirma que el riesgo sísmico del país no es uniforme geográficamente.
  2. Los sismos grandes son mucho menos frecuentes que los moderados, como lo confirma la relación de Gutenberg-Richter (pendiente ≈ -0.74): la mayoría de los eventos registrados están en el rango 4.5–4.9 (moderado), mientras que los sismos mayores (M ≥ 6.5) son excepcionales.
  3. La actividad sísmica no es constante en el tiempo: el año 2019 concentró 19 eventos, muy por encima del promedio anual, lo que indica que deben esperarse periodos de mayor actividad y no solo una tasa fija de sismos por año.

Algunos datos adicionales que podemos resaltar:

  • En el periodo analizado (2007–2026) se registraron 180 sismos con magnitud ≥ 4.5 según USGS.
  • La mayoría de los eventos son de profundidad Superficial (0–70 km), y el rango de magnitud más frecuente es 4.5–4.9 (moderado).
  • El año con más eventos fue 2019 (19 sismos), lo que sugiere que la actividad sísmica en Colombia no es uniforme en el tiempo, sino que presenta periodos de mayor actividad.
  • La zona con mayor concentración de sismos es Colombia (3 eventos), coherente con la ubicación de Colombia sobre el cinturón de fuego del Pacífico y la interacción de las placas Nazca, Caribe y Suramericana.
  • La base de datos usada solo captura sismos moderados a fuertes (mag ≥ 4.5); la sismicidad total del país —incluyendo microsismos— es mucho mayor y debe complementarse con el catálogo del SGC para un análisis completo.

Con esto claro, podemos ahondar ahora en algunas recomendaciones para tener en cuenta en estos eventos.

Recomendaciones para la toma de decisiones

  • Priorizar estudios de microzonificación sísmica y reforzamiento estructural en las zonas identificadas con mayor frecuencia de eventos.
  • Dado que los sismos profundos son mayoría, evaluar junto con el SGC si estos representan un menor riesgo superficial directo frente a los sismos superficiales, que suelen causar más daño pese a ser menos numerosos.
  • Complementar este análisis con el catálogo completo del Servicio Geológico Colombiano (incluye magnitudes menores a 4.5) antes de tomar decisiones de política pública o de inversión en infraestructura.

Recomendaciones para la población

¿Cómo actuar antes, durante y después de un sismo?

Antes de un sismo, lo más importante es tener un plan familiar claro, es decir, identificar los puntos más seguros de la vivienda (cerca de columnas o bajo muebles resistentes, lejos de vidrios y objetos que puedan caer), tener a la mano un kit de emergencia con agua, linterna, radio, medicamentos básicos y copias de documentos importantes, y participar en simulacros para que la reacción sea automática. Durante el sismo, la recomendación estándar es “agacharse, cubrirse y sujetarse” (drop, cover, hold on): agacharse al piso, cubrirse la cabeza y el cuello bajo una mesa u otro mueble firme, y sujetarse hasta que termine el movimiento, evitando salir corriendo o usar ascensores; si la persona está en la calle, debe alejarse de fachadas, postes y cables eléctricos, y si va conduciendo, debe detenerse en un lugar despejado sin bajarse del vehículo. Por último, después del sismo, es importante revisar si hay heridos antes que daños materiales, salir con calma por las rutas de evacuación verificando que no haya vidrios rotos o estructuras dañadas, no usar fósforos ni encendedores por posibles fugas de gas, estar atento a réplicas (que pueden ocurrir minutos, horas o incluso días después) y seguir únicamente la información oficial del Servicio Geológico Colombiano o de la Unidad Nacional para la Gestión del Riesgo de Desastres (UNGRD) para evitar dejarse llevar por rumores o desinformación.