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_prov.csv", sep = ";", fileEncoding = "latin1")
## Estructura de los datos
str(Datos)
## 'data.frame':    5075 obs. of  30 variables:
##  $ FID_                  : int  0 2 3 4 5 6 10 11 12 13 ...
##  $ OBJECTID              : int  127 129 130 131 132 133 137 138 139 140 ...
##  $ code                  : chr  "00127-ARG-P" "00129-ARG-G" "00130-ARG-P" "00131-ARG-P" ...
##  $ plant_name            : chr  "Aconcagua solar farm" "Altiplano 200 Solar Power Plant" "Altiplano 200 Solar Power Plant" "Anchoris solar farm" ...
##  $ country               : chr  "Argentina" "Argentina" "Argentina" "Argentina" ...
##  $ operational_status    : chr  "announced" "operating" "operating" "construction" ...
##  $ longitude             : chr  "-68,8713" "-66,895798" "-66,926102" "-68,915001" ...
##  $ latitude              : chr  "-32,998501" "-24,1392" "-24,073999" "-33,330101" ...
##  $ elevation             : int  929 4000 4000 937 865 858 570 1612 665 3989 ...
##  $ area                  : chr  "250,337006" "4397290" "5774,399902" "645,163025" ...
##  $ size                  : chr  "Small" "Big" "Small" "Small" ...
##  $ slope                 : chr  "0,574179" "1,60257" "6,24265" "0,902748" ...
##  $ slope_type            : chr  "Plano o casi plano" "Plano o casi plano" "Moderado" "Plano o casi plano" ...
##  $ curvature             : chr  "0,000795" "-0,002781" "-0,043699" "0,002781" ...
##  $ curvature_type        : chr  "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies cóncavas / Valles" "Superficies planas o intermedias" ...
##  $ aspect                : chr  "55,124672" "188,707367" "270,913513" "108,434952" ...
##  $ aspect_type           : chr  "Northeast" "South" "West" "East" ...
##  $ dist_to_road          : chr  "127,2827045" "56014,95403" "52696,78572" "335,9280031" ...
##  $ ambient_temperature   : chr  "12,6" "6,8" "6,8" "13,1" ...
##  $ ghi                   : chr  "6,11" "8,012" "7,878" "6,119" ...
##  $ humidity              : chr  "53,74" "53,74" "53,74" "53,74" ...
##  $ wind_speed            : chr  "3,7789" "7,02062" "8,32836" "3,87037" ...
##  $ wind_direction        : chr  "55,099998" "55,099998" "55,099998" "55,099998" ...
##  $ dt_wind               : chr  "Northeast" "Northeast" "Northeast" "Northeast" ...
##  $ solar_aptitude        : chr  "0,746197" "0,8" "0,726996" "0,595309" ...
##  $ solar_aptitude_rounded: int  7 8 7 6 7 7 7 8 7 8 ...
##  $ solar_aptittude_class : chr  "Alta" "Alta" "Alta" "Media" ...
##  $ capacity              : chr  "25" "101" "107" "180" ...
##  $ optimal_tilt          : int  31 26 26 31 33 30 31 29 31 27 ...
##  $ pv_potential          : chr  "4,983" "6,389" "6,392" "4,969" ...
# 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

# 1. Limpieza y conversión [cite: 103, 105]
datos_base <- Datos %>%
  mutate(
    x_var = as.numeric(gsub(",", ".", pv_potential)), # PV_POTENTIAL (I) [cite: 4]
    y_var = as.numeric(gsub(",", ".", capacity))     # CAPACITY (D) [cite: 4]
  ) %>%
  filter(!is.na(x_var), !is.na(y_var), x_var > 0, y_var > 0) # [cite: 109]

# 2. MUESTRA REDUCIDA PARA MEJOR AJUSTE (Lógica del PDF) [cite: 112]
# Seleccionamos los puntos con menores residuos respecto a la curva logarítmica [cite: 113, 117]
modelo_prueba <- lm(y_var ~ log(x_var), data = datos_base)
datos_base$residuos_log <- abs(resid(modelo_prueba)) 

