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.
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.
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))
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")
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()
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 |
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()
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).
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.
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.
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")
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()
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()
Algunos datos adicionales que podemos resaltar:
Con esto claro, podemos ahondar ahora en algunas recomendaciones para tener en cuenta en estos eventos.
Recomendaciones para la toma de decisiones
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.