2025-03-20

Descargar las librerias y traer el database

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(ggplot2)
library(dplyr)
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## 
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Attaching package: 'VIM'
## 
## The following object is masked from 'package:datasets':
## 
##     sleep
datos <- read_excel("dataset_demanda_energia.xlsx")

Verificar datos faltantes

sum(is.na(datos))
## [1] 59
datos_faltantes <- colSums(is.na(datos))
porcentaje_faltantes <- (datos_faltantes / nrow(datos)) * 100

Visualizar porcentaje de datos faltantes

print(porcentaje_faltantes)
##             id_cliente           tipo_cliente        zona_geográfica 
##                   0.00                   0.00                   0.00 
##          nivel_ingreso       edad_instalación    potencia_contratada 
##                   0.00                   0.00                   0.00 
##            temperatura       humedad_relativa        precipitaciones 
##                   0.00                   0.00                   0.00 
##             día_semana               hora_día               estación 
##                   0.00                   0.00                   0.00 
##            día_laboral   consumo_medio_diario           consumo_pico 
##                   0.00                   0.00                   0.00 
##   variabilidad_consumo        factor_potencia    uso_paneles_solares 
##                   0.00                   0.00                   0.00 
##      capacidad_batería             horas_pico         carga_nocturna 
##                   0.00                   0.00                   0.00 
##          tarifa_actual          costo_mensual subsidio_gubernamental 
##                   0.00                   0.00                   0.00 
##        aumento_consumo       historico_cortes  eficiencia_energética 
##                   0.00                   0.00                   0.00 
##        demanda_energia          nivel_demanda 
##                   0.00                   0.59

Imputar los datos faltantes

set.seed(6942)
datos <- kNN(datos, k = 5, imp_var = FALSE)
sum(is.na(datos))
## [1] 0

1. Análisis Exploratorio de Datos (EDA)

# Estadísticas descriptivas
summary(datos)
##    id_cliente    tipo_cliente       zona_geográfica    nivel_ingreso     
##  Min.   :    1   Length:10000       Length:10000       Length:10000      
##  1st Qu.: 2501   Class :character   Class :character   Class :character  
##  Median : 5000   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 5000                                                           
##  3rd Qu.: 7500                                                           
##  Max.   :10000                                                           
##  edad_instalación potencia_contratada  temperatura     humedad_relativa
##  Min.   : 1.012   Min.   : 3.002      Min.   :-4.993   Min.   :10.02   
##  1st Qu.:13.482   1st Qu.:26.706      1st Qu.: 6.641   1st Qu.:32.85   
##  Median :25.372   Median :51.025      Median :17.788   Median :55.63   
##  Mean   :25.499   Mean   :51.142      Mean   :17.686   Mean   :55.37   
##  3rd Qu.:37.648   3rd Qu.:75.349      3rd Qu.:28.913   3rd Qu.:77.85   
##  Max.   :49.998   Max.   :99.993      Max.   :39.992   Max.   :99.99   
##  precipitaciones      día_semana       hora_día       estación        
##  Min.   :  0.0031   Min.   :1.000   Min.   : 0.00   Length:10000      
##  1st Qu.: 50.1243   1st Qu.:2.000   1st Qu.: 5.00   Class :character  
##  Median :100.0344   Median :4.000   Median :12.00   Mode  :character  
##  Mean   :100.2759   Mean   :3.978   Mean   :11.49                     
##  3rd Qu.:149.3453   3rd Qu.:6.000   3rd Qu.:18.00                     
##  Max.   :199.9630   Max.   :7.000   Max.   :23.00                     
##  día_laboral        consumo_medio_diario  consumo_pico    variabilidad_consumo
##  Length:10000       Min.   :100.1        Min.   : 150.1   Min.   :  5.008     
##  Class :character   1st Qu.:324.1        1st Qu.: 410.9   1st Qu.: 41.412     
##  Mode  :character   Median :546.8        Median : 673.0   Median : 77.569     
##                     Mean   :548.4        Mean   : 676.4   Mean   : 77.412     
##                     3rd Qu.:772.4        3rd Qu.: 941.2   3rd Qu.:113.499     
##                     Max.   :999.9        Max.   :1199.9   Max.   :149.998     
##  factor_potencia  uso_paneles_solares capacidad_batería    horas_pico    
##  Min.   :0.5000   Length:10000        Min.   : 0.00029   Min.   : 1.000  
##  1st Qu.:0.6254   Class :character    1st Qu.:12.34136   1st Qu.: 3.750  
##  Median :0.7501   Mode  :character    Median :25.21151   Median : 7.000  
##  Mean   :0.7490                       Mean   :25.13434   Mean   : 6.526  
##  3rd Qu.:0.8726                       3rd Qu.:37.67569   3rd Qu.:10.000  
##  Max.   :1.0000                       Max.   :49.99935   Max.   :12.000  
##  carga_nocturna  tarifa_actual     costo_mensual    subsidio_gubernamental
##  Min.   :10.01   Min.   :0.05007   Min.   : 20.07   Length:10000          
##  1st Qu.:30.80   1st Qu.:0.11302   1st Qu.:141.04   Class :character      
##  Median :50.58   Median :0.17595   Median :261.02   Mode  :character      
##  Mean   :50.40   Mean   :0.17571   Mean   :261.31                         
##  3rd Qu.:70.56   3rd Qu.:0.23821   3rd Qu.:384.83                         
##  Max.   :90.00   Max.   :0.29998   Max.   :499.98                         
##  aumento_consumo   historico_cortes eficiencia_energética demanda_energia 
##  Min.   :-10.000   Min.   : 0.000   Length:10000          Min.   :-269.1  
##  1st Qu.: -2.550   1st Qu.: 2.000   Class :character      1st Qu.: 366.4  
##  Median :  4.858   Median : 5.000   Mode  :character      Median : 497.8  
##  Mean   :  5.023   Mean   : 5.017                         Mean   : 499.5  
##  3rd Qu.: 12.738   3rd Qu.: 8.000                         3rd Qu.: 634.7  
##  Max.   : 19.999   Max.   :10.000                         Max.   :1269.6  
##  nivel_demanda     
##  Length:10000      
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Histogramas para variables numéricas

