# ---------------------------------------------------------------------------
# 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)
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).
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))
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")
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.
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 |
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()
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.
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()
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)
| 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)
| 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.
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:
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.
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.