# --------------------------- Carga de datos ---------------------------
# El archivo sismos.csv debe estar en la misma carpeta que este .Rmd
sismos <- read.csv("C:/Users/melis/Desktop/Meli/Diplomado Dashboards/Modulo6/sismos.csv", stringsAsFactors = FALSE)

# Conversión de fecha/hora (formato ISO 8601 UTC entregado por USGS)
sismos$time <- ymd_hms(sismos$time, tz = "UTC")

# Variables temporales complementarias
sismos$anio        <- year(sismos$time)
sismos$mes_num     <- month(sismos$time)
meses_es           <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")
sismos$mes         <- factor(meses_es[sismos$mes_num], levels = meses_es)
dias_es            <- c("Dom","Lun","Mar","Mié","Jue","Vie","Sáb")
sismos$dia_semana  <- factor(dias_es[wday(sismos$time)], levels = dias_es)
sismos$hora        <- hour(sismos$time)

# País, extraído del campo "place" (texto libre entregado por USGS)
paises_conocidos <- c("Colombia", "Ecuador", "Venezuela", "Peru", "Panama")
extraer_pais <- function(x) {
  encontrado <- sapply(paises_conocidos, function(p) grepl(p, x, ignore.case = TRUE))
  if (any(encontrado)) paste(paises_conocidos[encontrado], collapse = " / ") else "Zona fronteriza / sin especificar"
}
sismos$pais <- vapply(sismos$place, extraer_pais, character(1))

# Categoría de magnitud (clasificación USGS ligero -> gran sismo)
# Se amplía el límite superior a 10 para capturar magnitudes >= 8.0 presentes en los datos
sismos$categoria <- cut(
  sismos$mag,
  breaks = c(4, 4.9, 5.9, 6.9, 7.9, 10),
  labels = c("Ligero (4.0-4.9)", "Moderado (5.0-5.9)", "Fuerte (6.0-6.9)",
             "Mayor (7.0-7.9)", "Gran sismo (8.0+)")
)

# Categoría de profundidad (clasificación estándar USGS)
sismos$prof_categoria <- cut(
  sismos$depth,
  breaks = c(-1, 70, 300, 1000),
  labels = c("Superficial (<70 km)", "Intermedia (70-300 km)", "Profunda (>300 km)")
)

# --------------------------- Indicadores clave (KPI) ---------------------------
n_total       <- nrow(sismos)
mag_prom      <- round(mean(sismos$mag, na.rm = TRUE), 2)
mag_max       <- max(sismos$mag, na.rm = TRUE)
prof_prom     <- round(mean(sismos$depth, na.rm = TRUE), 1)
fecha_min     <- format(min(sismos$time, na.rm = TRUE), "%d-%m-%Y")
fecha_max     <- format(max(sismos$time, na.rm = TRUE), "%d-%m-%Y")
n_anios       <- length(unique(sismos$anio))
pct_fuertes   <- round(mean(sismos$mag >= 6, na.rm = TRUE) * 100, 1)
pais_top      <- names(sort(table(sismos$pais), decreasing = TRUE))[1]

Introducción

El Servicio Geológico de los Estados Unidos (United States Geological Survey, USGS) opera una de las redes de monitoreo sismológico más completas del mundo, registrando en tiempo casi real la ubicación, profundidad, magnitud e incertidumbre de los eventos sísmicos que ocurren en el planeta. Estos registros son de acceso público y constituyen una fuente primaria para el estudio de la sismicidad regional.

Planteamiento del problema. El norte de Sudamérica (Colombia, Ecuador, Perú, Venezuela y Panamá) se ubica sobre el margen de subducción entre la placa de Nazca y la placa Suramericana, además de la interacción con la placa del Caribe. Esta configuración tectónica genera una actividad sísmica frecuente que representa un riesgo permanente para la población, la infraestructura y la economía de la región. Comprender dónde, cuándo y con qué magnitud/profundidad ocurren estos eventos es un insumo fundamental para la gestión del riesgo de desastres, el ordenamiento territorial y la definición de normas de construcción sismorresistente.

Este informe presenta un análisis descriptivo de 1518 eventos sísmicos reportados por el USGS entre el 02-09-2006 y el 08-09-2026 (21 años), abordando tres dimensiones: características del sismo (magnitud y profundidad), ubicación geográfica y distribución temporal, para finalmente discutir posibles tendencias y recomendaciones de preparación.

Panorama general de los datos

