1 Configuración y Carga de Datos

##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: MARTIN SARMIENTO ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####


#### VARIABLE APTITUD SOLAR REDONDEADA ####
## DATASET ##
setwd("~/R/SOLAR_APTITUDE_ROUNDED")
# Cargar dataset
Datos <- read.csv("Data_Mundial_Final.csv", sep = ";", fileEncoding = "latin1")
# Estructura de los datos
str(Datos)
## 'data.frame':    58771 obs. of  29 variables:
##  $ OBJECTID              : int  127 129 131 132 133 137 138 139 140 145 ...
##  $ code                  : chr  "00127-ARG-P" "00129-ARG-G" "00131-ARG-P" "00132-ARG-P" ...
##  $ plant_name            : chr  "Aconcagua solar farm" "Altiplano 200 Solar Power Plant" "Anchoris solar farm" "Antu Newen solar farm" ...
##  $ country               : chr  "Argentina" "Argentina" "Argentina" "Argentina" ...
##  $ operational_status    : chr  "announced" "operating" "construction" "cancelled - inferred 4 y" ...
##  $ longitude             : chr  "-68,8713" "-66,895798" "-68,915001" "-70,269897" ...
##  $ latitude              : chr  "-32,998501" "-24,1392" "-33,330101" "-37,375801" ...
##  $ elevation             : int  929 4000 937 865 858 570 1612 665 3989 2640 ...
##  $ area                  : chr  "250,337006" "4397290" "645,163025" "241,276001" ...
##  $ size                  : chr  "Small" "Big" "Small" "Small" ...
##  $ slope                 : chr  "0,574179" "1,60257" "0,902748" "1,79147" ...
##  $ slope_type            : chr  "Plano o casi plano" "Plano o casi plano" "Plano o casi plano" "Plano o casi plano" ...
##  $ curvature             : chr  "0,000795" "-0,002781" "0,002781" "-0,002384" ...
##  $ curvature_type        : chr  "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies planas o intermedias" ...
##  $ aspect                : chr  "55,124672" "188,707367" "108,434952" "239,349335" ...
##  $ aspect_type           : chr  "Northeast" "South" "East" "Southwest" ...
##  $ dist_to_road          : chr  "127,2827045" "56014,95403" "335,9280031" "34,00973342" ...
##  $ ambient_temperature   : chr  "12,6" "6,8" "13,1" "11,4" ...
##  $ ghi                   : chr  "6,11" "8,012" "6,119" "6,223" ...
##  $ humidity              : chr  "53,74" "53,74" "53,74" "53,74" ...
##  $ wind_speed            : chr  "3,7789" "7,02062" "3,87037" "6,55962" ...
##  $ wind_direction        : chr  "55,099998" "55,099998" "55,099998" "55,099998" ...
##  $ dt_wind               : chr  "Northeast" "Northeast" "Northeast" "Northeast" ...
##  $ solar_aptitude        : chr  "0,746197" "0,8" "0,595309" "0,657269" ...
##  $ solar_aptitude_rounded: int  7 8 6 7 7 7 8 7 8 6 ...
##  $ solar_aptittude_class : chr  "Alta" "Alta" "Media" "Alta" ...
##  $ capacity              : chr  "25" "101" "180" "20" ...
##  $ optimal_tilt          : chr  "31" "26" "31" "33" ...
##  $ pv_potential          : chr  "4,983" "6,389" "4,969" "5,002" ...
# Cargamos las librerias
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(gt)
library(e1071)

2 Tabla de Distribución de Frecuencias

# Extraer variable
solar_aptitude_rounded <- na.omit(Datos$solar_aptitude_rounded)

# Creamos la tabla base de conteos 
TDF_solar_aptitude_rounded <- table(solar_aptitude_rounded)
# Convertir a Dataframe
tabla_solar <- as.data.frame(TDF_solar_aptitude_rounded)
colnames(tabla_solar) <- c("Variable", "Freq") 

# Cálculo de Frecuencia Relativa
hi_solar_raw <- (tabla_solar$Freq / sum(tabla_solar$Freq)) * 100
tabla_solar$hi <- round(hi_solar_raw, 2)

# Cálculo de Frecuencias Acumuladas (Ni y Hi)
Niasc_solar <- cumsum(tabla_solar$Freq)


Hiasc_solar <- round(cumsum(hi_solar_raw), 2)
Hiasc_solar[length(Hiasc_solar)] <- 100.00

# Descendentes
Nidsc_solar <- rev(cumsum(rev(tabla_solar$Freq)))
Hidsc_solar <- round(rev(cumsum(rev(hi_solar_raw))), 2)
Hidsc_solar[1] <- 100.00

