1 INTRODUCCIÓN

Este ecosistema es fundamental para el equilibrio ecológico de la región. Actúa como una fuente de agua vital, alimentando ríos y lagunas que abastecen a comunidades cercanas, incluida la ciudad de Quito. Su funcionamiento y biodiversidad están regulados por una combinación de factores clave:

  • Climáticos: La temperatura y las precipitaciones.

  • Geográficos: La altitud y la latitud.

  • Atmosféricos: Los patrones de vientos.

1.1 PLANTEAMIENTO DEL PROBLEMA

El análisis estadístico del clima en el Volcán Antisana es fundamental para transformar datos climáticos en información cuantificable que permita optimizar la gestión del agua, evaluar riesgos naturales y proteger sus ecosistemas. Para lograrlo, este estudio se centrará en el caso específico de la Reserva Ecológica Antisana, utilizando datos confiables recopilados de fuentes científicas y plataformas especializadas, con el objetivo de generar conclusiones objetivas que faciliten la toma de decisiones en conservación y planificación sostenible.

1.2 MAPA DE UBICACIÓN GEOGRÁFICA

📄 Descargar Mapa de Ubicación del Volcán Antisana (PDF)

1.3 OBJETIVOS

1.3.1 Objetivo General

Aplicar la estadística, Machine Learning y el análisis climático al estudio del clima del Volcán Antisana para evaluar sus patrones meteorológicos y su influencia en el ecosistema circundante, mediante el uso de herramientas computacionales.

1.3.2 Objetivo Específicos

  1. Conocer la situación actual de los datos climáticos del volcán Antisana a través de sus características más importantes y medidas estadísticas.

  2. Emplear un modelo de probabilidad para establecer conclusiones sobre el clima del Volcán Antisana a partir de los resultados de muestra.

  3. Deducir relaciones entre variables climáticas relevantes del volcán Antisana con el fin de realizar estimaciones significativas sobre su impacto en el ecosistema y la biodiversidad de la zona.

2 ESTADÍSTICA DESCRIPTIVA

2.1 METODOLOGÍA

2.1.1 Población

  • Textual: Todos los registros climáticos históricos y actuales asociados al Volcán Antisana y su área de influencia, independientemente de su estado operativo.

  • Simbólico: \(U = \{ x/x \in \text{Registros Climáticos} \land \text{Ubicación}(x) = \text{"Volcán Antisana"}\}\)

2.1.2 Individuo

  • Textual: Cada registro climático individual dentro de la población.

  • Simbólico: \(X_i \text{ donde i = 1, 2, 3, 4, ..., +∞}\)