cat(sprintf('
<div class="kpi-grid">
  <div class="kpi-box"><span class="valor">%s</span><span class="etiqueta">Sismos registrados</span></div>
  <div class="kpi-box"><span class="valor">%s</span><span class="etiqueta">Magnitud promedio</span></div>
  <div class="kpi-box"><span class="valor">%s</span><span class="etiqueta">Magnitud máxima</span></div>
  <div class="kpi-box"><span class="valor">%s km</span><span class="etiqueta">Profundidad promedio</span></div>
  <div class="kpi-box"><span class="valor">%s%%</span><span class="etiqueta">Sismos M &ge; 6.0</span></div>
  <div class="kpi-box"><span class="valor">%s</span><span class="etiqueta">País con más eventos</span></div>
</div>
', n_total, format(mag_prom, decimal.mark=","), mag_max, prof_prom, pct_fuertes, pais_top))
1518Sismos registrados
4,8Magnitud promedio
8Magnitud máxima
67.8 kmProfundidad promedio
2.7%Sismos M ≥ 6.0
ColombiaPaís con más eventos

Diccionario breve de variables usadas:

diccionario <- data.frame(
  Variable = c("time", "latitude / longitude", "depth", "mag / magType", "place"),
  Descripción = c(
    "Fecha y hora UTC del evento",
    "Coordenadas geográficas del epicentro",
    "Profundidad del hipocentro, en kilómetros",
    "Magnitud del sismo y escala utilizada para medirla (mb, mw, md, ml, entre otras)",
    "Descripción textual de la ubicación (distancia y dirección respecto a un lugar de referencia)"
  )
)
kbl(diccionario) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE) %>%
  row_spec(0, background = azul_oscuro, color = "white")
Variable Descripción
time Fecha y hora UTC del evento
latitude / longitude Coordenadas geográficas del epicentro
depth Profundidad del hipocentro, en kilómetros
mag / magType Magnitud del sismo y escala utilizada para medirla (mb, mw, md, ml, entre otras)
place Descripción textual de la ubicación (distancia y dirección respecto a un lugar de referencia)

1 Capítulo 1. Características del sismo: magnitud y profundidad

La magnitud describe la energía liberada por el sismo, mientras que la profundidad del hipocentro determina, en buena medida, la intensidad con la que ese movimiento se percibe en superficie: a igual magnitud, los sismos superficiales suelen ser más destructivos que los profundos.

1.1 Distribución de la magnitud

ggplot(sismos, aes(x = mag)) +
  geom_histogram(binwidth = 0.2, fill = azul_medio, color = "white", boundary = 0) +
  labs(
    title = "Distribución de la magnitud de los sismos",
    subtitle = paste0("n = ", n_total, " eventos | ", fecha_min, " a ", fecha_max),
    x = "Magnitud", y = "Número de sismos"
  )

ggplot(sismos, aes(x = mag)) +
  geom_density(fill = azul_claro, color = azul_oscuro, alpha = 0.7, linewidth = 0.8) +
  geom_vline(xintercept = mag_prom, color = azul_oscuro, linetype = "dashed", linewidth = 0.9) +
  annotate("text", x = mag_prom + 0.15, y = 0, vjust = -1,
           label = paste0("Promedio = ", mag_prom), color = azul_oscuro, hjust = 0, size = 3.5) +
  labs(
    title = "Densidad de la magnitud",
    subtitle = "La línea punteada marca la magnitud promedio",
    x = "Magnitud", y = "Densidad"
  )

table1(~ mag, data = sismos)
Overall
(N=1518)
mag
Mean (SD) 4.80 (0.420)
Median [Min, Max] 4.70 [4.50, 8.00]

La mayoría de los eventos se concentra en magnitudes moderadas-bajas (mb entre 4.5 y 5.0), lo cual es consistente con la ley de Gutenberg-Richter: los sismos de baja magnitud son mucho más frecuentes que los de gran magnitud.

1.2 Categorías de magnitud

Se clasifican los sismos según la escala de severidad utilizada habitualmente por el USGS (ligero, moderado, fuerte, mayor y gran sismo):

table1(~ categoria, data = sismos)
Overall
(N=1518)
categoria
Ligero (4.0-4.9) 1197 (78.9%)
Moderado (5.0-5.9) 280 (18.4%)
Fuerte (6.0-6.9) 32 (2.1%)
Mayor (7.0-7.9) 8 (0.5%)
Gran sismo (8.0+) 1 (0.1%)
ggplot(sismos, aes(x = categoria, fill = categoria)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4, color = azul_oscuro, fontface = "bold") +
  scale_fill_manual(values = azul_5) +
  labs(title = "Sismos por categoría de magnitud", x = NULL, y = "Número de sismos") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 15, hjust = 1))

