1 Configuración y Carga de Datos

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

#### VARIABLE TIPO DE ASPECTO ####
## DATASET ##
setwd("~/R INFERENCIAL/ASPECT_TYPE")
# 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_aspecto <- c(
  "Norte (N)", "Noreste (NE)", "Este (E)", "Sureste (SE)", 
  "Sur (S)", "Suroeste (SW)", "Oeste (W)", "Noroeste (NW)", 
  "Plano (Flat)"
)

# Traducción y Mapeo
Aspecto_Traducido <- case_when(
  grepl("Northeast", Datos$aspect_type, ignore.case = TRUE) ~ "Noreste (NE)",
  grepl("Southeast", Datos$aspect_type, ignore.case = TRUE) ~ "Sureste (SE)",
  grepl("Southwest", Datos$aspect_type, ignore.case = TRUE) ~ "Suroeste (SW)",
  grepl("Northwest", Datos$aspect_type, ignore.case = TRUE) ~ "Noroeste (NW)",
  grepl("North", Datos$aspect_type, ignore.case = TRUE) ~ "Norte (N)", 
  grepl("East", Datos$aspect_type, ignore.case = TRUE) ~ "Este (E)",
  grepl("South", Datos$aspect_type, ignore.case = TRUE) ~ "Sur (S)",
  grepl("West", Datos$aspect_type, ignore.case = TRUE) ~ "Oeste (W)",
  grepl("Flat", Datos$aspect_type, ignore.case = TRUE) ~ "Plano (Flat)",
  TRUE ~ "Otro" 
)

# Actualizamos dataset
Datos$Aspecto <- Aspecto_Traducido

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

# Tabla de distribución de frecuencias
TDF_Aspecto <- table(Aspecto)

3 Tabla de Distribución de Frecuencias

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

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

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

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

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

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

# TABLA GT
tabla_aspecto_gt <- tabla_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias del Tipo de Aspecto de las Plantas Solares**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_label(
    Aspecto = "Tipo de Aspecto",
    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_aspecto_gt
Tabla N°1 de Distribución de Frecuencias del Tipo de Aspecto de las Plantas Solares
Tipo de Aspecto Frecuencia (ni) Porcentaje (hi%)
Norte (N) 711 14.01
Noreste (NE) 622 12.26
Este (E) 571 11.25
Sureste (SE) 623 12.28
Sur (S) 564 11.11
Suroeste (SW) 546 10.76
Oeste (W) 700 13.79
Noroeste (NW) 731 14.40
Plano (Flat) 7 0.14
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$Aspecto <- factor(Tabla$Aspecto, levels = orden_aspecto)

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

5 Modelo de Probabilidad

# Crear Tabla de Frecuencias y Mapeo
TDF_Uni <- as.data.frame(TDF_Aspecto)
colnames(TDF_Uni) <- c("Aspecto", "ni") 

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

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

# Visualización del Mapeo
TDF_Uni %>% 
  select(Aspecto, X, ni, hi) %>% 
  gt() %>% 
  tab_header(
    title = md("**Tabla N°2 de Distribución de Frecuencias del Tipo de Aspecto - Mapeado**")) %>% 
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>% 
  cols_label(
    Aspecto = "Tipo de Aspecto",
    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 Aspecto - Mapeado
Tipo de Aspecto Valor Asignado Frecuencia (ni) Porcentaje (hi%)
Norte (N) 0 711 0.1401
Noreste (NE) 1 622 0.1226
Este (E) 2 571 0.1125
Sureste (SE) 3 623 0.1228
Sur (S) 4 564 0.1111
Suroeste (SW) 5 546 0.1076
Oeste (W) 6 700 0.1379
Noroeste (NW) 7 731 0.1440
Plano (Flat) 8 7 0.0014
Autor: Martin Sarmiento

5.1 Conjentura del Modelo

# Parámetros Uniformes
k <- nrow(TDF_Uni)
Prob_Teorica <- 1 / k

# Probabilidades Teóricas 
P_Uniforme <- rep(Prob_Teorica, k)

# Gráfico
par(mar = c(10, 4, 4, 2))
barplot(rbind(TDF_Uni$hi, P_Uniforme), 
        beside = TRUE,
        main = "Gráfica N°2: Comparado de lo Observado frente a lo Esperado del Tipo de Aspecto de las Plantas Solares",
        ylab = "Porcentaje (%)",
        names.arg = TDF_Uni$Aspecto, 
        col = c("#E8F5E9", "green"),
        legend.text = c("Observado", "Esperado"), 
        args.legend = list(x = "topright"),
        las = 2, 
        cex.names = 0.8,
        cex.main = 0.7,
        ylim = c(0, 1))
mtext("Tipo de Aspecto", side = 1, line = 6)

5.2 Test de Pearson

# Definir Frecuencia Observada y Esperada
Fo_U <- TDF_Uni$hi
Fe_U <- P_Uniforme

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

# Cálculo del coeficiente
Correlacion_U <- cor(Fo_U, Fe_U) * 100
## Warning in cor(Fo_U, Fe_U): La desviación estándar es cero
Correlacion_U
## [1] NA

5.3 Test de Chi-cuadrado

# Cálculo de Chi-cuadrado
x2_U <- sum(((Fo_U - Fe_U)^2) / Fe_U)

# Grados de libertad (k - 1)
gl_U <- length(Fo_U) - 1

# Valor crítico
vc_U <- qchisq(0.95, gl_U)

# Mostrar resultados
x2_U
## [1] 0.1346948
vc_U
## [1] 15.50731
# Validación lógica
x2_U < vc_U
## [1] TRUE

5.4 Tabla Resumen del Test

# Crear data frame resumen
tabla_resumen_U <- data.frame(
  Variable = "Tipo de Aspecto",
  Pearson = round(Correlacion_U, 2),
  Chi2    = round(x2_U, 4),
  Umbral  = round(vc_U, 2)
)

# Visualizar con GT
tabla_resumen_U %>% 
  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 NA 0.1347 15.51
Autor: Martin Sarmiento

5.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de que exista una planta solar cuyos paneles estén orientados, por ejemplo, hacia el Sur (S)?

prob_aspecto <- 1 / k
paste0(round(prob_aspecto * 100, 2), "%")
## [1] "11.11%"