1 Configuración y Carga de Datos

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

#### VARIABLE TIPO DE APTITUD SOLAR ####
## DATASET ##
setwd("~/R INFERENCIAL/SOLAR_APTITUDE_CLASS")
# 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  "Small" "Big" "Small" "Small" ...
##  $ 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(ggplot2)
library(gt)

2 Extraer Variable

# Definir el orden específico
orden_solar <- c("Baja", "Media", "Alta")

# Traducción y Mapeo
Datos <- Datos %>%
  mutate(Solar = case_when(
    grepl("Baja", solar_aptittude_class, ignore.case = TRUE) ~ "Baja",
    grepl("Media", solar_aptittude_class, ignore.case = TRUE) ~ "Media",
    grepl("Alta", solar_aptittude_class, ignore.case = TRUE) ~ "Alta",
    TRUE ~ NA_character_ 
  )) %>%
  filter(!is.na(Solar))

# Crear el Factor 
Solar <- factor(
  Datos$Solar,
  levels = orden_solar,
  ordered = TRUE
)

# Tabla de distribución de frecuencias
TDF_Solar <- table(Solar)

3 Tabla de Distribución de Frecuencias

# Tabla de frecuencias absolutas
Tabla <- as.data.frame(TDF_Solar)

# Renombrar columna de frecuencia
colnames(Tabla) <- c("Solar", "ni")

# Asegurar tipo character
Tabla$Solar <- as.character(Tabla$Solar)

# Crear porcentaje
Tabla$`hi (%)` <- (Tabla$ni / sum(Tabla$ni)) * 100

# Fila total
fila_total_Solar <- tibble(
  Solar = "TOTAL",
  ni = sum(Tabla$ni),
  `hi (%)` = sum(Tabla$`hi (%)`)
)

# Unir fila total
tabla_Final <- bind_rows(Tabla, fila_total_Solar)

# TABLA GT
tabla_solar_gt <- tabla_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias del Tipo de Aptitud Solar de las Plantas Solares**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_label(
    Solar = "Tipo de Aptitud Solar",
    ni = "Frecuencia (ni)",
    `hi (%)` = "Porcentaje (hi%)"
  ) %>%
  fmt_number(
    columns = `hi (%)`,
    decimals = 2
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )

# Mostrar tabla
tabla_solar_gt
Tabla N°1 de Distribución de Frecuencias del Tipo de Aptitud Solar de las Plantas Solares
Tipo de Aptitud Solar Frecuencia (ni) Porcentaje (hi%)
Baja 23 0.45
Media 1871 36.87
Alta 3181 62.68
TOTAL 5075 100.00
Autor: Martin Sarmiento

4 Análisis Gráfico

4.1 Diagramas de Barras de Cantidad

# Reordenar los niveles del factor para que las barras aparezcan en la secuencia correcta
Tabla_Plot <- Tabla
Tabla_Plot$Solar <- factor(Tabla_Plot$Solar, levels = orden_solar)

par(mar = c(10, 4, 4, 2)) 
barplot(Tabla_Plot$`hi (%)`,
        main = "Gráfica N°1: Distribución Porcentual de las Plantas Solares por Tipo de Aptitud Solar",
        xlab = "",
        ylab = "Porcentaje %",
        col = "#F0E68C",
        ylim = c(0,100),
        names.arg = Tabla_Plot$Solar,
        cex.names = 0.7,
        cex.main = 0.9,
        las = 2)
mtext("Tipo de Aptitud Solar", side = 1, line = 9)

5 Modelo de Probabilidad

# Crear Tabla de Frecuencias y Mapeo
TDF_Bin <- as.data.frame(TDF_Solar)
colnames(TDF_Bin) <- c("Solar", "ni")

# Mapeo 
TDF_Bin$X <- 0:(nrow(TDF_Bin) - 1)

TDF_Bin$hi <- TDF_Bin$ni / sum(TDF_Bin$ni)

# Estimación de Parametros Binomiales
Media_Obs <- sum(TDF_Bin$X * TDF_Bin$ni) / sum(TDF_Bin$ni)
n_param <- 2 
p_param <- Media_Obs / n_param

