El presente informe estadístico analiza la variable Radiación Solar registrada en la estación meteorológica del Antisana. Esta variable cuantifica la energía recibida por unidad de superficie, siendo un indicador directo de la nubosidad y el potencial energético en la zona.
# 1. LIBRERÍAS Y CARGA DE DATOS
library(readxl)
library(dplyr)
library(gt)
library(e1071)
# Carga de datos
Datos_Brutos <- read.csv("C:\\Users\\User\\Downloads\\datos_clima.antisana.csv", check.names = FALSE)
colnames(Datos_Brutos) <- trimws(colnames(Datos_Brutos))
# Selección y limpieza
Datos <- Datos_Brutos %>%
select(any_of(c("Date", "Solar"))) %>%
mutate(Variable_Analisis = as.numeric(gsub(",", ".", as.character(`Solar`))))
Variable <- na.omit(Datos$Variable_Analisis)
Variable <- Variable[Variable >= 0 & Variable < 50]
if(length(Variable) == 0) {
stop("ERROR: No hay datos válidos en la variable seleccionada.")
}
# 2. CÁLCULOS MATEMÁTICOS PARA LA TABLA
N <- length(Variable)
min_val <- min(Variable)
max_val <- max(Variable)
Rango <- max_val - min_val
K <- floor(1 + 3.322 * log10(N))
Amplitud <- Rango / K
breaks_table <- seq(min_val, max_val, length.out = K + 1)
breaks_table[length(breaks_table)] <- max_val + 0.0001
lim_inf_table <- breaks_table[1:K]
lim_sup_table <- breaks_table[2:(K+1)]
MC <- (lim_inf_table + lim_sup_table) / 2
ni <- numeric(K)
for (i in 1:K) {
if (i < K) {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable < lim_sup_table[i]])
} else {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable <= lim_sup_table[i]])
}
}
hi <- (ni / sum(ni)) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
TDF_Solar <- data.frame(
Li = round(lim_inf_table, 2),
Ls = round(lim_sup_table, 2),
MC = round(MC, 2),
ni = ni,
hi = round(hi, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = round(Hi_asc, 2),
Hi_desc = round(Hi_desc, 2)
)A continuación se presenta la tabla de distribución de frecuencias obtenida para la radiación solar global.
# Totales
totales <- c("TOTAL", "-", "-", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char <- TDF_Solar %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)
TDF_Final %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS - ANTISANA**"),
subtitle = md("Variable: **Radiación Solar (MJ/m²)**")
) %>%
tab_source_note(source_note = "Fuente: Datos Meteorológicos Antisana") %>%
cols_label(
Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca Clase (Xi)",
ni = "ni", hi = "hi (%)",
Ni_asc = "Ni (Asc)", Ni_desc = "Ni (Desc)",
Hi_asc = "Hi (Asc)", Hi_desc = "Hi (Desc)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6)
)| DISTRIBUCIÓN DE FRECUENCIAS - ANTISANA | ||||||||
| Variable: Radiación Solar (MJ/m²) | ||||||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) | Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) |
|---|---|---|---|---|---|---|---|---|
| 1.26 | 4.48 | 2.87 | 40 | 10.93 | 40 | 366 | 10.93 | 100 |
| 4.48 | 7.71 | 6.1 | 57 | 15.57 | 97 | 326 | 26.5 | 89.07 |
| 7.71 | 10.93 | 9.32 | 55 | 15.03 | 152 | 269 | 41.53 | 73.5 |
| 10.93 | 14.15 | 12.54 | 55 | 15.03 | 207 | 214 | 56.56 | 58.47 |
| 14.15 | 17.38 | 15.77 | 30 | 8.2 | 237 | 159 | 64.75 | 43.44 |
| 17.38 | 20.6 | 18.99 | 17 | 4.64 | 254 | 129 | 69.4 | 35.25 |
| 20.6 | 23.82 | 22.21 | 35 | 9.56 | 289 | 112 | 78.96 | 30.6 |
| 23.82 | 27.05 | 25.44 | 48 | 13.11 | 337 | 77 | 92.08 | 21.04 |
| 27.05 | 30.27 | 28.66 | 29 | 7.92 | 366 | 29 | 100 | 7.92 |
| TOTAL | - | - | 366 | 100 | - | - | - | - |
| Fuente: Datos Meteorológicos Antisana | ||||||||
Esta sección presenta la visualización de la distribución de la energía solar recibida.
col_gris_azulado <- "#5D6D7E"
col_ejes <- "#2E4053"
h_base <- hist(Variable, breaks = "Sturges", plot = FALSE)
# GRÁFICO 1: Histograma Absoluto (Local)
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica No.1: Distribución de Radiación Solar en Antisana",
xlab = "Radiación Solar (MJ/m²)",
ylab = "Frecuencia Absoluta (Días)",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted") # GRÁFICO 2: Histograma Global
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica N°2: Distribución Global de Radiación Solar",
xlab = "Radiación Solar (MJ/m²)",
ylab = "Total Días",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, sum(h_base$counts)))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
h_porc$density <- h_porc$counts
# GRÁFICO 3: Porcentajes (Local)
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica N°3: Distribución Porcentual de Radiación Solar",
xlab = "Radiación Solar (MJ/m²)",
ylab = "Porcentaje (%)",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, max(h_porc$counts)*1.2))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted") # GRÁFICO 4: Global Porcentual
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica No.4: Distribución Porcentual Global (Radiación)",
xlab = "Radiación Solar (MJ/m²)",
ylab = "% del Total",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, 100))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), scientific = FALSE), las = 2, cex.axis = 0.7)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
axis(2)
abline(h=seq(0,100,20), col="#D7DBDD", lty="dotted")# GRÁFICO 5: Boxplot
par(mar = c(5, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_gris_azulado,
main = "Gráfica No.5: Diagrama de Caja de Radiación Solar",
xlab = "Radiación Solar (MJ/m²)", outline = TRUE, outpch = 19, outcol = "#C0392B",
boxwex = 0.5, frame.plot = FALSE, xaxt = "n")
eje_x_detallado <- pretty(Variable, n = 20)
axis(1, at = eje_x_detallado, labels = format(eje_x_detallado, scientific = FALSE), cex.axis=0.7, las=2)
grid(nx=NULL, ny=NA, col="lightgray", lty="dotted")# GRÁFICO 6: Ojivas
par(mar = c(5, 5, 4, 8), xpd = TRUE)
x_asc <- c(min(breaks_table), breaks_table[2:length(breaks_table)])
y_asc <- c(0, Ni_asc)
x_desc <- c(min(breaks_table), breaks_table[2:length(breaks_table)])
y_desc <- c(Ni_desc, 0)
x_range <- range(c(x_asc, x_desc))
y_range <- c(0, max(c(y_asc, y_desc)))
col_azul <- "#2E4053"
col_rojo <- "#C0392B"
plot(x_asc, y_asc, type = "o", col = col_azul, lwd=2, pch=19,
main = "Gráfica No.6: Ojivas Ascendente y Descendente de Radiación",
xlab = "Radiación Solar (MJ/m²)", ylab = "Frecuencia acumulada",
xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE, cex.main=0.95)
axis(1, at = round(breaks_table,1), labels = format(round(breaks_table,1), scientific = FALSE), las=2, cex.axis=0.6)
axis(2, at = pretty(y_asc), labels = format(pretty(y_asc), scientific = FALSE))
lines(x_asc, y_desc, type = "o", col = col_rojo, lwd=2, pch=19)
legend("right", legend = c("Ascendente", "Descendente"),
col = c(col_azul, col_rojo), lty = 1, pch = 19, cex = 0.7, lwd=2,
inset = c(-0.15, 0), bty="n")
grid()# CÁLCULO DE INDICADORES
media_val <- mean(Variable)
mediana_val <- median(Variable)
freq_max <- max(TDF_Solar$ni)
modas_calc <- TDF_Solar$MC[TDF_Solar$ni == freq_max]
moda_txt <- paste(round(modas_calc, 2), collapse = ", ")
rango_txt <- paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]")
varianza_val <- var(Variable)
sd_val <- sd(Variable)
cv_val <- (sd_val / abs(media_val)) * 100
asimetria_val <- skewness(Variable, type = 2)
curtosis_val <- kurtosis(Variable, type = 2)
vals_atipicos <- boxplot.stats(Variable)$out
num_atipicos <- length(vals_atipicos)
status_atipicos <- if(num_atipicos > 0) {
min_out <- min(vals_atipicos)
max_out <- max(vals_atipicos)
paste0(num_atipicos, " [", round(min_out, 2), "; ", round(max_out, 2), "]")
} else {
"0 (Sin atípicos)"
}
df_resumen <- data.frame(
"Variable" = "Radiación Solar (MJ/m²)",
"Rango" = rango_txt,
"Media" = media_val,
"Mediana" = mediana_val,
"Moda" = moda_txt,
"Varianza" = varianza_val,
"Desv_Std" = sd_val,
"CV_Porc" = cv_val,
"Asimetria" = asimetria_val,
"Curtosis" = curtosis_val,
"Atipicos" = status_atipicos
)
df_resumen %>%
gt() %>%
tab_header(
title = md("**CONCLUSIONES Y ESTADÍSTICOS**"),
subtitle = "Resumen de Indicadores - Estación Antisana"
) %>%
tab_source_note(source_note = "Autor: Grupo 3") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
fmt_number(columns = c(Asimetria), decimals = 4) %>%
cols_label(
Variable = "Variable",
Rango = "Rango Total",
Media = "Media (X̄)",
Mediana = "Mediana (Me)",
Moda = "Moda (Mo)",
Varianza = "Varianza (S²)",
Desv_Std = "Desv. Est. (S)",
CV_Porc = "C.V. (%)",
Asimetria = "Asimetría (As)",
Curtosis = "Curtosis (K)",
Atipicos = "Outliers [Intervalo]"
) %>%
tab_options(
column_labels.background.color = "#2E4053",
table.border.top.color = "black",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(8)
) %>%
tab_style(
style = list(cell_text(weight = "bold", color = "white")),
locations = cells_column_labels()
)| CONCLUSIONES Y ESTADÍSTICOS | ||||||||||
| Resumen de Indicadores - Estación Antisana | ||||||||||
| Variable | Rango Total | Media (X̄) | Mediana (Me) | Moda (Mo) | Varianza (S²) | Desv. Est. (S) | C.V. (%) | Asimetría (As) | Curtosis (K) | Outliers [Intervalo] |
|---|---|---|---|---|---|---|---|---|---|---|
| Radiación Solar (MJ/m²) | [1.26; 30.27] | 14.44 | 12.66 | 6.1 | 69.36 | 8.33 | 57.69 | 0.2996 | −1.23 | 0 (Sin atípicos) |
| Autor: Grupo 3 | ||||||||||
min_txt <- format(min(Variable), scientific = FALSE)
max_txt <- format(max(Variable), scientific = FALSE)
asimetria_val <- skewness(Variable, type = 2)
if (abs(asimetria_val) > 0.5) {
centro_valor <- format(round(median(Variable), 2), scientific = FALSE)
} else {
centro_valor <- format(round(mean(Variable), 2), scientific = FALSE)
}
sd_txt <- format(round(sd(Variable), 4), scientific = FALSE)
cv_calc <- (sd(Variable) / abs(mean(Variable))) * 100
tipo_homogeneidad <- if(cv_calc > 30) "heterogénea" else "homogénea"
donde_se_concentra <- if(asimetria_val > 0) "parte media baja" else "parte media alta"
outliers_lista <- boxplot.stats(Variable)$out
num_outliers <- length(outliers_lista)
texto_outliers <- if(num_outliers > 0) {
paste0("con la presencia de **", num_outliers, " valores atípicos**")
} else {
"sin valores atípicos significativos"
}
umbral_radiacion <- 12
juicio_solar <- if(median(Variable) < umbral_radiacion) {
"moderado a bajo, lo que sugiere una prevalencia de días con cobertura nubosa significativa que atenúa la incidencia solar directa, protegiendo parcialmente el suelo de la evapotranspiración extrema"
} else {
"alto y significativo, indicando la predominancia de cielos despejados que maximizan la entrada de energía al sistema, elevando potencialmente los índices UV y la tasa de derretimiento superficial diurno"
}
cat(paste0(
"## Análisis Descriptivo y de Radiación\n\n",
"La variable **Radiación Solar** fluctúa entre **", min_txt, "** y **", max_txt, "** MJ/m², ",
"y sus valores se encuentran alrededor de **", centro_valor, "** MJ/m². ",
"Presenta una desviación estándar de **", sd_txt, "**, siendo una variable **", tipo_homogeneidad, "** ",
"(CV: ", round(cv_calc, 2), "%), ",
"cuyos valores se concentran en la **", donde_se_concentra, "** de la distribución ",
texto_outliers, "; ",
"**por todo lo anterior, el ingreso energético solar se considera ", juicio_solar, ".**"
))La variable Radiación Solar fluctúa entre 1.26 y 30.27 MJ/m², y sus valores se encuentran alrededor de 14.44 MJ/m². Presenta una desviación estándar de 8.3282, siendo una variable heterogénea (CV: 57.69%), cuyos valores se concentran en la parte media baja de la distribución sin valores atípicos significativos; por todo lo anterior, el ingreso energético solar se considera alto y significativo, indicando la predominancia de cielos despejados que maximizan la entrada de energía al sistema, elevando potencialmente los índices UV y la tasa de derretimiento superficial diurno.