1 Configuración y Carga de Datos

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

#### MODELO DE REGRESIÓN POTENCIAL ####
## DATASET ##
setwd("~/R REGRESION/POTENCIAL")
# 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 Extracción y Depuración de Variables

Se definió la Velocidad del Viento (m/s) como variable independiente (x), dado que representa una condición atmosférica que puede influir en el comportamiento del sistema fotovoltaico.

El Potencial Fotovoltaico (kWh/kWp) actúa como variable dependiente (y), pues refleja la capacidad de generación energética resultante bajo determinadas condiciones ambientales.

Esta relación modela la correspondencia energética del sistema analizado: en los datos evaluados, existe una tendencia no lineal donde las variaciones en la velocidad del viento se encuentran correlacionadas con cambios progresivos en el potencial fotovoltaico, comportamiento que se ajusta idealmente a una Ley de Potencia.

  • Variable Independiente (X): Velocidad del Viento (m/s).
  • Variable Dependiente (Y): Potencial Fotovoltaico (kWh/kWp).
# Selección de variables
datos_raw <- Datos %>%
  select(wind_speed, pv_potential) %>%
  mutate(
    x_raw = abs(as.numeric(gsub(",", ".", as.character(wind_speed)))),
    y_raw = abs(as.numeric(gsub(",", ".", as.character(pv_potential))))
  ) %>%
  filter(!is.na(x_raw) & !is.na(y_raw) & 
         x_raw > 0 & y_raw > 0) %>%
  filter(x_raw < 8.05) 

3 Análisis Gráfico Exploratorio

Previo a la ejecución del agrupamiento, se analiza la distribución inicial de los datos con el fin de fundamentar técnicamente el uso de la técnica de Binning.

datos_plot <- datos_raw

par(mar = c(5, 5, 4, 2))

plot(datos_plot$x_raw, datos_plot$y_raw,
     main = "Gráfica N°1: Diagrama de Dispersión del Potencial Fotovoltaico (kWh/kWp)\n en función de la Velocidad del Viento (m/s)",
     xlab = "Velocidad del Viento (m/s)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = "#3498DB",
     pch = 16,
     cex = 0.6,
     cex.main = 0.9,
     frame.plot = FALSE)

grid(nx = NULL, ny = NULL, col = "gray", lty = "dotted")

4 Aplicación de Binning

Para mitigar el ruido visual de la Gráfica N°1, se aplicó un agrupamiento por Binning en 20 intervalos de igual magnitud para la velocidad del viento, facilitando así la identificación del comportamiento estadístico de los datos.

# Número de bins
n_bins <- 20

