##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: MARTIN SARMIENTO ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####
#### MODELO DE REGRESIÓN LOGARÍTMICA ####
## DATASET ##
setwd("~/R REGRESION/LOGARITMICA")
# 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 estableció el GHI (kWh/m²) como variable independiente (x), ya que representa la cantidad de radiación solar disponible en una determinada ubicación geográfica y constituye el principal insumo energético para la generación fotovoltaica.
El Potencial Fotovoltaico (kWh/kWp) actúa como variable dependiente (y), puesto que refleja la capacidad estimada de producción eléctrica por unidad instalada en función del recurso solar disponible.
Esta relación modela el comportamiento del rendimiento energético: a medida que el GHI aumenta, el potencial fotovoltaico también se incrementa, aunque con una tasa de crecimiento decreciente, lo cual justifica el uso de un modelo logarítmico para capturar dicha tendencia no lineal.
# Selección de variables
datos_raw <- Datos %>%
select(ghi, pv_potential) %>%
mutate(
x_raw = abs(as.numeric(str_replace(as.character(ghi), ",", "."))),
y_raw = abs(as.numeric(str_replace(as.character(pv_potential), ",", ".")))
) %>%
filter(!is.na(x_raw) & !is.na(y_raw) & x_raw > 0 & y_raw > 0) %>%
filter(y_raw < 15000)datos_plot <- datos_raw %>% filter(x_raw < 15000)
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 del GHI(kWh/m²)",
xlab = "GHI (kWh/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.
# Agrupamiento cada 0.2 unidades de GHI
datos_model <- datos_raw %>%
mutate(x_bin = round(x_raw / 0.2) * 0.2) %>%
group_by(x_bin) %>%
summarise(
y = mean(y_raw, na.rm = TRUE),
conteo = n(),
.groups = "drop"
) %>%
rename(x = x_bin) %>%
filter(conteo >= 3)
# Limpieza de outliers
lim_y <- quantile(datos_model$y, probs = c(0.05, 0.95), na.rm = TRUE)
datos_model <- datos_model %>%
filter(y >= lim_y[1] & y <= lim_y[2])
x <- datos_model$x
y <- datos_model$yLa ecuación del modelo es: \(y = a + b \cdot \ln(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, y,
main = "Gráfica N°2: Modelo Exponencial del Potencial Fotovoltaico (kWh/kWp)\n en función del GHI (kWh/m²)",
xlab = "GHI (kWh/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")
# Secuencia suave
x_seq <- seq(min(x), max(x), length.out = 500)
pred_log <- predict(modelo_log,
newdata = data.frame(x = x_seq),
interval = "confidence",
level = 0.95)
# Intervalo de confianza
polygon(c(x_seq, rev(x_seq)),
c(pred_log[,"lwr"], rev(pred_log[,"upr"])),
col = rgb(0.5, 0.5, 0.5, 0.2),
border = NA)
# Línea ajustada
lines(x_seq, pred_log[,"fit"], col = "#E74C3C", lwd = 3)
legend("topleft",
legend = c("Datos promediados (binning)",
"Modelo Logarítmico",
"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")a_bin <- coef(modelo_log)[1]
b_bin <- coef(modelo_log)[2]
if (b_bin >= 0) {
ecuacion <- paste0("y = ",
round(a_bin, 4),
" + ",
round(b_bin, 4),
" ln(x)")
} else {
ecuacion <- paste0("y = ",
round(a_bin, 4),
" - ",
abs(round(b_bin, 4)),
" ln(x)")
}
cat("La ecuación estimada del modelo es:\n\n", ecuacion)La ecuación estimada del modelo es:
y = -1.6156 + 3.6283 ln(x)
tabla_resumen <- data.frame(
Variable = c("GHI (kWh/m²)", "Potencial Fotovoltaico (kWh/kWp)"),
Tipo = c("Independiente (x)", "Dependiente (y)"),
Pearson = c("", round(r, 2)),
R2 = c("", round(r2, 2)),
Intercepto_a = c("", round(a_bin, 4)),
Pendiente_b = c("", round(b_bin, 4)),
Ecuación = c("", ecuacion)
)
tabla_resumen %>%
gt() %>%
tab_header(title = md("**Tabla N°1 del Resumen del Modelo de Regresión Logarítmica**")) %>%
tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
cols_align(align = "center", everything())| Tabla N°1 del Resumen del Modelo de Regresión Logarítmica | ||||||
| Variable | Tipo | Pearson | R2 | Intercepto_a | Pendiente_b | Ecuación |
|---|---|---|---|---|---|---|
| GHI (kWh/m²) | Independiente (x) | |||||
| Potencial Fotovoltaico (kWh/kWp) | Dependiente (y) | 0.99 | 0.99 | -1.6156 | 3.6283 | y = -1.6156 + 3.6283 ln(x) |
| Autor: Martin Sarmiento | ||||||
¿Cuál es el Potencial Fotovoltaico estimado para una zona con un GHI de 5.2 kWh/m²?
ghi_test <- 5.2
y_est <- predict(modelo_log,
newdata = data.frame(x = ghi_test))
cat("Para un GHI de", ghi_test,
"kWh/m², el Potencial Fotovoltaico estimado es:",
round(y_est, 4), "kWh/kWp")Para un GHI de 5.2 kWh/m², el Potencial Fotovoltaico estimado es: 4.3662 kWh/kWp
Entre el GHI (kWh/m²) y el Potencial Fotovoltaico (kWh/kWp) existe una relación de tipo logarítmica, con un coeficiente de determinación R² = 0.99, lo que indica un ajuste excelente del modelo.
La ecuación estimada es: \(y = - 1.6156 + 3.6283 \cdot \ln(x)\).
El modelo presenta como única condición matemática que x > 0, lo cual se cumple naturalmente en el contexto físico del GHI (kWh/m²), por lo que no existen restricciones prácticas dentro del rango analizado.