1 Configuración y Carga de Datos

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

#### MODELO DE REGRESIÓN LINEAL ####
## DATASET ##
setwd("~/R REGRESION/LINEAL")
# 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 seleccionó la Latitud (°) como variable independiente (x), ya que representa un parámetro geográfico fijo que determina la posición del lugar en el planeta.

Por consiguiente, la Inclinación Óptima (°) se considera la variable dependiente (y), debido a que su valor depende directamente de la latitud para maximizar la captación de radiación solar.

  • Variable Independiente (X): Latitud (°)
  • Variable Dependiente (Y): Inclinación Óptima (°)
# Selección de variables
datos_model <- Datos %>%
  select(latitude, optimal_tilt) %>%
  mutate(
  x = abs(as.numeric(gsub(",", ".", as.character(latitude)))),
  y = abs(as.numeric(gsub(",", ".", as.character(optimal_tilt))))
  ) %>%
  filter(
    !is.na(x),
    !is.na(y),
    x > 0,
    y > 0,
    x <= 90,        
    y <= 90         
  )

# Omitir outliers 
lim_x <- quantile(datos_model$x, probs = c(0.01, 0.99), na.rm = TRUE)
lim_y <- quantile(datos_model$y, probs = c(0.01, 0.99), na.rm = TRUE)

datos_model <- datos_model %>%
  filter(
    x >= lim_x[1] & x <= lim_x[2],
    y >= lim_y[1] & y <= lim_y[2]
  )

x <- datos_model$x
y <- datos_model$y

3 Análisis Gráfico Exploratorio

par(mar = c(5, 5, 4, 2))

plot(jitter(x), jitter(y),
     main = "Gráfica N°1: Diagrama de Dispersión de la Inclinación Óptima (°)\n en función de la Latitud (°)",
     xlab = "Latitud (°)",
     ylab = "Inclinación Óptima (°)",
     col = "#3498DB",
     pch = 16,
     cex = 0.5,
     cex.main = 0.9,
     cex.lab = 0.95,
     cex.axis = 0.85,
     frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")

axis(1)
axis(2)

4 Conjetura del Modelo de Regresión Lineal

La ecuación general del modelo es \(y = \beta_0 + \beta_1 x\).

modelo_lineal <- lm(y ~ x, data = datos_model)

5 Gráfica del Modelo Lineal

Se presenta el ajuste lineal 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 de Regresión Lineal de la Inclinación Óptima (°)\n en función de la Latitud (°)",
     xlab = "Latitud (°)",
     ylab = "Inclinación Óptima (°)",
     col = "#3498DB",
     pch = 16,
     cex = 0.6,
     cex.main = 0.9,
     frame.plot = FALSE)

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

# Secuencia de valores para suavizar la recta
x_seq <- seq(min(x), max(x), length.out = 500)

# Predicciones con intervalo de confianza
predicciones <- predict(modelo_lineal,
                        newdata = data.frame(x = x_seq),
                        interval = "confidence",
                        level = 0.95)

# Banda del 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 = "red",
      lwd = 3)

# Leyenda
legend("topleft",
       legend = c("Datos Reales", "Modelo Lineal", "I.C. 95%"),
       col = c("#3498DB", "red", "gray"),
       pch = c(16, NA, 15),
       lwd = c(NA, 3, NA),
       pt.cex = c(0.7, NA, 2),
       bty = "n")

6 Test de Bondad del Modelo

6.1 Test de Pearson

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

6.2 Coeficiente de Determinación

r2 <- ((r / 100)^2) 
cat("El coeficiente de determinación (R²) es:", round(r2, 2))
El coeficiente de determinación (R²) es: 0

7 Ecuación del Modelo

b <- coef(modelo_lineal)[1]
m <- coef(modelo_lineal)[2]

ecuacion <- paste0("y = ", round(m, 4), "x + ", round(b, 4))
cat("La ecuación estimada del modelo es:\n\n", "y =", round(m,4), "x +", round(b,4))
La ecuación estimada del modelo es:

 y = 0.5912 x + 9.6301

8 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Latitud (°)", "Inclinación Óptima (°)"),
  Tipo = c("Independiente (x)", "Dependiente (y)"),
  Pearson = c("", round(r, 2)),
  R2 = c("", round(r2, 2)),
  Intercepto = c("", round(b, 2)),
  Pendiente = c("", round(m, 4)),
  Ecuación = c("", ecuacion)
)

tabla_resumen %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 del Resumen del Modelo de Regresión Lineal**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_align(
    align = "center",
    everything()
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°1 del Resumen del Modelo de Regresión Lineal
Variable Tipo Pearson R2 Intercepto Pendiente Ecuación
Latitud (°) Independiente (x)
Inclinación Óptima (°) Dependiente (y) 0.91 0 9.63 0.5912 y = 0.5912x + 9.6301
Autor: Martin Sarmiento

9 Cálculo de Estimaciones

¿Cuál sería la Inclinación Óptima esperada para una Latitud de 35°?

lat_test <- 35
y_est <- m * lat_test + b

cat("Para una Latitud de", lat_test, "°, la Inclinación Óptima estimada es:", round(y_est, 2), "°")
Para una Latitud de 35 °, la Inclinación Óptima estimada es: 30.32 °

10 Conclusiones

Entre la Latitud (°) y la Inclinación Óptima (°) existe una relación de tipo lineal cuya ecuación matemática está representada por \(y = 0.5912 x + 9.6301\), siendo ‘x’ la Latitud (°) en m y ‘y’ la Inclinación Óptima (°).

El modelo estimado muestra que por cada grado que aumenta la Latitud (°), la Inclinación Óptima (°) aumenta en aproximadamente 0.58°. El intercepto representa el valor estimado cuando la Latitud es 0°, y su presencia mejora el ajuste estadístico del modelo. El R² ≈ 80% indica un buen nivel de explicación de los datos.