# Crear bins y calcular promedios
datos_binned <- datos_raw %>%
  mutate(bin = cut(x_raw, breaks = n_bins)) %>%
  group_by(bin) %>%
  summarise(
    x_mean = mean(x_raw, na.rm = TRUE),
    y_mean = mean(y_raw, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  filter(!is.na(x_mean), !is.na(y_mean),
         x_mean > 0, y_mean > 0)

5 Conjetura del Modelo de Regresión Potencial

La ecuación es \(y = a \cdot x^{b}\). Para lograr la linealización del modelo y aplicar una regresión lineal simple, aplicamos logaritmo natural a ambos lados de la igualdad:\[\ln(y) = \ln(a) + b \cdot \ln(x)\]

datos_modelo <- datos_binned %>%
  mutate(
    x_log = log(x_mean),
    y_log = log(y_mean)
  )

modelo_potencial <- lm(y_log ~ x_log, data = datos_modelo)

log_a <- coef(modelo_potencial)[1]
b_param <- coef(modelo_potencial)[2]
a_param <- exp(log_a)

6 Gráfica del Modelo Potencial

Se exhibe el ajuste del modelo acompañado por su correspondiente banda de incertidumbre, definida mediante un intervalo de confianza del 95%.

x_seq <- seq(min(datos_binned$x_mean), 
             max(datos_binned$x_mean), 
             length.out = 500)

pred_log <- predict(modelo_potencial,
                    newdata = data.frame(x_log = log(x_seq)),
                    interval = "confidence",
                    level = 0.95)

y_fit <- exp(pred_log[, "fit"])
y_lwr <- exp(pred_log[, "lwr"])
y_upr <- exp(pred_log[, "upr"])

plot(datos_binned$x_mean, datos_binned$y_mean,
     main = "Gráfica N°2: Modelo de Regresión Potencial del Potencial Fotovoltaico (kWh/kWp)\n en función de la Velocidad del Viento (m/s)",
     xlab = "Velocidad del Viento (m/s)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = "#3498DB",
     cex.main = 0.9,
     pch = 20)

polygon(c(x_seq, rev(x_seq)),
        c(y_lwr, rev(y_upr)),
        col = rgb(0.5, 0.5, 0.5, 0.2),
        border = NA)

lines(x_seq, y_fit,
      col = "red",
      lwd = 3)

legend("topleft",
       legend = c("Datos promediados (binning)",
                  "Modelo Potencial",
                  "IC 95%"),
       col = c("#3498DB", "red", "gray"),
       pch = c(19, NA, 15),
       lwd = c(NA, 3, NA),
       pt.cex = c(1.3, NA, 2),
       bty = "n")

7 Test de Bondad del Modelo

7.1 Test de Pearson

r <- cor(datos_modelo$x_log, datos_modelo$y_log) * 100
cat("El coeficiente de correlación de Pearson es: ", round(r, 2), "%")
El coeficiente de correlación de Pearson es:  81.01 %

7.2 Coeficiente de determinación

r2 <- summary(modelo_potencial)$r.squared * 100
cat(paste0("El coeficiente de determinación (R²) es: ", round(r2, 2), "%"))
El coeficiente de determinación (R²) es: 65.62%

8 Ecuación del Modelo

# Coeficientes del modelo 
log_a <- coef(modelo_potencial)[1]
b_param <- coef(modelo_potencial)[2]
a_param <- exp(log_a)

# Construcción elegante de ecuación
ecuacion <- paste0("y = ", round(a_param, 4),
                   "x^", round(b_param, 4))

cat("La ecuación estimada del modelo es:\n\n",
    "y =", round(a_param,4), "x^", round(b_param,4))
La ecuación estimada del modelo es:

 y = 3.9835 x^ 0.081

9 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Velocidad del Viento (m/s)", "Potencial Fotovoltaico (kWh/kWp)"),
  Tipo = c("Independiente (x)", "Dependiente (y)"),
  Pearson = c("", round(r, 2)),
  R2 = c("", round(r2, 2)),
  Parametro_a = c("", round(a_param, 4)),
  Exponente_b = c("", round(b_param, 4)),
  Ecuación = c("", ecuacion)
)

tabla_resumen %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1 del Resumen del Modelo de Regresión Potencial**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_align(align = "center", everything())
Tabla N°1 del Resumen del Modelo de Regresión Potencial
Variable Tipo Pearson R2 Parametro_a Exponente_b Ecuación
Velocidad del Viento (m/s) Independiente (x)
Potencial Fotovoltaico (kWh/kWp) Dependiente (y) 81.01 65.62 3.9835 0.081 y = 3.9835x^0.081
Autor: Martin Sarmiento

10 Cálculo de Estimaciones

¿Qué Potencial Fotovoltaico se estima para una Velocidad del Viento de 6 m/s?

wind_test <- 6  
pv_est <- a_param * (wind_test^b_param)

cat("Para una Velocidad del Viento de", wind_test, "m/s, el Potencial Fotovoltaico estimado es:", round(pv_est, 4), "kWh/kWp")
Para una Velocidad del Viento de 6 m/s, el Potencial Fotovoltaico estimado es: 4.6056 kWh/kWp

11 Conclusiones

Entre la Velocidad del Viento y el Potencial Fotovoltaico existe una relación directa de tipo potencial, explicada por un coeficiente de determinación R² ≈ 66%.

Esto indica que el 66% de la variabilidad del Potencial Fotovoltaico puede ser explicada por la variación en la Velocidad del Viento, lo que representa una relación estadísticamente significativa y de magnitud considerable.

La ecuación matemática estimada del modelo es: \(y = 3.9825 \cdot x^{0.081}\)

Dado que el exponente b = 0.081 es positivo, la relación es creciente; sin embargo, al ser un valor pequeño, el efecto de la Velocidad del Viento sobre el Potencial Fotovoltaico es moderado y de crecimiento suave.