ggplot(datos, aes(x = consumo_medio_diario)) + geom_histogram(binwidth = 50, fill = "blue", color = "black") + ggtitle("Distribucion del Consumo Medio Diario")

Histogramas para variables numéricas

ggplot(datos, aes(x = temperatura)) + geom_histogram(binwidth = 5, fill = "red", color = "black") + ggtitle("Distribucion de la Temperatura")

Boxplots para variables categóricas

ggplot(datos, aes(x = tipo_cliente, y = consumo_medio_diario)) + geom_boxplot() + ggtitle("Consumo Medio Diario por Tipo de Cliente")

Boxplots para variables categóricas

ggplot(datos, aes(x = nivel_ingreso, y = consumo_medio_diario)) + geom_boxplot() + ggtitle("Consumo Medio Diario por Nivel de Ingresos")

Correlación entre variables numéricas

cor(datos %>% select_if(is.numeric))
##                         id_cliente edad_instalación potencia_contratada
## id_cliente            1.0000000000    -0.0001988092        0.0001772683
## edad_instalación     -0.0001988092     1.0000000000        0.0072737806
## potencia_contratada   0.0001772683     0.0072737806        1.0000000000
## temperatura          -0.0016297082    -0.0030914522       -0.0020125552
## humedad_relativa      0.0097815932     0.0015556454        0.0210124494
## precipitaciones       0.0055285600     0.0084926452       -0.0012204570
## día_semana            0.0019134121     0.0125224005        0.0092211092
## hora_día             -0.0162462438     0.0025736952       -0.0012608428
## consumo_medio_diario  0.0041485707     0.0096728499        0.0225380356
## consumo_pico         -0.0176019375    -0.0059942741       -0.0010427169
## variabilidad_consumo -0.0350434000    -0.0129610393       -0.0090588585
## factor_potencia       0.0044300053    -0.0265597274       -0.0092120389
## capacidad_batería     0.0161907523    -0.0161972682       -0.0101010766
## horas_pico            0.0065692420    -0.0009340993        0.0101562832
## carga_nocturna        0.0049071734     0.0060846630       -0.0057484707
## tarifa_actual        -0.0094764520    -0.0018007500       -0.0047850378
## costo_mensual         0.0003653233     0.0039746211       -0.0113873644
## aumento_consumo       0.0131392681     0.0158513597       -0.0028345707
## historico_cortes      0.0158304858     0.0095547697       -0.0041902719
## demanda_energia      -0.0103161608     0.0085548648       -0.0088350549
##                        temperatura humedad_relativa precipitaciones
## id_cliente           -0.0016297082     0.0097815932    5.528560e-03
## edad_instalación     -0.0030914522     0.0015556454    8.492645e-03
## potencia_contratada  -0.0020125552     0.0210124494   -1.220457e-03
## temperatura           1.0000000000    -0.0177694283   -3.149042e-03
## humedad_relativa     -0.0177694283     1.0000000000   -2.018368e-02
## precipitaciones      -0.0031490416    -0.0201836755    1.000000e+00
## día_semana            0.0150063009     0.0011071488   -2.750427e-04
## hora_día              0.0171477800     0.0022845197    1.822114e-02
## consumo_medio_diario -0.0202167206    -0.0104426734    7.126433e-03
## consumo_pico         -0.0200718341     0.0068318493   -2.189052e-02
## variabilidad_consumo  0.0183759029    -0.0156485268   -2.879277e-06
## factor_potencia      -0.0001275854     0.0105514981    6.645919e-04
## capacidad_batería     0.0086871362     0.0010966502   -1.388825e-02
## horas_pico           -0.0095338412     0.0047782332    2.674719e-02
## carga_nocturna        0.0113447616     0.0033060667    5.066195e-03
## tarifa_actual        -0.0012440560     0.0065716002    1.849243e-02
## costo_mensual        -0.0040987148    -0.0056011894    9.276078e-04
## aumento_consumo      -0.0009237981    -0.0019322896    3.828456e-03
## historico_cortes     -0.0120092882     0.0001219939    6.953878e-04
## demanda_energia      -0.0156757568    -0.0075605631   -7.605651e-03
##                         día_semana      hora_día consumo_medio_diario
## id_cliente            0.0019134121 -1.624624e-02          0.004148571
## edad_instalación      0.0125224005  2.573695e-03          0.009672850
## potencia_contratada   0.0092211092 -1.260843e-03          0.022538036
## temperatura           0.0150063009  1.714778e-02         -0.020216721
## humedad_relativa      0.0011071488  2.284520e-03         -0.010442673
## precipitaciones      -0.0002750427  1.822114e-02          0.007126433
## día_semana            1.0000000000 -9.477825e-03          0.010845266
## hora_día             -0.0094778246  1.000000e+00          0.003444346
## consumo_medio_diario  0.0108452661  3.444346e-03          1.000000000
## consumo_pico          0.0043055603  8.865976e-03         -0.007510395
## variabilidad_consumo  0.0001328561 -2.997836e-02          0.008043421
## factor_potencia      -0.0094600317  9.126276e-03         -0.014323747
## capacidad_batería     0.0183559115 -7.106584e-03          0.021832591
## horas_pico           -0.0053171664  1.132759e-06         -0.005773806
## carga_nocturna        0.0195383633 -1.183760e-02         -0.009620852
## tarifa_actual         0.0036166998 -3.055902e-03         -0.010323473
## costo_mensual         0.0062898605  1.303283e-02         -0.006085494
## aumento_consumo      -0.0005610736  3.536851e-03         -0.010235359
## historico_cortes      0.0112927759  1.045074e-02         -0.015684470
## demanda_energia       0.0024803115 -1.047698e-02          0.008004521
##                      consumo_pico variabilidad_consumo factor_potencia
## id_cliente           -0.017601938        -3.504340e-02    0.0044300053
## edad_instalación     -0.005994274        -1.296104e-02   -0.0265597274
## potencia_contratada  -0.001042717        -9.058859e-03   -0.0092120389
## temperatura          -0.020071834         1.837590e-02   -0.0001275854
## humedad_relativa      0.006831849        -1.564853e-02    0.0105514981
## precipitaciones      -0.021890519        -2.879277e-06    0.0006645919
## día_semana            0.004305560         1.328561e-04   -0.0094600317
## hora_día              0.008865976        -2.997836e-02    0.0091262760
## consumo_medio_diario -0.007510395         8.043421e-03   -0.0143237472
## consumo_pico          1.000000000        -1.699270e-03    0.0077610743
## variabilidad_consumo -0.001699270         1.000000e+00    0.0149847558
## factor_potencia       0.007761074         1.498476e-02    1.0000000000
## capacidad_batería    -0.014162506        -5.208190e-03   -0.0038951046
## horas_pico            0.002183718        -8.747338e-03   -0.0060578615
## carga_nocturna        0.002898944         1.227265e-02   -0.0123275168
## tarifa_actual         0.003927497        -1.735059e-02    0.0065569108
## costo_mensual        -0.002221001         7.122313e-04   -0.0045634104
## aumento_consumo       0.020545776        -1.050523e-02    0.0043264248
## historico_cortes     -0.007308362        -1.058081e-02    0.0018865021
## demanda_energia       0.001549410         1.822927e-02    0.0049388007
##                      capacidad_batería    horas_pico carga_nocturna
## id_cliente                0.0161907523  6.569242e-03    0.004907173
## edad_instalación         -0.0161972682 -9.340993e-04    0.006084663
## potencia_contratada      -0.0101010766  1.015628e-02   -0.005748471
## temperatura               0.0086871362 -9.533841e-03    0.011344762
## humedad_relativa          0.0010966502  4.778233e-03    0.003306067
## precipitaciones          -0.0138882540  2.674719e-02    0.005066195
## día_semana                0.0183559115 -5.317166e-03    0.019538363
## hora_día                 -0.0071065839  1.132759e-06   -0.011837595
## consumo_medio_diario      0.0218325909 -5.773806e-03   -0.009620852
## consumo_pico             -0.0141625057  2.183718e-03    0.002898944
## variabilidad_consumo     -0.0052081896 -8.747338e-03    0.012272652
## factor_potencia          -0.0038951046 -6.057862e-03   -0.012327517
## capacidad_batería         1.0000000000  4.844264e-03    0.001639262
## horas_pico                0.0048442637  1.000000e+00    0.003989222
## carga_nocturna            0.0016392617  3.989222e-03    1.000000000
## tarifa_actual             0.0001236469  5.064948e-03    0.004794539
## costo_mensual             0.0111404733  6.751682e-03    0.004725392
## aumento_consumo           0.0014867821  7.147593e-03   -0.002715829
## historico_cortes          0.0074005817  2.064826e-02    0.027714613
## demanda_energia           0.0081185492 -4.603054e-03   -0.016976403
##                      tarifa_actual costo_mensual aumento_consumo
## id_cliente           -0.0094764520  0.0003653233    0.0131392681
## edad_instalación     -0.0018007500  0.0039746211    0.0158513597
## potencia_contratada  -0.0047850378 -0.0113873644   -0.0028345707
## temperatura          -0.0012440560 -0.0040987148   -0.0009237981
## humedad_relativa      0.0065716002 -0.0056011894   -0.0019322896
## precipitaciones       0.0184924314  0.0009276078    0.0038284562
## día_semana            0.0036166998  0.0062898605   -0.0005610736
## hora_día             -0.0030559025  0.0130328342    0.0035368506
## consumo_medio_diario -0.0103234733 -0.0060854942   -0.0102353586
## consumo_pico          0.0039274970 -0.0022210006    0.0205457760
## variabilidad_consumo -0.0173505871  0.0007122313   -0.0105052301
## factor_potencia       0.0065569108 -0.0045634104    0.0043264248
## capacidad_batería     0.0001236469  0.0111404733    0.0014867821
## horas_pico            0.0050649482  0.0067516818    0.0071475931
## carga_nocturna        0.0047945387  0.0047253917   -0.0027158290
## tarifa_actual         1.0000000000  0.0045399669    0.0040097101
## costo_mensual         0.0045399669  1.0000000000   -0.0153868488
## aumento_consumo       0.0040097101 -0.0153868488    1.0000000000
## historico_cortes      0.0062616189 -0.0035625212    0.0048566079
## demanda_energia      -0.0073725121 -0.0065378555    0.0065572494
##                      historico_cortes demanda_energia
## id_cliente               0.0158304858    -0.010316161
## edad_instalación         0.0095547697     0.008554865
## potencia_contratada     -0.0041902719    -0.008835055
## temperatura             -0.0120092882    -0.015675757
## humedad_relativa         0.0001219939    -0.007560563
## precipitaciones          0.0006953878    -0.007605651
## día_semana               0.0112927759     0.002480312
## hora_día                 0.0104507438    -0.010476983
## consumo_medio_diario    -0.0156844705     0.008004521
## consumo_pico            -0.0073083618     0.001549410
## variabilidad_consumo    -0.0105808107     0.018229275
## factor_potencia          0.0018865021     0.004938801
## capacidad_batería        0.0074005817     0.008118549
## horas_pico               0.0206482583    -0.004603054
## carga_nocturna           0.0277146131    -0.016976403
## tarifa_actual            0.0062616189    -0.007372512
## costo_mensual           -0.0035625212    -0.006537855
## aumento_consumo          0.0048566079     0.006557249
## historico_cortes         1.0000000000     0.006983625
## demanda_energia          0.0069836252     1.000000000

