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("DataSet_prov.csv", sep = ";", fileEncoding = "latin1")
# Estructura de los datos
str(Datos)
## 'data.frame':    5075 obs. of  30 variables:
##  $ FID_                  : int  0 2 3 4 5 6 10 11 12 13 ...
##  $ OBJECTID              : int  127 129 130 131 132 133 137 138 139 140 ...
##  $ code                  : chr  "00127-ARG-P" "00129-ARG-G" "00130-ARG-P" "00131-ARG-P" ...
##  $ plant_name            : chr  "Aconcagua solar farm" "Altiplano 200 Solar Power Plant" "Altiplano 200 Solar Power Plant" "Anchoris solar farm" ...
##  $ country               : chr  "Argentina" "Argentina" "Argentina" "Argentina" ...
##  $ operational_status    : chr  "announced" "operating" "operating" "construction" ...
##  $ longitude             : chr  "-68,8713" "-66,895798" "-66,926102" "-68,915001" ...
##  $ latitude              : chr  "-32,998501" "-24,1392" "-24,073999" "-33,330101" ...
##  $ elevation             : int  929 4000 4000 937 865 858 570 1612 665 3989 ...
##  $ area                  : chr  "250,337006" "4397290" "5774,399902" "645,163025" ...
##  $ size                  : chr  "Pequeña" "Grande" "Pequeña" "Pequeña" ...
##  $ slope                 : chr  "0,574179" "1,60257" "6,24265" "0,902748" ...
##  $ slope_type            : chr  "Plano o casi plano" "Plano o casi plano" "Moderado" "Plano o casi plano" ...
##  $ curvature             : chr  "0,000795" "-0,002781" "-0,043699" "0,002781" ...
##  $ curvature_type        : chr  "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies cóncavas / Valles" "Superficies planas o intermedias" ...
##  $ aspect                : chr  "55,124672" "188,707367" "270,913513" "108,434952" ...
##  $ aspect_type           : chr  "Northeast" "South" "West" "East" ...
##  $ dist_to_road          : chr  "127,2827045" "56014,95403" "52696,78572" "335,9280031" ...
##  $ ambient_temperature   : chr  "12,6" "6,8" "6,8" "13,1" ...
##  $ ghi                   : chr  "6,11" "8,012" "7,878" "6,119" ...
##  $ humidity              : chr  "53,74" "53,74" "53,74" "53,74" ...
##  $ wind_speed            : chr  "3,7789" "7,02062" "8,32836" "3,87037" ...
##  $ 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,726996" "0,595309" ...
##  $ solar_aptitude_rounded: int  7 8 7 6 7 7 7 8 7 8 ...
##  $ solar_aptittude_class : chr  "Alta" "Alta" "Alta" "Media" ...
##  $ capacity              : chr  "25" "101" "107" "180" ...
##  $ optimal_tilt          : int  31 26 26 31 33 30 31 29 31 27 ...
##  $ pv_potential          : chr  "4,983" "6,389" "6,392" "4,969" ...
# 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)
hi_solar <- (tabla_solar$Freq / sum(tabla_solar$Freq)) * 100
tabla_solar$hi <- round(hi_solar, 2)

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

# Descendentes
Nidsc_solar <- rev(cumsum(rev(tabla_solar$Freq)))
Hidsc_solar <- rev(cumsum(rev(tabla_solar$hi)))

# 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 = round(Hiasc_solar, 2),
  Nidsc = Nidsc_solar,
  Hidsc = round(Hidsc_solar, 2)
)

# Visualización de Tabla con librería 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)
5 3 0.06 3 0.06 5075 100.00
6 1912 37.67 1915 37.73 5072 99.94
7 2531 49.87 4446 87.60 3160 62.27
8 581 11.45 5027 99.05 629 12.40
9 47 0.93 5074 99.98 48 0.95
10 1 0.02 5075 100.00 1 0.02

3 Análisis Gráfico

3.1 Diagramas de Barras de Cantidad

par(mar = c(8, 5, 4, 2))
barplot(tabla_final$Frecuencia,
        names.arg = tabla_final$Aptitud,
        main = "Gráfica N°1: Distribución de Cantidad de Plantas Solares por Aptitud Solar Redondeada",
        cex.main = 0.9,
        xlab = "",
        ylab = "Cantidad",
        col = "#CD6600",
        las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

par(mar = c(8, 5, 4, 2))
barplot(tabla_final$Frecuencia,
        main = "Gráfica N°2: Distribución de Cantidad de Plantas Solares por Aptitud Solar Redondeada",
        xlab = "",
        ylab = "Cantidad",
        names.arg = tabla_final$Aptitud,
        col = "#CD6600",
        cex.main = 0.9,
        ylim = c(0, sum(tabla_final$Frecuencia)),
        las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

3.2 Diagramas de Barras Porcentual

par(mar = c(8, 5, 4, 2))
barplot(tabla_final$Porcentaje,
        main = "Gráfica N°3: Distribución Porcentual de Plantas Solares por Aptitud Solar Redondeada",
        xlab = "",
        ylab = "Porcentaje (%)",
        col = "#CD6600",
        names.arg = tabla_final$Aptitud,
        cex.main = 0.9,
        ylim = c(0, max(tabla_final$Porcentaje) * 1.1),
        las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

par(mar = c(8, 5, 4, 2))
barplot(tabla_final$Porcentaje,
        main = "Gráfica N°4: Distribución Porcentual de Plantas Solares por Aptitud Solar Redondeada",
        xlab = "",
        ylab = "Porcentaje (%)",
        col = "#CD6600",
        cex.main = 0.9,
        names.arg = tabla_final$Aptitud,
        ylim = c(0, 100),
        las = 1)
mtext("Aptitud Solar", side = 1, line = 4)

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, 4, 10), 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 = "Gráfica N°6: Ojivas Ascendentes y Descendentes de la Distribución de la Altitud Solar Redondeada en las Plantas Solares",
     cex.main = 0.6,
     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()
legend("right", 
       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
outliers_data <- boxplot.stats(Variable)$out

if(length(outliers_data) > 0) {
 num_out <- length(outliers_data)
 min_out <- round(min(outliers_data), 2)
 max_out <- round(max(outliers_data), 2)

 # Formato Total [Min; Max]
 msg_atipicos <- paste0(" ", num_out, " [", min_out, " ; ", max_out, "]")
} else {
 msg_atipicos <- "No hay presencia de valores atípicos"
}

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" = msg_atipicos)

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"
 ) %>%
 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
Aptitud Solar [5; 10] 6.76 7 7 0.4728074 0.6876099 10.17 0.5339932 -0.04084686 48 [9 ; 10]
Autor: Martin Sarmiento

5 Conclusiones

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