##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: LEONARDO RUIZ ####
### CARRERA: INGENIERÍA EN PETROLEOS #####


##1. Carga de Datos
library(readxl)
Datos <- read_xlsx("C:/Users/LEO/Documents/Antisana/weatherdataANTISANA.csv.xlsx")
str(Datos)
## tibble [366 × 10] (S3: tbl_df/tbl/data.frame)
##  $ Date             : POSIXct[1:366], format: "2012-01-01" "2012-01-02" ...
##  $ 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 ...
##2.Extraer la variable continua 
Solar <- Datos$Solar
Solar <- as.numeric(Solar)
Solar <- na.omit(Solar)

##3. Cálculo de intervalos (sturges)
R <- max(Solar) - min(Solar)
k <- floor(1 + (3.3 * log10(length(Solar))))
A <- R / k

liminf <- seq(from = min(Solar), 
              by = A, 
              length.out = k)

limsup <- liminf + A
limsup[k] <- max(Solar)

MC <- (liminf + limsup) / 2

##4.Tabla de distribución de frecuencias
#4.1 Frecuencia absoluta
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(Solar >= liminf[i] & Solar <= limsup[i])
  } else {
    ni[i] <- sum(Solar >= liminf[i] & Solar < limsup[i])
  }
}

#4.2 Frecuencias relativas y acumuladas
hi <- (ni / length(Solar)) * 100
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- cumsum(hi)
Hidsc <- rev(cumsum(rev(hi)))

#4.3 Tabla de frecuencias
tabla_Solar <- data.frame(
  Límite_Inferior = round(liminf, 2),
  Límite_Superior = round(limsup, 2),
  Marca_Clase = round(MC, 2),
  ni = ni,
  hi_porc = round(hi, 2),
  Ni_asc = Niasc,
  Ni_dsc = Nidsc,
  Hiasc_porc = round(Hiasc, 2),
  Hidsc_porc = round(Hidsc, 2))

# TABLA 1 CON GT()
library(gt)
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(e1071)
tabla_Solar %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 1: Distribución de Frecuencias de Radiacción Solar**"),
    subtitle = md("Antisana | Método Sturges")  
  ) %>%
  tab_source_note(
    source_note = md("**Antisana**")
  ) %>%  
  cols_label(
    Límite_Inferior = "L. Inferior",
    Límite_Superior = "L. Superior", 
    Marca_Clase = "Marca Clase",
    hi_porc = "hi %",
    Ni_asc = "Ni Asc.",
    Ni_dsc = "Ni Desc.",
    Hiasc_porc = "Hi Asc. %",
    Hidsc_porc = "Hi Desc. %"
  ) %>%
  fmt_number(
    columns = c(Límite_Inferior, Límite_Superior, Marca_Clase),
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(hi_porc, Hiasc_porc, Hidsc_porc),
    decimals = 2,
    pattern = "{x}%"
  )
Tabla 1: Distribución de Frecuencias de Radiacción Solar
Antisana | Método Sturges
L. Inferior L. Superior Marca Clase ni hi % Ni Asc. Ni Desc. Hi Asc. % Hi Desc. %
1.26 4.48 2.87 40 10.93% 40 366 10.93% 100.00%
4.48 7.71 6.10 57 15.57% 97 326 26.50% 89.07%
7.71 10.93 9.32 55 15.03% 152 269 41.53% 73.50%
10.93 14.15 12.54 55 15.03% 207 214 56.56% 58.47%
14.15 17.38 15.76 30 8.20% 237 159 64.75% 43.44%
17.38 20.60 18.99 17 4.64% 254 129 69.40% 35.25%
20.60 23.82 22.21 35 9.56% 289 112 78.96% 30.60%
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.00% 7.92%
Antisana
##5. Gráficos
#5.1 Histograma
hist(Solar,
     main = "Gráfica No.1: Distribución de Radiacción Solar",
     breaks = seq(min(Solar), max(Solar) + A, by = A),
     xlab = "Solar",
     ylab = "Cantidad",
     col = "lightblue",
     border = "darkblue",
     xaxt = "n")  

