Construir y evaluar un modelo de regresión multiple para prediccion de rendimiento de frijol.
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.
library(readr)
library(ggplot2)
# tal vez otra
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)
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 ...
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.
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
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
# Cálculo manual del RMSE
rmse <- sqrt(mean((datos_comparar$reales - datos_comparar$predicciones)^2))
# Imprimir resultado
paste ("RMSE:", rmse)
## [1] "RMSE: 250.63980084124"
El valor de RMSE: 250.63980084124 significa que las predicciones pueden variar en esa cantidad respecto a los valores reales.