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.


☕ Práctica Guiada 3: Análisis Multivariado y Discriminante

Asignatura: Estadística Aplicada con Python y R Tema: Clasificación de la Calidad de Granos de Café

Objetivo del Ejercicio

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.


Paso 1: Configuración del Proyecto (El Flujo “De Cero a Héroe”)

  1. Crear Repositorio en GitHub:

    • Crea un nuevo repositorio público llamado proyecto-multivariado-cafe.
    • Inicialízalo con un README.md y un .gitignore para R.
  2. Clonar en Posit Cloud:

    • Copia la URL HTTPS del repositorio.
    • En Posit Cloud, crea un New Project from Git Repository usando esa URL.
  3. Configurar Git:

    • Asegúrate de que tu identidad y tu PAT estén configurados en la Consola de R.

Paso 2: Creación de los Datos y el Entorno de Trabajo

1. Crear la Carpeta y el Archivo de Datos:

  • Crea una carpeta llamada data.
  • Dentro de data, crea un nuevo archivo de texto (New File > Text File) llamado datos_cafe.csv.
  • Pega los siguientes datos de las mediciones de los sensores y guarda el archivo:
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:

  • Crea un nuevo archivo R Markdown (New File > R Markdown...).
  • Titúlalo “Clasificación de Calidad del Café”.
  • Guárdalo como analisis_multivariado.Rmd y borra el contenido de ejemplo.

Paso 3: Análisis en R Markdown

Ahora, dentro de tu archivo analisis_multivariado.Rmd, desarrollarás el análisis.

3.1 Carga de Librerías y Exploración Inicial

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.

3.2 Análisis de Componentes Principales (PCA) para Visualización 📈

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é.

Paso 4: Conclusiones y Sincronización

1. Escribir las Conclusiones:

  • ¿Qué te mostró el gráfico de PCA sobre la separabilidad de las calidades de café?
  • ¿Qué tan preciso fue tu modelo de LDA? ¿Consideras que una precisión del [valor]% es suficientemente buena para ser implementada por la cooperativa?
  • ¿Qué variables parecen ser más importantes para discriminar entre grupos (observa los “Coefficients of linear discriminants” en el resultado de print(modelo_lda))?

2. Generar el Reporte y Sincronizar con GitHub ✅:

  • Knit tu documento a HTML.
  • Ve a la pestaña Git, y haz Stage, Commit (con un mensaje como 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.