##### 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" ...
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
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.
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")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$yLa 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\).
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")El coeficiente de correlación es: 0.94
# 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)
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 | ||||||
¿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
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 R² 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}\)