Solo 9 de los 1518 eventos (0.59%) alcanzan magnitud “mayor” (≥ 7.0), pero son estos los que concentran el mayor potencial destructivo y, por lo tanto, exigen mayor atención en la planificación de emergencias.

1.3 Distribución de la profundidad

ggplot(sismos, aes(x = depth)) +
  geom_histogram(binwidth = 20, fill = azul_oscuro, color = "white") +
  labs(
    title = "Distribución de la profundidad del hipocentro",
    subtitle = paste0("Profundidad promedio = ", prof_prom, " km"),
    x = "Profundidad (km)", y = "Número de sismos"
  )

table1(~ depth + prof_categoria, data = sismos)
Overall
(N=1518)
depth
Mean (SD) 67.8 (59.7)
Median [Min, Max] 44.6 [1.50, 437]
prof_categoria
Superficial (<70 km) 944 (62.2%)
Intermedia (70-300 km) 573 (37.7%)
Profunda (>300 km) 1 (0.1%)

1.4 Relación entre magnitud y profundidad

ggplot(sismos, aes(x = depth, y = mag, color = depth)) +
  geom_point(alpha = 0.65, size = 2) +
  scale_color_gradient(low = azul_claro, high = azul_oscuro, name = "Profundidad\n(km)") +
  labs(
    title = "Magnitud vs. profundidad del hipocentro",
    x = "Profundidad (km)", y = "Magnitud"
  )

table1(~ mag | prof_categoria, data = sismos)
Superficial (<70 km)
(N=944)
Intermedia (70-300 km)
(N=573)
Profunda (>300 km)
(N=1)
Overall
(N=1518)
mag
Mean (SD) 4.81 (0.412) 4.78 (0.431) 5.30 (NA) 4.80 (0.420)
Median [Min, Max] 4.70 [4.50, 7.80] 4.60 [4.50, 8.00] 5.30 [5.30, 5.30] 4.70 [4.50, 8.00]

No se observa una relación lineal fuerte entre magnitud y profundidad; sin embargo, la coexistencia de sismos intermedios y profundos es característica de zonas de subducción activa como la que domina esta región, donde la placa de Nazca se hunde bajo la placa Suramericana (zona de Wadati-Benioff).


2 Capítulo 2. Descripción del lugar

2.1 Mapa de epicentros

leaflet(sismos) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(
    lng = ~longitude, lat = ~latitude,
    radius = ~rescale(mag, to = c(3, 14)),
    color = azul_oscuro, fillColor = azul_medio,
    fillOpacity = 0.55, weight = 1, stroke = TRUE,
    popup = ~paste0(
      "<b>", place, "</b><br>",
      "Fecha: ", format(time, "%d-%m-%Y %H:%M UTC"), "<br>",
      "Magnitud: ", mag, " (", magType, ")<br>",
      "Profundidad: ", depth, " km"
    )
  ) %>%
  addLegend(position = "bottomright", title = "Epicentros",
            colors = azul_medio, labels = "Sismo (radio ~ magnitud)")

2.2 Mapa de densidad (clústeres)

Agrupar los eventos por clústeres permite identificar rápidamente las zonas de mayor concentración de actividad sísmica:

leaflet(sismos) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(
    lng = ~longitude, lat = ~latitude,
    color = azul_oscuro, fillColor = azul_claro, fillOpacity = 0.6,
    clusterOptions = markerClusterOptions()
  )

2.3 Mapa por profundidad

pal_prof <- colorNumeric(palette = "Blues", domain = sismos$depth)

leaflet(sismos) %>%
  addProviderTiles("CartoDB.DarkMatter") %>%
  addCircleMarkers(
    lng = ~longitude, lat = ~latitude,
    radius = ~rescale(mag, to = c(3, 13)),
    color = ~pal_prof(depth), fillOpacity = 0.8, stroke = FALSE,
    popup = ~paste0(place, " | ", depth, " km")
  ) %>%
  addLegend(position = "bottomright", pal = pal_prof, values = ~depth, title = "Profundidad (km)")

2.4 Distribución por país

