##### 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" ...
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
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.
# 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$ypar(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)La ecuación general del modelo es \(y = \beta_0 + \beta_1 x\).
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")El coeficiente de correlación de Pearson es: 0.91
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
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 | ||||||
¿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 °
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.