1 Configuración y Carga de Datos

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

#### MODELO DE REGRESIÓN MÚLTIPLE ####
## DATASET ##
setwd("~/R REGRESION/MULTIPLE")
# 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)
library(stringr)
library(plotly)

Adjuntando el paquete: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout

2 Extracción y Depuración de Variables

El diseño de este modelo responde a una lógica energética de “Interacción de Factores Ambientales” aplicada a la generación solar. Se busca explicar el Potencial Fotovoltaico como el resultado combinado de dos variables físicas fundamentales: la radiación solar disponible y las condiciones altitudinales del emplazamiento.

  • Variable Dependiente (Y): Potencial Fotovoltaico (kWh/kWp). Se seleccionó como variable de respuesta porque representa el rendimiento energético estimado por unidad instalada. Es el resultado final del sistema de generación y no depende de decisiones arbitrarias, sino de las condiciones geográficas y atmosféricas del lugar donde se ubica la instalación solar.

  • Variable Independiente 1 (X₁): GHI (kWh/m²). Representa el recurso solar disponible. Es la cantidad de radiación que incide sobre una superficie horizontal y constituye el insumo energético principal del sistema fotovoltaico. Es la variable dominante, ya que determina directamente la energía potencial que puede transformarse en electricidad.

  • Variable Independiente 2 (X₂): Elevación (m.s.n.m.). Representa la condición atmosférica asociada a la altitud del terreno. A mayores elevaciones, la atmósfera es menos densa y las temperaturas tienden a ser menores, lo que puede influir en el desempeño del sistema fotovoltaico. Esta variable cuantifica el efecto complementario del entorno físico sobre la eficiencia energética.

El Potencial Fotovoltaico (Y) es, esencialmente, el resultado de la disponibilidad del recurso solar (X₁) ajustado por las condiciones altitudinales del emplazamiento (X₂). Ambos factores interactúan para determinar el rendimiento energético estimado del sistema.

# Selección de variables
datos_model <- Datos %>%
  select(pv_potential, ghi, elevation) %>%
  mutate(
    y  = as.numeric(str_replace(pv_potential, ",", ".")),
    x1 = as.numeric(str_replace(ghi, ",", ".")),
    x2 = as.numeric(elevation)
  ) %>%
  filter(!is.na(y) & !is.na(x1) & !is.na(x2)) %>%
  filter(y > 0 & x2 >= 0)

y  <- datos_model$y    # Potencial Fotovoltaico
x1 <- datos_model$x1   # GHI
x2 <- datos_model$x2   # Elevación

3 Análisis Gráfico Exploratorio (3D)

El gráfico 3D interactivo permite rotar y ampliar la visualización para analizar la distribución y posible relación entre el GHI, la Elevación y el Potencial Fotovoltaico.

# Gráfico 3D 
plot_ly(
  x = ~x1, 
  y = ~x2, 
  z = ~y,
  type = "scatter3d", 
  mode = "markers",
  marker = list(
    size = 4, 
    color = "#E67E22", 
    line = list(color = '#A04000', width = 0.5)
  ),
  name = "Plantas Solares"
) %>%

layout(
    title = list(
      text = "Gráfica N°1: Potencial Fotovoltaico (kWh/kWp) en función de GHI (kWh/m²) y Elevación (m.s.n.m.) - 3D",
      font = list(size = 12),
      font = list(size = 12),
      x = 0.5,               
      xanchor = 'center'     
    ),
    scene = list(
      xaxis = list(title = list(text = "GHI (kWh/m²) [X₁]", font = list(size = 10))),
      yaxis = list(title = list(text = "Elevación (m.s.n.m.) [X₂]", font = list(size = 10))),
      zaxis = list(title = list(text = "Potencial Fotovoltaico (kWh/kWp) [Y]", font = list(size = 10))),
      camera = list(eye = list(x = 1.6, y = 1.6, z = 1.2))
    ),
    margin = list(t = 50)    
  )

4 Conjetura del Modelo de Regresión Múltiple

Se plantea la ecuación del plano: \(y = \beta_0 + \beta_1 \cdot X_1 + \beta_2 \cdot X_2\)

modelo <- lm(y ~ x1 + x2)

# Extracción de Coeficientes
coefs <- coef(modelo)
b0 <- coefs[1] 
b1 <- coefs[2] 
b2 <- coefs[3] 

5 Gráfica del Modelo Múltiple

Se visualiza el plano de regresión múltiple junto con los datos reales, permitiendo observar el ajuste del modelo y la relación conjunta entre el GHI, la Elevación y el Potencial Fotovoltaico.

# Crear grilla de valores
grid_x1 <- seq(min(x1), max(x1), length.out = 50)   # GHI
grid_x2 <- seq(min(x2), max(x2), length.out = 50)   # Elevación

# Calcular plano ajustado
z_plano <- t(outer(grid_x1, grid_x2, function(x1_val, x2_val) {
  b0 + (b1 * x1_val) + (b2 * x2_val)
}))

