1. Introducción

Desempeña un papel crucial en el equilibrio ecológico de la zona, siendo fuente de agua para ríos y lagunas que abastecen a comunidades cercanas, incluyendo Quito

Factores cruciales para el equilibrio ecológico de la región:

Temperatura Precipitaciones Vientos Altitud Latitud

2. Planteamiento de Problema

El análisis del clima en el volcán Antisana es fundamental para comprender su impacto en los ecosistemas locales, optimizar la gestión de recursos hídricos y evaluar los riesgos asociados a la actividad volcánica. Mediante un análisis estadístico, se pueden examinar de manera cuantitativa los datos climáticos, transformándolos en información útil para sugerir y obtener conclusiones que faciliten la toma de decisiones en la conservación y gestión sostenible del área. Consideramos como caso de estudio la Reserva Ecológica Antisana, utilizando datos recopilados de fuentes científicas y plataformas de investigación que abordan el clima y la biodiversidad en esta región.

3.Objetivo General

Aplicar la estadística 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.

3.1.Objetivo Específico

Conocer la situación actual de los datos climáticos del volcán Antisana con el fin de evaluar sus características meteorológicas más importantes y sus medidas estadísticas.

3.2. Objetivo Específico

Emplear modelos de probabilidad para establecer conclusiones sobre el clima del volcán Antisana, basándose en los resultados obtenidos de la recolección de datos climáticos.

3.3. Objetivo Específico

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

4. Población

Todos los registros climáticos (activos o inactivos) en el volcán Antisana durante el periodo de estudio.

4.1.Simbólico:

P={d/d∈todos los registros del clima del volcán Antisana∧lugar(x)=+∞}

5. Muestra

Todos los registros climáticos (activos o inactivos) en el volcán Antisana durante el periodo de estudio.

5.1. Simbólico:

P={d/d∈Registro Climático∧ubicación(d)=“Volcán Antisana”∧fecha(d)∈[01/01/2012, 30/06/2012]}

6. Individuo

Un subconjunto de los registros climáticos (activos o inactivos) en el volcán Antisana durante el periodo de estudio.

6.1. Simbólico:

S={di/di∈P∧i=1,2,…,m}

Donde:

m<n , siendo n el número total de registros en la población P . di : un registro específico en la muestra, donde i indica el número o la posición de ese registro.

1. Estadistica Descriptiva

1.1. Max Temperature

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
## 
## Adjuntando el paquete: 'e1071'
## The following object is masked from 'package:ggplot2':
## 
##     element
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readr)
weatherdataANTISANA <- 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.
weatherdataANTISANA
Temperatura_Máxima <- weatherdataANTISANA$`Max Temperature`

Tabla de Distribución de Frecuencias

#  Aplicar Regla de Sturges para el número de intervalos (k)
n <- length(Temperatura_Máxima)
k <- ceiling(1 + 3.322 * log10(n)) # Regla de Sturges

#  Calcular cortes y límites
cortes <- seq(min(Temperatura_Máxima), max(Temperatura_Máxima), length.out = k + 1)

#  Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Temperatura_Máxima, breaks = cortes, include.lowest = TRUE)))

#  Calcular cada columna solicitada
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],                                 # Límite Inferior
    Ls = cortes[2:(k+1)],                             # Límite Superior
    MC = (Li + Ls) / 2,                               # Marca de Clase
    ni = Freq,                                        # Frecuencia absoluta
    hi_porc = (ni / n) * 100,                         # Frecuencia relativa %
    Ni_asc = cumsum(ni),                              # Frecuencia absoluta acumulada asc.
    Ni_desc = rev(cumsum(rev(ni))),                   # Frecuencia absoluta acumulada desc.
    Hi_asc_porc = (Ni_asc / n) * 100,                 # Frecuencia relativa acumulada asc. %
    Hi_desc_porc = (Ni_desc / n) * 100                # Frecuencia relativa acumulada desc. %
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

