Objetivo

Construir y evaluar un modelo de regresión multiple para prediccion de rendimiento de frijol.

Descripción

Se cargan datos simulados de rendimiento de frijol

Las variables indendientes son:

Algunas variables son numéricas y otras categ´rocas pero la variabole a predecir es numérica por eso usamos un modelo de regresión para las predicciones numéricas.

Se va evaluar el modelo con R Square ajustado para ver que tanto representan las variables independientes al rendimiento del frijol.

Se va a calcualr el RMSE para comaprarlo con otro modelo de regresión como árboles de regresión.

Cargar librerías

library(readr)
library(ggplot2)
# tal vez otra

cargar datos

Se cargan datos ya están limpios

datos_entrenamiento <- read.csv("https://raw.githubusercontent.com/rpizarrog/Ciencia-de-los-Datos-Descriptivo-Predictivo/refs/heads/main/datos/rendimiento_frijol_train.csv", stringsAsFactors = TRUE)
datos_validacion <- read.csv("https://raw.githubusercontent.com/rpizarrog/Ciencia-de-los-Datos-Descriptivo-Predictivo/refs/heads/main/datos/rendimiento_frijol_val.csv", stringsAsFactors = TRUE)

Análisis descriptivo

print("Datos de entrenamiento")
## [1] "Datos de entrenamiento"
head(datos_entrenamiento)
##   Rendimiento_Frijol Tipo_Suelo Precipitacion_mm Fertilizacion_kg
## 1               1302     Limoso              237               65
## 2               1635  Arcilloso              293               63
## 3               1470     Limoso              294               66
## 4               1306    Arenoso              268               57
## 5               1271    Arenoso              435               57
## 6               1900    Arenoso              336               53
##   Temperatura_Promedio_C Variedad_Frijol
## 1                   21.7           Negro
## 2                   22.0           Negro
## 3                   25.0           Negro
## 4                   21.9           Negro
## 5                   22.5           Pinto
## 6                   20.4           Negro
summary(datos_entrenamiento)
##  Rendimiento_Frijol     Tipo_Suelo  Precipitacion_mm Fertilizacion_kg
##  Min.   :1201       Arcilloso:157   Min.   :200.0    Min.   :40.00   
##  1st Qu.:1395       Arenoso  :184   1st Qu.:274.0    1st Qu.:47.00   
##  Median :1602       Limoso   :159   Median :348.0    Median :54.00   
##  Mean   :1605                       Mean   :349.3    Mean   :54.66   
##  3rd Qu.:1823                       3rd Qu.:425.0    3rd Qu.:62.00   
##  Max.   :1999                       Max.   :498.0    Max.   :69.00   
##  Temperatura_Promedio_C Variedad_Frijol
##  Min.   :18.00          Negro:178      
##  1st Qu.:20.48          Pinto:157      
##  Median :23.10          Rojo :165      
##  Mean   :22.96                         
##  3rd Qu.:25.40                         
##  Max.   :28.00
str(datos_entrenamiento)
## 'data.frame':    500 obs. of  6 variables:
##  $ Rendimiento_Frijol    : int  1302 1635 1470 1306 1271 1900 1220 1814 1321 1666 ...
##  $ Tipo_Suelo            : Factor w/ 3 levels "Arcilloso","Arenoso",..: 3 1 3 2 2 2 3 3 2 3 ...
##  $ Precipitacion_mm      : int  237 293 294 268 435 336 275 234 200 495 ...
##  $ Fertilizacion_kg      : int  65 63 66 57 57 53 54 68 51 43 ...
##  $ Temperatura_Promedio_C: num  21.7 22 25 21.9 22.5 20.4 21.7 20.3 18.7 24 ...
##  $ Variedad_Frijol       : Factor w/ 3 levels "Negro","Pinto",..: 1 1 1 1 2 1 3 2 1 3 ...
print ("Datos de validación")
## [1] "Datos de validación"
head(datos_validacion)
##   Rendimiento_Frijol Tipo_Suelo Precipitacion_mm Fertilizacion_kg
## 1               1903  Arcilloso              258               58
## 2               1646  Arcilloso              368               55
## 3               1780    Arenoso              468               53
## 4               1989  Arcilloso              244               60
## 5               1446  Arcilloso              380               55
## 6               1275     Limoso              369               44
##   Temperatura_Promedio_C Variedad_Frijol
## 1                   18.8           Pinto
## 2                   25.3           Negro
## 3                   23.0           Pinto
## 4                   22.4            Rojo
## 5                   25.3           Pinto
## 6                   25.7            Rojo
summary(datos_validacion)
##  Rendimiento_Frijol     Tipo_Suelo Precipitacion_mm Fertilizacion_kg
##  Min.   :1215       Arcilloso:20   Min.   :206.0    Min.   :40.00   
##  1st Qu.:1418       Arenoso  :17   1st Qu.:244.2    1st Qu.:45.25   
##  Median :1632       Limoso   :13   Median :360.5    Median :52.00   
##  Mean   :1613                      Mean   :339.7    Mean   :52.80   
##  3rd Qu.:1844                      3rd Qu.:420.2    3rd Qu.:59.50   
##  Max.   :1991                      Max.   :494.0    Max.   :69.00   
##  Temperatura_Promedio_C Variedad_Frijol
##  Min.   :18.20          Negro:15       
##  1st Qu.:20.50          Pinto:15       
##  Median :22.75          Rojo :20       
##  Mean   :22.81                         
##  3rd Qu.:25.30                         
##  Max.   :27.80
str(datos_validacion)
## 'data.frame':    50 obs. of  6 variables:
##  $ Rendimiento_Frijol    : int  1903 1646 1780 1989 1446 1275 1353 1855 1634 1285 ...
##  $ Tipo_Suelo            : Factor w/ 3 levels "Arcilloso","Arenoso",..: 1 1 2 1 1 3 1 2 1 3 ...
##  $ Precipitacion_mm      : int  258 368 468 244 380 369 390 354 387 206 ...
##  $ Fertilizacion_kg      : int  58 55 53 60 55 44 48 65 69 67 ...
##  $ Temperatura_Promedio_C: num  18.8 25.3 23 22.4 25.3 25.7 19.6 24.1 19.4 25.5 ...
##  $ Variedad_Frijol       : Factor w/ 3 levels "Negro","Pinto",..: 2 1 2 3 2 3 1 3 1 1 ...