2. Modelo de Regresión

# Variable objetivo "demanda_energia"
set.seed(6942)
indices <- createDataPartition(datos$demanda_energia, p = 0.8, list = FALSE)
train_data <- datos[indices, ]
test_data <- datos[-indices, ]

Modelo de regresion lineal

# Modelo de Regresión Lineal
modelo_lm <- lm(demanda_energia ~ ., data = train_data)
predicciones_lm <- predict(modelo_lm, test_data)
rmse_lm <- sqrt(mean((test_data$demanda_energia - predicciones_lm)^2))
rmse_lm
## [1] 91.30523

Modelo de Random Forest

modelo_rf <- randomForest(demanda_energia ~ ., data = train_data, ntree = 100)
predicciones_rf <- predict(modelo_rf, test_data)
rmse_rf <- sqrt(mean((test_data$demanda_energia - predicciones_rf)^2))
rmse_rf
## [1] 92.41355

Se puede observar que el modelo de Regresión Lineal es mejor ya que su RMSE es menor lo que indica menor error y mayor ajuste que el modelo de Random Forest

3. Modelo de Clasificación

# Variable objetivo "nivel_demanda"
datos$nivel_demanda <- as.factor(datos$nivel_demanda)
set.seed(6942)
indices_clas <- createDataPartition(datos$nivel_demanda, p = 0.8, list = FALSE)
train_data_clas <- datos[indices_clas, ]
test_data_clas <- datos[-indices_clas, ]

Modelo de Árbol de Decisión

modelo_ad <- train(nivel_demanda ~ .,
                   data = train_data_clas,
                   method = "rpart")
predicciones_ad <- predict(modelo_ad, test_data_clas)
cm_ad <- confusionMatrix(predicciones_ad, test_data_clas$nivel_demanda)
precision <- cm_ad$overall['Accuracy']
cat("Precisión del modelo:", precision, "\n")
## Precisión del modelo: 0.9969985

Modelo de Random Forest para Clasificación

modelo_rf_clas <- randomForest(nivel_demanda ~ ., data = train_data_clas, ntree = 10)
predicciones_rf_clas <- predict(modelo_rf_clas, test_data_clas)
cm_rf <- confusionMatrix(predicciones_rf_clas, test_data_clas$nivel_demanda)
precision <- cm_rf$overall['Accuracy']
cat("Precisión del modelo:", precision, "\n")
## Precisión del modelo: 0.9964982

Se puede concluir que el modelo de Árbol de Decisión es mejor que Random Forest ya que tiene una mayor precisión