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 SIMPLE ####
## DATASET ##
setwd("~/R REGRESION/LINEAL")
# 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

# Selección de variables
datos_filtrados <- Datos %>%
  select(ghi, pv_potential) %>%
  mutate(
    ghi = as.numeric(gsub(",", ".", ghi)),
    pv_potential = as.numeric(gsub(",", ".", pv_potential))
  ) %>%
  filter(
    !is.na(ghi),
    !is.na(pv_potential),
    ghi > 0,
    pv_potential > 0
  )

# Verificación de tipos
str(datos_filtrados)
## 'data.frame':    5075 obs. of  2 variables:
##  $ ghi         : num  6.11 8.01 7.88 6.12 6.22 ...
##  $ pv_potential: num  4.98 6.39 6.39 4.97 5 ...
# Eliminación de outliers (1% - 99%)
lim_x <- quantile(datos_filtrados$ghi, probs = c(0.01, 0.99), na.rm = TRUE)
lim_y <- quantile(datos_filtrados$pv_potential, probs = c(0.01, 0.99), na.rm = TRUE)

datos_limpios <- datos_filtrados %>%
  filter(
    ghi >= lim_x[1] & ghi <= lim_x[2],
    pv_potential >= lim_y[1] & pv_potential <= lim_y[2]
  )

x <- datos_limpios$ghi
y <- datos_limpios$pv_potential

3 Análisis Gráfico Exploratorio

plot(jitter(x), jitter(y),
     main = "Gráfica N°1: Diagrama de dispersión del potencial fotovoltaico\n en función de la irradiancia global",
     xlab = "Irradiancia Global (kWh/m²)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = rgb(0, 0, 1, alpha = 0.25),
     pch = 20)

4 Conjetura del Modelo de Regresión Lineal

                                              **y = mx + b**
modelo_lineal <- lm(y ~ x)
summary(modelo_lineal)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.13036 -0.03820 -0.00664  0.02603  0.41608 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.284087   0.011207   25.35   <2e-16 ***
## x           0.735274   0.001899  387.27   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05107 on 4956 degrees of freedom
## Multiple R-squared:  0.968,  Adjusted R-squared:  0.968 
## F-statistic: 1.5e+05 on 1 and 4956 DF,  p-value: < 2.2e-16

5 Gráfica del Modelo Lineal

plot(jitter(x), jitter(y),
     main = "Gráfica N°2: Modelo de regresión lineal del potencial fotovoltaico",
     xlab = "Irradiancia Global (kWh/m²)",
     ylab = "Potencial Fotovoltaico (kWh/kWp)",
     col = rgb(0, 0, 1, alpha = 0.25),
     pch = 20)

abline(modelo_lineal, col = "red", lwd = 2)

6 Test de Bondad del Modelo

6.1 Test de Pearson

r <- cor(x, y) * 100
r
## [1] 98.38762

6.2 Coeficiente de determinación

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

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))
ecuacion
## [1] "y = 0.7353x + 0.2841"

8 Tabla Resumen del Modelo

tabla_resumen <- data.frame(
  Variable = c("Irradiancia Global (kWh/m²)", "Potencial Fotovoltaico (kWh/kWp)"),
  Tipo = c("Independiente", "Dependiente"),
  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: 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: Resumen del Modelo de Regresión Lineal
Variable Tipo Pearson R2 Intercepto Pendiente Ecuación
Irradiancia Global (kWh/m²) Independiente
Potencial Fotovoltaico (kWh/kWp) Dependiente 98.39 96.8 0.28 0.7353 y = 0.7353x + 0.2841
Autor: Martin Sarmiento

9 Cálculo de Estimaciones

¿Cuál sería el potencial fotovoltaico para una irradiancia global de 1800?

y_est <- m * 1800 + b
y_est
##        x 
## 1323.777

10 Conclusiones

Entre la irradiancia global y el potencial fotovoltaico existe una relación de tipo lineal positiva, la cual puede representarse mediante el modelo y = mx + b. El coeficiente de correlación de Pearson indica una relación fuerte entre ambas variables, mientras que el coeficiente de determinación muestra que un alto porcentaje de la variabilidad del potencial fotovoltaico es explicado por la irradiancia global. Esto confirma que la irradiancia solar es un factor determinante en la generación de energía fotovoltaica, mientras que el porcentaje restante se debe a otros factores no considerados en el modelo.