Construir un modelo de regresion múltiple

La instrucción lm(formula = Rendimiento_Frijol ~ ., datos.entrenamiento) significa que la variabloe dependiente se llama Rendimiento_Frijol y se ve afectada o relacionadas con todas las variables independiente del conjunto de datos.

modelo1 <- lm(formula = Rendimiento_Frijol ~ ., datos_entrenamiento)

summary(modelo1)
## 
## Call:
## lm(formula = Rendimiento_Frijol ~ ., data = datos_entrenamiento)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -454.6 -190.0    4.7  199.0  448.6 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1449.94322  113.76847  12.745  < 2e-16 ***
## Tipo_SueloArenoso        25.10891   25.59300   0.981  0.32703    
## Tipo_SueloLimoso         70.33872   26.49489   2.655  0.00819 ** 
## Precipitacion_mm          0.07854    0.12047   0.652  0.51476    
## Fertilizacion_kg         -0.59455    1.22059  -0.487  0.62641    
## Temperatura_Promedio_C    4.83115    3.71362   1.301  0.19389    
## Variedad_FrijolPinto     42.64738   25.75424   1.656  0.09837 .  
## Variedad_FrijolRojo      13.25036   25.51644   0.519  0.60379    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 234.6 on 492 degrees of freedom
## Multiple R-squared:  0.02476,    Adjusted R-squared:  0.01089 
## F-statistic: 1.785 on 7 and 492 DF,  p-value: 0.08818
modelo2 <- lm(formula = Rendimiento_Frijol ~ Tipo_Suelo + Precipitacion_mm + Fertilizacion_kg + Temperatura_Promedio_C,  datos_entrenamiento)

summary(modelo2)
## 
## Call:
## lm(formula = Rendimiento_Frijol ~ Tipo_Suelo + Precipitacion_mm + 
##     Fertilizacion_kg + Temperatura_Promedio_C, data = datos_entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -459.23 -191.13    3.19  200.59  444.42 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1462.37328  112.41440  13.009  < 2e-16 ***
## Tipo_SueloArenoso        25.36461   25.61391   0.990  0.32253    
## Tipo_SueloLimoso         70.01478   26.50224   2.642  0.00851 ** 
## Precipitacion_mm          0.06968    0.11989   0.581  0.56133    
## Fertilizacion_kg         -0.56333    1.22134  -0.461  0.64483    
## Temperatura_Promedio_C    5.12413    3.70797   1.382  0.16762    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 234.8 on 494 degrees of freedom
## Multiple R-squared:  0.01914,    Adjusted R-squared:  0.009215 
## F-statistic: 1.928 on 5 and 494 DF,  p-value: 0.08814
modelo3 <- lm(formula = Rendimiento_Frijol ~ Tipo_Suelo + Variedad_Frijol,  datos_entrenamiento)