# Ver el resultado
print(tabla_frecuencia)
##        Li     Ls      MC ni   hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1  10.320 11.667 10.9935 21  5.737705     21     366    5.737705   100.000000
## 2  11.667 13.014 12.3405 50 13.661202     71     345   19.398907    94.262295
## 3  13.014 14.361 13.6875 70 19.125683    141     295   38.524590    80.601093
## 4  14.361 15.708 15.0345 51 13.934426    192     225   52.459016    61.475410
## 5  15.708 17.055 16.3815 51 13.934426    243     174   66.393443    47.540984
## 6  17.055 18.402 17.7285 53 14.480874    296     123   80.874317    33.606557
## 7  18.402 19.749 19.0755 34  9.289617    330      70   90.163934    19.125683
## 8  19.749 21.096 20.4225 22  6.010929    352      36   96.174863     9.836066
## 9  21.096 22.443 21.7695  9  2.459016    361      14   98.633880     3.825137
## 10 22.443 23.790 23.1165  5  1.366120    366       5  100.000000     1.366120

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Temperatura_Máxima), aes(x = Temperatura_Máxima)) +
  geom_histogram(breaks = cortes, 
                 fill = "steelblue", 
                 color = "black") + # El color blanco crea la división fina pero las barras están unidas
  labs(title = "Gráfica No. 1: Distribución de Temperatura Máxima",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Temperatura (°C)",
       y = "cantidad") +
  scale_x_continuous(breaks = round(cortes, 1)) + # Muestra los límites exactos en el eje X
  theme_minimal()

Histograma Frecuencia Absoluta —————–

# 4. Crear el Histograma
ggplot(data = data.frame(Temperatura_Máxima), aes(x = Temperatura_Máxima)) +
  geom_histogram(breaks = cortes, 
                 fill = "steelblue", 
                 color = "black") + 
  # Ajustar el límite del eje Y al tamaño muestral (n)
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  # Ajustar eje X a los límites de los intervalos
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 1: Distribución de Temperatura Máxima",
       x = "Temperatura Máxima (°C)",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Temperatura_Máxima), aes(x = Temperatura_Máxima)) +
  # El eje Y mostrará el porcentaje real de cada barra sin forzar el límite a 100
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, 
                 fill = "steelblue", 
                 color = "black") + 
  # Ajustar eje X a los límites de los intervalos para mayor precisión
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3:Distribución Porcentual de Temperatura Máxima",
       x = "Temperatura Máxima (°C)",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

# 4. Crear el Histograma de Porcentajes
ggplot(data = data.frame(Temperatura_Máxima), aes(x = Temperatura_Máxima)) +
  # aes(y = after_stat(count)/sum(after_stat(count)) * 100) calcula el % automáticamente
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, 
                 fill = "steelblue", 
                 color = "black") + 
  # Ajustar el límite del eje Y al 100%
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  # Ajustar eje X a los límites de los intervalos
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4:Distribución Porcentual de Temperatura Máxima )",
       x = "Temperatura Máxima (°C)",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

# 2. Asegurarnos de que los datos estén listos
# (Asumiendo que ya tienes tabla_frecuencia del paso anterior)

# 3. Transformar los datos para ggplot
df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

# 4. Crear la Gráfica de Ojivas
ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + # Usamos linewidth en lugar de size (versiones modernas)
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Temperatura Máxima",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Temperatura (°C)",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

# Usando la función básica de R
boxplot(Temperatura_Máxima, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de CajasNo. 6: Temperatura Máxima",
       
        xlab = "Temperatura (°C)",
        border = "darkblue",
        pch = 16,        # Forma de los puntos atípicos
        col.alpha = 0.5) # Transparencia

Cálculo de Indicadores Estadístocos

# 3. Función para calcular la Moda (ya que R base no tiene una directa)
get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

# 4. Cálculo de Indicadores
minimo  <- min(Temperatura_Máxima, na.rm = TRUE)
maximo  <- max(Temperatura_Máxima, na.rm = TRUE)
media   <- mean(Temperatura_Máxima, na.rm = TRUE)
mediana <- median(Temperatura_Máxima, na.rm = TRUE)
moda    <- get_moda(Temperatura_Máxima)
sd_val  <- sd(Temperatura_Máxima, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Temperatura_Máxima, na.rm = TRUE)
k_val   <- kurtosis(Temperatura_Máxima, na.rm = TRUE)

# 5. Crear Tabla de Resultados
indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

# Mostrar tabla con formato
knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de la Temperatura Máxima - Antisana")
Indicadores Estadísticos de la Temperatura Máxima - Antisana
Indicador Valor
Mínimo 10.32
Máximo 23.79
Media 15.74
Mediana 15.51
Moda 14.77
SD (Desv. Est.) 2.87
CV (Coef. Var. %) 18.22
As (Asimetría) 0.39
K (Curtosis) -0.56

Conclusión

