Eficiencia energética de los edificios en Aragón

MACHINE LEARNING

Author

Danny Jair Yaguana

Published

February 25, 2025

file.exists("~/INGENIERÍA AMBIENTAL/Semestre 3/Estadística y Probabilidad/Proyecto Eficiencia Energética Aragón/1.Datos")
[1] TRUE

Estimación de Emisiones de CO2 con multiplés parámetros

Regresión múltiple

Ahora conoceremos la correlación existente entre una variable dependiente y varias variables independientes mediante modelos de regresión aprovechando el Machine Learning o Aprendizaje de máquina, aprovechando el conjunto total de datos para que un 80% sea de entrenamiento y un 20% se de prueba del modelo.

Estadística multivariable

Buscamos el directorio de trabajo y cargamos la tabla de datos o el dataset:

setwd("~/INGENIERÍA AMBIENTAL/Semestre 3/Estadística y Probabilidad/Proyecto Eficiencia Energética Aragón/1.Datos")

library(readr)
data <- read.csv("Edificios_Reales.csv", sep = ";", dec = ".")

Verificamos que rstudio nos lea correctamente los datos

str(data)
'data.frame':   167479 obs. of  17 variables:
 $ Día_Emisión            : int  29 26 26 12 27 17 13 8 7 16 ...
 $ Mes_Emisión            : int  6 9 2 6 6 6 2 4 4 12 ...
 $ Año_Emisión            : int  2013 2013 2014 2013 2013 2013 2014 2014 2014 2013 ...
 $ Emision_CO2            : num  30.1 46.1 20.3 39.2 103.8 ...
 $ Clasificacion_Emisiones: chr  "E" "E" "D" "E" ...
 $ Demanda_energética     : num  142.3 174.4 94.2 187.7 409 ...
 $ Clasificacion_consumo  : chr  "E" "E" "D" "E" ...
 $ Tipo_edificio          : chr  "Vivienda individual" "Vivienda individual" "Vivienda individual" "Vivienda individual" ...
 $ Estado_edificio        : chr  "Existente" "Existente" "Existente" "Existente" ...
 $ Anio_construccion      : int  1962 1974 1999 1970 1965 1968 1966 1963 2006 1970 ...
 $ Superficie_m2          : num  49 81 72 65 46 ...
 $ Municipio              : chr  "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" ...
 $ Provincia              : chr  "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" ...
 $ Coordenadas._x         : num  674904 674063 671872 676129 674807 ...
 $ Coordenadas._y         : num  4612931 4612970 4612102 4613402 4613068 ...
 $ Anio_emision           : int  2013 2013 2014 2013 2013 2013 2014 2014 2014 2013 ...
 $ Dias_hasta_expiracion  : int  3652 3652 3652 3652 3652 3652 3652 3653 3653 3652 ...

Carga de librerías para R para realizar el modelo de predicción, necesitamos diferentes librerías para el entrenamiento, prueba, neuronas, entre otras.

# Cargar las bibliotecas
library(neuralnet)
Warning: package 'neuralnet' was built under R version 4.4.2
library(readr)
library(caret)
Warning: package 'caret' was built under R version 4.4.2
Cargando paquete requerido: ggplot2
Warning: package 'ggplot2' was built under R version 4.4.2
Cargando paquete requerido: lattice

1)Seleccionamos nuestras variables regresoras y nuestra variable a predecir.

# Definir la variable respuesta y las variables predictoras
Y <- data$Emision_CO2
# Asegúrate de que las columnas existen y que no hay errores tipográficos
colnames(data)
 [1] "Día_Emisión"             "Mes_Emisión"            
 [3] "Año_Emisión"             "Emision_CO2"            
 [5] "Clasificacion_Emisiones" "Demanda_energética"     
 [7] "Clasificacion_consumo"   "Tipo_edificio"          
 [9] "Estado_edificio"         "Anio_construccion"      
[11] "Superficie_m2"           "Municipio"              
[13] "Provincia"               "Coordenadas._x"         
[15] "Coordenadas._y"          "Anio_emision"           
[17] "Dias_hasta_expiracion"  
X <- data[ , c("Día_Emisión","Mes_Emisión","Año_Emisión", "Demanda_energética","Anio_construccion","Superficie_m2","Coordenadas._x", "Coordenadas._y","Anio_emision","Dias_hasta_expiracion")]

