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 ...

Tablas Descriptivas:

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")
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)")
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")
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")
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)")
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)")
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.

Gráficos Descriptivos:

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.

estimaciones estadisticas.

  1. Estimación de la Media
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")
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")
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%.

conclusiones

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.