# Crear Dataframe 
tabla_final <- data.frame(
  Aptitud = as.numeric(as.character(tabla_solar$Variable)),
  Frecuencia = tabla_solar$Freq,
  Porcentaje = tabla_solar$hi,
  Niasc = Niasc_solar,
  Hiasc = Hiasc_solar, 
  Nidsc = Nidsc_solar,
  Hidsc = Hidsc_solar 
)

# Visualización con gt
tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias de la Aptitud Solar de las Plantas Solares**"),
  ) %>%
  cols_label(
    Aptitud = "Aptitud Solar",
    Frecuencia = "Frec. Abs (ni)",
    Porcentaje = "Frec. Rel (%)",
    Niasc = "Ni (Asc)",
    Hiasc = "Hi (Asc)",
    Nidsc = "Ni (Desc)",
    Hidsc = "Hi (Desc)"
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0")
Tabla N°1 de Distribución de Frecuencias de la Aptitud Solar de las Plantas Solares
Aptitud Solar Frec. Abs (ni) Frec. Rel (%) Ni (Asc) Hi (Asc) Ni (Desc) Hi (Desc)
0 71 0.12 71 0.12 58771 100.00
1 185 0.31 256 0.44 58700 99.88
2 450 0.77 706 1.20 58515 99.56
3 740 1.26 1446 2.46 58065 98.80
4 818 1.39 2264 3.85 57325 97.54
5 6333 10.78 8597 14.63 56507 96.15
6 12202 20.76 20799 35.39 50174 85.37
7 19304 32.85 40103 68.24 37972 64.61
8 13163 22.40 53266 90.63 18668 31.76
9 5505 9.37 58771 100.00 5505 9.37

3 Análisis Gráfico

3.1 Diagramas de Barras de Cantidad

par(mar = c(6, 7, 5, 2))
barplot(tabla_final$Frecuencia,
        names.arg = tabla_final$Aptitud,
        main = "",
        xlab = "",
        ylab = "",
        col = "#CD6600",
        ylim = c(0, max(tabla_final$Frecuencia) * 1.2),
        las = 1)
mtext("Cantidad", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Aptitud Solar", side = 1, line = 4)

mtext("Gráfica N°1: Distribución de Cantidad de Plantas Solares por Aptitud Solar Redondeada", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 0.8, 
      font = 2)

par(mar = c(6, 7, 5, 2))
barplot(tabla_final$Frecuencia,
        main = "",
        xlab = "",
        ylab = "",
        names.arg = tabla_final$Aptitud,
        col = "#CD6600",
        ylim = c(0, 58771),
        las = 1)
mtext("Cantidad", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Aptitud Solar", side = 1, line = 4)

mtext("Gráfica N°2: Distribución de Cantidad de Plantas Solares por Aptitud Solar Redondeada", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 0.8, 
      font = 2)

3.2 Diagramas de Barras Porcentual

par(mar = c(8, 5, 5, 2))
bp3 <- barplot(tabla_final$Porcentaje,
               main = "", 
               xlab = "",
               ylab = "Porcentaje (%)",
               col = "#CD6600",
               ylim = c(0, max(tabla_final$Porcentaje) * 1.3),
               names.arg = tabla_final$Aptitud,
               las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

mtext("Gráfica N°3: Distribución Porcentual de Plantas Solares por Aptitud Solar Redondeada", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 0.9, 
      font = 2)

text(x = bp3, 
     y = tabla_final$Porcentaje, 
     labels = paste0(round(tabla_final$Porcentaje, 1), "%"), 
     pos = 3, 
     cex = 0.8)

par(mar = c(8, 5, 5, 2))
bp4 <- barplot(tabla_final$Porcentaje,
               main = "", 
               xlab = "",
               ylab = "Porcentaje (%)",
               col = "#CD6600",
               names.arg = tabla_final$Aptitud,
               ylim = c(0, 110), 
               las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

mtext("Gráfica N°4: Distribución Porcentual de Plantas Solares por Aptitud Solar Redondeada", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 0.9, 
      font = 2)

text(x = bp4, 
     y = tabla_final$Porcentaje, 
     labels = paste0(round(tabla_final$Porcentaje, 1), "%"), 
     pos = 3, 
     cex = 0.8)

3.3 Diagrama de Cajas (Boxplot)

boxplot(solar_aptitude_rounded,
        horizontal = TRUE,
        col = "#CD6600",
        xlab = "Aptitud Solar",
        main = "Gráfica N°5: Distribución de la Aptitud Solar Redondeada en las Plantas Solares",
        cex.main = 0.9)

3.4 Ojivas

par(mar = c(5, 5, 6, 11), xpd = TRUE)

# Coordenadas
x_asc <- tabla_final$Aptitud
x_desc <- tabla_final$Aptitud
y_asc <- tabla_final$Niasc
y_desc <- tabla_final$Nidsc

# 1. Dibujar la Ascendente 
plot(x_asc, y_asc,
     type = "b", 
     main = "",
     xlab = "Aptitud Solar",
     ylab = "Frecuencia Acumulada",
     col = "black",
     pch = 19, 
     xlim = c(min(x_asc), max(x_asc)), 
     ylim = c(0, sum(tabla_final$Frecuencia)))

# 2. Agregar la Descendente 
lines(x_desc, y_desc, col = "orange", type = "b", pch = 19)

grid()
mtext("Gráfica N°6: Ojivas Ascendentes y Descendentes de la\nDistribución de la Aptitud Solar Redondeada", 
      side = 3,      
      line = 3, 
      adj = 0.5,     
      cex = 0.9,     
      font = 2)

legend("left", 
       legend = c("Ascendente", "Descendente"), 
       col = c("black", "orange"), 
       lty = 1, 
       pch = 1, 
       cex = 0.6, 
       inset = c(0.05, 0.05),
       bty = "n")

4 Indicadores Estadísticos

Variable <- as.numeric(as.character(na.omit(Datos$solar_aptitude_rounded)))

## INDICADORES DE TENDENCIA CENTRAL
# Media aritmética
media <- round(mean(Variable), 2)

# Mediana
mediana <- round(median(Variable), 2)

# Moda
max_frecuencia <- max(tabla_final$Frecuencia)
moda_vals <- tabla_final$Aptitud[tabla_final$Frecuencia == max_frecuencia]
moda_txt <- paste(round(moda_vals, 2), collapse = ", ")

## INDICADORES DE DISPERSIÓN
# Varianza
varianza <- var(Variable)

# Desviación Estándar
sd_val <- sd(Variable)

# Coeficiente de Variación
cv <- round((sd_val / abs(media)) * 100, 2)

## INDICADORES DE FORMA
# Coeficiente de Asimetría
asimetria <- skewness(Variable, type = 2)

# Curtosis
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)

if(num_outliers > 0){
  rango_outliers <- paste0(num_outliers, " [", min(outliers_data), "; ", max(outliers_data), "]")
} else {
  rango_outliers <- "0 [Sin Outliers]"
}

tabla_indicadores <- data.frame(
 "Variable" = c("Aptitud Solar"),
 "Rango_MinMax" = paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]"),
 "X" = c(media),
 "Me" = c(mediana),
 "Mo" = c(moda_txt),
 "V" = c(varianza),
 "Sd" = c(sd_val),
 "Cv" = c(cv),
 "As" = c(asimetria),
 "K" = c(curtosis),
 "Outliers" = rango_outliers)

tabla_conclusiones_gt <- tabla_indicadores %>%
 gt() %>%
 tab_header(title = md("**Tabla N°2 de Conclusiones de Aptitud Solar Redondeada de las Plantas Solares**")) %>%
 tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
 cols_label(
  Variable = "Variable",
  Rango_MinMax = "Rango",
  X = "Media (X)",
  Me = "Mediana (Me)",
  Mo = "Moda (Mo)",
  V = "Varianza (V)",
  Sd = "Desv. Est. (Sd)",
  Cv = "C.V. (%)",
  As = "Asimetría (As)",
  K = "Curtosis (K)",
  Outliers = "Outliers [Intervalo]"
 ) %>%
 tab_options(
  heading.title.font.size = px(16),
  column_labels.background.color = "#F0F0F0")

tabla_conclusiones_gt
Tabla N°2 de Conclusiones de Aptitud Solar Redondeada de las Plantas Solares
Variable Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K) Outliers [Intervalo]
Aptitud Solar [0; 9] 6.83 7 7 1.899235 1.378127 20.18 -0.9010812 1.946554 706 [0; 2]
Autor: Martin Sarmiento

5 Conclusiones

La variable “Aptitud Solar” fluctúa entre 0 y 9 y sus valores se encuentran alrededor de 7, con una desviación estándar de 1.378127, siendo una variable homogénea, cuyos valores se concentran en la parte media alta de la variable con la agregación de valores atípicos de 706 outliers; por todo lo anterior, el comportamiento de la variable es bueno.