Temperatura Máxima en el Antisana presenta una alta estabilidad térmica, con una Media y Mediana muy cercanas que indican un comportamiento predecible. La Curtosis (K) positiva refleja una fuerte concentración de datos alrededor del promedio (distribución leptocúrtica), mientras que el bajo Coeficiente de Variación (CV) corrobora la escasa variabilidad anual. No obstante, la Asimetría (As) y la presencia de valores atípicos en el Diagrama de Cajas revelan picos de calor extremos que, aunque inusuales, son los principales responsables del riesgo de deshielo en los glaciares del volcán.

1.2. Temperatura Mínima

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
library(dplyr)

weatherdataANTISANA <- 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.
# Definir la variable de interés: Temperatura Mínima
Temperatura_Mínima <- weatherdataANTISANA$`Min Temperature`

Tabla de Distribución de Frecuencias

# Aplicar Regla de Sturges
n <- length(Temperatura_Mínima)
k <- ceiling(1 + 3.322 * log10(n)) 

# Calcular cortes y límites
cortes <- seq(min(Temperatura_Mínima), max(Temperatura_Mínima), length.out = k + 1)

# Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Temperatura_Mínima, breaks = cortes, include.lowest = TRUE)))

# Calcular columnas
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],
    Ls = cortes[2:(k+1)],
    MC = (Li + Ls) / 2,
    ni = Freq,
    hi_porc = (ni / n) * 100,
    Ni_asc = cumsum(ni),
    Ni_desc = rev(cumsum(rev(ni))),
    Hi_asc_porc = (Ni_asc / n) * 100,
    Hi_desc_porc = (Ni_desc / n) * 100
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

print(tabla_frecuencia)
##       Li    Ls    MC ni    hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1   2.65  3.47  3.06  1  0.2732240      1     366    0.273224   100.000000
## 2   3.47  4.29  3.88  3  0.8196721      4     365    1.092896    99.726776
## 3   4.29  5.11  4.70  6  1.6393443     10     362    2.732240    98.907104
## 4   5.11  5.93  5.52 13  3.5519126     23     356    6.284153    97.267760
## 5   5.93  6.75  6.34 33  9.0163934     56     343   15.300546    93.715847
## 6   6.75  7.57  7.16 73 19.9453552    129     310   35.245902    84.699454
## 7   7.57  8.39  7.98 95 25.9562842    224     237   61.202186    64.754098
## 8   8.39  9.21  8.80 59 16.1202186    283     142   77.322404    38.797814
## 9   9.21 10.03  9.62 56 15.3005464    339      83   92.622951    22.677596
## 10 10.03 10.85 10.44 27  7.3770492    366      27  100.000000     7.377049

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Temperatura_Mínima), aes(x = Temperatura_Mínima)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  labs(title = "Gráfica No. 1: Distribución de Temperatura Mínima",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Temperatura (°C)",
       y = "Cantidad") +
  scale_x_continuous(breaks = round(cortes, 1)) +
  theme_minimal()

Histograma Frecuencia Absoluta —————–

ggplot(data = data.frame(Temperatura_Mínima), aes(x = Temperatura_Mínima)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 2: Distribución de Temperatura Mínima (Escala N)",
       x = "Temperatura Mínima (°C)",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Temperatura_Mínima), aes(x = Temperatura_Mínima)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3: Distribución Porcentual de Temperatura Mínima",
       x = "Temperatura Mínima (°C)",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