2) Depuramos las celdas de nuestra tabla que contenga valores vacios o nulos.

# Eliminar filas con NA en el conjunto de datos original
data <- na.omit(data)

3)Normalizamos nuestras variables para que la máquina pueda identificar correctamente todos los valores y no se produzcan errores al momento del entrenamiento.

# Normalizar las variables numéricas
numeric_features <- c("Día_Emisión", "Mes_Emisión", "Año_Emisión", "Demanda_energética",
"Anio_construccion", "Superficie_m2", "Anio_emision", "Dias_hasta_expiracion")
# Asegúrate de que las columnas sean numéricas
X[numeric_features] <- lapply(X[numeric_features], function(x) as.numeric(as.character(x)))
# Normalización Min-Max
preproc <- preProcess(X[, numeric_features], method = c("range"))
X_normalized <- predict(preproc, X[, numeric_features])
X_normalized <- as.data.frame(X_normalized)
# Combinar características normalizadas con otras características
X <- cbind(X[, !names(X) %in% numeric_features], X_normalized)

4) Dividimos nuestro conjunto de datos en dos: uno para entrenamiento con el 80% de los valores y otro para prueba con el 20% de los valores.Al final nos resulto entre 133983 valores de entrenamiento y 33496 valores de prueba

# Dividir los datos en conjuntos de entrenamiento y prueba
set.seed(42) # Para reproducibilidad
train_index <- createDataPartition(Y, p = 0.8, list = FALSE)
X_train <- X[train_index, ]
Y_train <- Y[train_index]
X_test <- X[-train_index, ]
Y_test <- Y[-train_index]

# Reemplazar espacios en los nombres de las columnas
names(X_train) <- make.names(names(X_train))
names(X_test) <- make.names(names(X_test))

# Crear un marco de datos para el entrenamiento
train_data <- data.frame(Y_train = Y_train, X_train)

# Eliminar filas con NA en el conjunto de entrenamiento
train_data <- na.omit(train_data)

# Verificar si hay valores NA introducidos
if (any(is.na(train_data))) {
cat("Valores NA introducidos en train_data. Verifique los niveles de los factores.\n")
print(sapply(train_data, function(x) sum(is.na(x)))) # Mostrar cuántos NA hay en cada columna
stop("Error: Hay valores NA en el conjunto de entrenamiento.")
}

# Convertir factores a numéricos de forma segura
train_data[] <- lapply(train_data, function(x) {
if (is.factor(x)) {
as.numeric(as.character(x)) # Convertir a caracteres y luego a numéricos
} else {
x
}
})

# Verificar si hay valores NA después de la conversión
if (any(is.na(train_data))) {
cat("Valores NA introducidos tras la conversión. Verifique los niveles de los factores.\n")
stop("Error: Hay valores NA en el conjunto de entrenamiento.")
}

5) Definimos nuestro modelo de predicción.

# Definir la fórmula para el modelo
predictor_names <- names(X_train)
formula <- as.formula(paste("Y_train ~", paste(predictor_names, collapse = " + ")))

Entrenamiento de la red neuronal

# Entrenar el modelo de red neuronal
model <- neuralnet(formula, data = train_data,
hidden = c(5), # Número de neuronas en la capa oculta
linear.output = TRUE) # Salida lineal para regresión
# Hacer predicciones
predictions <- compute(model, X_test)
predicted_values <- predictions$net.result

plot(model)

Prueba de la red neuronal

# Evaluación del modelo (ejemplo: RMSE) PREDICCIÓNM
RMSE <- sqrt(mean((predicted_values - Y_test)^2))
print(paste("RMSE:", RMSE))
[1] "RMSE: 243.682718711806"

Estimaciones

¿Cuál sera la emisión de CO2 de un edificio que su fecha de emisión sea el 10/10/2023 con una demanda energética de 100.34 KWh/m2*año, su año de construcción fuera en el 1950 d.c., tenga una superficie de 204.22 m2, sus coordenadas sean [67 000, 78 000]m y tenga un tiempo de vida sea de 1053 días?

Con dichas especificaciones, el modelo nos arroja un valor de 0.47 Kg de CO2.