table1(~ pais, data = sismos)
Overall
(N=1518)
pais
Colombia 697 (45.9%)
Colombia / Ecuador 2 (0.1%)
Colombia / Panama 1 (0.1%)
Ecuador 420 (27.7%)
Ecuador / Peru 7 (0.5%)
Panama 81 (5.3%)
Peru 201 (13.2%)
Venezuela 109 (7.2%)
sismos %>%
  count(pais, sort = TRUE) %>%
  ggplot(aes(x = reorder(pais, n), y = n)) +
  geom_col(fill = azul_medio) +
  geom_text(aes(label = n), hjust = -0.15, color = azul_oscuro, fontface = "bold") +
  coord_flip() +
  labs(title = "Número de sismos por país", x = NULL, y = "Número de sismos") +
  expand_limits(y = max(table(sismos$pais)) * 1.15)

sismos %>%
  filter(pais %in% names(sort(table(pais), decreasing = TRUE))[1:5]) %>%
  ggplot(aes(x = reorder(pais, mag, median), y = mag, fill = pais)) +
  geom_boxplot(alpha = 0.85) +
  scale_fill_manual(values = azul_5) +
  labs(title = "Magnitud por país (5 países con más eventos)", x = NULL, y = "Magnitud") +
  theme(legend.position = "none")

La actividad sísmica se concentra fuertemente en Colombia, seguido de Ecuador y Perú, tres países atravesados por el margen de subducción del Pacífico. Venezuela y Panamá registran menos eventos en esta ventana de magnitudes (mag ≥ 4.5), asociados en su mayoría a la interacción con la placa del Caribe.


3 Capítulo 3. Descripción del tiempo

3.1 Distribución por mes

table1(~ mes, data = sismos)
Overall
(N=1518)
mes
Ene 138 (9.1%)
Feb 138 (9.1%)
Mar 132 (8.7%)
Abr 137 (9.0%)
May 136 (9.0%)
Jun 106 (7.0%)
Jul 119 (7.8%)
Ago 120 (7.9%)
Sep 121 (8.0%)
Oct 120 (7.9%)
Nov 122 (8.0%)
Dic 129 (8.5%)
ggplot(sismos, aes(x = mes)) +
  geom_bar(fill = azul_medio) +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4, color = azul_oscuro) +
  labs(title = "Sismos por mes del año (todos los años agregados)", x = NULL, y = "Número de sismos")

3.2 Distribución por año

table1(~ as.factor(anio), data = sismos)
Overall
(N=1518)
as.factor(anio)
2006 17 (1.1%)
2007 64 (4.2%)
2008 44 (2.9%)
2009 55 (3.6%)
2010 53 (3.5%)
2011 59 (3.9%)
2012 51 (3.4%)
2013 56 (3.7%)
2014 91 (6.0%)
2015 75 (4.9%)
2016 118 (7.8%)
2017 78 (5.1%)
2018 90 (5.9%)
2019 91 (6.0%)
2020 88 (5.8%)
2021 86 (5.7%)
2022 91 (6.0%)
2023 104 (6.9%)
2024 72 (4.7%)
2025 79 (5.2%)
2026 56 (3.7%)
ggplot(sismos, aes(x = factor(anio))) +
  geom_bar(fill = azul_medio) +
  labs(title = "Sismos registrados por año", x = "Año", y = "Número de sismos") +
  theme(axis.text.x = element_text(angle = 60, hjust = 1))

3.3 Complemento: mapa de calor año x mes

sismos %>%
  count(anio, mes) %>%
  ggplot(aes(x = mes, y = factor(anio), fill = n)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = azul_muy_claro, high = azul_oscuro, name = "N.° sismos") +
  labs(title = "Mapa de calor: sismos por año y mes", x = NULL, y = "Año")

3.4 Complemento: evolución de la magnitud en el tiempo

ggplot(sismos, aes(x = time, y = mag)) +
  geom_point(color = azul_medio, alpha = 0.5, size = 1.6) +
  geom_smooth(method = "loess", color = azul_oscuro, se = TRUE, fill = azul_claro) +
  labs(title = "Magnitud de los sismos a lo largo del tiempo",
       subtitle = "La línea de tendencia (LOESS) resume el comportamiento promedio",
       x = "Fecha", y = "Magnitud")

3.5 Complemento: día de la semana y hora del día

p1 <- ggplot(sismos, aes(x = dia_semana)) +
  geom_bar(fill = azul_medio) +
  labs(title = "Sismos por día de la semana", x = NULL, y = "N.° de sismos")