ggplot(data = data.frame(Temperatura_Mínima), aes(x = Temperatura_Mínima)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4: Distribución Porcentual de Temperatura Mínima (Escala 100%)",
       x = "Temperatura Mínima (°C)",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + 
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Temperatura Mínima",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Temperatura (°C)",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

boxplot(Temperatura_Mínima, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de Cajas No. 6: Temperatura Mínima",
        xlab = "Temperatura (°C)",
        border = "darkblue",
        pch = 16)

Cálculo de Indicadores Estadístocos

get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

minimo  <- min(Temperatura_Mínima, na.rm = TRUE)
maximo  <- max(Temperatura_Mínima, na.rm = TRUE)
media   <- mean(Temperatura_Mínima, na.rm = TRUE)
mediana <- median(Temperatura_Mínima, na.rm = TRUE)
moda    <- get_moda(Temperatura_Mínima)
sd_val  <- sd(Temperatura_Mínima, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Temperatura_Mínima, na.rm = TRUE)
k_val   <- kurtosis(Temperatura_Mínima, na.rm = TRUE)

indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de la Temperatura Mínima - Antisana")
Indicadores Estadísticos de la Temperatura Mínima - Antisana
Indicador Valor
Mínimo 2.65
Máximo 10.85
Media 8.05
Mediana 8.00
Moda 7.89
SD (Desv. Est.) 1.37
CV (Coef. Var. %) 17.08
As (Asimetría) -0.43
K (Curtosis) 0.57

Conclusión

El análisis de la Temperatura Mínima en el Antisana muestra una distribución con una Media y Mediana que reflejan el rigor del clima de alta montaña nocturno. La Curtosis (K) y el CV indican una variabilidad moderada, mientras que la Asimetría (As) negativa sugeriría una tendencia hacia eventos de heladas más intensas. El Diagrama de Cajas permite visualizar que, aunque hay estabilidad, existen valores atípicos inferiores que representan los descensos térmicos más extremos registrados en la estación.

1.3. Precipitation

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
library(dplyr)

weatherdataANTISANA <- 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.
# Definir la variable de interés: Precipitación
Precipitacion <- weatherdataANTISANA$Precipitation

Tabla de Distribución de Frecuencias

# Aplicar Regla de Sturges
n <- length(Precipitacion)
k <- ceiling(1 + 3.322 * log10(n)) 

# Calcular cortes y límites
cortes <- seq(min(Precipitacion), max(Precipitacion), length.out = k + 1)

# Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Precipitacion, breaks = cortes, include.lowest = TRUE)))

# Calcular columnas
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],
    Ls = cortes[2:(k+1)],
    MC = (Li + Ls) / 2,
    ni = Freq,
    hi_porc = (ni / n) * 100,
    Ni_asc = cumsum(ni),
    Ni_desc = rev(cumsum(rev(ni))),
    Hi_asc_porc = (Ni_asc / n) * 100,
    Hi_desc_porc = (Ni_desc / n) * 100
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

print(tabla_frecuencia)
##        Li     Ls      MC  ni    hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1   0.010  9.481  4.7455 146 39.8907104    146     366    39.89071  100.0000000
## 2   9.481 18.952 14.2165  91 24.8633880    237     220    64.75410   60.1092896
## 3  18.952 28.423 23.6875  55 15.0273224    292     129    79.78142   35.2459016
## 4  28.423 37.894 33.1585  29  7.9234973    321      74    87.70492   20.2185792
## 5  37.894 47.365 42.6295  24  6.5573770    345      45    94.26230   12.2950820
## 6  47.365 56.836 52.1005  10  2.7322404    355      21    96.99454    5.7377049
## 7  56.836 66.307 61.5715   9  2.4590164    364      11    99.45355    3.0054645
## 8  66.307 75.778 71.0425   0  0.0000000    364       2    99.45355    0.5464481
## 9  75.778 85.249 80.5135   0  0.0000000    364       2    99.45355    0.5464481
## 10 85.249 94.720 89.9845   2  0.5464481    366       2   100.00000    0.5464481

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Precipitacion), aes(x = Precipitacion)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  labs(title = "Gráfica No. 1: Distribución de Precipitación",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Precipitación (mm)",
       y = "Cantidad de días") +
  scale_x_continuous(breaks = round(cortes, 1)) +
  theme_minimal()

Histograma Frecuencia Absoluta —————–

ggplot(data = data.frame(Precipitacion), aes(x = Precipitacion)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 2: Distribución de Precipitación (Escala N)",
       x = "Precipitación (mm)",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Precipitacion), aes(x = Precipitacion)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3: Distribución Porcentual de Precipitación",
       x = "Precipitación (mm)",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

