En este informe se analizará una base de datos sobre volcanes. Esta base contiene información como los nombres de los volcanes, su altitud, tipo de volcan y emiciones de SO2 y temperatura de la lava. El análisis de datos sobre volcanes es importante por varias razones. Por un lado, permite identificar patrones geográficos o de actividad que pueden ser útiles en el estudio de riesgos naturales. Por otro, ayuda a visibilizar qué tan bien (o mal) se está recolectando y organizando la información científica en ciertas áreas, especialmente cuando se usan bases de datos abiertas o de origen poco documentado.
primero realizamos la lestura de nuestros datos vulcanologicos
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(readxl))
ruta_archivo <- "Base_Datos_Vulcanologia.xlsx"
volcanes <- read_excel(ruta_archivo, sheet = 1)
# Ver la estructura de la base de datos
d <- str(volcanes)
## tibble [100 × 7] (S3: tbl_df/tbl/data.frame)
## $ ID_Volcan : num [1:100] 1 2 3 4 5 6 7 8 9 10 ...
## $ Nombre_Volcan : chr [1:100] "Cotopaxi" "Cotopaxi" "Galeras" "Etna" ...
## $ Tipo_Volcan : chr [1:100] "Cono de Ceniza" "Escudo" "Escudo" "Estratovolcán" ...
## $ Altura_m : num [1:100] 2545 5952 1574 5913 1555 ...
## $ Frecuencia_Erupcion_Anios: num [1:100] 460 447 349 117 411 ...
## $ Emision_SO2_Toneladas : num [1:100] 10769 15834 18172 13928 33982 ...
## $ Temperatura_Lava_C : num [1:100] 825 849 1108 624 891 ...
haciendo una revicion manuel de la vace de datos se pueden ver siertas inconsistencias en esta muy extrañas y para mostarlo primero haremos un analizis de los volcanes con respecto a la variable nombre.
library(knitr)
# Crear tabla de frecuencia para la primera variable cualitativa
tabla_nombre_volcan <- as.data.frame(table(volcanes$Nombre_Volcan))
colnames(tabla_nombre_volcan) <- c("Categoria", "Frecuencia")
kable(tabla_nombre_volcan, caption = "Frecuencia de nombres de volcanes")
Categoria | Frecuencia |
---|---|
Cotopaxi | 21 |
Etna | 26 |
Galeras | 21 |
Kilauea | 18 |
Nevado del Ruiz | 14 |
se ve que hay varios datos del mismo volcan y tedria sentido que estos datos sean mas o menos iguales pero no pasa asi
# Agrupar por nombre de volcán y calcular altura mínima y máxima
rango_alturas <- volcanes %>%
group_by(Nombre_Volcan) %>%
summarise(
Altura_Min = min(Altura_m, na.rm = TRUE),
Altura_Max = max(Altura_m, na.rm = TRUE),
Diferencia = Altura_Max - Altura_Min,
Frecuencia = n()
) %>%
filter(Diferencia > 0) %>%
arrange(desc(Diferencia))
# Mostrar tabla
kable(rango_alturas, caption = "Rangos de altura por nombre de volcán (inconsistencias potenciales)")
Nombre_Volcan | Altura_Min | Altura_Max | Diferencia | Frecuencia |
---|---|---|---|---|
Etna | 524.1863 | 5913.110 | 5388.924 | 26 |
Galeras | 676.3981 | 5980.627 | 5304.229 | 21 |
Nevado del Ruiz | 735.0826 | 5954.287 | 5219.205 | 14 |
Cotopaxi | 876.8972 | 5951.872 | 5074.975 | 21 |
Kilauea | 990.6517 | 5860.559 | 4869.908 | 18 |
A partir del análisis anterior, se evidencia que la base de datos presenta inconsistencias notorias. Resulta ilógico que un mismo volcán tenga variaciones tan grandes en su altura, lo cual carece de sentido físico. Esto sugiere errores en el registro o en la identificación de los volcanes. Por tal motivo, en lo sucesivo, se asumirá que cada entrada representa un volcán distinto, sin considerar si comparten el mismo nombre.
library(dplyr)
# Crear una nueva columna que clasifique la lava por su temperatura
volcanes <- volcanes %>%
mutate(
Tipo_Lava = case_when(
volcanes$Temperatura_Lava_C > 950 ~ "Mafica",
volcanes$Temperatura_Lava_C <= 950 & volcanes$Temperatura_Lava_C >= 750 ~ "Intermedia",
volcanes$Temperatura_Lava_C < 750 ~ "Felsica",
TRUE ~ "Desconocida"
)
)
# Tabla de frecuencia por Tipo de Volcán
tabla_tipo_volcan <- volcanes %>%
group_by(Tipo_Volcan) %>%
summarise(
Frecuencia = n(),
Altura_Promedio = mean(Altura_m, na.rm = TRUE)
) %>%
arrange(desc(Frecuencia))
# Mostrar tabla formateada
kable(tabla_tipo_volcan, caption = "Frecuencia y altura promedio por Tipo de Volcán")
Tipo_Volcan | Frecuencia | Altura_Promedio |
---|---|---|
Estratovolcán | 36 | 3307.627 |
Escudo | 34 | 3378.389 |
Cono de Ceniza | 30 | 3609.638 |
# Tabla de frecuencia por Tipo de Lava
tabla_tipo_lava <- volcanes %>%
group_by(Tipo_Lava) %>%
summarise(
Frecuencia = n(),
Altura_Promedio = mean(Altura_m, na.rm = TRUE)
) %>%
arrange(desc(Frecuencia))
# Mostrar tabla formateada
kable(tabla_tipo_lava, caption = "Frecuencia y altura promedio por Tipo de Lava")
Tipo_Lava | Frecuencia | Altura_Promedio |
---|---|---|
Mafica | 43 | 3520.948 |
Intermedia | 29 | 3239.088 |
Felsica | 28 | 3460.522 |
Como se puede observar en nuestra muestra, hay una mayor presencia de lavas máficas. Los volcanes en escudo suelen formarse a partir de este tipo de lava, por lo que este resultado sería esperable. Sin embargo, esta coincidencia también pone en duda la fiabilidad de algunos datos en la base, ya que se presentan ciertas discrepancias. Aun así, estas inconsistencias podrían tener una explicación geológica o metodológica.
A partir de este punto, utilizaremos las agrupaciones según el tipo de volcán o la temperatura de la lava, dependiendo de lo que sea más conveniente para el análisis que se esté realizando.
library(dplyr)
library(knitr)
library(tidyr)
# Crear vector con nombres de las variables numéricas
# Crear vector con nombres de las variables numéricas
variables_numericas <- c(
"Altura_m",
"Frecuencia_Erupcion_Anios",
"Emision_SO2_Toneladas",
"Temperatura_Lava_C"
)
# Calcular resumen por tipo de lava incluyendo la proporción
resumen_estadistico <- volcanes %>%
filter(!is.na(Tipo_Lava)) %>%
group_by(Tipo_Lava) %>%
summarise(
Proporcion = n() / nrow(volcanes %>% filter(!is.na(Tipo_Lava))),
across(
all_of(variables_numericas),
list(
Media = ~mean(.x, na.rm = TRUE),
Mediana = ~median(.x, na.rm = TRUE),
DesvEstandar = ~sd(.x, na.rm = TRUE)
),
.names = "{.col}_{.fn}"
)
)
# Transponer tabla para mejor visualización
resumen_transpuesto <- resumen_estadistico %>%
pivot_longer(-Tipo_Lava, names_to = "Variable", values_to = "Valor") %>%
pivot_wider(names_from = Tipo_Lava, values_from = Valor)
# Mostrar con kable
kable(resumen_transpuesto, caption = "Resumen estadístico por tipo de lava (transpuesto, con proporción incluida)")
Variable | Felsica | Intermedia | Mafica |
---|---|---|---|
Proporcion | 0.28000 | 0.29000 | 0.43000 |
Altura_m_Media | 3460.52232 | 3239.08798 | 3520.94785 |
Altura_m_Mediana | 3330.25650 | 3329.43423 | 3616.19294 |
Altura_m_DesvEstandar | 1815.10095 | 1588.84644 | 1505.18948 |
Frecuencia_Erupcion_Anios_Media | 201.78482 | 234.62484 | 224.10938 |
Frecuencia_Erupcion_Anios_Mediana | 154.30583 | 188.24508 | 221.59358 |
Frecuencia_Erupcion_Anios_DesvEstandar | 167.92221 | 156.15940 | 131.66975 |
Emision_SO2_Toneladas_Media | 27615.73904 | 29366.83648 | 23393.40392 |
Emision_SO2_Toneladas_Mediana | 29264.30813 | 32776.14029 | 19747.18991 |
Emision_SO2_Toneladas_DesvEstandar | 15383.24571 | 13139.62094 | 14334.04200 |
Temperatura_Lava_C_Media | 671.99664 | 840.13255 | 1072.10032 |
Temperatura_Lava_C_Mediana | 672.25684 | 846.21846 | 1083.82319 |
Temperatura_Lava_C_DesvEstandar | 38.96231 | 59.02087 | 74.53693 |
tambien hacemos lo mismo con el tipo de volcan.
# Crear vector con nombres de las variables numéricas
# Crear vector con nombres de las variables numéricas
variables_numericas <- c(
"Altura_m",
"Frecuencia_Erupcion_Anios",
"Emision_SO2_Toneladas",
"Temperatura_Lava_C"
)
# Calcular resumen por tipo de volcán, incluyendo proporción
resumen_estadistico_volcan <- volcanes %>%
filter(!is.na(Tipo_Volcan)) %>%
group_by(Tipo_Volcan) %>%
summarise(
Proporcion = n() / nrow(volcanes %>% filter(!is.na(Tipo_Volcan))),
across(
all_of(variables_numericas),
list(
Media = ~mean(.x, na.rm = TRUE),
Mediana = ~median(.x, na.rm = TRUE),
DesvEstandar = ~sd(.x, na.rm = TRUE)
),
.names = "{.col}_{.fn}"
)
)
# Transponer tabla para mejor visualización
resumen_volcan_transpuesto <- resumen_estadistico_volcan %>%
pivot_longer(-Tipo_Volcan, names_to = "Variable", values_to = "Valor") %>%
pivot_wider(names_from = Tipo_Volcan, values_from = Valor)
# Mostrar tabla con kable
kable(resumen_volcan_transpuesto, caption = "Resumen estadístico por tipo de volcán (transpuesto, con proporción incluida)")
Variable | Cono de Ceniza | Escudo | Estratovolcán |
---|---|---|---|
Proporcion | 0.3000 | 0.3400 | 0.3600 |
Altura_m_Media | 3609.6384 | 3378.3886 | 3307.6269 |
Altura_m_Mediana | 3397.4089 | 2978.7018 | 3677.0943 |
Altura_m_DesvEstandar | 1105.2806 | 1908.7425 | 1681.6447 |
Frecuencia_Erupcion_Anios_Media | 229.5868 | 239.2764 | 196.3277 |
Frecuencia_Erupcion_Anios_Mediana | 199.3039 | 222.2250 | 179.8859 |
Frecuencia_Erupcion_Anios_DesvEstandar | 151.3747 | 160.9151 | 134.5833 |
Emision_SO2_Toneladas_Media | 24820.1535 | 26014.7263 | 27824.7228 |
Emision_SO2_Toneladas_Mediana | 22608.8269 | 28041.1931 | 31727.7984 |
Emision_SO2_Toneladas_DesvEstandar | 12854.4361 | 15310.7947 | 14983.5360 |
Temperatura_Lava_C_Media | 887.9658 | 902.3768 | 887.7855 |
Temperatura_Lava_C_Mediana | 911.8510 | 906.3470 | 883.3291 |
Temperatura_Lava_C_DesvEstandar | 191.5661 | 194.8063 | 158.4321 |
Como se puede observar, la media de altura de los conos de ceniza es notablemente más alta en comparación con otros tipos de volcanes. Esto resulta llamativo, ya que los conos de ceniza, por lo general, se asocian a estructuras volcánicas más pequeñas y de crecimiento rápido. Sin embargo, esta discrepancia podría deberse a errores en el registro o a una mala clasificación de los volcanes en la base de datos.
Por otro lado, la media de las emisiones de dióxido de azufre (SO₂) es más alta en las lavas félsicas. Este resultado también parece contradictorio, ya que típicamente las lavas félsicas (más viscosas y con menor contenido de gases) tienden a emitir menos SO₂ que las lavas máficas, las cuales fluyen con mayor facilidad y permiten una liberación más constante de gases volcánicos.
library(ggplot2)
ggplot(volcanes, aes(x = Altura_m)) +
geom_histogram(binwidth = 500, fill = "skyblue", color = "black", boundary = 0) +
scale_x_continuous(breaks = seq(0, max(volcanes$Altura_m, na.rm = TRUE), by = 500)) +
labs(title = "Distribución de Alturas de los Volcanes",
x = "Altura (m)",
y = "Frecuencia") +
theme_minimal()
ggplot(volcanes, aes(x = Emision_SO2_Toneladas)) +
geom_histogram(binwidth = 5000, fill = "salmon", color = "black", boundary = 0) +
scale_x_continuous(breaks = seq(0, max(volcanes$Emision_SO2_Toneladas, na.rm = TRUE), by = 5000)) +
labs(title = "Distribución de Emisión de SO₂",
x = "Emisión de SO₂ (Toneladas)",
y = "Frecuencia") +
theme_minimal()
Las dos gráficas nos muestran que la distribución tanto de las alturas de los volcanes como de sus emisiones de SO₂ es relativamente equilibrada. No se observan concentraciones excesivas en rangos específicos ni asimetrías marcadas, lo cual sugiere una dispersión uniforme de los datos en ambas variables. Esto podría indicar que, dentro de nuestra muestra, no hay una predominancia clara de volcanes extremadamente altos ni de emisiones particularmente altas o bajas.
grafico de barras
ggplot(volcanes, aes(x = Tipo_Lava)) +
geom_bar(fill = "steelblue") +
labs(title = "Frecuencia de Tipos de Lava",
x = "Tipo de Lava",
y = "Frecuencia") +
theme_minimal()
se puede ver que en los volcanes predominan las lavas de mayor temperatura.
ggplot(volcanes, aes(x = Tipo_Volcan)) +
geom_bar(fill = "darkorange") +
labs(title = "Frecuencia de Tipos de Volcan",
x = "Tipo de Volcan",
y = "Frecuencia") +
theme_minimal()
hay una mañor frecuencia de estrato volcanes que de otro tipo de volcanes.
Boxplot
ggplot(volcanes, aes(x = Tipo_Volcan, y = Altura_m)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Dispersión de Alturas por Tipo de Volcán",
x = "Tipo de Volcán",
y = "Altura (m)") +
theme_minimal()
como se puede ver, dentro de los tipos de volcanes no se encuentran valores atipicos con respecto a su altura, y los que precentan un mayor rango intercuatilico son los volcanes de escudo.
ggplot(volcanes, aes(x = Tipo_Lava, y = Emision_SO2_Toneladas)) +
geom_boxplot(fill = "lightcoral") +
labs(title = "Emisión de SO₂ según Tipo de Lava",
x = "Tipo de Lava",
y = "Emisión de SO₂ (Toneladas)") +
theme_minimal()
como se observa tampoco se encontraron valores atipicos en este diagrama.
library(ggplot2)
ggplot(volcanes, aes(x = Temperatura_Lava_C, y = Emision_SO2_Toneladas)) +
geom_point(color = "darkred", alpha = 0.6) +
labs(
title = "Relación entre Temperatura de Lava y Emisión de SO₂",
x = "Temperatura de la lava (°C)",
y = "Emisión de SO₂ (Toneladas)"
) +
theme_minimal()
como ultima grafica realize una grafica para ver si abia una relacion entre la temperatura y las emiciones de so2 pero como se observa tampoco se presenta una relacion clara.
library(dplyr)
library(tidyr)
library(knitr)
# Calcular los intervalos de confianza directamente
intervalos_ic_volcan <- resumen_estadistico_volcan %>%
select(Tipo_Volcan, ends_with("_Media"), ends_with("_DesvEstandar")) %>%
pivot_longer(
cols = -Tipo_Volcan,
names_to = c("Variable", ".value"),
names_pattern = "(.*)_(Media|DesvEstandar)"
) %>%
mutate(
LI = Media - 1.96 * DesvEstandar / sqrt(nrow(volcanes)),
LS = Media + 1.96 * DesvEstandar / sqrt(nrow(volcanes)),
Intervalo = paste0("(", round(LI, 2), ", ", round(LS, 2), ")")
) %>%
select(Tipo_Volcan, Variable, Intervalo) %>%
pivot_wider(names_from = Tipo_Volcan, values_from = Intervalo)
# Mostrar tabla transpuesta con solo los intervalos
kable(intervalos_ic_volcan, caption = "Intervalos de confianza del 95% para las medias por tipo de volcán")
Variable | Cono de Ceniza | Escudo | Estratovolcán |
---|---|---|---|
Altura_m | (3393, 3826.27) | (3004.28, 3752.5) | (2978.02, 3637.23) |
Frecuencia_Erupcion_Anios | (199.92, 259.26) | (207.74, 270.82) | (169.95, 222.71) |
Emision_SO2_Toneladas | (22300.68, 27339.62) | (23013.81, 29015.64) | (24887.95, 30761.5) |
Temperatura_Lava_C | (850.42, 925.51) | (864.19, 940.56) | (856.73, 918.84) |
aqui se pueden ver los intervalos de medias para los distintos tipos de volcanes.
ahora veremos los intervalos de proporciones para los tipos de lava
# Calcular proporciones e intervalo de confianza para Tipo_Lava
lava_prop <- volcanes %>%
filter(!is.na(Tipo_Lava)) %>%
count(Tipo_Lava) %>%
mutate(
Total = sum(n),
Proporcion = n / Total,
Error = 1.96 * sqrt(Proporcion * (1 - Proporcion) / Total),
Inferior = Proporcion - Error,
Superior = Proporcion + Error,
IC_95 = paste0("(", round(Inferior, 3), ", ", round(Superior, 3), ")")
) %>%
select(Tipo_Lava, Proporcion, IC_95)
# Mostrar en tabla
library(knitr)
kable(lava_prop, caption = "Intervalo de confianza del 95% para las proporciones por tipo de lava")
Tipo_Lava | Proporcion | IC_95 |
---|---|---|
Felsica | 0.28 | (0.192, 0.368) |
Intermedia | 0.29 | (0.201, 0.379) |
Mafica | 0.43 | (0.333, 0.527) |
ahora relalizamos una comparacion estre dos medias en este caso entre las lavas felsicas(frias) y las lavas maficas(calientes)
# Filtrar datos de lava máfica y félsica
lava_comparacion <- volcanes %>%
filter(Tipo_Lava %in% c("Mafica", "Felsica")) %>%
select(Tipo_Lava, Altura_m) %>%
filter(!is.na(Altura_m))
# Agrupar y calcular estadísticos necesarios
estadisticos <- lava_comparacion %>%
group_by(Tipo_Lava) %>%
summarise(
n = n(),
media = mean(Altura_m),
sd = sd(Altura_m)
)
# Extraer valores
m1 <- estadisticos$media[estadisticos$Tipo_Lava == "Mafica"]
m2 <- estadisticos$media[estadisticos$Tipo_Lava == "Felsica"]
s1 <- estadisticos$sd[estadisticos$Tipo_Lava == "Mafica"]
s2 <- estadisticos$sd[estadisticos$Tipo_Lava == "Felsica"]
n1 <- estadisticos$n[estadisticos$Tipo_Lava == "Mafica"]
n2 <- estadisticos$n[estadisticos$Tipo_Lava == "Felsica"]
# Calcular diferencia de medias e intervalo
diferencia <- m1 - m2
error <- 1.96 * sqrt((s1^2 / n1) + (s2^2 / n2))
inferior <- diferencia - error
superior <- diferencia + error
# Mostrar resultado
cat("Diferencia de medias (Mafica - Felsica):", round(diferencia, 2), "\n")
## Diferencia de medias (Mafica - Felsica): 60.43
cat("IC 95%:", paste0("(", round(inferior, 2), ", ", round(superior, 2), ")"))
## IC 95%: (-748.54, 869.39)
Como el intervalo de confianza para la diferencia de medias contiene valores negativos, no es posible afirmar con certeza que exista una diferencia significativa entre los grupos analizados.
# Contar tipos de volcán
tabla_volcanes <- volcanes %>%
filter(!is.na(Tipo_Volcan)) %>%
count(Tipo_Volcan)
# Mostrar los nombres exactos disponibles (para verificar)
print(tabla_volcanes)
## # A tibble: 3 × 2
## Tipo_Volcan n
## <chr> <int>
## 1 Cono de Ceniza 30
## 2 Escudo 34
## 3 Estratovolcán 36
# Asignar tipos exactos como aparecen en los datos
tipo1 <- "Escudo"
tipo2 <- "Cono de Ceniza" # Verifica bien este nombre exacto
# Verificar si ambos tipos existen
if (tipo1 %in% tabla_volcanes$Tipo_Volcan & tipo2 %in% tabla_volcanes$Tipo_Volcan) {
# Extraer valores
n1 <- tabla_volcanes$n[tabla_volcanes$Tipo_Volcan == tipo1]
n2 <- tabla_volcanes$n[tabla_volcanes$Tipo_Volcan == tipo2]
total_volcanes <- sum(tabla_volcanes$n)
# Proporciones
p1 <- n1 / total_volcanes
p2 <- n2 / total_volcanes
# Diferencia y error estándar
diferencia <- p1 - p2
error <- 1.96 * sqrt((p1 * (1 - p1)) / total_volcanes + (p2 * (1 - p2)) / total_volcanes)
inferior <- diferencia - error
superior <- diferencia + error
# Mostrar resultado
cat("Diferencia de proporciones (", tipo1, " - ", tipo2, "): ", round(diferencia, 3), "\n")
cat("IC 95%: (", round(inferior, 3), ", ", round(superior, 3), ")\n", sep = "")
} else {
cat("Uno o ambos tipos de volcán no se encontraron en los datos. Verifica los nombres.\n")
}
## Diferencia de proporciones ( Escudo - Cono de Ceniza ): 0.04
## IC 95%: (-0.089, 0.169)
dado que en el intervalo volvio a haber un numero negativo No hay evidencia estadísticamente concluyente de que un tipo de volcán sea más frecuente que el otro en la población general de volcanes, al nivel de confianza del 95%.
A lo largo del análisis realizado, se evidenció que la base de datos utilizada presentaba serias limitaciones tanto en la calidad como en la completitud de la información. Muchas de las variables clave contenían valores faltantes, registros ambiguos o inconsistencias que dificultaron la obtención de resultados confiables y robustos. Aunque se logró realizar un tratamiento estadístico básico y se obtuvieron algunas estimaciones e interpretaciones generales, la falta de precisión y de homogeneidad en los datos compromete la validez de cualquier conclusión más profunda. En ese sentido, este ejercicio sirve más como una demostración metodológica que como un análisis con valor predictivo o explicativo real.