1 Configuración y Carga de Datos

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

#### VARIABLE DIRECCIÓN DEL VIENTO PREDOMINANTE ####
## DATASET ##
setwd("~/R INFERENCIAL/DT_WIND")
# 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

# Traducción de los valores
Datos <- Datos %>%
  mutate(grupo = case_when(
    grepl("Northeast", dt_wind, ignore.case = TRUE) ~ "Noreste (NE)",
    grepl("Northwest", dt_wind, ignore.case = TRUE) ~ "Noroeste (NW)",
    grepl("Southeast", dt_wind, ignore.case = TRUE) ~ "Sureste (SE)",
    grepl("Southwest", dt_wind, ignore.case = TRUE) ~ "Suroeste (SW)",
    grepl("North", dt_wind, ignore.case = TRUE) ~ "Norte (N)",
    grepl("South", dt_wind, ignore.case = TRUE) ~ "Sur (S)",
    grepl("East", dt_wind, ignore.case = TRUE) ~ "Este (E)",
    grepl("West", dt_wind, ignore.case = TRUE) ~ "Oeste (W)",
    TRUE ~ "No Asignado / Otros"))

# Definimos el orden 
orden_horario <- c(
  "Norte (N)",
  "Noreste (NE)",
  "Este (E)",
  "Sureste (SE)",
  "Sur (S)",
  "Suroeste (SW)",
  "Oeste (W)",
  "Noroeste (NW)",
  "No Asignado / Otros")

# Convertimos a factor ordenado
Datos$grupo <- factor(
  Datos$grupo, 
  levels = orden_horario, 
  ordered = TRUE
)

# Tabla de distribución de frecuencias inicial
TDF_WIND <- table(Datos$grupo)

3 Tabla de Distribución de Frecuencias

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

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

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

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

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

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

