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_Mundial_Final.csv", sep = ";", fileEncoding = "latin1")
# Estructura de los datos
str(Datos)
## 'data.frame':    58978 obs. of  29 variables:
##  $ ï..OBJECTID           : int  2 3 4 5 6 7 8 9 10 11 ...
##  $ code                  : chr  "00001-AFG-P" "00002-AFG-P" "00003-AFG-P" "00004-AFG-P" ...
##  $ plant_name            : chr  "Badghis Solar Power Plant" "Balkh solar farm" "Behsood solar farm" "Dab Pal 4 solar farm" ...
##  $ country               : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ operational_status    : chr  "cancelled - inferred 4 y" "cancelled - inferred 4 y" "cancelled - inferred 4 y" "shelved - inferred 2 y" ...
##  $ longitude             : chr  "62,874" "67,121" "70,413" "66,239" ...
##  $ latitude              : chr  "35,078" "36,714" "34,407" "33,768" ...
##  $ elevation             : int  918 359 629 2288 1060 1060 1392 398 410 1012 ...
##  $ area                  : chr  "6,735" "10,718" "487,729" "111,801" ...
##  $ size                  : chr  "Small" "Small" "Small" "Small" ...
##  $ slope                 : chr  "7,375" "0,49" "1,099" "6,162" ...
##  $ slope_type            : chr  "Moderado" "Plano o casi plano" "Plano o casi plano" "Moderado" ...
##  $ curvature             : chr  "-0,024" "0" "0" "0,045" ...
##  $ curvature_type        : chr  "Superficies cóncavas / Valles" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies convexas / Crestas" ...
##  $ aspect                : chr  "96,77" "358,452" "36,18" "305,766" ...
##  $ aspect_type           : chr  "East" "North" "Northeast" "Northwest" ...
##  $ dist_to_road          : chr  "7037,104" "92,748" "112,117" "1705,255" ...
##  $ ambient_temperature   : chr  "14,402" "17,875" "21,315" "8,857" ...
##  $ ghi                   : chr  "5,824" "5,579" "5,805" "6,749" ...
##  $ humidity              : chr  "47,743" "42,305" "36,396" "37,344" ...
##  $ wind_speed            : chr  "0,039" "0,954" "0,234" "0,943" ...
##  $ wind_direction        : chr  "187,481" "207,422" "255,601" "160,331" ...
##  $ dt_wind               : chr  "South" "Southwest" "West" "South" ...
##  $ solar_aptitude        : chr  "0,72" "0,635" "0,685" "0,659" ...
##  $ solar_aptitude_rounded: int  7 6 7 7 8 8 8 6 6 4 ...
##  $ solar_aptittude_class : chr  "Alta" "Alta" "Alta" "Alta" ...
##  $ capacity              : chr  "32" "40" "60" "3000" ...
##  $ optimal_tilt          : chr  "30" "31" "31,063" "33" ...
##  $ pv_potential          : chr  "4,613" "4,408" "4,572" "5,424" ...
# 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**"),
  ) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  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 58978 100.00
1 185 0.31 256 0.43 58907 99.88
2 450 0.76 706 1.20 58722 99.57
3 740 1.25 1446 2.45 58272 98.80
4 818 1.39 2264 3.84 57532 97.55
5 6379 10.82 8643 14.65 56714 96.16
6 12269 20.80 20912 35.46 50335 85.35
7 19398 32.89 40310 68.35 38066 64.54
8 13163 22.32 53473 90.67 18668 31.65
9 5505 9.33 58978 100.00 5505 9.33
Autor: Martin Sarmiento

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, 2), "%"), 
     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, 2), "%"), 
     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.896007 1.376956 20.16 -0.8977138 1.943085 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.376956, 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.