ggplot(data = data.frame(Precipitacion), aes(x = Precipitacion)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4: Distribución Porcentual de Precipitación (Escala 100%)",
       x = "Precipitación (mm)",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + 
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Precipitación",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Precipitación (mm)",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

boxplot(Precipitacion, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de Cajas No. 6: Precipitación",
        xlab = "Precipitación (mm)",
        border = "darkblue",
        pch = 16)

Cálculo de Indicadores Estadístocos

get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

minimo  <- min(Precipitacion, na.rm = TRUE)
maximo  <- max(Precipitacion, na.rm = TRUE)
media   <- mean(Precipitacion, na.rm = TRUE)
mediana <- median(Precipitacion, na.rm = TRUE)
moda    <- get_moda(Precipitacion)
sd_val  <- sd(Precipitacion, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Precipitacion, na.rm = TRUE)
k_val   <- kurtosis(Precipitacion, na.rm = TRUE)

indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de Precipitación - Antisana")
Indicadores Estadísticos de Precipitación - Antisana
Indicador Valor
Mínimo 0.01
Máximo 94.72
Media 17.10
Mediana 12.94
Moda 0.01
SD (Desv. Est.) 16.12
CV (Coef. Var. %) 94.21
As (Asimetría) 1.30
K (Curtosis) 1.95

Conclusión

La Precipitación en el Antisana presenta una distribución típica de variables hidrológicas, caracterizada por una fuerte Asimetría Positiva, donde la mayoría de los días presentan valores bajos o nulos (moda en cero), pero con eventos extremos de lluvia intensa reflejados en los valores Máximo y los outliers del Diagrama de Cajas. La Curtosis elevada y un CV significativamente alto indican que el régimen de lluvias es muy variable y está concentrado en eventos específicos, lo cual es fundamental para el aporte hídrico de los glaciares.

1.4. Velocidad del Viento

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
library(dplyr)

weatherdataANTISANA <- 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.
# Definir la variable de interés: Viento
Viento <- weatherdataANTISANA$Wind

Tabla de Distribución de Frecuencias

# Aplicar Regla de Sturges
n <- length(Viento)
k <- ceiling(1 + 3.322 * log10(n)) 

# Calcular cortes y límites
cortes <- seq(min(Viento), max(Viento), length.out = k + 1)

# Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Viento, breaks = cortes, include.lowest = TRUE)))

# Calcular columnas
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],
    Ls = cortes[2:(k+1)],
    MC = (Li + Ls) / 2,
    ni = Freq,
    hi_porc = (ni / n) * 100,
    Ni_asc = cumsum(ni),
    Ni_desc = rev(cumsum(rev(ni))),
    Hi_asc_porc = (Ni_asc / n) * 100,
    Hi_desc_porc = (Ni_desc / n) * 100
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

print(tabla_frecuencia)
##      Li   Ls   MC ni    hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1  0.59 0.83 0.71  2  0.5464481      2     366   0.5464481  100.0000000
## 2  0.83 1.07 0.95 19  5.1912568     21     364   5.7377049   99.4535519
## 3  1.07 1.31 1.19 43 11.7486339     64     345  17.4863388   94.2622951
## 4  1.31 1.55 1.43 66 18.0327869    130     302  35.5191257   82.5136612
## 5  1.55 1.79 1.67 67 18.3060109    197     236  53.8251366   64.4808743
## 6  1.79 2.03 1.91 57 15.5737705    254     169  69.3989071   46.1748634
## 7  2.03 2.27 2.15 51 13.9344262    305     112  83.3333333   30.6010929
## 8  2.27 2.51 2.39 41 11.2021858    346      61  94.5355191   16.6666667
## 9  2.51 2.75 2.63 18  4.9180328    364      20  99.4535519    5.4644809
## 10 2.75 2.99 2.87  2  0.5464481    366       2 100.0000000    0.5464481

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Viento), aes(x = Viento)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  labs(title = "Gráfica No. 1: Distribución de la Velocidad del Viento",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Velocidad del Viento (km/h)",
       y = "Cantidad de días") +
  scale_x_continuous(breaks = round(cortes, 1)) +
  theme_minimal()

Histograma Frecuencia Absoluta —————–

ggplot(data = data.frame(Viento), aes(x = Viento)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 2: Distribución de Viento (Escala N)",
       x = "Velocidad del Viento (km/h)",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Viento), aes(x = Viento)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3: Distribución Porcentual del Viento",
       x = "Velocidad del Viento (km/h)",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

