A continuación se detalla el siguiente ejercicio de la serie, enfocado en Análisis Multivariado (con Componentes Principales) y Análisis Discriminante.
Este tipo de análisis es extremadamente útil en ingeniería cuando se necesita clasificar objetos o situaciones basándose en múltiples mediciones simultáneamente, como en control de calidad, diagnóstico de fallas o caracterización de materiales.
Asignatura: Estadística Aplicada con Python y R Tema: Clasificación de la Calidad de Granos de Café
Eres un ingeniero agroindustrial en una cooperativa cafetera. Para mejorar la eficiencia y objetividad del proceso de selección, la cooperativa ha instalado sensores que capturan cuatro características físicas de los granos de café. Tu tarea es desarrollar un modelo estadístico que pueda clasificar automáticamente cada grano en una de tres categorías de calidad (“Premium”, “Estándar”, “Defectuoso”) basándose en estas mediciones.
Primero, usarás Análisis de Componentes Principales (PCA) para visualizar si los grupos de calidad son naturalmente separables. Luego, construirás un modelo de Análisis Discriminante Lineal (LDA) para predecir la calidad de nuevos granos.
Crear Repositorio en GitHub:
proyecto-multivariado-cafe
.README.md
y un
.gitignore
para R
.Clonar en Posit Cloud:
Configurar Git:
1. Crear la Carpeta y el Archivo de Datos:
data
.data
, crea un nuevo archivo de texto
(New File
> Text File
) llamado
datos_cafe.csv
.Lote,Calidad,Intensidad_Color,Humedad_pct,Densidad_g_cm3,Tamano_mm
1,Premium,85,11.5,0.75,8.2
2,Premium,88,11.2,0.76,8.5
3,Premium,86,11.8,0.74,8.3
4,Premium,90,11.0,0.77,8.6
5,Premium,84,12.0,0.73,8.1
6,Estándar,75,12.5,0.68,7.5
7,Estándar,78,12.2,0.70,7.8
8,Estándar,76,12.8,0.67,7.6
9,Estándar,80,12.1,0.71,7.9
10,Estándar,77,12.6,0.69,7.7
11,Defectuoso,65,13.5,0.60,6.5
12,Defectuoso,68,13.2,0.62,6.8
13,Defectuoso,66,13.8,0.59,6.6
14,Defectuoso,70,13.0,0.63,7.0
15,Defectuoso,64,14.0,0.58,6.4
2. Crear el Documento R Markdown:
New File
>
R Markdown...
).analisis_multivariado.Rmd
y borra el
contenido de ejemplo.Ahora, dentro de tu archivo analisis_multivariado.Rmd
,
desarrollarás el análisis.
Cargamos las herramientas y damos un primer vistazo a los datos.
``` r
# Cargar librerías
library(tidyverse) # Para manipulación y gráficos
library(MASS) # Para el Análisis Discriminante Lineal (LDA)
library(caTools) # Para dividir datos en entrenamiento y prueba
library(GGally) # Para gráficos exploratorios
```
``` r
# Cargar el dataset
datos <- read_csv("data/datos_cafe.csv")
```
```
## Rows: 15 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Calidad
## dbl (5): Lote, Intensidad_Color, Humedad_pct, Densidad_g_cm3, Tamano_mm
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
```
``` r
# Convertir la variable 'Calidad' a un factor
datos$Calidad <- factor(datos$Calidad,
levels = c("Defectuoso", "Estándar", "Premium"))
# Seleccionar solo las variables de interés
datos_analisis <- datos %>% dplyr::select(Calidad, Intensidad_Color, Humedad_pct, Densidad_g_cm3, Tamano_mm)
# Visualización exploratoria
ggpairs(datos_analisis, aes(color = Calidad, alpha = 0.7)) +
labs(title = "Relaciones entre Variables por Calidad de Café")
```
```
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
```
<img src="3_Práctica-Guiada_3_Análisis_Multivariado_y_Discriminante_files/figure-html/carga-datos-1.png" width="672" />
**Observación Preliminar:** El gráfico `ggpairs` nos muestra cómo se distribuyen las variables y sus relaciones. Visualmente, parece que los grupos de calidad tienen características diferentes, lo que sugiere que un modelo de clasificación podría funcionar.
El PCA nos ayudará a reducir las 4 variables de medición a solo 2 “componentes principales”, permitiéndonos visualizar la separación de los grupos en un gráfico 2D.
El objetivo del PCA es visualizar la estructura de los datos. No es un modelo de clasificación, sino una técnica de reducción de dimensionalidad.
# Seleccionar solo las variables numéricas para el PCA
variables_numericas <- datos_analisis %>% dplyr::select(-Calidad)
# Ejecutar el PCA. Es crucial escalar las variables (scale = TRUE)
# porque están en diferentes unidades.
pca_resultado <- prcomp(variables_numericas, scale = TRUE)
# Convertir los resultados del PCA en un data frame para graficar
pca_scores <- as.data.frame(pca_resultado$x)
# Añadir la variable de Calidad para colorear los puntos
pca_scores$Calidad <- datos_analisis$Calidad
# Graficar los dos primeros componentes principales
ggplot(pca_scores, aes(x = PC1, y = PC2, color = Calidad)) +
geom_point(size = 4, alpha = 0.8) +
labs(title = "Visualización de Grupos de Café con PCA",
x = "Componente Principal 1",
y = "Componente Principal 2") +
theme_minimal() +
stat_ellipse() # Añade elipses para visualizar la concentración de cada grupo
Interpretación del PCA: En el gráfico, cada punto es un grano de café. Si los colores (que representan la calidad) forman grupos separados, ¡es una excelente señal! Significa que las mediciones contienen información útil para distinguir entre granos “Premium”, “Estándar” y “Defectuosos”.
#### **3.3 Análisis Discriminante Lineal (LDA) para Clasificación**
Ahora que sabemos que los grupos son separables, construiremos un modelo para predecir la calidad.
**El objetivo del LDA es crear una regla de clasificación** para asignar nuevos granos a una categoría de calidad.
**1. Dividir los Datos: Entrenamiento y Prueba**
Para evaluar nuestro modelo de forma honesta, lo entrenaremos con una parte de los datos (70%) y probaremos su rendimiento con la parte restante (30%).
``` r
set.seed(123) # Para que la división sea reproducible
split <- sample.split(datos_analisis$Calidad, SplitRatio = 0.7)
datos_entrenamiento <- subset(datos_analisis, split == TRUE)
datos_prueba <- subset(datos_analisis, split == FALSE)
```
**2. Construir el Modelo LDA**
Entrenamos el modelo usando solo el conjunto de entrenamiento.
``` r
modelo_lda <- lda(Calidad ~ ., data = datos_entrenamiento)
print(modelo_lda)
```
```
## Call:
## lda(Calidad ~ ., data = datos_entrenamiento)
##
## Prior probabilities of groups:
## Defectuoso Estándar Premium
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Intensidad_Color Humedad_pct Densidad_g_cm3 Tamano_mm
## Defectuoso 67.00 13.500 0.605 6.700
## Estándar 77.50 12.350 0.695 7.725
## Premium 87.25 11.375 0.755 8.400
##
## Coefficients of linear discriminants:
## LD1 LD2
## Intensidad_Color -0.9152908 2.625394
## Humedad_pct -8.3778153 -3.320469
## Densidad_g_cm3 -230.3977354 -84.080382
## Tamano_mm 12.1654058 -27.761087
##
## Proportion of trace:
## LD1 LD2
## 0.8722 0.1278
```
**3. Realizar Predicciones**
Usamos el modelo entrenado para predecir la calidad de los granos en el conjunto de prueba.
``` r
predicciones <- predict(modelo_lda, newdata = datos_prueba)
nombres_clases_predichas <- predicciones$class
```
**4. Evaluar el Modelo con una Matriz de Confusión**
Comparamos las predicciones del modelo con la calidad real de los granos.
``` r
# Crear la tabla que cruza lo real vs. lo predicho
matriz_confusion <- table(Observado = datos_prueba$Calidad,
Predicho = nombres_clases_predichas)
print("Matriz de Confusión:")
```
```
## [1] "Matriz de Confusión:"
```
``` r
print(matriz_confusion)
```
```
## Predicho
## Observado Defectuoso Estándar Premium
## Defectuoso 1 0 0
## Estándar 0 1 0
## Premium 0 0 1
```
``` r
# Calcular la Precisión (Accuracy) del modelo
precision <- sum(diag(matriz_confusion)) / sum(matriz_confusion)
print(paste("Precisión del Modelo:", round(precision * 100, 2), "%"))
```
```
## [1] "Precisión del Modelo: 100 %"
```
**Interpretación de la Matriz de Confusión:** La diagonal principal muestra las predicciones correctas. Los números fuera de la diagonal son los errores. Una precisión alta (cercana al 100%) indica que el modelo es muy bueno para clasificar los granos de café.
1. Escribir las Conclusiones:
[valor]
% es suficientemente buena para ser implementada
por la cooperativa?print(modelo_lda)
)?2. Generar el Reporte y Sincronizar con GitHub ✅:
Análisis multivariado y LDA para calidad de café
), y
Push para subir tu proyecto final a GitHub.¡Felicidades! Has aplicado un flujo de trabajo completo de machine learning supervisado, desde la exploración y visualización hasta la construcción y evaluación de un modelo predictivo.