# TABLA GT
tabla_wind_gt <- tabla_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias de la Dirección del Viento Predominante de las Plantas Solares**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_label(
    Direccion = "Dirección del Viento Predominante",
    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_wind_gt
Tabla N°1 de Distribución de Frecuencias de la Dirección del Viento Predominante de las Plantas Solares
Dirección del Viento Predominante Frecuencia (ni) Porcentaje (hi%)
Norte (N) 1050 20.69
Noreste (NE) 191 3.76
Este (E) 1920 37.83
Sureste (SE) 1239 24.41
Sur (S) 250 4.93
Suroeste (SW) 196 3.86
Oeste (W) 178 3.51
Noroeste (NW) 51 1.00
No Asignado / Otros 0 0.00
TOTAL 5075 100.00
Autor: Martin Sarmiento

4 Análisis Gráfico

4.1 Diagramas de Barras de Cantidad

# Definimos tabla_resumen 
tabla_resumen <- Tabla 

# Renombrar columna de frecuencia
colnames(tabla_resumen) <- c("Velocidad", "ni")

# Extraemos los valores para graficar
alturas_ni <- tabla_resumen$ni
nombres_eje <- tabla_resumen$Velocidad

# Calculamos un límite 
limite_y <- max(alturas_ni) * 1.2

par(mar = c(10, 4, 4, 2))
barplot(height = alturas_ni,
        names.arg = nombres_eje,
        main = "Gráfica N°1: Distribución de Cantidad de las Plantas Solares por Dirección del Viento Predominante",
        ylab = "Cantidad",
        col = "#FFB6C1",
        las = 2,
        cex.names = 0.7,
        cex.main = 0.7,
        ylim = c(0, limite_y))
mtext("Dirección del Viento Predominante", side = 1, line = 8)

5 Agrupación 1 (Sector Noreste)

# Definimos niveles 
niveles_Binom1 <- c("Noreste (NE)", "Norte (N)", "Este (E)")

# Extracción
Datos_G1_Binom <- subset(Datos, grupo %in% niveles_Binom1)
Datos_G1_Binom$grupo <- factor(Datos_G1_Binom$grupo, 
                               levels = niveles_Binom1, ordered = TRUE)

# Crear Tabla de Frecuencias y Mapeo
TDF_G1_Binom <- as.data.frame(table(Datos_G1_Binom$grupo))
colnames(TDF_G1_Binom) <- c("Velocidad", "ni")

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

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

# Visualización del Mapeo
TDF_G1_Binom %>% 
  select(Velocidad, X, ni, hi) %>%
  gt() %>% 
  tab_header(
    title = md("**Tabla N°2 de Distribución de Frecuencias de la Dirección del Viento Predominante de las Plantas Solares - Mapeado**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Velocidad = "Dirección del Viento Predominante",
    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 de la Dirección del Viento Predominante de las Plantas Solares - Mapeado
Dirección del Viento Predominante Valor Asignado Frecuencia (ni) Porcentaje (hi%)
Noreste (NE) 0 191 0.0604
Norte (N) 1 1050 0.3322
Este (E) 2 1920 0.6074
Autor: Martin Sarmiento

5.1 Conjentura del Modelo (Binomial)

# Usamos la columna X que acabamos de Mapear
n_total_Binom1 <- sum(TDF_G1_Binom$ni)

# Parámetros Binomiales 
size_binom1 <- nrow(TDF_G1_Binom) - 1 
media_G1 <- sum(TDF_G1_Binom$X * TDF_G1_Binom$ni) / n_total_Binom1
prob_p1 <- media_G1 / size_binom1

# Probabilidades Teóricas
P_Binom_B <- dbinom(TDF_G1_Binom$X, size = size_binom1, prob = prob_p1)
P_Binom_B <- P_Binom_B / sum(P_Binom_B) 

# Gráfico
par(mar = c(8, 4, 4, 2))
barplot(rbind(TDF_G1_Binom$hi, P_Binom_B), 
        beside = TRUE,
        main = "Gráfica N°2: Comparado de lo Observado frente a lo Esperado de la Dirección del Viento Predominante de las Plantas Solares",
        ylab = "Porcentaje (%)",
        names.arg = TDF_G1_Binom$Velocidad, 
        col = c("#FFB6C1", "#CD2990"),
        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("Dirección del Viento Predominante", side = 1, line = 6)

5.2 Test de Pearson

# Definir Frecuencia Observada y Esperada
Fo_B <- TDF_G1_Binom$hi
Fe_B <- P_Binom_B

# Gráfico de Correlación
plot(Fo_B, Fe_B, 
     main = "Gráfica N°3: Correlación del Modelo Observado y Esperado de la Dirección del Viento Predominante de las Plantas Solares",
     cex.main = 0.7,
     xlab = "Frecuencia Observada", 
     ylab = "Frecuencia Esperada", 
     pch = 19, col = "#8B1C62")
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] 99.83366

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.00270773
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 = "Sector Noreste",
  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
Sector Noreste 99.83 0.0027 5.99
Autor: Martin Sarmiento

5.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de seleccionar una planta solar cuya dirección predominante sea el Noreste (NE)?

prob_ne <- dbinom(0, size = size_binom1, prob = prob_p1)

paste0("La probabilidad estimada para la dirección Noreste es de: ", 
       round(prob_ne * 100, 2), "%")
## [1] "La probabilidad estimada para la dirección Noreste es de: 5.13%"

6 Agrupación 2 (Sector Sur-Oeste)

# Definimos niveles
niveles_G2_Geom <- c("Sureste (SE)", "Sur (S)", "Suroeste (SW)", "Oeste (W)", "Noroeste (NW)")

# Extracción
Datos_G2_Geom <- subset(Datos, grupo %in% niveles_G2_Geom)
Datos_G2_Geom$grupo <- factor(Datos_G2_Geom$grupo, levels = niveles_G2_Geom, ordered = TRUE)

# Crear Tabla de Frecuencias y Mapeo
TDF_G2_Geom <- as.data.frame(table(Datos_G2_Geom$grupo))
colnames(TDF_G2_Geom) <- c("Velocidad", "ni")

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

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

# Visualización del Mapeo
TDF_G2_Geom %>% 
  select(Velocidad, X, ni, hi) %>%
  gt() %>% 
  tab_header(
    title = md("**Tabla N°4 de Distribución de Frecuencias de la Dirección del Viento Predominante de las Plantas Solares - Mapeado**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Velocidad = "Dirección del Viento Predominante",
    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°4 de Distribución de Frecuencias de la Dirección del Viento Predominante de las Plantas Solares - Mapeado
Dirección del Viento Predominante Valor Asignado Frecuencia (ni) Porcentaje (hi%)
Sureste (SE) 0 1239 0.6473
Sur (S) 1 250 0.1306
Suroeste (SW) 2 196 0.1024
Oeste (W) 3 178 0.0930
Noroeste (NW) 4 51 0.0266
Autor: Martin Sarmiento

6.1 Conjentura del Modelo (Geométrico)

# Usamos la columna X que acabamos de mapear
n_total_G2_Geom <- sum(TDF_G2_Geom$ni)

# Parámetros Geométricos
media_G2_Geom <- sum(TDF_G2_Geom$X * TDF_G2_Geom$ni) / n_total_G2_Geom
prob_p2_Geom <- 1 / (media_G2_Geom + 1)

# Probabilidades Teóricas
P_Geom_G2 <- dgeom(TDF_G2_Geom$X, prob = prob_p2_Geom)
P_Geom_G2 <- P_Geom_G2 / sum(P_Geom_G2)

# Gráfico
par(mar = c(10, 4, 4, 2))
barplot(rbind(TDF_G2_Geom$hi, P_Geom_G2), 
        beside = TRUE,
        main = "Gráfica N°4: Comparado de lo Observado frente a lo Esperado de la Dirección del Viento Predominante de las Plantas Solares",
        ylab = "Porcentaje (%)",
        names.arg = TDF_G2_Geom$Velocidad, 
        col = c("#FFB6C1", "#CD2990"),
        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("Dirección del Viento Predominante", side = 1, line = 8)

6.2 Test de Pearson

# Definir Frecuencia Observada y Esperada
Fo_G2 <- TDF_G2_Geom$hi
Fe_G2 <- P_Geom_G2

# Gráfico de Correlación
plot(Fo_G2, Fe_G2, 
     main = "Gráfica N°5: Correlación del Modelo Observado y Esperado de la Dirección del Viento Predominante de las Plantas Solares",
     cex.main = 0.7,
     xlab = "Frecuencia Observada", 
     ylab = "Frecuencia Esperada", 
     pch = 19, col = "#8B1C62")
abline(lm(Fe_G2 ~ Fo_G2), col = "red", lwd = 2)

# Cálculo del coeficiente
Correlacion_G2 <- cor(Fo_G2, Fe_G2) * 100
Correlacion_G2
## [1] 96.18793

6.3 Test de Chi-cuadrado

# Cálculo de Chi-cuadrado
x2_G2 <- sum(((Fo_G2 - Fe_G2)^2) / Fe_G2)

# Grados de libertad (k - 1)
gl_G2 <- length(Fo_G2) - 1

# Valor crítico
vc_G2 <- qchisq(0.95, gl_G2)

# Mostrar resultados
x2_G2
## [1] 0.1215153
vc_G2
## [1] 9.487729
# Validación lógica
x2_G2 < vc_G2
## [1] TRUE

6.4 Tabla Resumen del Test

# Crear data frame resumen
tabla_resumen_G2 <- data.frame(
  Variable = "Sector Sur-Oeste",
  Pearson = round(Correlacion_G2, 2),
  Chi2 = round(x2_G2, 4),
  Umbral = round(vc_G2, 2)
)

# Visualizar con GT
tabla_resumen_G2 %>% 
  gt() %>% 
  cols_label(
    Variable = ("Variable"),       
    Pearson  = "Test Pearson (%)",
    Chi2     = ("Chi Cuadrado"), 
    Umbral   = "Umbral de Aceptación"
  ) %>%
  tab_header(
    title = md("**Tabla N°5 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°5 Resumen del Test de Bondad al Modelo de Probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación
Sector Sur-Oeste 96.19 0.1215 9.49
Autor: Martin Sarmiento

6.5 Cálculo de Probabilidades

¿Cuál es la probabilidad estimada de que la dirección del viento predominante sea Sureste (SE)?

prob_se <- dgeom(0, prob = prob_p2_Geom)

paste0("La probabilidad estimada para la dirección Sureste es de: ", 
       round(prob_se * 100, 2), "%")
## [1] "La probabilidad estimada para la dirección Sureste es de: 58.11%"