Este informe presenta un análisis descriptivo de la sismicidad
registrada en Colombia durante los últimos 20
años, con base en el catálogo sísmico suministrado
(query.csv, fuente USGS). Más allá de describir los datos,
el análisis busca aportar evidencia para responder una pregunta central:
¿por qué, con toda la tecnología disponible, todavía no es
posible predecir un sismo, y qué hace que la sismicidad sea, al mismo
tiempo, un fenómeno “sistemático”? El documento se organiza en
cuatro capítulos:
# --- Cargar datos ---
# Guardarlos en sismos_raw
sismos_raw = read_csv("query.csv", show_col_types = FALSE)# show col es para que no muestre
#el número de columnas.
# --- Limpieza y preparación ---
sismos = sismos_raw %>% # %>% (Pipe):Su función principal es encadenar funciones de forma secuencial, eliminando la necesidad de anidar código o crear variables intermedias basura.
mutate(
time = ymd_hms(time, tz = "UTC"),#Convierte el texto de la columna time a un objeto de fecha y hora (date-time) en zona horaria UTC (Universal Time Coordinated).
fecha = as_date(time), #Extrae únicamente la fecha (Año-Mes-Día).
anio = year(time), # Extrae(Crea una Variable) el año
mes_num = month(time), #Extrae número de mes (1 al 12)
mes = factor(mes_num, #Vuelve los meses de números a texto ordenado.
levels = 1:12,
labels = c("Ene","Feb","Mar","Abr","May","Jun",
"Jul","Ago","Sep","Oct","Nov","Dic")),
hora = hour(time) #Variable para la hora exacta (0 a 23)
) %>%
# Nos quedamos únicamente con eventos localizados en Colombia
filter(str_detect(place, "Colombia")) %>%
# Últimos 20 años a partir de la fecha del reporte
filter(fecha >= (Sys.Date() - years(20))) %>%
filter(type == "earthquake") %>%
mutate(
lugar_corto = str_remove(place, ",\\s*Colombia$") %>%
str_remove("^\\d+\\s*km\\s*(N|S|E|W|NE|NW|SE|SW|NNE|NNW|SSE|SSW|ENE|ESE|WNW|WSW)?\\s*(of|from)?\\s*") #Se eliminan prefijos
)
n_total <- nrow(sismos)
rango_fechas <- range(sismos$fecha)
El conjunto de datos depurado contiene 668 eventos sísmicos ocurridos en territorio colombiano entre 06/09/2006 y 10/08/2026.
Nota metodológica: el catálogo del USGS reporta de forma más completa los sismos con magnitud igual o superior a 4.5, por lo cual los sismos de menor magnitud (frecuentes pero de escasa percepción) están subrepresentados. Las conclusiones deben leerse teniendo en cuenta este umbral de detección.
Para su análisis, los sismos se clasificaron según rangos de magnitud (escala de momento/mb según reporte) y rangos de profundidad, siguiendo criterios usados habitualmente en sismología:
sismos <- sismos %>%
mutate(
rango_mag = case_when( #case_when(): Evalúa la columna numérica mag e asigna una #etiqueta de texto según el intervalo en el que cae cada valor.
mag < 4.5 ~ "Menor (< 4.5)",
mag >= 4.5 & mag < 5.0 ~ "Ligero (4.5 - 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 ~ "Mayor (≥ 7.0)"
),
rango_mag = factor(rango_mag, levels = c("Menor (< 4.5)", "Ligero (4.5 - 4.9)",
"Moderado (5.0 - 5.9)", "Fuerte (6.0 - 6.9)",
"Mayor (≥ 7.0)")),#da un orden lógico al text
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)"))
)
tab_mag <- sismos %>%
count(rango_mag, name = "n") %>%
mutate(porcentaje = percent(n / sum(n), accuracy = 0.1))
kable(tab_mag, col.names = c("Rango de magnitud", "N° de sismos", "% del total"),
caption = "Distribución de sismos por rango de magnitud") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Rango de magnitud | N° de sismos | % del total |
|---|---|---|
| Ligero (4.5 - 4.9) | 548 | 82.0% |
| Moderado (5.0 - 5.9) | 107 | 16.0% |
| Fuerte (6.0 - 6.9) | 11 | 1.6% |
| Mayor (≥ 7.0) | 2 | 0.3% |
ggplot(sismos, aes(x = rango_mag, fill = rango_mag)) +
geom_bar() +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4) +
labs(title = "Número de sismos por rango de magnitud",
x = "Rango de magnitud", y = "Número de sismos") +
theme_minimal(base_size = 12) +
theme(legend.position = "none")
stats_mag <- sismos %>%
summarise(
Mínimo = min(mag),
`Percentil 25` = quantile(mag, 0.25),
Mediana = median(mag),
Media = mean(mag),
`Percentil 75` = quantile(mag, 0.75),
Máximo = max(mag),
`Desv. estándar` = sd(mag),
`Coef. de variación (%)` = sd(mag) / mean(mag) * 100
) %>%
mutate(across(everything(), ~ round(.x, 2))) %>%
pivot_longer(everything(), names_to = "Estadístico", values_to = "Valor")
kable(stats_mag, caption = "Estadística descriptiva global de la magnitud (escala reportada)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Estadístico | Valor |
|---|---|
| Mínimo | 4.50 |
| Percentil 25 | 4.50 |
| Mediana | 4.60 |
| Media | 4.75 |
| Percentil 75 | 4.90 |
| Máximo | 7.40 |
| Desv. estándar | 0.36 |
| Coef. de variación (%) | 7.53 |
mag_moda <- tab_mag %>% filter(n == max(n)) %>% pull(rango_mag) %>% as.character() %>% first()
mag_asimetria <- round(mean(sismos$mag) - median(sismos$mag), 2)
mag_rara <- tab_mag %>% filter(n == min(n)) %>% pull(rango_mag) %>% as.character() %>% first()
n_mag_moda <- tab_mag %>% filter(n == max(n)) %>% pull(n) %>% first()
n_mag_rara <- tab_mag %>% filter(n == min(n)) %>% pull(n) %>% first()
La magnitud promedio de los sismos analizados es de 4.75, con una mediana de 4.6,al promedio representar un valor ligeramente superior, evidencia que la mayoría de los sismos se presentaron en magnitudes ligeras (4.5 - 4.9) de baja a moderada intensidad; esto se ve reforzado al observar que la moda corresponde a esta categoría, siendo la más frecuente con 548 eventos.Además, la pequeña diferencia entre la media y la mediana 0.15 sugiere una distribución sesgada a la derecha, impulsada por los pocos eventos fuertes y mayores. Por otra parte, la categoría más inusual es Mayor (≥ 7.0), con apenas 2 eventos en 20 años. La dispersión de la magnitud (desviación estándar de 0.36) es relativamente baja, lo cual es esperable dado que los datos capturan sobre todo sismos con magnitud ≥ 4.5.
Los sismos de las categorías más frecuentes (Ligero y Moderado) liberan mucha menos energía de la que intuitivamente se pensaría. De acuerdo con el Servicio Geológico de los Estados Unidos (USGS), la magnitud mide la energía sísmica radiada a través de ondas que viajan por la Tierra y sacuden el suelo, y esta escala es de carácter logarítmico, de modo que cada unidad de aumento equivale a liberar cerca de 32 veces más energía radiada. Así, un sismo de magnitud 6.0 no libera “el doble” de energía que uno de 5.0, sino cerca de 32 veces más, y uno de 7.0 libera cerca de 1.000 veces más energía que uno de 5.0, por eso los eventos frecuentes (Ligero/Moderado) casi nunca causan daños estructurales; por lo general, solo se sienten o pasan inadvertidos; mientras que, los sismos de categoría ‘Fuerte’ o ‘Mayor’, los cuales equivalen a un porcentaje muy pequeño de los registros, son precisamente los que concentran la mayor fuerza destructiva y representan el verdadero riesgo de impacto ambiental y daños materiales, como lo vivido de forma desgarradora el pasado 10 de agosto del 2026.
Al clasificar la información según la profundidad a la que ocurren estos temblores, se identifican dos comportamientos claramente diferenciados:
Sismos superficiales: Ocurren a poca profundidad y están vinculados a rupturas o fracturas en la corteza terrestre. Estos eventos se asocian directamente con las fallas corticales, que son grietas o zonas de debilidad en la capa más externa del planeta donde se acumula y libera energía.
Sismos de profundidad intermedia y profunda: Ocurren a niveles mucho más profundos de la Tierra. Este fenómeno se explica por la subducción de la placa de Nazca bajo la placa Suramericana, un proceso tectónico en el cual la placa oceánica de Nazca se desliza por debajo del continente americano, generando fricción y sismicidad a grandes profundidades.
tab_prof <- sismos %>%
count(rango_prof, name = "n") %>%
mutate(porcentaje = percent(n / sum(n), accuracy = 0.1))
kable(tab_prof, col.names = c("Rango de profundidad", "N° de sismos", "% del total"),
caption = "Distribución de sismos por rango de profundidad") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Rango de profundidad | N° de sismos | % del total |
|---|---|---|
| Superficial (< 70 km) | 348 | 52.1% |
| Intermedio (70 - 300 km) | 319 | 47.8% |
| Profundo (≥ 300 km) | 1 | 0.1% |
ggplot(sismos, aes(x = rango_prof, fill = rango_prof)) +
geom_bar() +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4) +
labs(title = "Número de sismos por rango de profundidad",
x = "Rango de profundidad", y = "Número de sismos") +
theme_minimal(base_size = 12) +
theme(legend.position = "none")
stats_prof <- sismos %>%
summarise(
Mínimo = min(depth),
`Percentil 25` = quantile(depth, 0.25),
Mediana = median(depth),
Media = mean(depth),
`Percentil 75` = quantile(depth, 0.75),
Máximo = max(depth),
`Desv. estándar` = sd(depth),
`Coef. de variación (%)` = sd(depth) / mean(depth) * 100
) %>%
mutate(across(everything(), ~ round(.x, 1))) %>%
pivot_longer(everything(), names_to = "Estadístico", values_to = "Valor")
kable(stats_prof, caption = "Estadística descriptiva global de la profundidad (km)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Estadístico | Valor |
|---|---|
| Mínimo | 2.7 |
| Percentil 25 | 18.4 |
| Mediana | 61.8 |
| Media | 84.3 |
| Percentil 75 | 154.6 |
| Máximo | 436.5 |
| Desv. estándar | 65.1 |
| Coef. de variación (%) | 77.2 |
prof_moda <- tab_prof %>% filter(n == max(n)) %>% pull(rango_prof) %>% as.character() %>% first()
n_prof_moda <- tab_prof %>% filter(n == max(n)) %>% pull(n) %>% first()
prof_rara <- tab_prof %>% filter(n == min(n)) %>% pull(rango_prof) %>% as.character() %>% first()
n_prof_rara <- tab_prof %>% filter(n == min(n)) %>% pull(n) %>% first()
La profundidad promedio de los sismos fue de 84,3 km, mientras que la mediana fue de 61,8 km, lo que indica que la mayoría de los eventos se concentran a profundidades relativamente bajas, esto se observa también en la gráfica, donde predominan los sismos superficiales (<70 km), con 348 eventos, mientras que los profundos (≥300 km) son muy poco frecuentes, con solo 1 evento, el cual ocurrió en el año 2007 en Ubalá. La diferencia entre la media y la mediana, junto con el máximo de 436,5 km, sugiere una distribución con sesgo hacia valores altos, causada por algunos eventos mucho más profundos. Además, el coeficiente de variación de 77,2 % muestra una dispersión considerable de las profundidades.
Desde el punto de vista sísmico, esta distribución es importante porque la profundidad influye en los efectos que llegan a la superficie, un sismo superficial puede generar una mayor intensidad y potencial de daño que uno más profundo, debido a que las ondas recorren una menor distancia antes de alcanzar la superficie.
sismos %>%
count(rango_mag, rango_prof) %>%
ggplot(aes(x = rango_mag, y = rango_prof, fill = n)) +
geom_tile(color = "white") +
geom_text(aes(label = n), color = "white", size = 3.5) +
scale_fill_gradient(low = "#a1d99b", high = "#08519c") +
labs(title = "Cruce entre rango de magnitud y rango de profundidad",
x = "Rango de magnitud", y = "Rango de profundidad", fill = "N° sismos") +
theme_minimal(base_size = 12) +
theme(axis.text.x = element_text(angle = 20, hjust = 1))
ggplot(sismos, aes(x = depth, y = mag, color = rango_mag)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed", linewidth = 0.6) +
labs(title = "Relación entre profundidad y magnitud",
x = "Profundidad (km)", y = "Magnitud", color = "Rango de magnitud") +
theme_minimal(base_size = 12)
La relación entre magnitud y profundidad permite observar que los sismos pueden presentarse a diferentes profundidades sin que necesariamente exista una relación directa entre ambas variables. Sin embargo, un sismo de magnitud moderada o alta puede generar mayores efectos cuando ocurre a poca profundidad.
Lectura del capítulo: la mayoría de los eventos se concentran en las categorías de menor magnitud (umbral de detección del catálogo) y presentan tanto sismos superficiales, asociados a fallas corticales, como sismos de profundidad intermedia y profunda, relacionados con la subducción de la placa Nazca bajo la placa Suramericana.
Se calculó el tiempo promedio transcurrido entre sismos consecutivos de cada rango de magnitud, como aproximación a la recurrencia de cada nivel de intensidad.
recurrencia <- sismos %>%
arrange(rango_mag, time) %>%
group_by(rango_mag) %>%
mutate(dias_desde_anterior = as.numeric(difftime(time, lag(time), units = "days"))) %>%
summarise(
n_eventos = n(),
promedio_dias_entre_eventos = round(mean(dias_desde_anterior, na.rm = TRUE), 1),
mediana_dias_entre_eventos = round(median(dias_desde_anterior, na.rm = TRUE), 1),
.groups = "drop"
)
kable(recurrencia,
col.names = c("Rango de magnitud", "N° eventos", "Promedio días entre eventos",
"Mediana días entre eventos"),
caption = "Frecuencia de ocurrencia por rango de magnitud") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Rango de magnitud | N° eventos | Promedio días entre eventos | Mediana días entre eventos |
|---|---|---|---|
| Ligero (4.5 - 4.9) | 548 | 13.3 | 8.9 |
| Moderado (5.0 - 5.9) | 107 | 67.3 | 47.5 |
| Fuerte (6.0 - 6.9) | 11 | 665.8 | 563.7 |
| Mayor (≥ 7.0) | 2 | 5061.8 | 5061.8 |
ggplot(recurrencia, aes(x = rango_mag, y = promedio_dias_entre_eventos, fill = rango_mag)) +
geom_col() +
geom_text(aes(label = promedio_dias_entre_eventos), vjust = -0.4) +
labs(title = "Tiempo promedio entre sismos según rango de magnitud",
x = "Rango de magnitud", y = "Días promedio entre eventos") +
theme_minimal(base_size = 12) +
theme(legend.position = "none")
dias_ligero <- recurrencia %>% filter(rango_mag == "Ligero (4.5 - 4.9)") %>% pull(promedio_dias_entre_eventos)
dias_moderado <- recurrencia %>% filter(rango_mag == "Moderado (5.0 - 5.9)") %>% pull(promedio_dias_entre_eventos)
dias_fuerte <- recurrencia %>% filter(rango_mag == "Fuerte (6.0 - 6.9)") %>% pull(promedio_dias_entre_eventos)
dias_mayor <- recurrencia %>% filter(rango_mag == "Mayor (≥ 7.0)") %>% pull(promedio_dias_entre_eventos)
anios_mayor <- round(ifelse(length(dias_mayor) > 0 && !is.na(dias_mayor), dias_mayor / 365, NA), 1)
De acuerdo a las gráficas se puede observar un patrón, los sismos de menor magnitud ocurren con mayor frecuencia, por lo que el intervalo entre ellos es menor, en cambio, los sismos fuertes y mayores presentan intervalos más largos, lo que confirma que son eventos menos frecuentes. De acuerdo a los datos y lo representado en la gráfica los sismos Ligeros ocurren en promedio cada13.3 días,los Moderados cada67.3 días,los Fuertes cada665.8 días (~1.8 años),y los de categoría Mayor cada 5061.8 días (~13.9 años).
serie_anual <- sismos %>%
count(anio, name = "n_sismos")
ggplot(serie_anual, aes(x = anio, y = n_sismos)) +
geom_line(color = "steelblue", linewidth = 1) +
geom_point(color = "steelblue", size = 2) +
geom_smooth(method = "loess", se = FALSE, color = "darkred", linetype = "dashed") +
scale_x_continuous(breaks = pretty_breaks(n = 10)) +
labs(title = "Serie de tiempo anual de sismos en Colombia",
subtitle = "Línea punteada: tendencia suavizada (loess)",
x = "Año", y = "Número de sismos") +
theme_minimal(base_size = 12)
La cantidad de sismos no se mantiene constante durante los años analizados, sino que presenta variaciones y algunos picos de ocurrencia, entre estos se destacan los años 2007, 2014 y 2023, donde se observa una mayor cantidad de eventos registrados. El año 2023 presenta el mayor número, con 55 sismos; pero, en general, estos cambios muestran que la ocurrencia de los sismos varía de un año a otro, aunque con esta gráfica no se puede afirmar que exista una tendencia creciente o decreciente de la actividad sísmica.
serie_anual_mag <- sismos %>%
count(anio, rango_mag, name = "n")
ggplot(serie_anual_mag, aes(x = anio, y = n, fill = rango_mag)) +
geom_col(position = "stack") +
scale_x_continuous(breaks = pretty_breaks(n = 10)) +
labs(title = "Sismos por año, según rango de magnitud",
x = "Año", y = "Número de sismos", fill = "Rango de magnitud") +
theme_minimal(base_size = 12)
En los diferentes años predominan los sismos de magnitud baja, mientras que los eventos moderados, fuertes y mayores aparecen en menor proporción. Esto indica que los cambios en la cantidad total de sismos de cada año están determinados principalmente por los eventos de menor magnitud. Además, se observa que el 2023, al ser el año con mayor número de sismos registrados, también presenta una mayor cantidad de eventos pequeños. Por lo tanto, aunque existen variaciones entre años, los sismos de baja magnitud son los que tienen mayor peso dentro del comportamiento general del período.
serie_mensual <- sismos %>%
count(mes, name = "n_sismos")
ggplot(serie_mensual, aes(x = mes, y = n_sismos)) +
geom_col(fill = "darkorange") +
labs(title = "Distribución mensual de sismos (todos los años agregados)",
x = "Mes", y = "Número de sismos") +
theme_minimal(base_size = 12)
# Prueba chi-cuadrado de bondad de ajuste: ¿la distribución mensual es uniforme?
test_mensual <- chisq.test(serie_mensual$n_sismos)
mes_top <- serie_mensual %>% filter(n_sismos == max(n_sismos)) %>% pull(mes) %>% as.character()
mes_bajo <- serie_mensual %>% filter(n_sismos == min(n_sismos)) %>% pull(mes) %>% as.character()
La gráfica permite identificar los meses con mayor y menor cantidad de registros, el mes con más eventos es Mar y el de menos es Jun, pero la diferencia entre meses es relativamente pequeña en comparación con el total. Sin embargo, una mayor cantidad de sismos en determinados meses no significa necesariamente que exista una relación causal con la época del año (porque su origen es la acumulación y liberación de esfuerzo dentro de la corteza terrestre); se trata principalmente de una descripción de la distribución temporal de los datos.
Para identificar en qué periodos ha habido mayor frecuencia de sismos según su intensidad (por ejemplo, si los sismos ligeros se concentran en algún tramo de tiempo particular), el rango total de años analizado se dividió en periodos consecutivos de duración similar (~5 años cada uno).
anio_min <- min(sismos$anio)
anio_max <- max(sismos$anio)
amplitud_periodo <- 5
sismos <- sismos %>%
mutate(
periodo_ini = anio_min + amplitud_periodo * ((anio - anio_min) %/% amplitud_periodo),
periodo_fin = pmin(periodo_ini + amplitud_periodo - 1, anio_max),
periodo = paste0(periodo_ini, "-", periodo_fin)
) %>%
mutate(periodo = fct_reorder(periodo, periodo_ini))
tab_periodo_mag <- sismos %>%
count(periodo, rango_mag) %>%
pivot_wider(names_from = rango_mag, values_from = n, values_fill = 0)
kable(tab_periodo_mag,
caption = "N° de sismos por periodo y rango de magnitud") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| periodo | Ligero (4.5 - 4.9) | Moderado (5.0 - 5.9) | Fuerte (6.0 - 6.9) | Mayor (≥ 7.0) |
|---|---|---|---|---|
| 2006-2010 | 84 | 22 | 3 | 0 |
| 2011-2015 | 127 | 22 | 3 | 1 |
| 2016-2020 | 152 | 33 | 3 | 0 |
| 2021-2025 | 170 | 28 | 2 | 0 |
| 2026-2026 | 15 | 2 | 0 | 1 |
ggplot(sismos, aes(x = periodo, fill = rango_mag)) +
geom_bar(position = "dodge") +
labs(title = "Frecuencia de sismos por periodo, según rango de magnitud",
x = "Periodo", y = "Número de sismos", fill = "Rango de magnitud") +
theme_minimal(base_size = 12) +
theme(axis.text.x = element_text(angle = 20, hjust = 1))
# Periodo con mayor frecuencia para cada rango de magnitud (insight automático)
periodo_top_por_rango <- sismos %>%
count(rango_mag, periodo) %>%
group_by(rango_mag) %>%
slice_max(n, n = 1, with_ties = FALSE) %>%
ungroup() %>%
rename(`Periodo de mayor frecuencia` = periodo, `N° de sismos` = n)
kable(periodo_top_por_rango,
col.names = c("Rango de magnitud", "Periodo de mayor frecuencia", "N° de sismos"),
caption = "Periodo con mayor número de eventos, para cada rango de magnitud") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Rango de magnitud | Periodo de mayor frecuencia | N° de sismos |
|---|---|---|
| Ligero (4.5 - 4.9) | 2021-2025 | 170 |
| Moderado (5.0 - 5.9) | 2016-2020 | 33 |
| Fuerte (6.0 - 6.9) | 2006-2010 | 3 |
| Mayor (≥ 7.0) | 2011-2015 | 1 |
periodo_ligero <- periodo_top_por_rango %>%
filter(rango_mag == "Ligero (4.5 - 4.9)") %>%
pull(`Periodo de mayor frecuencia`)
n_periodo_ligero <- periodo_top_por_rango %>%
filter(rango_mag == "Ligero (4.5 - 4.9)") %>%
pull(`N° de sismos`)
La tabla anterior identifica, para cada rango de magnitud, el periodo en el que se concentró el mayor número de eventos. Por ejemplo, para los sismos de intensidad Ligera el periodo con más ocurrencias fue 2021-2025, con 170 eventos registrados, algo importante a recalcar, es que, el periodo con mayor frecuencia Mayor (≥ 7.0) en la tabla es 2011-2015;sin embargo tmbn hay un registro en el 2026. Al observar la tabla se puede detectar si ciertos periodos concentran más actividad de una intensidad específica, esto puede deberse a mejoras en la instrumentación y detección de la red sismológica a lo largo del tiempo.
sismos <- sismos %>%
mutate(
franja_horaria = case_when(
hora >= 0 & hora < 6 ~ "Madrugada (00-06h)",
hora >= 6 & hora < 12 ~ "Mañana (06-12h)",
hora >= 12 & hora < 18 ~ "Tarde (12-18h)",
hora >= 18 ~ "Noche (18-24h)"
),
franja_horaria = factor(franja_horaria,
levels = c("Madrugada (00-06h)", "Mañana (06-12h)",
"Tarde (12-18h)", "Noche (18-24h)"))
)
tab_franja <- sismos %>%
count(franja_horaria, name = "n") %>%
mutate(porcentaje = percent(n / sum(n), accuracy = 0.1))
kable(tab_franja, col.names = c("Franja horaria (hora UTC)", "N° de sismos", "% del total"),
caption = "Distribución de sismos por franja horaria") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Franja horaria (hora UTC) | N° de sismos | % del total |
|---|---|---|
| Madrugada (00-06h) | 167 | 25.0% |
| Mañana (06-12h) | 156 | 23.4% |
| Tarde (12-18h) | 184 | 27.5% |
| Noche (18-24h) | 161 | 24.1% |
ggplot(sismos, aes(x = franja_horaria, fill = franja_horaria)) +
geom_bar() +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4) +
labs(title = "Número de sismos por franja horaria",
x = "Franja horaria (hora UTC)", y = "Número de sismos") +
theme_minimal(base_size = 12) +
theme(legend.position = "none")
test_franja <- chisq.test(tab_franja$n)
franja_top <- tab_franja %>% filter(n == max(n)) %>% pull(franja_horaria) %>% as.character()
franja_bajo <- tab_franja %>% filter(n == min(n)) %>% pull(franja_horaria) %>% as.character()
diff_pct_franja <- round((max(tab_franja$n) - min(tab_franja$n)) / sum(tab_franja$n) * 100, 1)
La franja con más eventos es Tarde (12-18h) y la de menos es Mañana (06-12h), pero la diferencia entre la franja más y menos activa es de solo 4.2% del total un resultado inapreciable. Por lo tanto, no hay evidencia de que la hora del día influya en la ocurrencia de sismos.
Lectura del capítulo: los sismos de mayor magnitud son notablemente menos frecuentes que los de magnitud moderada o ligera, consistente con la relación de Gutenberg-Richter. La serie anual permite identificar años con actividad sísmica atípica (posibles secuencias de réplicas o enjambres sísmicos), la estacionalidad mensual sirve para descartar o confirmar patrones estacionales (en general, la sismicidad tectónica no debería mostrar estacionalidad fuerte), y el análisis por periodos y franjas horarias permite ubicar con mayor precisión cuándo se concentra la actividad de cada nivel de intensidad.
top_zonas <- sismos %>%
count(lugar_corto, name = "n_sismos") %>%
arrange(desc(n_sismos)) %>%
slice_head(n = 15)
kable(top_zonas, col.names = c("Zona / referencia geográfica", "N° de sismos"),
caption = "Top 15 zonas con mayor número de sismos reportados") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Zona / referencia geográfica | N° de sismos |
|---|---|
| NW of Cepitá | 26 |
| SE of Cepitá | 22 |
| Cepitá | 20 |
| W of Cepitá | 20 |
| Jordán | 15 |
| E of Cepitá | 14 |
| NE of Jordán | 14 |
| SW of Bahía Solano | 11 |
| Nuquí | 9 |
| Mosquera | 8 |
| NE of Cepitá | 8 |
| northern Colombia | 8 |
| Aratoca | 7 |
| SW of Nuquí | 7 |
| W of Nuquí | 7 |
ggplot(top_zonas, aes(x = reorder(lugar_corto, n_sismos), y = n_sismos)) +
geom_col(fill = "seagreen") +
coord_flip() +
labs(title = "Zonas con mayor frecuencia sísmica",
x = NULL, y = "Número de sismos") +
theme_minimal(base_size = 11)
zona_top1 <- top_zonas$lugar_corto[1]
# Profundidad promedio de los eventos en la zona más frecuente
prof_zona_top1 <- sismos %>%
filter(lugar_corto == zona_top1) %>%
summarise(media = round(mean(depth), 1), n = n())
La zona con más eventos registrados es NW of Cepitá, con una profundidad promedio de 157.4 km y 26 eventos, seguido de distintos puntos cardinales del mismo municipio Cepitá en el departamento de Santander, si observamos los siguientes lugares como Aratoca o Jordán se encuentran en este mismo departamento, dejándonos ver una aglomeración. Este resultado tan específica no parece deberse al muestreo, sino un patrón biológico/geológico real. Casi todas las localidades que encabezan la lista corresponden al Nido Sísmico de Bucaramanga, ubicado debajo del municipio de Los Santos. Según la información expuesta por el Servicio Geológico Colombiano, este lugar presenta una densidad inusualmente alta de sismicidad a profundidades intermedias (entre 120 y 180 km), representando cerca del 60% de los sismos del país.
Adicionalmente, se presenta un segundo grupo de zonas más frecuentes (Nuquí, Bahía Solano, Pizarro, Riosucio, Mosquera) que se ubican en el Pacífico colombiano (Chocó y Nariño), Como explica también un reportaje de la BBC Mundo sobre la dinámica tectónica de la región, aquí la causa responde a otro fenómeno sistemático, el proceso de subducción de la placa de Nazca debajo de la placa Suramericana a lo largo de la costa mostrado en el gif del Cap. 2.
El siguiente mapa muestra la ubicación de cada evento (tamaño proporcional a la magnitud, color según rango de magnitud) y un mapa de calor de densidad de eventos.
pal <- colorFactor(
palette = c("#2c7fb8", "#41b6c4", "#f0e442", "#e6550d", "#a50f15"),
domain = levels(sismos$rango_mag)
)
leaflet(sismos) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
lng = ~longitude, lat = ~latitude,
radius = ~ scales::rescale(mag, to = c(3, 14)),
color = ~pal(rango_mag),
stroke = FALSE, fillOpacity = 0.6,
popup = ~paste0(
"<b>", place, "</b><br>",
"Fecha: ", fecha, "<br>",
"Magnitud: ", mag, " (", magType, ")<br>",
"Profundidad: ", depth, " km"
)
) %>%
addHeatmap(
lng = ~longitude, lat = ~latitude, intensity = ~mag,
blur = 20, max = 0.05, radius = 15, group = "Mapa de calor"
) %>%
addLegend(
"bottomright", pal = pal, values = ~rango_mag,
title = "Rango de magnitud"
)
El mapa muestra que la actividad sísmica se concentra principalmente en determinadas regiones del suroccidente del territorio colombiano (departamentos como Nariño, Cauca, Valle del Cauca y Chocó, en el marco de la subducción de la placa Nazca) y en el departamento de Santander,como se mostró anteriormente en el listado y no presenta una distribución uniforme.
Lectura del capítulo: la sismicidad colombiana se concentra principalmente a lo largo del suroccidente del país,en la zona del nido sísmico de Bucaramanga y en corredores de fallas activas del interior del país. Estas zonas concentran tanto el mayor número de eventos como los de mayor magnitud, por lo cual deberían considerarse prioritarias en la gestión del riesgo.
Uniendo la evidencia recolectada en los tres capítulos anteriores, se puede construir una respuesta razonada a la pregunta central de este trabajo.
El sismo de magnitud 7.4 que sacudió a Colombia el pasado 10 de agosto de 2026 fue un doloroso recordatorio de esta dualidad; ya que, por un lado, confirma lo que la geología y los datos estadísticos de largo plazo ya nos mostraban que la sismicidad en Colombia puede ser espacialmente predecible. Se concentra en estructuras bien identificadas y estables en el tiempo, como el Nido Sísmico de Bucaramanga o la zona de subducción del Pacífico. Y también sabemos que la acumulación de esfuerzo en las fallas por el movimiento constante de las placas tectónicas es continua y medible, por lo que sabemos que probablemente sucederá un sismo en algún momento cercano.
Sin embargo, a pesar de tener el conocimiento de lo anterior como sociedad aún tenemos la urgencia de saber ¿por qué la ciencia no pudo advertir el día ni la hora exacta? y de acuerdo a este análisis se puede decir que la respuesta radica en las limitaciones físicas y estadísticas del corto plazo, como se vio en el Capítulo 1 no existe una relación entre la magnitud y la profundidad así que no se puede estudiar por esa parte algún patrón. Luego en el Capítulo 2, ni la hora del día, ni el mes, ni el año muestran patrones fuertes o estadísticamente contundentes que permitan anticipar cuándo ocurrirá el próximo evento.
Esto nos lleva a concluir que el instante preciso y la magnitud exacta de un evento individual no son predecibles, porque dependen de un proceso de ruptura que es sensible a condiciones que no podemos observar ni medir con suficiente detalle. Por eso la gestión del riesgo sísmico no se basa en “predecir” el próximo sismo, sino en prepararse para el que tarde o temprano ocurrirá.
resumen <- tibble(
Indicador = c("Total de sismos analizados", "Periodo analizado",
"Magnitud promedio", "Magnitud máxima registrada",
"Profundidad promedio (km)", "Zona con mayor frecuencia"),
Valor = c(
n_total,
paste(format(rango_fechas[1], "%Y"), "-", format(rango_fechas[2], "%Y")),
round(mean(sismos$mag), 2),
max(sismos$mag),
round(mean(sismos$depth), 1),
top_zonas$lugar_corto[1]
)
)
kable(resumen, caption = "Resumen ejecutivo de indicadores clave") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Indicador | Valor |
|---|---|
| Total de sismos analizados | 668 |
| Periodo analizado | 2006 - 2026 |
| Magnitud promedio | 4.75 |
| Magnitud máxima registrada | 7.4 |
| Profundidad promedio (km) | 84.3 |
| Zona con mayor frecuencia | NW of Cepitá |
A partir del análisis descriptivo desarrollado se concluye que:
| Área | Recomendación |
|---|---|
| Ordenamiento territorial | Priorizar estudios de microzonificación sísmica en los municipios identificados con mayor frecuencia de eventos, e incorporar esta información en los Planes de Ordenamiento Territorial (POT). |
| Infraestructura crítica | Reforzar la evaluación de vulnerabilidad sísmica de hospitales, colegios, vías y redes de servicios públicos ubicados en las zonas de mayor concentración de sismicidad. |
| Sistemas de alerta y monitoreo | Fortalecer la densidad de estaciones de la Red Sismológica Nacional en las zonas de mayor actividad para mejorar la precisión de localización y magnitud, especialmente de eventos de baja magnitud. |
| Gestión del riesgo y educación | Diseñar campañas de preparación comunitaria y simulacros focalizados en las zonas de mayor recurrencia sísmica identificadas en este informe. |
| Investigación | Profundizar el análisis con modelos de recurrencia (Gutenberg-Richter) y de peligro sísmico probabilístico que complementen esta descripción exploratoria. |
sismos %>%
select(fecha, time, lugar_corto, place, mag, rango_mag, depth, rango_prof,
latitude, longitude) %>%
arrange(desc(fecha)) %>%
datatable(
options = list(pageLength = 10, scrollX = TRUE),
caption = "Catálogo sísmico depurado utilizado en el informe (Colombia, últimos 20 años)"
)
Fuente de los datos: United States Geological Survey (USGS),
catálogo sísmico consultado y proporcionado por el usuario
(query.csv).
•BBC News Mundo. (2024, 26 de agosto). Por qué hay tantos sismos en Colombia y en qué zonas es más probable que ocurra uno. BBC. https://www.bbc.com/mundo/articles/cre41wdd4qeo
•Instituto de Gestión del Riesgo y Cambio Climático [IDIGER]. (s. f.). Escenario de riesgo sísmico en Colombia. Alcaldía Mayor de Bogotá. https://www.idiger.gov.co/escenarios-de-riesgo/sismico/en-colombia
•Servicio Geológico Colombiano [SGC]. (2021). ¿Qué es el Nido Sísmico de Bucaramanga? Gobierno de Colombia. https://www2.sgc.gov.co/Noticias/Paginas/Que-es-el-Nido-Sismico-de-Bucaramanga.aspx
•U.S. Geological Survey [USGS]. (s. f.). Earthquake magnitude, energy release, and shaking intensity. U.S. Department of the Interior. https://www.usgs.gov/programs/earthquake-hazards/earthquake-magnitude-energy-release-and-shaking-intensity