ggplot(data = data.frame(Viento), aes(x = Viento)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4: Distribución Porcentual del Viento (Escala 100%)",
       x = "Velocidad del Viento (km/h)",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + 
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Velocidad del Viento",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Velocidad (km/h)",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

boxplot(Viento, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de Cajas No. 6: Velocidad del Viento",
        xlab = "Velocidad (km/h)",
        border = "darkblue",
        pch = 16)

Cálculo de Indicadores Estadístocos

get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

minimo  <- min(Viento, na.rm = TRUE)
maximo  <- max(Viento, na.rm = TRUE)
media   <- mean(Viento, na.rm = TRUE)
mediana <- median(Viento, na.rm = TRUE)
moda    <- get_moda(Viento)
sd_val  <- sd(Viento, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Viento, na.rm = TRUE)
k_val   <- kurtosis(Viento, na.rm = TRUE)

indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de la Velocidad del Viento - Antisana")
Indicadores Estadísticos de la Velocidad del Viento - Antisana
Indicador Valor
Mínimo 0.59
Máximo 2.99
Media 1.77
Mediana 1.75
Moda 1.49
SD (Desv. Est.) 0.46
CV (Coef. Var. %) 25.78
As (Asimetría) 0.11
K (Curtosis) -0.72

Conclusión

La velocidad del Viento en el Antisana muestra una distribución característica de zonas de alta montaña, donde la Media refleja la persistencia de corrientes atmosféricas en el páramo. La Asimetría suele ser positiva, indicando que aunque predominan velocidades moderadas, existen ráfagas intensas representadas por el valor Máximo. El CV elevado sugiere que el viento es una variable con alta fluctuación diaria, mientras que los valores atípicos en el Diagrama de Cajas señalan eventos de vientos fuertes que impactan directamente en la sensación térmica y la evaporación del glaciar.

1.5. Humedad Relativa

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
library(dplyr)

weatherdataANTISANA <- 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.
# Definir la variable de interés: Humedad Relativa
Humedad_Relativa <- weatherdataANTISANA$`Relative Humidity`

Tabla de Distribución de Frecuencias

# Aplicar Regla de Sturges
n <- length(Humedad_Relativa)
k <- ceiling(1 + 3.322 * log10(n)) 

# Calcular cortes y límites
cortes <- seq(min(Humedad_Relativa), max(Humedad_Relativa), length.out = k + 1)

# Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Humedad_Relativa, breaks = cortes, include.lowest = TRUE)))

# Calcular columnas
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],
    Ls = cortes[2:(k+1)],
    MC = (Li + Ls) / 2,
    ni = Freq,
    hi_porc = (ni / n) * 100,
    Ni_asc = cumsum(ni),
    Ni_desc = rev(cumsum(rev(ni))),
    Hi_asc_porc = (Ni_asc / n) * 100,
    Hi_desc_porc = (Ni_desc / n) * 100
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

print(tabla_frecuencia)
##       Li    Ls     MC  ni    hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1  0.560 0.603 0.5815   2  0.5464481      2     366   0.5464481    100.00000
## 2  0.603 0.646 0.6245  13  3.5519126     15     364   4.0983607     99.45355
## 3  0.646 0.689 0.6675  14  3.8251366     29     351   7.9234973     95.90164
## 4  0.689 0.732 0.7105  20  5.4644809     49     337  13.3879781     92.07650
## 5  0.732 0.775 0.7535  14  3.8251366     63     317  17.2131148     86.61202
## 6  0.775 0.818 0.7965  17  4.6448087     80     303  21.8579235     82.78689
## 7  0.818 0.861 0.8395  25  6.8306011    105     286  28.6885246     78.14208
## 8  0.861 0.904 0.8825  35  9.5628415    140     261  38.2513661     71.31148
## 9  0.904 0.947 0.9255  47 12.8415301    187     226  51.0928962     61.74863
## 10 0.947 0.990 0.9685 179 48.9071038    366     179 100.0000000     48.90710

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Humedad_Relativa), aes(x = Humedad_Relativa)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  labs(title = "Gráfica No. 1: Distribución de Humedad Relativa",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Humedad Relativa (%)",
       y = "Cantidad de días") +
  scale_x_continuous(breaks = round(cortes, 1)) +
  theme_minimal()

Histograma Frecuencia Absoluta —————–

ggplot(data = data.frame(Humedad_Relativa), aes(x = Humedad_Relativa)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 2: Distribución de Humedad Relativa (Escala N)",
       x = "Humedad Relativa (%)",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Humedad_Relativa), aes(x = Humedad_Relativa)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3: Distribución Porcentual de Humedad Relativa",
       x = "Humedad Relativa (%)",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