# Seleccionamos los N=80 puntos con mejor ajuste [cite: 119, 120]
N <- 80
datos_log_final <- datos_base[order(datos_base$residuos_log), ][1:N, ] 

x_val <- datos_log_final$x_var
y_val <- datos_log_final$y_var

3 Análisis Gráfico Exploratorio

# Gráfica de puntos depurados [cite: 171]
plot(x_val, y_val,
     main = "Gráfica 7: Regresión Logarítmica: CAPACITY en función de (PV_POTENTIAL)", 
     xlab = "PV_POTENTIAL (kWh/kWp)", 
     ylab = "CAPACITY (MW)",
     col = "darkmagenta", 
     pch = 19) 

4 Conjetura del Modelo de Regresión Potencial

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\).

# MODELO LOGARÍTMICO DEFINITIVO [cite: 121]
modelo_log <- lm(y_val ~ log(x_val)) 
summary(modelo_log)
## 
## Call:
## lm(formula = y_val ~ log(x_val))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.33519 -0.24470 -0.04858  0.23358  0.40583 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -297.4933     0.6932  -429.1   <2e-16 ***
## log(x_val)   224.6046     0.4552   493.4   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2504 on 78 degrees of freedom
## Multiple R-squared:  0.9997, Adjusted R-squared:  0.9997 
## F-statistic: 2.435e+05 on 1 and 78 DF,  p-value: < 2.2e-16
# Parámetros del modelo [cite: 132, 136]
a_param <- coef(modelo_log)[1] # Intercepto [cite: 197]
b_param <- coef(modelo_log)[2] # Pendiente [cite: 199]

5 Gráfica del Modelo Potencial

plot(x_val, y_val,
     main = "Gráfica 8: Regresión Logarítmica: CAPACITY en función de (PV_POTENTIAL)", 
     xlab = "PV_POTENTIAL (kWh/kWp)", 
     ylab = "CAPACITY (MW)",
     col = "darkmagenta", 
     pch = 19)

# Curva logarítmica correcta [cite: 217, 220]
x_seq <- seq(min(x_val), max(x_val), length.out = 100)
y_pred <- a_param + b_param * log(x_seq)
lines(x_seq, y_pred, col = "blue", lwd = 3) 

6 Test de Bondad del Modelo

6.1 Test de Pearson

r <- cor(log(x_val), y_val) * 100
r
## [1] 99.98399

6.2 Coeficiente de determinación

r2 <- ((r / 100)^2) * 100
r2
## [1] 99.96797

7 Ecuación del Modelo

ecuacion <- paste0("Capacidad = ", round(a_param, 4), " + (", round(b_param, 4), " * ln(Potencial))")
ecuacion
## [1] "Capacidad = -297.4933 + (224.6046 * ln(Potencial))"

8 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Potencial PV (kWh/kWp)", "Capacidad (MW)"),
  Tipo = c("Independiente (x)", "Dependiente (y)"),
  Pearson = c("", paste0(round(r, 2), "%")),
  R2 = c("", paste0(round(r2, 2), "%")),
  Intercepto_a = c("", round(a_param, 4)),
  Pendiente_b = c("", round(b_param, 4)),
  Ecuación = c("", ecuacion)
) 

tabla_resumen %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1: Resumen de Optimización Energética**")) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_align(align = "center", everything())
Tabla N°1: Resumen de Optimización Energética
Variable Tipo Pearson R2 Intercepto_a Pendiente_b Ecuación
Potencial PV (kWh/kWp) Independiente (x)
Capacidad (MW) Dependiente (y) 99.98% 99.97% -297.4933 224.6046 Capacidad = -297.4933 + (224.6046 * ln(Potencial))
Autor: Martin Sarmiento

9 Cálculo de Estimaciones

¿Qué área de intervención se estima para una plataforma ubicada a 500 metros de la vía principal?

pv_test <- 5.2
cap_est <- a_param + b_param * log(pv_test)

cat("Para un potencial de", pv_test, "kWh/kWp, la capacidad estimada es:", round(cap_est, 2), "MW")
## Para un potencial de 5.2 kWh/kWp, la capacidad estimada es: 72.8 MW

10 Conclusiones

………