1 Configuración y Carga de Datos

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

#### MODELO DE REGRESIÓN POLINÓMICA ####
## DATASET ##
setwd("~/R REGRESION/POLINOMICA")
# 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 definió la Elevación (m.s.n.m.) como variable independiente (x), dado que representa la altitud geográfica del terreno respecto al nivel del mar, constituyendo un factor físico que influye en las condiciones atmosféricas y en la disponibilidad de radiación solar.

La GHI (kWh/m²) actúa como variable dependiente (y), ya que expresa la cantidad de energía solar recibida en la superficie terrestre en función de la altitud y las condiciones asociadas a ella.

Esta relación busca modelar el comportamiento de la radiación solar en función de la elevación. Desde el punto de vista físico, los cambios en altitud modifican la densidad atmosférica y la interacción de la radiación con las capas de la atmósfera, lo cual puede generar variaciones no lineales en la irradiación incidente. Por ello, se justifica el análisis mediante un modelo polinómico que capture posibles curvaturas en la tendencia observada.

  • Variable Independiente (X): Elevación (m.s.n.m., agrupada en rangos de 200 m).
  • Variable Dependiente (Y): GHI (kWh/m²).
# Selección de variables
datos_raw <- Datos %>%
  select(elevation, ghi) %>%
  mutate(
    x_raw = as.numeric(str_replace_all(as.character(elevation), ",", ".")),
    y_raw = as.numeric(str_replace_all(as.character(ghi), ",", "."))
  ) %>%
  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 < 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 de la GHI (kWh/m²)\n en función de la Elevación (m.s.n.m.)",
     xlab = "Elevación (m.s.n.m.)",
     ylab = "GHI (kWh/m²)",
     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

Ante la alta dispersión visualizada en la Gráfica N°1, se aplica un método de agrupamiento por rangos (binning) para reducir el ruido en los datos y permitir una mejor identificación de la tendencia subyacente.

# Agrupamiento por rangos de 200 m
datos_model <- datos_raw %>%
  mutate(x_bin = floor(x_raw / 200) * 200) %>% 
  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 (percentiles 5% - 95%)
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]
  )

# Variables finales para el modelo
x <- datos_model$x
y <- datos_model$y

5 Conjetura del Modelo de Regresión Polinómico

La ecuación de quinto grado para dicho modelo es \(y = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \beta_4 x^4 + \beta_5 x^5\)

modelo_polinomico <- lm(y ~ poly(x, 5, raw = TRUE))

6 Gráfica del Modelo Polinómico (Grado 5)

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

# Base del gráfico
plot(x, y,
     main = "Gráfica N°2: Modelo Polinómico de la GHI (kWh/m²) en función de la Elevación (m.s.n.m.)",
     xlab = "Elevación (m.s.n.m.)",
     ylab = "GHI (kWh/m²)",
     col = "#3498DB",
     pch = 16,
     cex = 1.0,
     cex.main = 0.9,
     frame.plot = FALSE)

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

# Generar curva suavizada
x_seq <- seq(min(x), max(x), length.out = 500)

predicciones <- predict(modelo_polinomico, newdata = data.frame(x = x_seq), interval = "confidence", level = 0.95)

# Intervalo de confianza
polygon(c(x_seq, rev(x_seq)), 
        c(predicciones[, "lwr"], rev(predicciones[, "upr"])), 
        col = rgb(0.5, 0.5, 0.5, 0.2), border = NA)

# Línea del modelo
lines(x_seq, predicciones[, "fit"], col = "#E74C3C", lwd = 3)

legend("topleft",
       legend = c("Datos promediados (binning)", 
                  "Modelo Polinómico (Grado 5)", 
                  "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

r <- cor(x, y) 
cat("El coeficiente de correlación es: ", round(r, 2))
El coeficiente de correlación es:  0.87

7.2 Coeficiente de determinación

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

8 Ecuación del Modelo

coeficientes <- coef(modelo_polinomico)

b0 <- coeficientes[1]
b1 <- coeficientes[2]
b2 <- coeficientes[3]
b3 <- coeficientes[4]
b4 <- coeficientes[5]
b5 <- coeficientes[6]

formatear <- function(coef, termino) {
  if (coef >= 0) {
    paste0(" + ", round(coef, 10), termino)
  } else {
    paste0(" - ", abs(round(coef, 10)), termino)
  }
}

ecuacion <- paste0(
  "y = ",
  round(b0, 4),
  formatear(b1, "x"),
  formatear(b2, "x^2"),
  formatear(b3, "x^3"),
  formatear(b4, "x^4"),
  formatear(b5, "x^5")
)

cat("La ecuación estimada del modelo es:\n\n", ecuacion)
La ecuación estimada del modelo es:

 y = 2.8599 + 0.0067956811x - 6.7825e-06x^2 + 3e-09x^3 - 0x^4 + 0x^5

9 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Elevación (m.s.n.m.)", "GHI (kWh/m²)"),
  Tipo = c("Independiente (x)", "Dependiente (y)"),
  R = c("", round(r, 2)),
  R2 = c("", round(r2, 2)),
  Intercepto = c("", round(b0, 4)),
  Beta1 = c("", round(b1, 6)),
  Beta2 = c("", round(b2, 8)),
  Beta3 = c("", round(b3, 10)),
  Beta4 = c("", round(b4, 12)),
  Beta5 = c("", round(b5, 14)),
  Ecuación = c("", ecuacion)
)

tabla_resumen %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 del Resumen del Modelo de Regresión Polinómica**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_align(
    align = "center",
    everything()
  )
Tabla N°1 del Resumen del Modelo de Regresión Polinómica
Variable Tipo R R2 Intercepto Beta1 Beta2 Beta3 Beta4 Beta5 Ecuación
Elevación (m.s.n.m.) Independiente (x)
GHI (kWh/m²) Dependiente (y) 0.87 0.87 2.8599 0.006796 -6.78e-06 3e-09 -1e-12 0 y = 2.8599 + 0.0067956811x - 6.7825e-06x^2 + 3e-09x^3 - 0x^4 + 0x^5
Autor: Martin Sarmiento

10 Cálculo de Estimaciones

¿Cuál es el GHI estimado para una Elevación de 1500 m.s.n.m.?

x_nuevo <- 1500
y_est <- predict(modelo_polinomico, newdata = data.frame(x = x_nuevo))

cat("Para una Elevación de", x_nuevo, "m.s.n.m., el GHI estimado es:", round(y_est, 4), "kWh/m²")
Para una Elevación de 1500 m.s.n.m., el GHI estimado es: 5.2459 kWh/m²

11 Conclusiones

Entre la Elevación (m.s.n.m.) y la GHI (kWh/m²) existe una relación polinómica de quinto grado, con un coeficiente de correlación es r = 0.87, lo que indica una asociación positiva fuerte entre ambas variables.

El modelo presenta un coeficiente de determinación R² = 0.87, lo que significa que el 87% de la variabilidad del GHI (kWh/m²) es explicada por la Elevación (m.s.n.m.) bajo el modelo polinómico estimado.

La ecuación ajustada es: \(y = 2.8599 + 0.006796 x - 6.78e-06 x^2 + 3e-09 x^3 - 1e-12 x^4 + 0 x^5\)

Se observa que el coeficiente asociado al término x⁵ es prácticamente nulo, lo que indica que el comportamiento del fenómeno está mayormente explicado por los términos de menor grado, especialmente los componentes lineales y cuadráticos.

En consecuencia, aunque se ajustó un modelo polinómico de quinto grado, la relación presenta un comportamiento predominantemente no lineal suave, sin evidencia de oscilaciones extremas en el rango analizado.