2.1.3 Muestra

  • Textual: Un subconjunto representativo de registros climáticos correspondiente al período de estudio específico, obtenido de fuentes validadas como INAMHI y estaciones meteorológicas de la reserva.

  • Simbólico: \(M = \{ x/x \text{Registros Climáticos} \land \text{Ubicación}(x) = \text{"Volcán Antisana"} \land \text{Fecha}(x) = \text{[01/01/2012, 31/12/2012]}\)

2.1.4 Caso de Estudio

  • Textual: Cada registro climático dentro del período y área definidos, analizado para caracterizar el comportamiento climático y su impacto en los ecosistemas y recursos hídricos de la Reserva Antisana.

  • Simbólico: \(X_i \text{ donde i = 1, 2, 3, 4, ..., 366}\)

2.2 TABLA DE VARIABLES

📊 Ver tabla de variables en Google Sheets:
👉 Abrir tabla de variables

📥 Descargar tabla de variables (Excel):
👉 Descargar archivo Excel

2.3 TABLA DE INDICADORES

📊 Ver tabla de indicadores en Google Sheets:
👉 Abrir tabla de indicadores

📥 Descargar tabla de indicadores (Excel):
👉 Descargar archivo Excel

2.4 VARIABLES

2.4.1 Configuración y Carga de Datos

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.6
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.1     ✔ tibble    3.3.0
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(e1071)
## 
## Adjuntando el paquete: 'e1071'
## 
## The following object is masked from 'package:ggplot2':
## 
##     element
library(readr)
library(gt)
library(ggplot2)

setwd("~/PROYECTO ANTISANA")
Datos <- read_csv("weatherdataANTISANA.csv")
## Rows: 366 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): date
## dbl (9): longitude, latitude, elevation, max_temperature, min_temperature, p...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(Datos)
## spc_tbl_ [366 × 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ date             : chr [1:366] "01/01/2012" "02/01/2012" "03/01/2012" "04/01/2012" ...
##  $ longitude        : num [1:366] -78.1 -78.1 -78.1 -78.1 -78.1 ...
##  $ latitude         : num [1:366] -0.468 -0.468 -0.468 -0.468 -0.468 ...
##  $ elevation        : num [1:366] 4048 4048 4048 4048 4048 ...
##  $ max_temperature  : num [1:366] 16.1 15.5 11.6 12 11.7 ...
##  $ min_temperature  : num [1:366] 6.91 9.23 8.69 9.53 7.9 ...
##  $ precipitation    : num [1:366] 8.49 35.44 41.53 15.48 28.71 ...
##  $ wind             : num [1:366] 1.76 1.86 1.74 1.48 1.49 1.51 1.81 1.68 1.23 1.61 ...
##  $ relative_humidity: num [1:366] 0.93 0.96 0.98 0.99 0.98 0.97 0.98 0.99 0.99 0.98 ...
##  $ solar            : num [1:366] 15.98 12.25 4.58 4.32 3.86 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   date = col_character(),
##   ..   longitude = col_double(),
##   ..   latitude = col_double(),
##   ..   elevation = col_double(),
##   ..   max_temperature = col_double(),
##   ..   min_temperature = col_double(),
##   ..   precipitation = col_double(),
##   ..   wind = col_double(),
##   ..   relative_humidity = col_double(),
##   ..   solar = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

2.4.2 VARIABLE LONGITUD

# 1. Extraer variable: Max Temperature
# Asegúrate de que el nombre de la columna sea exacto (ej. Datos$max_temp)
Variable <- na.omit(Datos$max_temperature) 
N <- length(Variable)

# --- CÁLCULO LÍMITES DECIMALES ---
min_dec <- min(Variable)
max_dec <- max(Variable)
k_dec <- floor(1 + 3.322 * log10(N))
rango_dec <- max_dec - min_dec
amplitud_dec <- rango_dec / k_dec

cortes_dec <- seq(min_dec, max_dec, length.out = k_dec + 1)
cortes_dec[length(cortes_dec)] <- max_dec + 0.0001

inter_dec <- cut(Variable, breaks = cortes_dec, include.lowest = TRUE, right = FALSE)
ni_dec <- as.vector(table(inter_dec))

hi_dec <- (ni_dec / N) * 100
Ni_asc_dec <- cumsum(ni_dec)
Hi_asc_dec <- cumsum(hi_dec)
Ni_desc_dec <- rev(cumsum(rev(ni_dec)))
Hi_desc_dec <- rev(cumsum(rev(hi_dec)))

TDF_Decimal <- data.frame(
  Li = cortes_dec[1:k_dec],
  Ls = cortes_dec[2:(k_dec+1)],
  MC = (cortes_dec[1:k_dec] + cortes_dec[2:(k_dec+1)]) / 2,
  ni = ni_dec,
  hi = hi_dec,
  Ni_asc = Ni_asc_dec,
  Ni_desc = Ni_desc_dec,
  Hi_asc = Hi_asc_dec,
  Hi_desc = Hi_desc_dec)

# --- CÁLCULO LÍMITES ENTEROS ---
BASE <- 1 # Ajustado a 1 para temperaturas, ya que 10 es un rango muy amplio
min_int <- floor(min(Variable) / BASE) * BASE
max_int <- ceiling(max(Variable) / BASE) * BASE
k_int_sug <- floor(1 + 3.322 * log10(N))
Rango_int <- max_int - min_int
Amplitud_raw <- Rango_int / k_int_sug

Amplitud_int <- ceiling(Amplitud_raw)
if(Amplitud_int == 0) Amplitud_int <- 1

cortes_int <- seq(from = min_int, by = Amplitud_int, length.out = k_int_sug + 2)

while(max(cortes_int) < max(Variable)) {
  cortes_int <- c(cortes_int, max(cortes_int) + Amplitud_int)
}

K_real <- length(cortes_int) - 1
lim_inf_int <- cortes_int[1:K_real]
lim_sup_int <- cortes_int[2:(K_real+1)]

inter_int <- cut(Variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)
ni_int <- as.vector(table(inter_int))

hi_int <- (ni_int / N) * 100
Ni_asc_int <- cumsum(ni_int)
Hi_asc_int <- cumsum(hi_int)
Ni_desc_int <- rev(cumsum(rev(ni_int)))
Hi_desc_int <- rev(cumsum(rev(hi_int)))

TDF_Enteros <- data.frame(
  Li = lim_inf_int, Ls = lim_sup_int,
  MC = (lim_inf_int + lim_sup_int) / 2,
  ni = ni_int, hi = hi_int,
  Ni_asc = Ni_asc_int, Ni_desc = Ni_desc_int,
  Hi_asc = Hi_asc_int, Hi_desc = Hi_desc_int)

# --- TABLAS GT ---

# Tabla Decimal
TDF_Dec_Final <- data.frame(
  Li = as.character(round(TDF_Decimal$Li, 2)),
  Ls = as.character(round(TDF_Decimal$Ls, 2)),
  MC = as.character(round(TDF_Decimal$MC, 2)),
  ni = as.character(TDF_Decimal$ni),
  hi = as.character(round(TDF_Decimal$hi, 2)),
  Ni_asc = as.character(TDF_Decimal$Ni_asc),
  Ni_desc = as.character(TDF_Decimal$Ni_desc),
  Hi_asc = as.character(round(TDF_Decimal$Hi_asc, 2)),
  Hi_desc = as.character(round(TDF_Decimal$Hi_desc, 2))
)
totales_dec <- c("TOTAL", "-", "-", sum(TDF_Decimal$ni), round(sum(TDF_Decimal$hi), 2), "-", "-", "-", "-")
TDF_Dec_Final <- rbind(TDF_Dec_Final, totales_dec)

TDF_Dec_Final %>% gt() %>%
  tab_header(title = md("**Tabla N°1: Frecuencias de Temperatura Máxima (°C) - Volcán Antisana**")) %>%
  cols_label(Li="Lim. Inf", Ls="Lim. Sup", MC="Marca Clase", ni="ni", hi="hi (%)", Ni_asc="Ni Asc", Ni_desc="Ni Desc", Hi_asc="Hi Asc %", Hi_desc="Hi Desc %") %>%
  cols_align(align = "center") %>%
  tab_options(heading.title.font.size = px(14), column_labels.background.color = "#F0F0F0")
Tabla N°1: Frecuencias de Temperatura Máxima (°C) - Volcán Antisana
Lim. Inf Lim. Sup Marca Clase ni hi (%) Ni Asc Ni Desc Hi Asc % Hi Desc %
10.32 11.82 11.07 26 7.1 26 366 7.1 100
11.82 13.31 12.56 60 16.39 86 340 23.5 92.9
13.31 14.81 14.06 71 19.4 157 280 42.9 76.5
14.81 16.31 15.56 60 16.39 217 209 59.29 57.1
16.31 17.8 17.06 62 16.94 279 149 76.23 40.71
17.8 19.3 18.55 44 12.02 323 87 88.25 23.77
19.3 20.8 20.05 23 6.28 346 43 94.54 11.75
20.8 22.29 21.55 14 3.83 360 20 98.36 5.46
22.29 23.79 23.04 6 1.64 366 6 100 1.64
TOTAL - - 366 100 - - - -
# --- ANÁLISIS GRÁFICO ---

# Histograma de Frecuencia Absoluta
par(mar = c(6, 5, 5, 2))
barplot(TDF_Enteros$ni, names.arg = TDF_Enteros$MC, col = "#FFB347", 
        ylab = "Frecuencia (n)", xlab = "", las = 1, space = 0)
mtext("Temperatura Máxima (°C)", side = 1, line = 3)
mtext("Gráfica N°1: Distribución de Temperatura Máxima en el Volcán Antisana", side = 3, line = 2, font = 2)

# Boxplot
par(mar = c(5, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = "#FFB347", xlab = "Temperatura Máxima (°C)",
        main = "Gráfica N°2: Boxplot de Temperatura Máxima - Volcán Antisana")

# --- INDICADORES ESTADÍSTICOS ---
library(e1071) # Para asimetría y curtosis
media <- round(mean(Variable), 2)
mediana <- round(median(Variable), 2)
max_frecuencia <- max(TDF_Enteros$ni)
moda_vals <- TDF_Enteros$MC[TDF_Enteros$ni == max_frecuencia]
moda_txt <- paste(round(moda_vals, 2), collapse = ", ")
varianza <- var(Variable)
sd_val <- sd(Variable)
cv <- round((sd_val / abs(media)) * 100, 2)
asimetria <- skewness(Variable)
curtosis <- kurtosis(Variable)

# Outliers
Q1 <- quantile(Variable, 0.25); Q3 <- quantile(Variable, 0.75)
IQR_val <- Q3 - Q1
lim_inf <- Q1 - 1.5 * IQR_val; lim_sup <- Q3 + 1.5 * IQR_val
outliers_data <- Variable[Variable < lim_inf | Variable > lim_sup]
num_outliers <- length(outliers_data)
rango_outliers <- ifelse(num_outliers > 0, paste0(num_outliers, " [", round(min(outliers_data), 2), "; ", round(max(outliers_data), 2), "]"), "0 [Sin Outliers]")

tabla_indicadores <- data.frame(
  "Variable" = "Temperatura Máxima (°C)",
  "Rango" = paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]"),
  "X" = media, "Me" = mediana, "Mo" = moda_txt, "V" = round(varianza, 2), 
  "Sd" = round(sd_val, 2), "Cv" = cv, "As" = round(asimetria, 2), "K" = round(curtosis, 2),
  "Outliers" = rango_outliers)

tabla_indicadores %>% gt() %>%
  tab_header(title = md("**Tabla N°3: Resumen Estadístico - Volcán Antisana**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(X="Media", Me="Mediana", Mo="Moda", V="Varianza", Sd="Desv. Est.", Cv="C.V. %", As="Asimetría", K="Curtosis")
Tabla N°3: Resumen Estadístico - Volcán Antisana
Variable Rango Media Mediana Moda Varianza Desv. Est. C.V. % Asimetría Curtosis Outliers
Temperatura Máxima (°C) [10.32; 23.79] 15.74 15.51 13 8.22 2.87 18.22 0.39 -0.56 0 [Sin Outliers]
Autor: Martin Sarmiento
## --- CONCLUSIONES ---
"La variable “Temperatura Máxima” presenta una variabilidad climática específica en el entorno del Volcán Antisana, con valores comprendidos entre r round(min(Variable), 2)°C y r round(max(Variable), 2)°C, concentrándose alrededor de su media aritmética. La dispersión observada indica una estabilidad térmica propia de la zona, mientras que la presencia de valores atípicos sugiere eventos climáticos aislados o microclimas particulares que influyen en el comportamiento térmico del ecosistema del volcán."
## [1] "La variable “Temperatura Máxima” presenta una variabilidad climática específica en el entorno del Volcán Antisana, con valores comprendidos entre r round(min(Variable), 2)°C y r round(max(Variable), 2)°C, concentrándose alrededor de su media aritmética. La dispersión observada indica una estabilidad térmica propia de la zona, mientras que la presencia de valores atípicos sugiere eventos climáticos aislados o microclimas particulares que influyen en el comportamiento térmico del ecosistema del volcán."