ggplot(data = data.frame(Humedad_Relativa), aes(x = Humedad_Relativa)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4: Distribución Porcentual de Humedad Relativa (Escala 100%)",
       x = "Humedad Relativa (%)",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + 
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Humedad Relativa",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Humedad (%)",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

boxplot(Humedad_Relativa, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de Cajas No. 6: Humedad Relativa",
        xlab = "Humedad (%)",
        border = "darkblue",
        pch = 16)

Cálculo de Indicadores Estadístocos

get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

minimo  <- min(Humedad_Relativa, na.rm = TRUE)
maximo  <- max(Humedad_Relativa, na.rm = TRUE)
media   <- mean(Humedad_Relativa, na.rm = TRUE)
mediana <- median(Humedad_Relativa, na.rm = TRUE)
moda    <- get_moda(Humedad_Relativa)
sd_val  <- sd(Humedad_Relativa, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Humedad_Relativa, na.rm = TRUE)
k_val   <- kurtosis(Humedad_Relativa, na.rm = TRUE)

indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de Humedad Relativa - Antisana")
Indicadores Estadísticos de Humedad Relativa - Antisana
Indicador Valor
Mínimo 0.56
Máximo 0.99
Media 0.90
Mediana 0.94
Moda 0.98
SD (Desv. Est.) 0.11
CV (Coef. Var. %) 12.14
As (Asimetría) -1.18
K (Curtosis) 0.20

Conclusión

El análisis de la Humedad Relativa en el Antisana revela un ambiente con alta saturación hídrica, típica de los ecosistemas de páramo y glaciares altoandinos. La Media y Mediana elevadas confirman la persistencia de condiciones húmedas, mientras que la Asimetría Negativa (común en esta variable al estar topada al 100%) indica que la mayoría de los registros se concentran en valores altos. El CV moderado sugiere una estabilidad relativa en la humedad, aunque los valores atípicos inferiores en el Diagrama de Cajas señalan eventos de sequedad atmosférica extrema que pueden incrementar la sublimación del hielo glaciar.

1.6. Solar

Datos

library(readr)
library(tidyr)
library(ggplot2)
library(e1071)
library(dplyr)

weatherdataANTISANA <- 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.
# Definir la variable de interés: Radiación Solar
Radiacion_Solar <- weatherdataANTISANA$Solar

Tabla de Distribución de Frecuencias

# Aplicar Regla de Sturges
n <- length(Radiacion_Solar)
k <- ceiling(1 + 3.322 * log10(n)) 

# Calcular cortes y límites
cortes <- seq(min(Radiacion_Solar), max(Radiacion_Solar), length.out = k + 1)

# Crear la tabla de frecuencias
tabla_frec <- as.data.frame(table(cut(Radiacion_Solar, breaks = cortes, include.lowest = TRUE)))

# Calcular columnas
tabla_frecuencia <- tabla_frec %>%
  mutate(
    Li = cortes[1:k],
    Ls = cortes[2:(k+1)],
    MC = (Li + Ls) / 2,
    ni = Freq,
    hi_porc = (ni / n) * 100,
    Ni_asc = cumsum(ni),
    Ni_desc = rev(cumsum(rev(ni))),
    Hi_asc_porc = (Ni_asc / n) * 100,
    Hi_desc_porc = (Ni_desc / n) * 100
  ) %>%
  select(Li, Ls, MC, ni, hi_porc, Ni_asc, Ni_desc, Hi_asc_porc, Hi_desc_porc)

print(tabla_frecuencia)
##        Li     Ls      MC ni   hi_porc Ni_asc Ni_desc Hi_asc_porc Hi_desc_porc
## 1   1.260  4.161  2.7105 34  9.289617     34     366    9.289617   100.000000
## 2   4.161  7.062  5.6115 51 13.934426     85     332   23.224044    90.710383
## 3   7.062  9.963  8.5125 50 13.661202    135     281   36.885246    76.775956
## 4   9.963 12.864 11.4135 49 13.387978    184     231   50.273224    63.114754
## 5  12.864 15.765 14.3145 37 10.109290    221     182   60.382514    49.726776
## 6  15.765 18.666 17.2155 21  5.737705    242     145   66.120219    39.617486
## 7  18.666 21.567 20.1165 25  6.830601    267     124   72.950820    33.879781
## 8  21.567 24.468 23.0175 29  7.923497    296      99   80.874317    27.049180
## 9  24.468 27.369 25.9185 45 12.295082    341      70   93.169399    19.125683
## 10 27.369 30.270 28.8195 25  6.830601    366      25  100.000000     6.830601

Histograma Frecuencia Absoluta

ggplot(data = data.frame(Radiacion_Solar), aes(x = Radiacion_Solar)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  labs(title = "Gráfica No. 1: Distribución de Radiación Solar",
       subtitle = "Volcán Antisana (Regla de Sturges)",
       x = "Radiación Solar (W/m² o Ly/day)",
       y = "Cantidad de días") +
  scale_x_continuous(breaks = round(cortes, 1)) +
  theme_minimal()

Histograma Frecuencia Absoluta —————–

ggplot(data = data.frame(Radiacion_Solar), aes(x = Radiacion_Solar)) +
  geom_histogram(breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, n), breaks = seq(0, n, by = 50)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 2: Distribución de Radiación Solar (Escala N)",
       x = "Radiación Solar",
       y = "Cantidad") +
  theme_minimal()

Histograma Porcentaje

ggplot(data = data.frame(Radiacion_Solar), aes(x = Radiacion_Solar)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 3: Distribución Porcentual de Radiación Solar",
       x = "Radiación Solar",
       y = "Porcentaje (%)") +
  theme_minimal()

Histograma Porcentaje ——————

ggplot(data = data.frame(Radiacion_Solar), aes(x = Radiacion_Solar)) +
  geom_histogram(aes(y = after_stat(count)/sum(after_stat(count)) * 100),
                 breaks = cortes, fill = "steelblue", color = "black") + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  scale_x_continuous(breaks = round(cortes, 1)) +
  labs(title = "Gráfica No. 4: Distribución Porcentual de Radiación Solar (Escala 100%)",
       x = "Radiación Solar",
       y = "Porcentaje (%)") +
  theme_minimal()

Grafica de Ojivas

df_ojiva <- tabla_frecuencia %>%
  select(MC, Hi_asc_porc, Hi_desc_porc) %>%
  pivot_longer(cols = c(Hi_asc_porc, Hi_desc_porc), 
               names_to = "Tipo_Ojiva", 
               values_to = "Porcentaje")

ggplot(df_ojiva, aes(x = MC, y = Porcentaje, color = Tipo_Ojiva, group = Tipo_Ojiva)) +
  geom_line(linewidth = 1) + 
  geom_point(size = 2) +
  scale_color_manual(values = c("Hi_asc_porc" = "#2c7bb6", "Hi_desc_porc" = "#d7191c"),
                     labels = c("Ascendente (Menor que)", "Descendente (Mayor que)")) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10)) +
  labs(title = "Gráfica de Ojivas No. 5: Radiación Solar",
       subtitle = "Estación Antisana (4,048 msnm) - Año 2012",
       x = "Radiación Solar",
       y = "Porcentaje Acumulado (%)",
       color = "Interpretación") +
  theme_minimal() +
  theme(legend.position = "bottom")