# Gráfico interactivo
plot_ly() %>%
  
  add_trace(
    x = grid_x1, 
    y = grid_x2, 
    z = z_plano,
    type = "surface",
    colorscale = list(c(0, 1), c("#F39C12", "#E67E22")), 
    opacity = 0.7,
    name = "Plano Ajustado",
    showscale = FALSE
  ) %>% 
  
  add_trace(
    x = ~x1, 
    y = ~x2, 
    z = ~y,
    type = "scatter3d", 
    mode = "markers",
    marker = list(size = 4, color = "#2C3E50", line = list(color = 'black', width = 0.5)), 
    name = "Datos Reales"
  ) %>%
  
  layout(
    title = list(
      text = "Gráfica N°2: Plano de Regresión del Potencial Fotovoltaico (kWh/kWp)",
      font = list(size = 12),
      x = 0.5,               
      xanchor = 'center'     
    ),
    scene = list(
      xaxis = list(title = list(text = "GHI (kWh/m²) [X₁]", font = list(size = 10))),
      yaxis = list(title = list(text = "Elevación (m.s.n.m.) [X₂]", font = list(size = 10))),
      zaxis = list(title = list(text = "Potencial Fotovoltaico (kWh/kWp) [Y]", font = list(size = 10))),
      camera = list(eye = list(x = 1.6, y = 1.6, z = 1.2))
    ),
    margin = list(t = 50)    
  )

6 Test de Bondad del Modelo

6.1 Coeficiente de correlación múltiple

# Valores predichos
y_pred <- predict(modelo)

# Correlación múltiple
r <- cor(y, y_pred)

cat("El coeficiente de correlación múltiple es: ", round(r, 2))
El coeficiente de correlación múltiple es:  0.95

6.2 Coeficiente de determinación

r2 <- summary(modelo)$r.squared
cat(paste0("El coeficiente de determinación (R²) es: ", round(r2, 2)))
El coeficiente de determinación (R²) es: 0.9

7 Ecuación del Modelo

coefs <- coef(modelo)
b0 <- coefs[1]
b1 <- coefs[2]
b2 <- coefs[3]

ecuacion <- paste0(
  "y = ", round(b0,4),
  " + ", round(b1,6), "·X₁",
  " + ", round(b2,6), "·X₂"
)

cat("La ecuación estimada del modelo es:\n\n", ecuacion)
La ecuación estimada del modelo es:

 y = 0.5562 + 0.70888·X₁ + 5.9e-05·X₂

8 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("GHI (kWh/m²)", "Elevación (m.s.n.m.)", "Potencial Fotovoltaico (kWh/kWp)"),
  Tipo = c("Independiente (X₁)", "Independiente (X₂)", "Dependiente (Y)"),
  R_multiple = c("", "", round(r, 2)),
  R2 = c("", "", round(r2, 2)),
  Intercepto = c("", "", round(b0, 4)),
  Beta1 = c("", "", round(b1, 6)),
  Beta2 = c("", "", round(b2, 6)),
  Ecuación = c("", "", ecuacion)
)

tabla_resumen %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1 del Resumen del Modelo de Regresión Múltiple**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_align(align = "center", everything())
Tabla N°1 del Resumen del Modelo de Regresión Múltiple
Variable Tipo R_multiple R2 Intercepto Beta1 Beta2 Ecuación
GHI (kWh/m²) Independiente (X₁)
Elevación (m.s.n.m.) Independiente (X₂)
Potencial Fotovoltaico (kWh/kWp) Dependiente (Y) 0.95 0.9 0.5562 0.70888 5.9e-05 y = 0.5562 + 0.70888·X₁ + 5.9e-05·X₂
Autor: Martin Sarmiento

9 Cálculo de Estimaciones

¿Cuál es el Potencial Fotovoltaico estimado para una ubicación con GHI de 5.2 kWh/m² y Elevación de 2850 m.s.n.m.?

ghi_test <- 5.2
elev_test <- 2850

y_est <- predict(modelo,
                 newdata = data.frame(x1 = ghi_test,
                                      x2 = elev_test))

cat("Para un GHI de", ghi_test,
    "kWh/m² y una Elevación de", elev_test,
    "m.s.n.m., el Potencial Fotovoltaico estimado es:",
    round(y_est, 4), "kWh/kWp")
Para un GHI de 5.2 kWh/m² y una Elevación de 2850 m.s.n.m., el Potencial Fotovoltaico estimado es: 4.4097 kWh/kWp

10 Conclusiones

Se creó un modelo de regresión lineal múltiple para calcular el Potencial Fotovoltaico (Y) a partir del GHI (X₁) y la Elevación (X₂).

El coeficiente de determinación (R²) del modelo es del 90%, lo que señala que la variabilidad mayoritaria del potencial energético se explica a partir de la combinación de la radiación solar disponible y la altitud en el lugar. El resultado corroboró la relación física esperada, en la que el recurso solar es el factor principal y la elevación aporta de forma complementaria al desempeño del sistema.

En términos generales, el modelo demuestra una adecuada capacidad predictiva dentro del rango analizado, constituyendo una herramienta válida para la estimación preliminar del potencial fotovoltaico en distintas ubicaciones geográficas.