# Visualización del Mapeo
TDF_Bin %>% 
  select(Solar, X, ni, hi) %>% 
  gt() %>% 
  tab_header(
    title = md("**Tabla N°2 de Distribución de Frecuencias del Tipo de Aptitud Solar - Mapeado**")) %>% 
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>% 
  cols_label(
    Solar = "Tipo de Aptitud Solar",
    X = "Valor Asignado",
    ni = "Frecuencia (ni)",
    hi = "Porcentaje (hi%)"
  ) %>% 
  fmt_number(columns = hi, decimals = 4) %>% 
  tab_options(
    heading.title.font.size = px(16),
    heading.subtitle.font.size = px(14),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°2 de Distribución de Frecuencias del Tipo de Aptitud Solar - Mapeado
Tipo de Aptitud Solar Valor Asignado Frecuencia (ni) Porcentaje (hi%)
Baja 0 23 0.0045
Media 1 1871 0.3687
Alta 2 3181 0.6268
Autor: Martin Sarmiento

5.1 Conjentura del Modelo

# PCálculo de Probabilidades Teóricas
Prob_Teorica_Bin <- dbinom(TDF_Bin$X, size = n_param, prob = p_param)

# Gráfico
par(mar = c(8, 4, 4, 2))
barplot(rbind(TDF_Bin$hi, Prob_Teorica_Bin), 
        beside = TRUE,
        main = "Gráfica N°2: Comparado de lo Observado frente a lo Esperado del Tipo de Aptitud Solar de las Plantas Solares",
        ylab = "Porcentaje (%)",
        names.arg = TDF_Bin$Solar, 
        col = c("#F0E68C", "yellow"),
        legend.text = c("Observado", "Esperado"), 
        args.legend = list(x = "topleft"),
        las = 2, 
        cex.names = 0.8,
        cex.main = 0.7,
        ylim = c(0, 1))
mtext("Tipo de Aptitud Solar", side = 1, line = 6)

5.2 Test de Pearson

# Definir Frecuencia Observada y Esperada
Fo_B <- TDF_Bin$hi
Fe_B <- Prob_Teorica_Bin

# Gráfico de Correlación
plot(Fo_B, Fe_B, 
     main = "Gráfica N°3: Correlación del Modelo Observado y Esperado del Tipo de Aptitud Solar de las Plantas Solares",
     cex.main = 0.7,
     xlab = "Frecuencia Observada", 
     ylab = "Frecuencia Esperada", 
     pch = 19, col = "#458B00")
abline(lm(Fe_B ~ Fo_B), col = "red", lwd = 2)

# Cálculo del coeficiente
Correlacion_B <- cor(Fo_B, Fe_B) * 100
Correlacion_B
## [1] 98.50915

5.3 Test de Chi-cuadrado

# Cálculo de Chi-cuadrado
x2_B <- sum(((Fo_B - Fe_B)^2) / Fe_B)

# Grados de libertad (k - 1)
gl_B <- length(Fo_B) - 1

# Valor crítico
vc_B <- qchisq(0.95, gl_B)

# Mostrar resultados
x2_B
## [1] 0.04131476
vc_B
## [1] 5.991465
# Validación lógica
x2_B < vc_B
## [1] TRUE

5.4 Tabla Resumen del Test

# Crear data frame resumen
tabla_resumen_B <- data.frame(
  Variable = "Tipo de Aspecto",
  Pearson = round(Correlacion_B, 2),
  Chi2    = round(x2_B, 4),
  Umbral  = round(vc_B, 2)
)

# Visualizar con GT
tabla_resumen_B %>% 
  gt() %>% 
  cols_label(
    Variable = ("Variable"),       
    Pearson  = "Test Pearson (%)",
    Chi2     = ("Chi Cuadrado"), 
    Umbral   = "Umbral de Aceptación"
  ) %>%
  tab_header(
    title = md("**Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad**")) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento") %>%
  cols_align(
    align = "center", 
    everything()) %>%
tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0")
Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación
Tipo de Aspecto 98.51 0.0413 5.99
Autor: Martin Sarmiento

5.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de que una nueva planta solar tenga una aptitud Alta?

prob_alta <- dbinom(2, size = n_param, prob = p_param)
paste0(round(prob_alta * 100, 2), "%")
## [1] "65.79%"