Diagrama de Cajas

boxplot(Radiacion_Solar, 
        horizontal = TRUE, 
        col = "skyblue", 
        main = "Diagrama de Cajas No. 6: Radiación Solar",
        xlab = "Radiación Solar",
        border = "darkblue",
        pch = 16)

Cálculo de Indicadores Estadístocos

get_moda <- function(x) {
  uniqv <- unique(x)
  uniqv[which.max(tabulate(match(x, uniqv)))]
}

minimo  <- min(Radiacion_Solar, na.rm = TRUE)
maximo  <- max(Radiacion_Solar, na.rm = TRUE)
media   <- mean(Radiacion_Solar, na.rm = TRUE)
mediana <- median(Radiacion_Solar, na.rm = TRUE)
moda    <- get_moda(Radiacion_Solar)
sd_val  <- sd(Radiacion_Solar, na.rm = TRUE)
cv_val  <- (sd_val / media) * 100
as_val  <- skewness(Radiacion_Solar, na.rm = TRUE)
k_val   <- kurtosis(Radiacion_Solar, na.rm = TRUE)

indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda", 
                "SD (Desv. Est.)", "CV (Coef. Var. %)", "As (Asimetría)", "K (Curtosis)"),
  Valor = c(minimo, maximo, media, mediana, moda, 
            sd_val, cv_val, as_val, k_val)
)

knitr::kable(indicadores, digits = 2, caption = "Indicadores Estadísticos de Radiación Solar - Antisana")
Indicadores Estadísticos de Radiación Solar - Antisana
Indicador Valor
Mínimo 1.26
Máximo 30.27
Media 14.44
Mediana 12.66
Moda 7.19
SD (Desv. Est.) 8.33
CV (Coef. Var. %) 57.69
As (Asimetría) 0.30
K (Curtosis) -1.24

Conclusión

El análisis de la Radiación Solar en el volcán Antisana muestra una distribución con una variabilidad importante, típica de una zona donde la cobertura nubosa cambia drásticamente. La Media y la Mediana indican la energía promedio disponible, mientras que una Asimetría marcada y los valores extremos en el Diagrama de Cajas resaltan los días de “cielo despejado” con alta incidencia de radiación de onda corta. Estos picos de radiación, combinados con la baja presión atmosférica de la altitud, son el factor energético primario que impulsa la ablación glaciar en el sitio de estudio.