1 Configuración y Carga de Datos

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

#### MODELO DE REGRESIÓN EXPONENCIAL ####
## DATASET ##
setwd("~/R REGRESION/EXPONENCIAL")
# 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 aplica un modelo de crecimiento exponencial sobre los datos agrupados mediante técnica de binning para reducir el ruido estadístico y capturar la tendencia general del comportamiento energético.

Se estableció la Elevación (m.s.n.m.) como variable independiente (x), por representar el factor geográfico que influye directamente en las condiciones atmosféricas, la densidad del aire y la incidencia de radiación solar. El Potencial Fotovoltaico (kWh/kWp) actúa como variable dependiente (y), ya que expresa el rendimiento energético esperado bajo dichas condiciones de altitud.

Esta relación modela el comportamiento del recurso solar frente al gradiente altitudinal: a medida que aumenta la elevación, el potencial fotovoltaico tiende a incrementarse de manera progresiva (exponencial), posiblemente debido a una menor atenuación atmosférica y mejores condiciones de irradiancia en zonas de mayor altitud.

  • Variable Independiente (X): Elevación (agrupada cada 200 m.s.n.m.).
  • Variable Dependiente (Y): Potencial Fotovoltaico Promedio (kWh/kWp).
# Selección de variables
datos_raw <- Datos %>%
  select(elevation, pv_potential) %>%
  mutate(
    x_raw = abs(as.numeric(gsub(",", ".", as.character(elevation)))),
    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)

3 Análisis Gráfico Exploratorio

datos_plot <- datos_raw %>% filter(y_raw < quantile(y_raw, 0.99))

par(mar = c(5, 5, 4, 2))
color_trans <- rgb(0.2, 0.6, 0.86, 0.4) 

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 Elevación (m.s.n.m.)",
     xlab = "Elevación (m.s.n.m.)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = color_trans, pch = 16, cex = 0.6, cex.main = 0.9, frame.plot = FALSE)

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

4 Aplicación de Binning

Debido a la variabilidad observada en la Gráfica N°1, se implementa la técnica de binning con el objetivo de disminuir el ruido estadístico y visualizar con mayor claridad la tendencia general de los datos.

# Agrupación Técnica 
# Limpieza de Outliers
lim_x <- quantile(datos_raw$x_raw, c(0.05, 0.95))
lim_y <- quantile(datos_raw$y_raw, c(0.05, 0.95))

datos_limpios <- datos_raw %>%
  filter(x_raw >= lim_x[1] & x_raw <= lim_x[2],
         y_raw >= lim_y[1] & y_raw <= lim_y[2])

# Agrupación Técnica (cada 200 m)
datos_agrupados <- datos_limpios %>%
  mutate(elev_bin = round(x_raw / 200) * 200) %>% 
  group_by(elev_bin) %>%
  summarise(
    y = mean(y_raw, na.rm = TRUE),
    conteo = n()
  ) %>%
  rename(x = elev_bin) %>%
  filter(conteo >= 5)

x_val <- datos_agrupados$x
y_val <- datos_agrupados$y

5 Conjetura del Modelo de Regresión Exponencial

La ecuación es \(y = a \cdot e^{b \cdot x}\). Para linealizar, aplicamos logaritmo solo a la variable dependiente: \(\ln(y) = \ln(a) + b \cdot x\).

# Linealización
y_log <- log(y_val)
modelo_exponencial <- lm(y_log ~ x_val)

# Parámetros
log_a <- coef(modelo_exponencial)[1]
b_param <- coef(modelo_exponencial)[2]
a_param <- exp(log_a)

6 Gráfica del Modelo Exponencial

Se presenta el ajuste del modelo incluyendo la banda de incertidumbre estadística (Intervalo de Confianza del 95%).

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

plot(x_val, y_val,
     main = "Gráfica N°2: Modelo Exponencial del Potencial Fotovoltaico (kWh/kWp)\n en función de la Elevación (m.s.n.m.)",
     xlab = "Elevación (m.s.n.m.)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = "#3498DB", pch = 16, cex = 1.0, cex.main = 0.9, frame.plot = FALSE)

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

x_seq <- seq(min(x_val), max(x_val), length.out = 500)

pred_log <- predict(modelo_exponencial,
                    newdata = data.frame(x_val = x_seq),
                    interval = "confidence",
                    level = 0.95)

y_pred_fit <- exp(pred_log[, "fit"])
y_pred_lwr <- exp(pred_log[, "lwr"])
y_pred_upr <- exp(pred_log[, "upr"])

# Intervalo de Confianza
polygon(c(x_seq, rev(x_seq)), 
        c(y_pred_lwr, rev(y_pred_upr)),
        col = rgb(0.5, 0.5, 0.5, 0.2), border = NA) 

lines(x_seq, y_pred_fit, col = "#E74C3C", lwd = 3)

legend("topleft",
       legend = c("Datos promediados (binning)", 
                  "Modelo Exponencial", 
                  "I.C. 95%"),
       col = c("#3498DB", "#E74C3C", "gray"),
       pch = c(16, NA, 15),
       lwd = c(NA, 3, NA),
       pt.cex = c(1, NA, 2),
       bty = "n")

7 Test de Bondad del Modelo

7.1 Coeficiente de correlación del modelo linealizado

r <- cor(x_val, log(y_val))
cat("El coeficiente de correlación es: ", round(r, 2))
El coeficiente de correlación es:  0.94

7.2 Coeficiente de determinación

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

8 Ecuación del Modelo

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

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

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

 y = 3.6462 * e^( 0.000135 x)

9 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Elevación (m.s.n.m.)", "Potencial Fotovoltaico (kWh/kWp)"),
  Tipo = c("Independiente (X)", "Dependiente (Y)"),
  R = c("", round(r, 2)),
  R2 = c("", round(r2, 2)),
  Parametro_a = c("", round(a_param, 4)),
  Exponente_b = c("", round(b_param, 6)),
  Ecuación = c("", ecuacion)
)

  tabla_resumen %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1 del Resumen del Modelo de Regresión Exponencial**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_align(align = "center", everything())
Tabla N°1 del Resumen del Modelo de Regresión Exponencial
Variable Tipo R R2 Parametro_a Exponente_b Ecuación
Elevación (m.s.n.m.) Independiente (X)
Potencial Fotovoltaico (kWh/kWp) Dependiente (Y) 0.94 0.89 3.6462 0.000135 y = 3.6462 * e^(0.000135x)
Autor: Martin Sarmiento

10 Cálculo de Estimaciones

¿Qué Potencial Fotovoltaico se estima para una Elevación de 1500 m s.n.m.?

elev_test <- 1500
pv_est <- a_param * exp(b_param * elev_test)

cat("Para una Elevación de", elev_test, "m.s.n.m., el Potencial Fotovoltaico estimado es:", round(pv_est, 4), "kWh/kWp")
Para una Elevación de 1500 m.s.n.m., el Potencial Fotovoltaico estimado es: 4.4668 kWh/kWp

11 Conclusiones

Entre la Elevación (m.s.n.m.) y el Potencial Fotovoltaico (kWh/kWp) existe una relación de tipo exponencial creciente, explicada por un coeficiente de determinación de 88.76%, lo que indica que el modelo logra explicar una alta proporción de la variabilidad del Potencial Fotovoltaico (kWh/kWp) en función de la Elevación (m.s.n.m.).

El coeficiente de correlación fue de 94.21%, evidenciando una relación fuerte y positiva entre las variables analizadas.

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