# Eje X personalizado con MARCAS DE CLASE
axis(1, at = MC,  # Posiciones: Marcas de Clase
     labels = round(MC, 2),  # Etiquetas: valores redondeados
     las = 1)  # Etiquetas horizontales

#5.2 Ojivas
x_asc <- c(min(liminf), limsup)
y_asc <- c(0, Niasc)
x_desc <- c(liminf, max(limsup))
y_desc <- c(Nidsc, 0)
x_range <- range(c(x_asc, x_desc))
y_range <- c(0, max(c(y_asc, y_desc)))

plot(x_asc, y_asc, type = "o", col = "skyblue",
     main = "Gráfica No.2: Ojivas Ascendente y Descendente de Radiacción Solar",
     xlab = "Solar",
     ylab = "Frecuencia acumulada",
     xlim = x_range, ylim = y_range,
     xaxt = "n", pch = 16, lwd = 2)

axis(1, at = pretty(x_range), 
     labels = format(pretty(x_range), scientific = FALSE))
axis(2, at = pretty(y_range))

lines(x_desc, y_desc, type = "o", col = "steelblue4", pch = 17, lwd = 2)

legend("right", 
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("skyblue", "steelblue4"), 
       pch = c(16, 17), 
       lty = 1, 
       lwd = 2,
       cex = 0.8)

#5.3 Diagramas de cajas
boxplot(Solar, 
        horizontal = TRUE, 
        col = "steelblue",
        main = "Gráfica No.3: Distribución de Radiacción Solar",
        xlab = "Solar",
        xaxt = "n")

axis(1, at = pretty(Solar), 
     labels = format(pretty(Solar), scientific = FALSE))

# Outliers

outliers <- boxplot.stats(Solar)$out
cat("\nNúmero de outliers:", length(outliers), "\n")
## 
## Número de outliers: 0
if(length(outliers) > 0) {
  cat("Outliers:", round(outliers, 2), "\n")
}

##6. Indicadores estadísticos 
get_mode_interval <- function() {
  idx <- which.max(ni)
  return(paste0("[", round(liminf[idx], 2), ", ", round(limsup[idx], 2), "]"))
}

media <- mean(Solar)
mediana <- median(Solar)
moda_intervalo <- get_mode_interval()
desv <- sd(Solar)
varianza <- var(Solar)
cv <- (desv / media) * 100
asim <- skewness(Solar)
curt <- kurtosis(Solar)     

# CREAR DATA.FRAME DE INDICADORES
indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda (intervalo)",
                "Desviación Estándar", "Varianza", "Coef. Variación (%)",
                "Asimetría", "Curtosis", "N° Outliers"),
  Valor = c(round(min(Solar), 2), round(max(Solar), 2),
            round(media, 2), round(mediana, 2), moda_intervalo,
            round(desv, 2), round(varianza, 2), round(cv, 2),
            round(asim, 2), round(curt, 2), length(outliers))
)

# TABLA 2 CON GT()
indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 2: Indicadores Estadísticos de Radiacción Solar**")
  ) %>%
  tab_source_note(
    source_note = md("**Antisana**")
  ) %>%
  cols_label(
    Indicador = "Indicador",
    Valor = "Valor"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Indicador)
  )
Tabla 2: Indicadores Estadísticos de Radiacción Solar
Indicador Valor
Mínimo 1.26
Máximo 30.27
Media 14.44
Mediana 12.66
Moda (intervalo) [4.48, 7.71]
Desviación Estándar 8.33
Varianza 69.36
Coef. Variación (%) 57.69
Asimetría 0.3
Curtosis -1.24
N° Outliers 0
Antisana
##7. Conclusión 
#La variable Solar fluctúa entre 1.26  y 30.27  y sus valores están en torno a los 12.66  (media = 14.44 ), con una desviación estándar de 8.33 siendo un conjunto de valores extremadamente heterogéneos  (CV = 57.69%) cuyos valores se concentran en el intervalo modal [4.48, 7.71]  y con distribución platicúrtica (K = -1.24) y sesgo leve hacia la derecha (As = 0.3) y no tiene valores atípicos identificados, por lo tanto el comportamiento de la variable indica un proceso mayoritariamente inestable con mediciones consistentes en el rango principal, aunque con presencia significativa de lecturas extremas que requieren análisis particular.