Gráfico de barras para visualizar la distribución de la calidad del vino
## type fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
## 1 white 7.0 0.27 0.36 20.7 0.045
## 2 white 6.3 0.30 0.34 1.6 0.049
## 3 white 8.1 0.28 0.40 6.9 0.050
## 4 white 7.2 0.23 0.32 8.5 0.058
## 5 white 7.2 0.23 0.32 8.5 0.058
## 6 white 8.1 0.28 0.40 6.9 0.050
## free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol
## 1 45 170 1.0010 3.00 0.45 8.8
## 2 14 132 0.9940 3.30 0.49 9.5
## 3 30 97 0.9951 3.26 0.44 10.1
## 4 47 186 0.9956 3.19 0.40 9.9
## 5 47 186 0.9956 3.19 0.40 9.9
## 6 30 97 0.9951 3.26 0.44 10.1
## quality
## 1 6
## 2 6
## 3 6
## 4 6
## 5 6
## 6 6
Verifico si hay valores faltantes en el dataframe y elimino las filas con valores faltantes utilizando
## [1] TRUE
## 'data.frame': 6463 obs. of 13 variables:
## $ type : chr "white" "white" "white" "white" ...
## $ fixed.acidity : num 7 6.3 8.1 7.2 7.2 8.1 6.2 7 6.3 8.1 ...
## $ volatile.acidity : num 0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
## $ citric.acid : num 0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...
## $ residual.sugar : num 20.7 1.6 6.9 8.5 8.5 6.9 7 20.7 1.6 1.5 ...
## $ chlorides : num 0.045 0.049 0.05 0.058 0.058 0.05 0.045 0.045 0.049 0.044 ...
## $ free.sulfur.dioxide : num 45 14 30 47 47 30 30 45 14 28 ...
## $ total.sulfur.dioxide: num 170 132 97 186 186 97 136 170 132 129 ...
## $ density : num 1.001 0.994 0.995 0.996 0.996 ...
## $ pH : num 3 3.3 3.26 3.19 3.19 3.26 3.18 3 3.3 3.22 ...
## $ sulphates : num 0.45 0.49 0.44 0.4 0.4 0.44 0.47 0.45 0.49 0.45 ...
## $ alcohol : num 8.8 9.5 10.1 9.9 9.9 10.1 9.6 8.8 9.5 11 ...
## $ quality : int 6 6 6 6 6 6 6 6 6 6 ...
## - attr(*, "na.action")= 'omit' Named int [1:34] 18 34 55 87 99 140 175 225 250 268 ...
## ..- attr(*, "names")= chr [1:34] "18" "34" "55" "87" ...
Creo la variable taste que indica la calidad del vino como “bad”, “good”, o “normal” basado en la calidad numérica. La variable taste la convierto en un factor
##
## bad good normal
## 2372 1271 2820
Divido el dataframe en conjuntos de entrenamiento y prueba utilizando una muestra aleatoria del 60% para entrenamiento.
Ajusto un modelo de Random Forest para predecir la variable taste utilizando todas las variables excepto quality como predictoras en los datos de entrenamiento.
##
## Call:
## randomForest(formula = taste ~ . - quality, data = train)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 30.14%
## Confusion matrix:
## bad good normal class.error
## bad 1022 20 371 0.2767162
## good 25 438 294 0.4214003
## normal 327 132 1249 0.2687354
Realizo predicciones en el conjunto de prueba utilizando el modelo ajustado. Creo una tabla de confusión para comparar las predicciones del modelo con los valores reales de taste en el conjunto de prueba.
##
## pred bad good normal
## bad 707 14 205
## good 7 300 77
## normal 245 200 830
Al finalizar este proceso, el modelo de Random Forest se ajusta y se evalúa en el conjunto de prueba para predecir la calidad del vino basado en las variables proporcionadas en los datos. La tabla de confusión te proporciona información sobre la precisión de las predicciones del modelo en clasificar las muestras en las categorías de “bad”, “good” y “normal”.