1 Configuración y Carga de Datos

##### 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" ...
# 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)

2 Extracción y Depuración de Variables

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.

  • Variable Independiente (X): GHI (kWh/m²), agrupado en intervalos de 0.2 unidades.
  • Variable Dependiente (Y): Potencial Fotovoltaico (kWh/kWp).
# 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)

3 Análisis Gráfico Exploratorio

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")

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.

# 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$y

5 Conjetura del Modelo de Regresión Logarítmico

La ecuación del modelo es: \(y = a + b \cdot \ln(x)\).

modelo_log <- lm(y ~ log(x))

6 Gráfica del Modelo Logarítmico

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")

7 Test de Bondad del Modelo

7.1 Test de Pearson

r <- cor(log(x), y, use = "complete.obs")
cat("El coeficiente de correlación de Pearson es: ", round(r, 2))
El coeficiente de correlación de Pearson es:  0.99

7.2 Coeficiente de determinación

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

8 Ecuación del Modelo

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)

9 Tabla Resumen del Modelo

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

10 Cálculo de Estimaciones

¿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

11 Conclusiones

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.