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_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(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) 153 0.26
Noreste (NE) 160 0.27
Este (E) 8118 13.76
Sureste (SE) 10675 18.10
Sur (S) 7327 12.42
Suroeste (SW) 21042 35.68
Oeste (W) 11472 19.45
Noroeste (NW) 31 0.05
No Asignado / Otros 0 0.00
TOTAL 58978 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 160 0.0190
Norte (N) 1 153 0.0181
Este (E) 2 8118 0.9629
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.86757

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.4451522
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.87 0.4452 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: 0.08%"

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 10675 0.2112
Sur (S) 1 7327 0.1450
Suroeste (SW) 2 21042 0.4163
Oeste (W) 3 11472 0.2270
Noroeste (NW) 4 31 0.0006
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] 18.26989

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.7701436
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 18.27 0.7701 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: 37.58%"

7 Conclusiones

El análisis probabilístico permitió modelar el comportamiento eólico en los emplazamientos de las plantas solares a nivel mundial mediante un Modelo Binomial para el Sector Noreste y un Modelo Geométrico para el Sector Sur-Oeste. Los resultados muestran una marcada predominancia de los vientos provenientes del Suroeste (SW) (35.68%) y del Oeste (W), mientras que las direcciones del cuadrante norte presentan una frecuencia de ocurrencia significativamente menor.

Las pruebas de bondad de ajuste arrojaron coeficientes de Pearson del 99.87% y 18.27% respectivamente. Si bien el segundo coeficiente indica una correlación lineal baja debido a la alta concentración atípica en la dirección Suroeste, las pruebas de Chi-cuadrado (\(0.4452\) y \(0.7701\)) se mantienen dentro de los umbrales de aceptación (\(5.99\) y \(9.49\)). Esto valida estadísticamente los modelos para describir los patrones de circulación atmosférica y su impacto en el diseño estructural de la infraestructura solar.