p2 <- ggplot(sismos, aes(x = hora)) +
  geom_histogram(binwidth = 1, fill = azul_oscuro, color = "white") +
  labs(title = "Sismos por hora del día (UTC)", x = "Hora (UTC)", y = "N.° de sismos")

p1

p2

La distribución por día de la semana y hora del día es, como es de esperarse para un fenómeno de origen tectónico, relativamente uniforme: los sismos no obedecen a ciclos horarios o semanales. Cualquier variación observada corresponde a fluctuación natural y no a un patrón sistemático.


4 Conclusiones

Tendencia espacial. Los eventos sísmicos analizados no se distribuyen de manera aleatoria en el espacio: se concentran claramente sobre el corredor andino-pacífico que recorre Colombia, Ecuador y Perú, coincidiendo con el límite de subducción entre la placa de Nazca y la placa Suramericana. Esta concentración espacial es persistente en el tiempo, lo que confirma que se trata de zonas de riesgo sísmico estructural y no de eventos aislados.

Tendencia temporal. La frecuencia anual de sismos muestra un cambio estadísticamente significativo a lo largo de los 21 años analizados (pendiente = 2.22 sismos/año, p = 0.004), y no se observa una estacionalidad marcada por mes, día de la semana u hora del día. Esto es consistente con la naturaleza tectónica —no climática— del fenómeno: la ocurrencia de un sismo depende de la acumulación y liberación de esfuerzo en las fallas, un proceso que no sigue calendarios ni relojes.

Severidad. Aunque la mayoría de los sismos registrados son de magnitud ligera a moderada (mb 4.5–5.0), un 2.7% alcanza magnitud ≥ 6.0, y se han presentado eventos de magnitud ≥ 7.0 en la ventana analizada. La coexistencia de sismos superficiales, intermedios y profundos indica múltiples fuentes sismogénicas activas simultáneamente (interfase de subducción y sismicidad intraplaca profunda).

4.1 ¿Cómo usar estos resultados para prepararnos mejor?

Dado que la ubicación es predecible (zonas de subducción bien identificadas) pero el momento no lo es, la estrategia de preparación debe basarse en vigilancia y mitigación permanentes, más que en calendarios estacionales de alerta.

Recomendaciones

1. Priorización territorial. Concentrar inversión en reforzamiento estructural, códigos de construcción sismorresistente y actualización de estudios de microzonificación en Colombia, Ecuador y Perú, países que concentran la mayor frecuencia de eventos.

2. Preparación continua, no estacional. Al no existir estacionalidad, los simulacros, mantenimiento de sistemas de alerta temprana y revisión de protocolos de emergencia deben realizarse de forma periódica durante todo el año, no concentrados en una “temporada de sismos”.

3. Atención diferenciada por profundidad. Reforzar el monitoreo de sismos superficiales (<70 km), que suelen generar mayor intensidad percibida en superficie, priorizando la respuesta en las áreas urbanas más cercanas a estos epicentros.

4. Fortalecimiento de redes de monitoreo. Ampliar y mantener las redes sismológicas nacionales conectadas al USGS y a otras redes regionales, para reducir la incertidumbre en la localización y magnitud de los eventos (variables como nst, gap y dmin en los datos originales reflejan esta incertidumbre).

5. Educación y comunicación de riesgo. Mantener campañas permanentes de educación ciudadana sobre qué hacer antes, durante y después de un sismo, dado que la probabilidad de ocurrencia de un evento moderado a fuerte en esta región es alta y constante.

6. Planes de contingencia binacionales. Dado que varios eventos ocurren en zonas fronterizas (p. ej. Colombia-Ecuador, Panamá-Colombia), promover protocolos de respuesta y comunicación conjunta entre países vecinos.


Anexo: datos utilizados

sismos %>%
  select(time, place, mag, categoria, depth, prof_categoria, pais) %>%
  arrange(desc(time)) %>%
  datatable(
    options = list(pageLength = 10, scrollX = TRUE),
    colnames = c("Fecha (UTC)", "Lugar", "Magnitud", "Categoría", "Profundidad (km)", "Tipo de profundidad", "País"),
    rownames = FALSE
  ) %>%
  formatStyle(columns = "mag", background = styleColorBar(sismos$mag, azul_claro))

Fuente de los datos: U.S. Geological Survey (USGS) Earthquake Hazards Program. Informe generado en R Markdown.