summary(modelo3)
## 
## Call:
## lm(formula = Rendimiento_Frijol ~ Tipo_Suelo + Variedad_Frijol, 
##     data = datos_entrenamiento)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -423.7 -200.0    2.2  199.8  430.1 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           1556.67      23.33  66.713  < 2e-16 ***
## Tipo_SueloArenoso       25.12      25.47   0.986  0.32446    
## Tipo_SueloLimoso        70.76      26.38   2.682  0.00756 ** 
## Variedad_FrijolPinto    42.69      25.67   1.663  0.09694 .  
## Variedad_FrijolRojo     10.23      25.34   0.404  0.68666    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 234.4 on 495 degrees of freedom
## Multiple R-squared:  0.02025,    Adjusted R-squared:  0.01234 
## F-statistic: 2.558 on 4 and 495 DF,  p-value: 0.03799

Se va a analizar y predecir valores con el modelo1 que tiene todas las variables predictoras o independientes porque tien un valor mayor en R Square Adjusted.

Predecir con datos de validación

predicciones <- predict(modelo1, datos_validacion)
predicciones
##        1        2        3        4        5        6        7        8 
## 1569.195 1568.372 1634.059 1554.901 1611.962 1660.512 1546.724 1593.889 
##        9       10       11       12       13       14       15       16 
## 1533.037 1619.820 1683.473 1626.125 1645.680 1614.204 1583.072 1551.612 
##       17       18       19       20       21       22       23       24 
## 1552.375 1576.204 1620.346 1581.837 1612.198 1672.520 1606.084 1527.129 
##       25       26       27       28       29       30       31       32 
## 1616.455 1547.197 1554.382 1616.001 1610.297 1645.035 1588.993 1606.631 
##       33       34       35       36       37       38       39       40 
## 1657.110 1582.246 1576.580 1573.807 1611.995 1646.431 1608.765 1572.592 
##       41       42       43       44       45       46       47       48 
## 1551.522 1624.210 1591.064 1610.831 1648.456 1575.033 1568.463 1607.782 
##       49       50 
## 1607.555 1672.934

Construir datos a comparar

datos_comparar <- data.frame(reales = datos_validacion$Rendimiento_Frijol, predicciones)
datos_comparar
##    reales predicciones
## 1    1903     1569.195
## 2    1646     1568.372
## 3    1780     1634.059
## 4    1989     1554.901
## 5    1446     1611.962
## 6    1275     1660.512
## 7    1353     1546.724
## 8    1855     1593.889
## 9    1634     1533.037
## 10   1285     1619.820
## 11   1896     1683.473
## 12   1484     1626.125
## 13   1419     1645.680
## 14   1268     1614.204
## 15   1246     1583.072
## 16   1293     1551.612
## 17   1949     1552.375
## 18   1652     1576.204
## 19   1403     1620.346
## 20   1417     1581.837
## 21   1673     1612.198
## 22   1631     1672.520
## 23   1540     1606.084
## 24   1750     1527.129
## 25   1811     1616.455
## 26   1488     1547.197
## 27   1453     1554.382
## 28   1933     1616.001
## 29   1556     1610.297
## 30   1222     1645.035
## 31   1961     1588.993
## 32   1721     1606.631
## 33   1957     1657.110
## 34   1299     1582.246
## 35   1379     1576.580
## 36   1422     1573.807
## 37   1961     1611.995
## 38   1858     1646.431
## 39   1641     1608.765
## 40   1807     1572.592
## 41   1968     1551.522
## 42   1524     1624.210
## 43   1715     1591.064
## 44   1215     1610.831
## 45   1991     1648.456
## 46   1535     1575.033
## 47   1958     1568.463
## 48   1457     1607.782
## 49   1696     1607.555
## 50   1359     1672.934

Evaluar el modelo

# Cálculo manual del RMSE
rmse <- sqrt(mean((datos_comparar$reales - datos_comparar$predicciones)^2))

# Imprimir resultado
paste ("RMSE:", rmse)
## [1] "RMSE: 250.63980084124"

Interpretación

El valor de RMSE: 250.63980084124 significa que las predicciones pueden variar en esa cantidad respecto a los valores reales.