Mis Tareas de Referencia

Tarea 1: Exploratorio Vinos

1. Introducción y descripción de los datos

Base de datos Wine (Vino)

Esta base de datos contiene los resultados de un análisis químico y fisicoquímico realizado a vinos cultivados en una misma región de Italia, pero derivados de tres cultivares (tipos de plantas) diferentes.

  • Total de observaciones (muestras): 178
  • Total de variables: 14 (13 variables numéricas continuas/químicas y 1 variable categórica/grupo)
Descripción de variables numéricas:
  • Alcohol: Concentración de etanol producto de la fermentación (usualmente expresada en % v/v).
  • Ácido málico: Uno de los principales ácidos orgánicos naturales de la uva, responsable de la acidez característica y el sabor agrio (astringente) del vino.
  • Ceniza (Ash): Representa el residuo inorgánico que queda después de calcinar la muestra. Básicamente, es la medida de los minerales totales extraídos del suelo por la planta.
  • Alcalinidad de la ceniza: Un indicador del equilibrio mineral y del pH. Da pistas sobre las condiciones del suelo donde creció el cultivar.
  • Magnesio: Un catión metálico esencial, vital tanto para la nutrición de la planta original como para el metabolismo de las levaduras durante la fermentación.
  • Total de fenoles: La suma de todos los compuestos fenólicos en la muestra. Estos metabolitos secundarios son responsables del cuerpo, la astringencia y la capacidad antioxidante del líquido.
  • Flavanoides: Un subgrupo importante de fenoles que contribuye a la pigmentación, sabor y protección oxidativa.
  • Fenoles no flavanoides: Compuestos fenólicos de estructura más simple (como los ácidos hidroxicinámicos) que también aportan al perfil aromático y gustativo.
  • Proantocianinas: También conocidas como taninos condensados. Son polímeros que reaccionan con las proteínas de la saliva, causando la sensación de “sequedad” en la boca al beber.
  • Intensidad de color: Medición óptica de qué tan profundo o concentrado es el pigmento del líquido.
  • Matiz (Hue): La tonalidad exacta de la muestra (por ejemplo, si el rojo tiende hacia tonos violáceos o hacia tonos ladrillo).
  • OD280: Medición obtenida mediante espectrofotometría UV-Vis a una longitud de onda de 280 nm. A esta frecuencia absorben las proteínas y los anillos aromáticos, utilizándose como un indicador general de la pureza y concentración de compuestos.
  • Prolina: El aminoácido libre más abundante en el jugo de uva y en el vino; sirve como marcador de madurez y estrés de la planta.
Variable cualitativa de agrupación
  • Customer_Segment: Es la etiqueta o categoría final (1, 2 ó 3). Representa a cuál de los 3 cultivares genéticos pertenecía la planta a la que se extrajo la muestra.

2. Carga, preparación y limpieza de datos

En esta sección realizamos la verificación de la estructura técnica de los datos, la gestión de datos faltantes y la asignación correcta del tipo de variable.

Insertar la base de datos
# 1. Llamar a la libreria que lee el tipo de archivo que es la base de datos (csv ó excel)
library(readr)

# 2. Importar los datos (pegas la ruta exacta que te dió RStudio)
BD_Wine <- read_csv("BD_Wine.xlsx - Wine.csv")

# 3. Mostrar las primeras 6 filas para confirmar que cargó bien
head(BD_Wine)
## # A tibble: 6 × 14
##   Alcohol Acido_malico Ceniza Ceniza_Alcalinidad Magnesio Total_fenoles
##     <dbl>        <dbl>  <dbl>              <dbl>    <dbl>         <dbl>
## 1    14.2         1.71   2.43               15.6      127          2.8 
## 2    13.2         1.78   2.14               11.2      100          2.65
## 3    13.2         2.36   2.67               18.6      101          2.8 
## 4    14.4         1.95   2.5                16.8      113          3.85
## 5    13.2         2.59   2.87               21        118          2.8 
## 6    14.2         1.76   2.45               15.2      112          3.27
## # ℹ 8 more variables: Flavanoides <dbl>, Noflavanoides_fenoles <dbl>,
## #   Proantocianinas <dbl>, intensidad_color <dbl>, Matiz <dbl>, OD280 <dbl>,
## #   Prolina <dbl>, Customer_Segment <dbl>

2. Revisión de la estructura de los datos

# Revisar estructura: Muestra la "radiografía" de las variables (si son numéricas o texto) para evitar errores matemáticos.
str(BD_Wine)
## spc_tbl_ [178 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Alcohol              : num [1:178] 14.2 13.2 13.2 14.4 13.2 ...
##  $ Acido_malico         : num [1:178] 1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ Ceniza               : num [1:178] 2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ Ceniza_Alcalinidad   : num [1:178] 15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ Magnesio             : num [1:178] 127 100 101 113 118 112 96 121 97 98 ...
##  $ Total_fenoles        : num [1:178] 2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ Flavanoides          : num [1:178] 3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ Noflavanoides_fenoles: num [1:178] 0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ Proantocianinas      : num [1:178] 2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ intensidad_color     : num [1:178] 5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ Matiz                : num [1:178] 1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ OD280                : num [1:178] 3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ Prolina              : num [1:178] 1065 1050 1185 1480 735 ...
##  $ Customer_Segment     : num [1:178] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Alcohol = col_double(),
##   ..   Acido_malico = col_double(),
##   ..   Ceniza = col_double(),
##   ..   Ceniza_Alcalinidad = col_double(),
##   ..   Magnesio = col_double(),
##   ..   Total_fenoles = col_double(),
##   ..   Flavanoides = col_double(),
##   ..   Noflavanoides_fenoles = col_double(),
##   ..   Proantocianinas = col_double(),
##   ..   intensidad_color = col_double(),
##   ..   Matiz = col_double(),
##   ..   OD280 = col_double(),
##   ..   Prolina = col_double(),
##   ..   Customer_Segment = col_double()
##   .. )
##  - attr(*, "problems")=<pointer: 0x0000019f5fee6d30>

Se verificó que la base de datos cuenta con 178 filas y 14 columnas.

IMPORTANTE: Conversión de Variable Cualitativa a Tipo Factor

En el archivo original, la variable Customer_Segment está registrada con los valores 1, 2 y 3. Al importar la base de datos, R la interpreta por defecto como una variable numérica continua (dbl).

Sin embargo, las variables cualitativas siempre deben ser definidas de tipo Factor en R, debido a las siguientes razones:

  • 1. Significado del Dato: Los valores 1, 2 y 3 no representan magnitudes continuas ni cantidades medibles, sino categorías o etiquetas cualitativas que identifican el origen genético del vino (Cultivar 1, Cultivar 2 y Cultivar 3).

  • 2. Evitar Errores Matemáticos: Si se conserva como numérica, el sistema intentará calcular estadísticos sin sentido (como un promedio de grupo de 1.93) o asumir relaciones cuantitativas inexistentes (como asumir que el Cultivar 3 es el triple del Cultivar 1).

  • 3. Correcta Integración Multivariada: Al definirla como Factor, la aislamos para que no contamine la matriz de covarianzas ni el Análisis de Componentes Principales (ACP), utilizándola exclusivamente como la variable cualitativa de agrupación que solicita la rúbrica para comparar el comportamiento químico entre los distintos grupos.

— Cambio de tipo variable —

# CONVERSIÓN CLAVE: Transformar Customer_Segment a Factor (Variable Categórica)
BD_Wine$Customer_Segment <- factor(BD_Wine$Customer_Segment)

— Revisión de la estructura actualizada —

# Revisión de la estructura técnica actualizada
str(BD_Wine)
## spc_tbl_ [178 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Alcohol              : num [1:178] 14.2 13.2 13.2 14.4 13.2 ...
##  $ Acido_malico         : num [1:178] 1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ Ceniza               : num [1:178] 2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ Ceniza_Alcalinidad   : num [1:178] 15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ Magnesio             : num [1:178] 127 100 101 113 118 112 96 121 97 98 ...
##  $ Total_fenoles        : num [1:178] 2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ Flavanoides          : num [1:178] 3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ Noflavanoides_fenoles: num [1:178] 0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ Proantocianinas      : num [1:178] 2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ intensidad_color     : num [1:178] 5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ Matiz                : num [1:178] 1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ OD280                : num [1:178] 3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ Prolina              : num [1:178] 1065 1050 1185 1480 735 ...
##  $ Customer_Segment     : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Alcohol = col_double(),
##   ..   Acido_malico = col_double(),
##   ..   Ceniza = col_double(),
##   ..   Ceniza_Alcalinidad = col_double(),
##   ..   Magnesio = col_double(),
##   ..   Total_fenoles = col_double(),
##   ..   Flavanoides = col_double(),
##   ..   Noflavanoides_fenoles = col_double(),
##   ..   Proantocianinas = col_double(),
##   ..   intensidad_color = col_double(),
##   ..   Matiz = col_double(),
##   ..   OD280 = col_double(),
##   ..   Prolina = col_double(),
##   ..   Customer_Segment = col_double()
##   .. )
##  - attr(*, "problems")=<pointer: 0x0000019f5fee6d30>

Ahora, notemos que la variable cualitativa ya está en tipo factor.

— Identificación y manejo de datos faltantes (NA) —

# Buscar datos faltantes: Escanea y suma los datos faltantes (NA) por cada columna en lugar de borrar a ciegas
colSums(is.na(BD_Wine))
##               Alcohol          Acido_malico                Ceniza 
##                     0                     0                     0 
##    Ceniza_Alcalinidad              Magnesio         Total_fenoles 
##                     0                     0                     0 
##           Flavanoides Noflavanoides_fenoles       Proantocianinas 
##                     0                     0                     0 
##      intensidad_color                 Matiz                 OD280 
##                     0                     0                     0 
##               Prolina      Customer_Segment 
##                     0                     0

Vemos que nuestra base de datos no contiene datos faltantes, por lo cual no se eliminará nada.

(En caso de tener datos faltantes, aplicamos la limpieza con na.omit(BD_Wine))

# Limpiar datos: Filtra filas con celdas vacías y crea un clon limpio para no sobreescribir la matriz original.
#Limpieza de datos(creación de base de datos limpia)
#BD_Wine_limpia <- na.omit(BD_Wine)

#Después revisamos nuevamente las 6 filas para confirmar la carga correcta de la base nueva
#head(BD_Wine_limpia)

#Para verificar nuevamente si se eliminaron los datos faltantes se utiliza 
#colSums(is.na(BD_Wine_limpia))

Se verificó que la base de datos cuenta con 178 filas y 14 columnas de las cuales 13 son de tipo numerico y 1 de tipo factor. Tras la inspección con colSums(is.na()), se confirmó que no existen valores faltantes (0 NAs) en ninguna de las variables. La base de datos se encuentra completamente limpia y estructurada para el análisis.

Se verificó que la base de datos cuenta con 178 filas y 14 columnas de las cuales 13 son de tipo numérico y 1 de tipo factor. Tras la inspección con colSums(is.na()), se confirmó que no existen valores faltantes (0 NAs) en ninguna de las variables. La base de datos se encuentra completamente limpia y estructurada para el análisis.

3. Análisis univariado y descriptivo

En esta sección evaluamos la tendencia central, la dispersión, la presencia de valores atípicos y las formas de distribución (normalidad, sesgo, curtosis y modas múltiples) para las 13 variables químicas de la base de datos.

— Separación de variables cuantitativas — Extraemos únicamente las 13 columnas numéricas (excluyendo el factor Customer_Segment) para calcular las medidas descriptivas globales.

# Separamos las variables cuantitativas (químicas)
vinos_num <- BD_Wine[, 1:13]
head(vinos_num)
## # A tibble: 6 × 13
##   Alcohol Acido_malico Ceniza Ceniza_Alcalinidad Magnesio Total_fenoles
##     <dbl>        <dbl>  <dbl>              <dbl>    <dbl>         <dbl>
## 1    14.2         1.71   2.43               15.6      127          2.8 
## 2    13.2         1.78   2.14               11.2      100          2.65
## 3    13.2         2.36   2.67               18.6      101          2.8 
## 4    14.4         1.95   2.5                16.8      113          3.85
## 5    13.2         2.59   2.87               21        118          2.8 
## 6    14.2         1.76   2.45               15.2      112          3.27
## # ℹ 7 more variables: Flavanoides <dbl>, Noflavanoides_fenoles <dbl>,
## #   Proantocianinas <dbl>, intensidad_color <dbl>, Matiz <dbl>, OD280 <dbl>,
## #   Prolina <dbl>

— Vector de promedios —

# Vector de Promedios
colMeans(vinos_num)
##               Alcohol          Acido_malico                Ceniza 
##            13.0006180             2.3363483             2.3665169 
##    Ceniza_Alcalinidad              Magnesio         Total_fenoles 
##            19.4949438            99.7415730             2.2951124 
##           Flavanoides Noflavanoides_fenoles       Proantocianinas 
##             2.0292697             0.3618539             1.5908989 
##      intensidad_color                 Matiz                 OD280 
##             5.0580899             0.9574494             2.6116854 
##               Prolina 
##           746.8932584
  • Alcohol: En promedio, los vinos tienen una concentración de 13.00% v/v de etanol, lo cual es característico de un vino tinto seco tradicional.

  • Ácido málico: En promedio, se registran 2.34 unidades de ácido málico, el cual le otorga acidez a la bebida.

  • Ceniza y alcalinidad: En promedio, el vino conserva 2.37 unidades de residuo mineral (ceniza) y una alcalinidad de la ceniza de 19.49, reflejando las características minerales de la muestra.

  • Magnesio: En promedio, se presentan 99.74 mg/L de magnesio.

  • Compuestos fenólicos: En promedio, el vino contiene 2.30 unidades de fenoles totales, de los cuales una gran parte corresponde a flavonoides (2.03), mientras que los fenoles no flavonoides presentan un promedio de 0.36. Las proantocianinas promedian 1.59, aportando características relacionadas con el cuerpo y la estructura del vino.

  • Color y pureza: En promedio, los vinos muestran una intensidad de color de 5.06 con un matiz (hue) de 0.96. Además, presentan un indicador promedio de OD280 de 2.61.

  • Prolina: En promedio, se registran 746.89 mg/L de prolina, siendo una de las variables con valores promedio más elevados dentro de la base de datos.

En general, se observa una concentración moderada de alcohol, una importante presencia de compuestos fenólicos y flavonoides, así como diferencias en variables relacionadas con el color, los minerales y la composición química.

Las escalas de los promedios son enormemente distintas (van desde 0.36 en fenoles no flavanoides hasta 746.89 en prolina). Esta diferencia tan grande justifica por qué debemos estandarizar los datos antes de hacer el ACP, para evitar que la prolina le gane a las demás variables solo por tener números más grandes.

— Resumen estadístico completo (Mínimos, Cuartiles, Medianas, Medias, Máximos) —

summary(vinos_num)
##     Alcohol       Acido_malico       Ceniza      Ceniza_Alcalinidad
##  Min.   :11.03   Min.   :0.740   Min.   :1.360   Min.   :10.60     
##  1st Qu.:12.36   1st Qu.:1.603   1st Qu.:2.210   1st Qu.:17.20     
##  Median :13.05   Median :1.865   Median :2.360   Median :19.50     
##  Mean   :13.00   Mean   :2.336   Mean   :2.367   Mean   :19.49     
##  3rd Qu.:13.68   3rd Qu.:3.083   3rd Qu.:2.558   3rd Qu.:21.50     
##  Max.   :14.83   Max.   :5.800   Max.   :3.230   Max.   :30.00     
##     Magnesio      Total_fenoles    Flavanoides    Noflavanoides_fenoles
##  Min.   : 70.00   Min.   :0.980   Min.   :0.340   Min.   :0.1300       
##  1st Qu.: 88.00   1st Qu.:1.742   1st Qu.:1.205   1st Qu.:0.2700       
##  Median : 98.00   Median :2.355   Median :2.135   Median :0.3400       
##  Mean   : 99.74   Mean   :2.295   Mean   :2.029   Mean   :0.3619       
##  3rd Qu.:107.00   3rd Qu.:2.800   3rd Qu.:2.875   3rd Qu.:0.4375       
##  Max.   :162.00   Max.   :3.880   Max.   :5.080   Max.   :0.6600       
##  Proantocianinas intensidad_color     Matiz            OD280      
##  Min.   :0.410   Min.   : 1.280   Min.   :0.4800   Min.   :1.270  
##  1st Qu.:1.250   1st Qu.: 3.220   1st Qu.:0.7825   1st Qu.:1.938  
##  Median :1.555   Median : 4.690   Median :0.9650   Median :2.780  
##  Mean   :1.591   Mean   : 5.058   Mean   :0.9574   Mean   :2.612  
##  3rd Qu.:1.950   3rd Qu.: 6.200   3rd Qu.:1.1200   3rd Qu.:3.170  
##  Max.   :3.580   Max.   :13.000   Max.   :1.7100   Max.   :4.000  
##     Prolina      
##  Min.   : 278.0  
##  1st Qu.: 500.5  
##  Median : 673.5  
##  Mean   : 746.9  
##  3rd Qu.: 985.0  
##  Max.   :1680.0

Interpretación de Simetría, Sesgo y Escala:

  • Variables Simétricas (Alcohol, Ceniza y Alcalinidad de la Ceniza): Compuestos como el Alcohol (Media = 13.00 vs Mediana = 13.05), la Ceniza (Media = 2.37 vs Mediana = 2.36) y la Alcalinidad de la Ceniza (Media = 19.49 vs Mediana = 19.50) presentan valores casi idénticos entre su media y su mediana. Esto indica distribuciones simétricas y libres de grandes distorsiones.

  • Variables con Sesgo Positivo (Ácido Málico e Intensidad de Color): En variables como el Ácido Málico (Media = 2.34 vs Mediana = 1.87) y la Intensidad de Color (Media = 5.06 vs Mediana = 4.69), la media supera a la mediana debido a la presencia de un grupo de muestras con concentraciones altas (colas a la derecha).

  • Justificación de Estandarización por Escala (Prolina): La Prolina destaca por sus elevadas magnitudes (Media = 746.89, Máximo = 1680.0). Esta fuerte diferencia de escala con respecto a los otros químicos justifica técnicamente la necesidad de estandarizar los datos antes de aplicar el Análisis de Componentes Principales (ACP).

— Visualización gráfica: media vs. mediana y disparidad de escalas —

promedios <- colMeans(vinos_num)

# Disparidad de Escalas 
colores_escala <- rep("#7570b3", 13)
colores_escala[which(names(promedios) == "Prolina")] <- "#d95f02" # Resaltar Prolina en naranja

barplot(promedios, 
        main = "C. Disparidad de Escalas (Promedios)", 
        col = colores_escala, 
        las = 2, 
        cex.names = 0.6)

Al comparar gráficamente el Magnesio (con una media cercana a 99.74 mg/L) frente a la Prolina (con una media sobresaliente de 746.89 mg/L y valores máximos que superan los 1600 mg/L), se evidencia visualmente una disparidad extrema en las escalas de medición.

## Demostración Visual Directa de Simetría vs. Sesgo

# Configuración para mostrar 2 gráficos lado a lado
par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))

# --- 1. VARIABLE SIMÉTRICA: ALCOHOL
hist(vinos_num$Alcohol, 
     probability = TRUE, 
     main = "1. Variable Simétrica (Alcohol)", 
     xlab = "Alcohol (% v/v)", 
     col = "#e0f3f8", 
     border = "white")
lines(density(vinos_num$Alcohol), col = "#2b5b84", lwd = 2.5)

# Líneas de Media y Mediana (coinciden)
abline(v = mean(vinos_num$Alcohol), col = "red", lwd = 2, lty = 1)
abline(v = median(vinos_num$Alcohol), col = "blue", lwd = 2, lty = 2)

legend("topright", 
       legend = c(paste("Media:", round(mean(vinos_num$Alcohol), 2)), 
                  paste("Mediana:", round(median(vinos_num$Alcohol), 2))), 
       col = c("red", "blue"), lty = c(1, 2), lwd = 2, bty = "n", cex = 0.8)

# --- 2. VARIABLE CON SESGO POSITIVO: ÁCIDO MÁLICO
hist(vinos_num$Acido_malico, 
     probability = TRUE, 
     main = "2. Variable con Sesgo (Ácido Málico)", 
     xlab = "Ácido Málico", 
     col = "#fee090", 
     border = "white")
lines(density(vinos_num$Acido_malico), col = "#d73027", lwd = 2.5)

# Líneas de Media y Mediana (se separan)
abline(v = mean(vinos_num$Acido_malico), col = "red", lwd = 2, lty = 1)
abline(v = median(vinos_num$Acido_malico), col = "blue", lwd = 2, lty = 2)

legend("topright", 
       legend = c(paste("Media:", round(mean(vinos_num$Acido_malico), 2)), 
                  paste("Mediana:", round(median(vinos_num$Acido_malico), 2))), 
       col = c("red", "blue"), lty = c(1, 2), lwd = 2, bty = "n", cex = 0.8)

# Restaurar la ventana gráfica original
par(mfrow = c(1, 1))
  • Alcohol (Simétrico): La curva es equilibrada y con forma de campana, confirmando una distribución normal y libre de valores extremos.

  • Ácido Málico (Sesgo Positivo): La mayoría de los vinos tienen niveles bajos de acidez, pero unos pocos valores inusualmente altos elevan el promedio general (cola a la derecha).

— Detección global de valores atípicos (Boxplot escalado) —

# Boxplot general con datos estandarizados
boxplot(scale(vinos_num),
        main = "Detección global de valores atípicos (Variables escaladas)",
        col = "lightblue",
        las = 2,
        cex.axis = 0.8)

  • La mayor parte de los datos se concentran en el rango de -2 a +2 desviaciones estándar.

  • Se observan valores atípicos moderados en Ácido málico, Magnesio, Proantocianinas e Intensidad de color.

— Distribución univariada completa (Histogramas) —

Graficamos los histogramas de las 13 variables cuantitativas para analizar la normalidad, curtosis, sesgos y la presencia de modas múltiples.

par(mfrow = c(4, 4), mar = c(2, 2, 2, 1))

for(i in 1:13) {
  hist(vinos_num[[i]], 
       probability = TRUE, 
       main = names(vinos_num)[i], 
       col = "darkred", 
       border = "black",
       xlab = "")
  lines(density(vinos_num[[i]]), col = "blue", lwd = 2)
}

par(mfrow = c(1, 1))

  • Normalidad y Simetría: Variables como Alcohol, Ceniza y Ceniza_Alcalinidad muestran formas acampanadas con sesgos mínimos.

  • Sesgos y Curtosis: Ácido málico, Intensidad_color y Proantocianinas exhiben un claro sesgo positivo y comportamiento leptocúrtico. Por el contrario, la Prolina presenta una fuerte platicurtosis.

  • Irregularidades: Variables como Flavanoides, Total_fenoles y OD280 muestran distribuciones bimodales.

4. Variabilidad y correlaciones globales

En esta sección evaluamos la estructura de covarianza y correlación entre las 13 variables cuantitativas del vino, justificando la estandarización previa al Análisis de Componentes Principales (ACP).

— Matriz de covarianzas y Justificación de estandarización —

Calculamos la matriz de covarianzas con las variables en su escala original.

# Matriz de covarianzas de las 13 variables numéricas
cov(vinos_num)
##                            Alcohol Acido_malico        Ceniza
## Alcohol                 0.65906233   0.08561131  0.0471151590
## Acido_malico            0.08561131   1.24801540  0.0502770393
## Ceniza                  0.04711516   0.05027704  0.0752646353
## Ceniza_Alcalinidad     -0.84109290   1.07633171  0.4062082778
## Magnesio                3.13987812  -0.87077953  1.1229365835
## Total_fenoles           0.14688722  -0.23433772  0.0221455913
## Flavanoides             0.19203322  -0.45863037  0.0315347299
## Noflavanoides_fenoles  -0.01575426   0.04073336  0.0063584714
## Proantocianinas         0.06351752  -0.14114698  0.0015155780
## intensidad_color        1.02828254   0.64483818  0.1646543266
## Matiz                  -0.01331344  -0.14332564 -0.0046821545
## OD280                   0.04169782  -0.29244748  0.0007618358
## Prolina               164.56718498 -67.54886657 19.3197390973
##                       Ceniza_Alcalinidad     Magnesio Total_fenoles
## Alcohol                       -0.8410929    3.1398781    0.14688722
## Acido_malico                   1.0763317   -0.8707795   -0.23433772
## Ceniza                         0.4062083    1.1229366    0.02214559
## Ceniza_Alcalinidad            11.1526862   -3.9747604   -0.67114915
## Magnesio                      -3.9747604  203.9893354    1.91646988
## Total_fenoles                 -0.6711491    1.9164699    0.39168954
## Flavanoides                   -1.1720828    2.7930870    0.54047042
## Noflavanoides_fenoles          0.1504219   -0.4555634   -0.03504512
## Proantocianinas               -0.3771762    1.9328325    0.21937334
## intensidad_color               0.1450242    6.6205206   -0.07999752
## Matiz                         -0.2091181    0.1808513    0.06203888
## OD280                         -0.6562344    0.6693081    0.31102128
## Prolina                     -463.3553450 1769.1586999   98.17105726
##                        Flavanoides Noflavanoides_fenoles Proantocianinas
## Alcohol                 0.19203322          -0.015754260     0.063517520
## Acido_malico           -0.45863037           0.040733362    -0.141146982
## Ceniza                  0.03153473           0.006358471     0.001515578
## Ceniza_Alcalinidad     -1.17208281           0.150421856    -0.377176220
## Magnesio                2.79308703          -0.455563385     1.932832476
## Total_fenoles           0.54047042          -0.035045125     0.219373345
## Flavanoides             0.99771867          -0.066867000     0.373147553
## Noflavanoides_fenoles  -0.06686700           0.015488634    -0.026059868
## Proantocianinas         0.37314755          -0.026059868     0.327594668
## intensidad_color       -0.39916863           0.040120510    -0.033503918
## Matiz                   0.12408197          -0.007471177     0.038664565
## OD280                   0.55826225          -0.044469244     0.210932940
## Prolina               155.44749222         -12.203586301    59.554333778
##                       intensidad_color        Matiz         OD280     Prolina
## Alcohol                     1.02828254 -0.013313443  0.0416978226   164.56718
## Acido_malico                0.64483818 -0.143325638 -0.2924474830   -67.54887
## Ceniza                      0.16465433 -0.004682155  0.0007618358    19.31974
## Ceniza_Alcalinidad          0.14502419 -0.209118054 -0.6562343681  -463.35535
## Magnesio                    6.62052061  0.180851266  0.6693080683  1769.15870
## Total_fenoles              -0.07999752  0.062038876  0.3110212785    98.17106
## Flavanoides                -0.39916863  0.124081969  0.5582622548   155.44749
## Noflavanoides_fenoles       0.04012051 -0.007471177 -0.0444692440   -12.20359
## Proantocianinas            -0.03350392  0.038664565  0.2109329398    59.55433
## intensidad_color            5.37444938 -0.276505801 -0.7058125762   230.76748
## Matiz                      -0.27650580  0.052244961  0.0917662439    17.00022
## OD280                      -0.70581258  0.091766244  0.5040864089    69.92753
## Prolina                   230.76748014 17.000223386 69.9275255507 99166.71736

La varianza de la Prolina va a más de 99,000 unidades, mientras que compuestos clave como los Fenoles, no Flavanoides o la Ceniza tienen varianzas inferiores a 0.1 unidades.

— Matriz de correlación —

Calculamos la matriz de correlaciones de Pearson y la graficamos utilizando la librería corrplot para identificar las asociaciones lineales y redundancias entre compuestos químicos.

library(corrplot)

# 1. Matriz de correlación de Pearson
matriz_cor <- cor(vinos_num)

# 2. Visualización con corrplot 
matriz_correlacion <- cor(vinos_num)

corrplot(matriz_correlacion,
         method = "color",
         type = "upper",
         addCoef.col = "black", # Muestra los números exactos
         tl.col = "black",
         tl.srt = 45,
         number.cex = 0.5, # Tamaño de los números
         main = "Matriz de Correlaciones de Vinos",
         mar = c(0,0,1,0))

Correlaciones positivas altas

  • Flavanoides vs. Total_fenoles (r ≈ 0.86): Existe una correlación positiva lineal muy fuerte indicando alta redundancia de información.

  • Flavanoides vs. OD280 (r ≈ 0.79): La pureza aromática y la concentración de flavanoides están estrechamente ligadas.

  • Total_fenoles vs. Proantocianinas (r ≈ 0.68): El incremento en fenoles totales se traduce directamente en una mayor presencia de proantocianinas.

Correlaciones Negativas

  • Flavanoides vs. Noflavanoides_fenoles (r ≈ -0.54): Relación inversa moderada.

  • OD280 vs. Alcalinidad de la Ceniza (r ≈ -0.44): Vinos con mayor contenido de minerales alcalinos tienden a presentar menores niveles de pureza aromática OD280.

Variables Independientes

  • La Ceniza y el Magnesio muestran coeficientes de correlación débiles (r < 0.30) con la mayoría de los compuestos fenólicos.

5. Análisis por grupos (Cultivares)

Segmentamos las 178 muestras de vino según su procedencia (Customer_Segment o Cultivar 1, 2 y 3) para evaluar cómo varían los perfiles químicos entre grupos.

— Perfil químico promedio y dispersión por grupo —

library(dplyr)
library(knitr)

#Resumen estadístico por Cultivar (Medias y Desviaciones Estándar)
resumen_grupos <- BD_Wine %>%
  group_by(Customer_Segment) %>%
  summarise(
    N = n(),
    Alcohol_Media = round(mean(Alcohol), 2),
    Alcohol_SD = round(sd(Alcohol), 2),
    Flavanoides_Media = round(mean(Flavanoides), 2),
    Flavanoides_SD = round(sd(Flavanoides), 2),
    Prolina_Media = round(mean(Prolina), 2),
    Prolina_SD = round(sd(Prolina), 2),
    Acido_Malico_Media = round(mean(Acido_malico), 2),
    Acido_Malico_SD = round(sd(Acido_malico), 2)
  )

kable(resumen_grupos, caption = "Tabla 1: Comparación de Promedios y Desviación Estándar por Cultivar")
Tabla 1: Comparación de Promedios y Desviación Estándar por Cultivar
Customer_Segment N Alcohol_Media Alcohol_SD Flavanoides_Media Flavanoides_SD Prolina_Media Prolina_SD Acido_Malico_Media Acido_Malico_SD
1 59 13.74 0.46 2.98 0.40 1115.71 221.52 2.01 0.69
2 71 12.28 0.54 2.08 0.71 519.51 157.21 1.93 1.02
3 48 13.15 0.53 0.78 0.29 629.90 115.10 3.33 1.09
  • Cultivar 1 (Vinos de Alta Calidad/Madurez): Destaca por los niveles más altos de Prolina (1115.7 mg/L), Flavanoides (2.98) y un nivel elevado de Alcohol (13.74%).

  • Cultivar 2 (Vinos Ligeros y Balanceados): Muestra concentraciones moderadas a bajas en casi todos los marcadores.

  • Cultivar 3 (Vinos Secos con Alta Acidez y Bajo Fenol): Presenta la menor concentración de Flavanoides (0.78) y la mayor acidez por Ácido Málico (3.33).

— Comparación visual por grupos (Boxplot segmentados) —

par(mfrow = c(1, 3), mar = c(4, 4, 3, 1))

# Boxplot 1: Alcohol por Cultivar
boxplot(Alcohol ~ Customer_Segment, data = BD_Wine,
        col = c("#1b9e77", "#d95f02", "#7570b3"),
        main = "Alcohol por Cultivar",
        xlab = "Cultivar", ylab = "% v/v")

# Boxplot 2: Flavanoides por Cultivar
boxplot(Flavanoides ~ Customer_Segment, data = BD_Wine,
        col = c("#1b9e77", "#d95f02", "#7570b3"),
        main = "Flavanoides por Cultivar",
        xlab = "Cultivar", ylab = "Unidades")

# Boxplot 3: Prolina por Cultivar
boxplot(Prolina ~ Customer_Segment, data = BD_Wine,
        col = c("#1b9e77", "#d95f02", "#7570b3"),
        main = "Prolina por Cultivar",
        xlab = "Cultivar", ylab = "mg/L")

par(mfrow = c(1, 1))

— Matrices de correlación comparativas por cultivar —

# Filtrar las variables cuantitativas por cada grupo
cor_g1 <- cor(BD_Wine[BD_Wine$Customer_Segment == 1, 1:13])
cor_g2 <- cor(BD_Wine[BD_Wine$Customer_Segment == 2, 1:13])
cor_g3 <- cor(BD_Wine[BD_Wine$Customer_Segment == 3, 1:13])

# Panel de 3 matrices de correlación
par(mfrow = c(1, 3), mar = c(1, 1, 3, 1))

corrplot(cor_g1, method = "color", type = "lower", tl.cex = 0.6, addCoef.col = "black", number.cex = 0.45, title = "Cultivar 1 (N = 59)", mar = c(0, 0, 2, 0))
corrplot(cor_g2, method = "color", type = "lower", tl.cex = 0.6, addCoef.col = "black", number.cex = 0.45, title = "Cultivar 2 (N = 71)", mar = c(0, 0, 2, 0))
corrplot(cor_g3, method = "color", type = "lower", tl.cex = 0.6, addCoef.col = "black", number.cex = 0.45, title = "Cultivar 3 (N = 48)", mar = c(0, 0, 2, 0))

par(mfrow = c(1, 1))
  • Cultivar 1: Asociación fuerte entre Total_fenoles y Flavanoides (r = 0.80).

  • Cultivar 2: La correlación entre Total_fenoles y Flavanoides se reduce a r = 0.77.

  • Cultivar 3: La relación Flavanoides vs. Total_fenoles cae drásticamente a r = 0.24. Destaca la fuerte asociación inversa entre Noflavanoides_fenoles e Intensidad_color (r = -0.63).

6. Integración de resultados y conclusiones

Tras realizar el análisis exploratorio de la base de datos de vinos, se identificaron los siguientes patrones clave:

  • Distribución y Atípicos: La variable Alcohol muestra una distribución relativamente simétrica, sugiriendo normalidad. El Ácido málico presenta un sesgo positivo indicando que la mayoría de los vinos tienen concentraciones bajas. Se detectaron valores atípicos en Ácido málico y Color_intensidad que deberán tenerse en cuenta.

  • Variabilidad y Promedios: Destaca la Prolina con un valor medio de 746.89, mostrando además la mayor varianza absoluta, lo que justifica la estandarización debido a la escala de medición.

  • Correlaciones: Existe una fuerte correlación positiva entre los Fenoles Totales y los Flavanoides (0.86), lo cual sugiere que hay información redundante que puede ser condensada.

  • Diferencias por Grupo (Cultivar): El Cultivar 1 tiene el mayor promedio de Prolina (1115.7) y Alcohol (13.74%), mientras que el Cultivar 3 destaca por tener el Ácido málico más alto (3.33) pero los niveles más bajos de Flavanoides (0.78).

Pregunta: Con estas diferencias numéricas evidentes entre los tres segmentos y las altas correlaciones detectadas, ¿podremos utilizar un Análisis de Componentes Principales (ACP) para reducir estas 13 dimensiones, eliminar la redundancia y lograr clasificar visualmente a qué cultivar pertenece cada botella de vino?

# Boxplot de Prolina segmentado por Cultivar
boxplot(Prolina ~ Customer_Segment, data = BD_Wine,
        main = "Niveles de Prolina por Cultivar",
        xlab = "Cultivar (Customer_Segment)",
        ylab = "Prolina",
        col = c("lightgreen", "lightpink", "lightblue"))

Sí, completamente. El ACP es la herramienta ideal por las siguientes 3 razones fundamentales:

  • 1. Reducción de Redundancia (Alta Correlación): La presencia de fuertes relaciones entre variables indica que las 13 variables comparten información repetida. El ACP permitirá resumir esa variabilidad.

  • 2. Separación de Poblaciones: Las concentraciones químicas varían drásticamente según el origen botánico. Esto garantiza que las primeras dimensiones del ACP capturarán suficiente varianza para separar visualmente los grupos.

  • 3. Estandarización Obligatoria: Dado el comportamiento de la prolina, la aplicación del ACP a través de la Matriz de Correlaciones asegurará que cada variable aporte en igualdad de condiciones matemáticas a la discriminación de los cultivares.

Tarea 2: ACP Vinos

1. Descripción de los Datos y Objetivos de Estudio

La base de datos analizada contiene 178 observaciones correspondientes a los perfiles fisicoquímicos de vinos cultivados en una misma región de Italia. Para cada muestra, se midieron 13 variables químicas continuas (como Alcohol, Ácido Málico, Prolina, Flavanoides, etc.) y se registró una variable categórica correspondiente a los tres cultivares genéticos de origen (Customer_Segment).

Objetivo del estudio: Aplicar la técnica de Análisis de Componentes Principales (ACP) para reducir la dimensionalidad del perfil químico de los vinos, conservando la mayor cantidad de varianza y eliminando la redundancia.

Interrogantes a responder: ¿Existe la suficiente correlación entre los compuestos químicos para justificar la reducción de dimensiones? ¿Cuáles son las variables químicas que aportan mayor peso para caracterizar y distinguir a cada vino? ¿Es posible agrupar visualmente los vinos según su cultivar de origen basándonos exclusivamente en su composición química, sin utilizar la etiqueta cualitativa previa?

2. Preparación de los datos, promedios y covarianzas

Para garantizar un análisis riguroso, verificamos la estructura de los datos y calculamos las medidas de tendencia central y dispersión conjunta antes de cualquier transformación.

# Cargar Librerías necesarias
library(readr)
library(corrplot)

# 1. Cargar datos y omitir valores nulos
BD_Wine <- read_csv("BD_Wine.xlsx - Wine.csv")
BD_Wine_limpia <- na.omit(BD_Wine)

# 2. Revisar la estructura de los datos
print("--- DIMENSIONES Y ESTRUCTURA ---")
## [1] "--- DIMENSIONES Y ESTRUCTURA ---"
dim(BD_Wine_limpia)
## [1] 178  14
str(BD_Wine_limpia)
## spc_tbl_ [178 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Alcohol              : num [1:178] 14.2 13.2 13.2 14.4 13.2 ...
##  $ Acido_malico         : num [1:178] 1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
##  $ Ceniza               : num [1:178] 2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
##  $ Ceniza_Alcalinidad   : num [1:178] 15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
##  $ Magnesio             : num [1:178] 127 100 101 113 118 112 96 121 97 98 ...
##  $ Total_fenoles        : num [1:178] 2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
##  $ Flavanoides          : num [1:178] 3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
##  $ Noflavanoides_fenoles: num [1:178] 0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
##  $ Proantocianinas      : num [1:178] 2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
##  $ intensidad_color     : num [1:178] 5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
##  $ Matiz                : num [1:178] 1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
##  $ OD280                : num [1:178] 3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
##  $ Prolina              : num [1:178] 1065 1050 1185 1480 735 ...
##  $ Customer_Segment     : num [1:178] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Alcohol = col_double(),
##   ..   Acido_malico = col_double(),
##   ..   Ceniza = col_double(),
##   ..   Ceniza_Alcalinidad = col_double(),
##   ..   Magnesio = col_double(),
##   ..   Total_fenoles = col_double(),
##   ..   Flavanoides = col_double(),
##   ..   Noflavanoides_fenoles = col_double(),
##   ..   Proantocianinas = col_double(),
##   ..   intensidad_color = col_double(),
##   ..   Matiz = col_double(),
##   ..   OD280 = col_double(),
##   ..   Prolina = col_double(),
##   ..   Customer_Segment = col_double()
##   .. )
##  - attr(*, "problems")=<pointer: 0x0000019f5fee6f30>
# 3. Aislar variables continuas
vinos_num <- BD_Wine_limpia[, 1:13]

# 4. Vector de promedios y Matriz de Covarianzas
print("--- VECTOR DE PROMEDIOS ---")
## [1] "--- VECTOR DE PROMEDIOS ---"
colMeans(vinos_num)
##               Alcohol          Acido_malico                Ceniza 
##            13.0006180             2.3363483             2.3665169 
##    Ceniza_Alcalinidad              Magnesio         Total_fenoles 
##            19.4949438            99.7415730             2.2951124 
##           Flavanoides Noflavanoides_fenoles       Proantocianinas 
##             2.0292697             0.3618539             1.5908989 
##      intensidad_color                 Matiz                 OD280 
##             5.0580899             0.9574494             2.6116854 
##               Prolina 
##           746.8932584
print("--- MATRIZ DE VARIANZAS-COVARIANZAS ---")
## [1] "--- MATRIZ DE VARIANZAS-COVARIANZAS ---"
cov(vinos_num)
##                            Alcohol Acido_malico        Ceniza
## Alcohol                 0.65906233   0.08561131  0.0471151590
## Acido_malico            0.08561131   1.24801540  0.0502770393
## Ceniza                  0.04711516   0.05027704  0.0752646353
## Ceniza_Alcalinidad     -0.84109290   1.07633171  0.4062082778
## Magnesio                3.13987812  -0.87077953  1.1229365835
## Total_fenoles           0.14688722  -0.23433772  0.0221455913
## Flavanoides             0.19203322  -0.45863037  0.0315347299
## Noflavanoides_fenoles  -0.01575426   0.04073336  0.0063584714
## Proantocianinas         0.06351752  -0.14114698  0.0015155780
## intensidad_color        1.02828254   0.64483818  0.1646543266
## Matiz                  -0.01331344  -0.14332564 -0.0046821545
## OD280                   0.04169782  -0.29244748  0.0007618358
## Prolina               164.56718498 -67.54886657 19.3197390973
##                       Ceniza_Alcalinidad     Magnesio Total_fenoles
## Alcohol                       -0.8410929    3.1398781    0.14688722
## Acido_malico                   1.0763317   -0.8707795   -0.23433772
## Ceniza                         0.4062083    1.1229366    0.02214559
## Ceniza_Alcalinidad            11.1526862   -3.9747604   -0.67114915
## Magnesio                      -3.9747604  203.9893354    1.91646988
## Total_fenoles                 -0.6711491    1.9164699    0.39168954
## Flavanoides                   -1.1720828    2.7930870    0.54047042
## Noflavanoides_fenoles          0.1504219   -0.4555634   -0.03504512
## Proantocianinas               -0.3771762    1.9328325    0.21937334
## intensidad_color               0.1450242    6.6205206   -0.07999752
## Matiz                         -0.2091181    0.1808513    0.06203888
## OD280                         -0.6562344    0.6693081    0.31102128
## Prolina                     -463.3553450 1769.1586999   98.17105726
##                        Flavanoides Noflavanoides_fenoles Proantocianinas
## Alcohol                 0.19203322          -0.015754260     0.063517520
## Acido_malico           -0.45863037           0.040733362    -0.141146982
## Ceniza                  0.03153473           0.006358471     0.001515578
## Ceniza_Alcalinidad     -1.17208281           0.150421856    -0.377176220
## Magnesio                2.79308703          -0.455563385     1.932832476
## Total_fenoles           0.54047042          -0.035045125     0.219373345
## Flavanoides             0.99771867          -0.066867000     0.373147553
## Noflavanoides_fenoles  -0.06686700           0.015488634    -0.026059868
## Proantocianinas         0.37314755          -0.026059868     0.327594668
## intensidad_color       -0.39916863           0.040120510    -0.033503918
## Matiz                   0.12408197          -0.007471177     0.038664565
## OD280                   0.55826225          -0.044469244     0.210932940
## Prolina               155.44749222         -12.203586301    59.554333778
##                       intensidad_color        Matiz         OD280     Prolina
## Alcohol                     1.02828254 -0.013313443  0.0416978226   164.56718
## Acido_malico                0.64483818 -0.143325638 -0.2924474830   -67.54887
## Ceniza                      0.16465433 -0.004682155  0.0007618358    19.31974
## Ceniza_Alcalinidad          0.14502419 -0.209118054 -0.6562343681  -463.35535
## Magnesio                    6.62052061  0.180851266  0.6693080683  1769.15870
## Total_fenoles              -0.07999752  0.062038876  0.3110212785    98.17106
## Flavanoides                -0.39916863  0.124081969  0.5582622548   155.44749
## Noflavanoides_fenoles       0.04012051 -0.007471177 -0.0444692440   -12.20359
## Proantocianinas            -0.03350392  0.038664565  0.2109329398    59.55433
## intensidad_color            5.37444938 -0.276505801 -0.7058125762   230.76748
## Matiz                      -0.27650580  0.052244961  0.0917662439    17.00022
## OD280                      -0.70581258  0.091766244  0.5040864089    69.92753
## Prolina                   230.76748014 17.000223386 69.9275255507 99166.71736
# 5. Escalar los datos y generar Matriz de Correlaciones
vinos_escalados <- scale(vinos_num)
matriz_cor <- cor(vinos_escalados)

corrplot(matriz_cor, method = "color", type = "upper",
         addCoef.col = "black", tl.col = "black", tl.srt=45,
         number.cex = 0.5, title= "Correlación de Variables Químicas",
         mar=c(0,0,1,0))

— Análisis de Promedios, Covarianzas y Justificación del ACP: —

  • Promedios y varianzas: Al analizar el vector de promedios, observamos una disparidad masiva en las escalas de medición. La Prolina tiene un promedio altísimo (746.89), seguida del Magnesio (99.74), mientras que compuestos como los Fenoles no flavanoides apenas promedian 0.36. La matriz de varianzas-covarianzas confirma esta gran magnitud de dispersión en la Prolina. Esto demuestra que es estrictamente necesario estandarizar los datos (scale()), ya que, de no hacerlo, el ACP le daría todo el peso a la Prolina simplemente por tener números más grandes, opacando al resto de los químicos.
  • Correlaciones y adecuación del ACP: Al observar la gráfica de calor (corrplot), detectamos una evidente multicolinealidad. Existe una fuerte correlación positiva entre los Flavanoides y el Total de Fenoles (0.86), y una correlación negativa moderada entre la Intensidad de Color y el Matiz (-0.52). Estas altas asociaciones demuestran que hay información redundante, lo que justifica plenamente la adecuación del Análisis de Componentes Principales para condensar estas variables en dimensiones menores.

3. Eigenvalores y Varianza Explicada

En esta sección ejecutamos el Análisis de Componentes Principales. A partir de las 13 variables químicas originales, el algoritmo calcula los autovectores y autovalores (eigenvalores) para crear nuevas dimensiones que condensen la varianza.

# Cargar Librerías para ACP y visualización (instálalas en tu consola si no las tienes)
library(FactoMineR)
library(factoextra)

# 1. Ejecutar el Análisis de Componentes Principales
# Se usa scale.unit = TRUE para estandarizar los datos automáticamente en el cálculo
res.pca <- PCA(vinos_num, scale.unit = TRUE, graph = FALSE)

# 2. Extraer Eigenvalores y % de varianza
eigenvalores <- get_eigenvalue(res.pca)
print("--- EIGENVALORES Y VARIANZA EXPLICADA (Primeras 6 dimensiones) ---")
## [1] "--- EIGENVALORES Y VARIANZA EXPLICADA (Primeras 6 dimensiones) ---"
head(eigenvalores)
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  4.7058503        36.198848                    36.19885
## Dim.2  2.4969737        19.207490                    55.40634
## Dim.3  1.4460720        11.123631                    66.52997
## Dim.4  0.9189739         7.069030                    73.59900
## Dim.5  0.8532282         6.563294                    80.16229
# 3. Gráfico de Sedimentación (Scree plot)
fviz_eig(res.pca, addlabels = TRUE, ylim=c(0,50),
         main = "Gráfico de Sedimentación (Scree Plot)",
         xlab= "Componentes Principales",
         ylab = "Porcentaje de Varianza Explicada",
         barfill = "steelblue", barcolor = "black")

— Análisis de Eigenvalores y Justificación de Retención: —

Para determinar el número óptimo de componentes principales a conservar, nos basamos en el Criterio de Kaiser. Este criterio establece que un eigenvalor λi> 1 indica que ese nuevo componente representa más varianza que la contabilizada por una sola de las variables originales estandarizadas.

Al observar los resultados numéricos y el gráfico de sedimentación:

  • El Componente 1 (Dim. 1) es el más importante, capturando aproximadamente el 36.2% de la varianza total de los datos.

  • El Componente 2 (Dim. 2) captura un 19.2% adicional.

  • El Componente 3 (Dim. 3) captura un 11.1%.

Si evaluamos el criterio de Kaiser (λ>1), observamos que únicamente las primeras tres dimensiones superan este umbral (sus eigenvalores son mayores a 1). Por lo tanto, se justifica retener los primeros 3 componentes principales, los cuales en conjunto logran explicar una varianza acumulada cercana al 66.5%. Esto significa que hemos logrado reducir la dimensionalidad de 13 variables químicas a solo 3 dimensiones, perdiendo apenas una tercera parte de la información original, cumpliendo así el objetivo del análisis multivariado.

4. Análisis de Variables e Individuos

En esta etapa evaluamos la identidad química de nuestras nuevas dimensiones y proyectamos las 178 muestras de vino sobre el nuevo plano bidimensional. Para evaluar si el modelo logra clasificar los vinos naturalmente por su química, coloreamos los puntos según su cultivar de origen (Customer_Segment).

— Círculo de Correlaciones (Variables) —

# Gráfico de Correlación de Variables para justificar la identidad de las dimensiones
fviz_pca_var(res.pca,
             col.var = "contrib", # Colorea las flechas según su contribución
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE, # Evita que los textos se superpongan
             title = "Círculo de Correlaciones: Composición Química")

— Proyección de Individuos y Atípicos —

# 1. Gráfico de Individuos coloreado por Cultivar
fviz_pca_ind(res.pca,
             geom.ind = "point", # Muestra puntos en lugar de texto para evitar amontonamiento
             col.ind = as.factor(BD_Wine_limpia$Customer_Segment), # Variable de agrupación
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, # Agrega elipses de confianza alrededor de los grupos
             legend.title = "Cultivar",
             title = "Mapa de Individuos (PCA) agrupado por Cultivar")

# 2. Identificar los individuos (vinos) que más contribuyen al modelo
fviz_contrib(res.pca, choice = "ind", axes = 1:2, top = 15,
             fill = "darkgreen", color = "black",
             title = "Top 15 Vinos con mayor contribución (Dim 1 y 2)")

# 3. Resultados Numéricos: Top 5 individuos por Dimensión
print("--- TOP 5 VINOS CON MAYOR CONTRIBUCIÓN (DIM 1) ---")
## [1] "--- TOP 5 VINOS CON MAYOR CONTRIBUCIÓN (DIM 1) ---"
head(sort(res.pca$ind$contrib[, 1], decreasing = TRUE), 5)
##       15      147      138      137        4 
## 2.220533 2.187555 1.849926 1.830512 1.685153
print("--- TOP 5 VINOS CON MAYOR CONTRIBUCIÓN (DIM 2) ---")
## [1] "--- TOP 5 VINOS CON MAYOR CONTRIBUCIÓN (DIM 2) ---"
head(sort(res.pca$ind$contrib[, 2], decreasing = TRUE), 5)
##      116      159       81       60      117 
## 3.372782 2.779962 2.562875 2.125341 1.791116

— Análisis Numérico y Gráfico: —

Agrupación y Separación: El gráfico demuestra que el Análisis de Componentes Principales es altamente efectivo. Aunque el algoritmo nunca “supo” a qué cultivar pertenecía cada vino, logró agrupar las muestras en tres clústeres bien definidos con superposición mínima. Los vinos del Cultivar 1 y del Cultivar 3 se separan perfectamente a lo largo del eje horizontal (Dim 1), mientras que los del Cultivar 2 se ubican al centro pero varían sobre el eje vertical (Dim 2).

Individuos Sobresalientes (Atípicos): Al revisar los resultados numéricos y las barras de contribución, detectamos botellas específicas que definen la variabilidad del modelo debido a sus perfiles químicos extremos:}

  • En la Dimensión 1 (asociada a los fenoles), destacan fuertemente los vinos 15, 147 y 138. Al verlos en el mapa, estas botellas se ubican en los extremos más alejados del eje X, lo que indica que tienen concentraciones inusualmente altas (o bajas) de flavanoides y antioxidantes frente al promedio de su cultivar.

  • En la Dimensión 2 (asociada a color y prolina), sobresalen los vinos 116 y 159. Visualmente, estos puntos “jalan” la gráfica hacia arriba o hacia abajo, apartándose de las elipses de confianza de su grupo, lo que sugiere niveles atípicos de intensidad de color o magnesio.

5. Integración de Resultados y Conclusiones

La articulación de la evidencia numérica y gráfica obtenida a través de este Análisis de Componentes Principales nos permite derivar conclusiones sólidas y responder a las interrogantes planteadas al inicio del estudio:

  • Reducción de dimensionalidad justificada: La matriz de correlaciones inicial demostró una alta redundancia entre las variables químicas (como la fuerte asociación entre flavanoides y fenoles totales). El modelo matemático confirmó que esta reducción geométrica es altamente efectiva: basándonos en el criterio de Kaiser (eigenvalores > 1), logramos condensar las 13 características químicas originales en tan solo 3 dimensiones principales. Estas tres nuevas dimensiones retienen la mayor cantidad de información posible, explicando en conjunto aproximadamente el 66.5% de la varianza total de los datos.

  • Caracterización química (Análisis de Variables): La integración del círculo de correlaciones y los gráficos de contribución revela que los nuevos ejes tienen identidades químicas muy marcadas. La Dimensión 1 funciona estadísticamente como un índice de compuestos fenólicos (jalada fuertemente por la excelente calidad de representación de los Flavanoides, Fenoles Totales y Proantocianinas). Por su parte, la Dimensión 2 caracteriza propiedades de madurez y pigmentación, dominada por la Intensidad de color, la Prolina y el Magnesio.

  • Clasificación de los vinos (Análisis de Individuos): La proyección final en el mapa de individuos ofrece la prueba visual más contundente del éxito del análisis. A pesar de que el modelo ACP es una técnica no supervisada (es decir, la etiqueta del cultivar nunca se introdujo en el cálculo matemático), la varianza química natural calculada fue suficiente para agrupar las botellas en tres clústeres bien delimitados[cite: 8]. Además, se lograron identificar muestras atípicas específicas que se alejan del centro de sus agrupaciones debido a concentraciones extremas[cite: 8].

— Conclusión final: —

El Análisis de Componentes Principales no solo permitió simplificar la complejidad analítica de la base de datos eliminando el ruido estadístico, sino que expuso de forma exitosa la estructura subyacente de los datos[cite: 8]. Queda demostrado que la huella fisicoquímica y multivariada de un vino es lo suficientemente robusta como para identificar y clasificar visualmente el cultivar de origen de la planta[cite: 8].

Tarea 3: ACM Pingüinos

1. Descripción de los Datos y Objetivos de Estudio

La base de datos penguins_raw contiene información de 344 pingüinos estudiados en las islas de la región de Palmer, en la Antártida. Los datos incluyen información sobre la especie, ubicación, características físicas, sexo, fecha de observación y mediciones de isótopos. En total, la base contiene 17 variables, tanto categóricas como numéricas.

— Descrpicón de Variables —

Variable Descripción
studyName Nombre del estudio en el que se recopilaron los datos.
Sample Number Número de identificación asignado a cada muestra o registro.
Species Especie del pingüino. Se encuentran tres especies: Adelie, Chinstrap y Gentoo.
Region Región geográfica donde se realizó el estudio.
Island Isla donde fue observado o capturado el pingüino. Las principales son Biscoe, Dream y Torgersen.
Stage Etapa de desarrollo del pingüino al momento de la medición.
Individual ID Identificador utilizado para distinguir a cada pingüino.
Clutch Completion Indica si la puesta de huevos estaba completa al momento de la observación.
Date Egg Fecha en la que fue puesto el huevo.
Culmen Length (mm) Longitud del pico del pingüino, medida en milímetros.
Culmen Depth (mm) Profundidad o grosor del pico, medida en milímetros.
Flipper Length (mm) Longitud de la aleta, medida en milímetros.
Body Mass (g) Peso corporal del pingüino, expresado en gramos.
Sex Sexo del pingüino, clasificado como macho o hembra.
Delta 15 N (‰) Medición del isótopo de nitrógeno-15, relacionada con la alimentación y la posición del pingüino en la cadena alimenticia.
Delta 13 C (‰) Medición del isótopo de carbono-13, relacionada principalmente con el tipo de alimentación y el ambiente.
Comments Comentarios o información adicional registrada durante la observación.

— Variables cualitativas seleccionadas para el ACM: —

  • Especie (Species) (Nominal - 3 niveles): Adelie, Chinstrap y Gentoo.
  • Isla (Island) (Nominal - 3 niveles): Biscoe, Dream y Torgersen.
  • Sexo (Sex) (Binaria - 2 niveles): MALE, FEMALE.
  • Nidada_Completa (Clutch Completion) (Binaria - 2 niveles): Observación ecológica sobre si la pareja logró completar la postura de huevos (Yes, No).

— Interrogantes —

A partir de estas variables, el análisis puede buscar responder preguntas como:

  • ¿Existe una relación entre la especie de pingüino y la isla donde se encuentra?

  • ¿Existen diferencias entre las especies según el sexo o la condición de la puesta de huevos?

  • ¿Qué categorías de las variables analizadas presentan mayor relación entre sí?

  • ¿Se pueden identificar grupos o patrones de comportamiento entre las diferentes especies?

Objetivo de estudio: Analizar las relaciones entre las principales variables categóricas mediante un Análisis de Correspondencias Múltiples (ACM) para identificar patrones, asociaciones territoriales y perfiles biológicos entre las diferentes especies de pingüinos.

2. Preparación de los Datos

Antes de realizar el ACM, revisamos la estructura de la base, identificamos los datos faltantes y filtramos las variables adecuadas.

# Cargar la base de datos
library(palmerpenguins)
data("penguins_raw")
head(penguins_raw)
## # A tibble: 6 × 17
##   studyName `Sample Number` Species          Region Island Stage `Individual ID`
##   <chr>               <dbl> <chr>            <chr>  <chr>  <chr> <chr>          
## 1 PAL0708                 1 Adelie Penguin … Anvers Torge… Adul… N1A1           
## 2 PAL0708                 2 Adelie Penguin … Anvers Torge… Adul… N1A2           
## 3 PAL0708                 3 Adelie Penguin … Anvers Torge… Adul… N2A1           
## 4 PAL0708                 4 Adelie Penguin … Anvers Torge… Adul… N2A2           
## 5 PAL0708                 5 Adelie Penguin … Anvers Torge… Adul… N3A1           
## 6 PAL0708                 6 Adelie Penguin … Anvers Torge… Adul… N3A2           
## # ℹ 10 more variables: `Clutch Completion` <chr>, `Date Egg` <date>,
## #   `Culmen Length (mm)` <dbl>, `Culmen Depth (mm)` <dbl>,
## #   `Flipper Length (mm)` <dbl>, `Body Mass (g)` <dbl>, Sex <chr>,
## #   `Delta 15 N (o/oo)` <dbl>, `Delta 13 C (o/oo)` <dbl>, Comments <chr>
# Revisión de la estructura (para conocer el número de observaciones, variables y el tipo de dato de cada una.)
dim(penguins_raw)
## [1] 344  17
str(penguins_raw)
## tibble [344 × 17] (S3: tbl_df/tbl/data.frame)
##  $ studyName          : chr [1:344] "PAL0708" "PAL0708" "PAL0708" "PAL0708" ...
##  $ Sample Number      : num [1:344] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Species            : chr [1:344] "Adelie Penguin (Pygoscelis adeliae)" "Adelie Penguin (Pygoscelis adeliae)" "Adelie Penguin (Pygoscelis adeliae)" "Adelie Penguin (Pygoscelis adeliae)" ...
##  $ Region             : chr [1:344] "Anvers" "Anvers" "Anvers" "Anvers" ...
##  $ Island             : chr [1:344] "Torgersen" "Torgersen" "Torgersen" "Torgersen" ...
##  $ Stage              : chr [1:344] "Adult, 1 Egg Stage" "Adult, 1 Egg Stage" "Adult, 1 Egg Stage" "Adult, 1 Egg Stage" ...
##  $ Individual ID      : chr [1:344] "N1A1" "N1A2" "N2A1" "N2A2" ...
##  $ Clutch Completion  : chr [1:344] "Yes" "Yes" "Yes" "Yes" ...
##  $ Date Egg           : Date[1:344], format: "2007-11-11" "2007-11-11" ...
##  $ Culmen Length (mm) : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
##  $ Culmen Depth (mm)  : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
##  $ Flipper Length (mm): num [1:344] 181 186 195 NA 193 190 181 195 193 190 ...
##  $ Body Mass (g)      : num [1:344] 3750 3800 3250 NA 3450 ...
##  $ Sex                : chr [1:344] "MALE" "FEMALE" "FEMALE" NA ...
##  $ Delta 15 N (o/oo)  : num [1:344] NA 8.95 8.37 NA 8.77 ...
##  $ Delta 13 C (o/oo)  : num [1:344] NA -24.7 -25.3 NA -25.3 ...
##  $ Comments           : chr [1:344] "Not enough blood for isotopes." NA NA "Adult not sampled." ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   studyName = col_character(),
##   ..   `Sample Number` = col_double(),
##   ..   Species = col_character(),
##   ..   Region = col_character(),
##   ..   Island = col_character(),
##   ..   Stage = col_character(),
##   ..   `Individual ID` = col_character(),
##   ..   `Clutch Completion` = col_character(),
##   ..   `Date Egg` = col_date(format = ""),
##   ..   `Culmen Length (mm)` = col_double(),
##   ..   `Culmen Depth (mm)` = col_double(),
##   ..   `Flipper Length (mm)` = col_double(),
##   ..   `Body Mass (g)` = col_double(),
##   ..   Sex = col_character(),
##   ..   `Delta 15 N (o/oo)` = col_double(),
##   ..   `Delta 13 C (o/oo)` = col_double(),
##   ..   Comments = col_character()
##   .. )
# Revisión de datos faltantes iniciales (Los valores faltantes fueron identificados para evitar que afectaran el desarrollo del ACM. Para el análisis se conservaron únicamente los registros que cuentan con información completa en las variables categóricas seleccionadas.)

colSums(is.na(penguins_raw))
##           studyName       Sample Number             Species              Region 
##                   0                   0                   0                   0 
##              Island               Stage       Individual ID   Clutch Completion 
##                   0                   0                   0                   0 
##            Date Egg  Culmen Length (mm)   Culmen Depth (mm) Flipper Length (mm) 
##                   0                   2                   2                   2 
##       Body Mass (g)                 Sex   Delta 15 N (o/oo)   Delta 13 C (o/oo) 
##                   2                  11                  14                  13 
##            Comments 
##                 290
#Los valores faltantes fueron identificados para evitar que afectaran el desarrollo del ACM. Para el análisis se conservaron únicamente los registros que cuentan con información completa en las variables categóricas seleccionadas.

# Selección de variables cualitativas para el ACM. Para realizar el ACM se seleccionaron las variables categóricas que permiten estudiar las características y relaciones entre los diferentes grupos de pingüinos.

datos_acm <- penguins_raw[, c("Species", "Island", "Sex", "Clutch Completion")]

# Conversión de variables a factores (Obligatorio para el ACM)

datos_acm[] <- lapply(datos_acm, factor)
str(datos_acm)
## tibble [344 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Species          : Factor w/ 3 levels "Adelie Penguin (Pygoscelis adeliae)",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ Sex              : Factor w/ 2 levels "FEMALE","MALE": 2 1 1 NA 1 2 1 2 NA NA ...
##  $ Clutch Completion: Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 1 1 2 2 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   studyName = col_character(),
##   ..   `Sample Number` = col_double(),
##   ..   Species = col_character(),
##   ..   Region = col_character(),
##   ..   Island = col_character(),
##   ..   Stage = col_character(),
##   ..   `Individual ID` = col_character(),
##   ..   `Clutch Completion` = col_character(),
##   ..   `Date Egg` = col_date(format = ""),
##   ..   `Culmen Length (mm)` = col_double(),
##   ..   `Culmen Depth (mm)` = col_double(),
##   ..   `Flipper Length (mm)` = col_double(),
##   ..   `Body Mass (g)` = col_double(),
##   ..   Sex = col_character(),
##   ..   `Delta 15 N (o/oo)` = col_double(),
##   ..   `Delta 13 C (o/oo)` = col_double(),
##   ..   Comments = col_character()
##   .. )
# Revisamos datos faltantes de las variables que ocupamos y los eliminamos
colSums(is.na(datos_acm))
##           Species            Island               Sex Clutch Completion 
##                 0                 0                11                 0
datos_acm_n <- na.omit(datos_acm)
colSums(is.na(datos_acm_n))
##           Species            Island               Sex Clutch Completion 
##                 0                 0                 0                 0
# Dimensión final de la base limpia
dim(datos_acm_n)
## [1] 333   4

Eliminamos los datos faltantes y nos quedamos con una muestra final de 333 observaciones.

3. Justificación del ACM y Contraste de Variables

Para justificar la aplicación del ACM, evaluamos la independencia de nuestras variables categóricas.

  • H0 General: Todas las variables cualitativas son completamente independientes entre sí.

  • H1 General: Existe asociación o dependencia entre al menos un par de variables.

Para rechazar la hipótesis nula, contrastaremos visualmente dos pares de variables mediante gráficos de frecuencias observadas.

A) Especie vs. Isla de Anidación

\(H_0\): La especie del pingüino es independiente de la isla.

\(H_1\): La especie del pingüino depende de la isla en la que habita.

— A) Especie vs. Isla de Anidación —

library(ggplot2)
ggplot(data = datos_acm_n) +
  geom_count(mapping = aes(x = Species, y = Island)) +
  labs(title = "Relación entre Especie e Isla de Anidación", x = "Especie", y = "Isla") +
  theme_minimal()

Al observar el tamaño de los puntos, es evidente que las especies no se distribuyen de forma equitativa. Algunas especies solo se registraron en islas específicas (ej. Gentoo en Biscoe). Esta clara asociación visual rechaza la hipótesis nula y justifica el uso del ACM.

— B) Especie vs. Postura de Huevos —

\(H_0\): El éxito en completar la nidada es independiente de la especie.

\(H_1\): Existe asociación entre la especie y la probabilidad de completar la nidada

ggplot(data = datos_acm_n) +
  geom_count(mapping = aes(x = Species, y = `Clutch Completion`)) +
  labs(title = "Relación entre Especie y Postura de Huevos Completa", x = "Especie", y = "Nidada Completa") +
  theme_minimal()

La variación en el tamaño de los puntos evidencia múltiples patrones de asociación entre las categorías. Al rechazar la independencia general, se justifica mapear la red completa de relaciones cualitativas.

4. Gráfico de Sedimentación: Eigenvalores y Varianza Retenida

Una vez demostrada la asociación entre nuestras variables, procedemos a calcular el Análisis de Correspondencias Múltiples (ACM). El objetivo en esta etapa es determinar cuántas dimensiones matemáticas son necesarias para explicar la mayor cantidad de información (varianza) de los pingüinos, perdiendo la menor cantidad de datos posible.

# Cargar Librerías necesarias
library(FactoMineR)
library(factoextra)

# 1. Ejecutar el Análisis de Correspondencias Múltiples (ACM)
res.mca <- MCA(datos_acm_n, ncp=5, graph=FALSE)
summary(res.mca, nb.dec = 3, ncp=2)
## 
## Call:
## MCA(X = datos_acm_n, ncp = 5, graph = FALSE) 
## 
## 
## Eigenvalues
##                       Dim.1  Dim.2  Dim.3  Dim.4  Dim.5
## Variance              0.466  0.361  0.251  0.241  0.133
## % of var.            31.089 24.087 16.709 16.073  8.883
## Cumulative % of var. 31.089 55.177 71.885 87.958 96.842
## 
## Individuals (the 10 first)
##                                             Dim.1   ctr  cos2   Dim.2   ctr
## 1                                         | 0.206 0.027 0.020 | 1.234 1.265
## 2                                         | 0.223 0.032 0.023 | 1.259 1.318
## 3                                         | 0.223 0.032 0.023 | 1.259 1.318
## 4                                         | 0.223 0.032 0.023 | 1.259 1.318
## 5                                         | 0.206 0.027 0.020 | 1.234 1.265
## 6                                         | 0.623 0.250 0.092 | 1.231 1.260
## 7                                         | 0.605 0.236 0.087 | 1.206 1.208
## 8                                         | 0.223 0.032 0.023 | 1.259 1.318
## 9                                         | 0.206 0.027 0.020 | 1.234 1.265
## 10                                        | 0.206 0.027 0.020 | 1.234 1.265
##                                            cos2  
## 1                                         0.719 |
## 2                                         0.746 |
## 3                                         0.746 |
## 4                                         0.746 |
## 5                                         0.719 |
## 6                                         0.359 |
## 7                                         0.345 |
## 8                                         0.746 |
## 9                                         0.719 |
## 10                                        0.719 |
## 
## Categories
##                                               Dim.1     ctr    cos2  v.test  
## Adelie Penguin (Pygoscelis adeliae)       |   0.286   1.929   0.064   4.613 |
## Chinstrap penguin (Pygoscelis antarctica) |   1.369  20.524   0.481  12.638 |
## Gentoo penguin (Pygoscelis papua)         |  -1.134  24.632   0.715 -15.407 |
## Biscoe                                    |  -0.930  22.715   0.830 -16.600 |
## Dream                                     |   1.075  22.874   0.677  14.988 |
## Torgersen                                 |   0.414   1.297   0.028   3.058 |
## FEMALE                                    |   0.024   0.016   0.001   0.441 |
## MALE                                      |  -0.024   0.016   0.001  -0.441 |
## No                                        |   0.976   5.367   0.112   6.094 |
## Yes                                       |  -0.115   0.630   0.112  -6.094 |
##                                             Dim.2     ctr    cos2  v.test  
## Adelie Penguin (Pygoscelis adeliae)         0.923  25.871   0.666  14.868 |
## Chinstrap penguin (Pygoscelis antarctica)  -1.149  18.639   0.339 -10.601 |
## Gentoo penguin (Pygoscelis papua)          -0.477   5.618   0.126  -6.477 |
## Biscoe                                     -0.215   1.563   0.044  -3.833 |
## Dream                                      -0.505   6.515   0.149  -7.040 |
## Torgersen                                   2.066  41.699   0.702  15.263 |
## FEMALE                                      0.031   0.033   0.001   0.560 |
## MALE                                       -0.030   0.032   0.001  -0.560 |
## No                                         -0.060   0.026   0.000  -0.376 |
## Yes                                         0.007   0.003   0.000   0.376 |
## 
## Categorical variables (eta2)
##                                             Dim.1 Dim.2  
## Species                                   | 0.878 0.724 |
## Island                                    | 0.875 0.719 |
## Sex                                       | 0.001 0.001 |
## Clutch Completion                         | 0.112 0.000 |
# 2. Resultados Numéricos: Eigenvalores, % de varianza y varianza acumulada
print("--- EIGENVALORES Y VARIANZA ---")
## [1] "--- EIGENVALORES Y VARIANZA ---"
eig.val <- get_eigenvalue(res.mca)
head(eig.val)
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  0.4663418        31.089453                    31.08945
## Dim.2  0.3613084        24.087227                    55.17668
## Dim.3  0.2506308        16.708720                    71.88540
## Dim.4  0.2410952        16.073016                    87.95842
## Dim.5  0.1332477         8.883177                    96.84159
# 3. Resultado Gráfico: Gráfico de Sedimentación
fviz_screeplot(res.mca, addlabels = TRUE,
               title = "Gráfico de Sedimentación - Varianza Explicada por Dimensión")

Al evaluar los resultados numéricos y el gráfico de sedimentación:

  • Varianza Explicada: La Dimensión 1 es la más importante, explicando el 31.1% de la varianza total. Le sigue la Dimensión 2 con un 24.1%.

  • Varianza Acumulada: En conjunto, logramos retener aproximadamente el 55.2% de la información estructural.

  • Justificación de retención: Para decidir cuántas dimensiones conservar, utilizamos el criterio visual del codo (Elbow method) en el gráfico de sedimentación. En el gráfico se puede observar que después de la segunda dimensión hay una caída más marcada y, a partir de ahí, las siguientes dimensiones aportan muy poco. Por esta razón, se decidió conservar únicamente las primeras 2 dimensiones, ya que son las que contienen la mayor parte de la información relevante y permiten realizar el análisis de las categorías e individuos en un plano de dos dimensiones.

5. Análisis de Variables: Categorías, Contribución y Calidad (Cos2)

Evaluamos cómo las categorías se asocian entre sí y cuáles construyen los ejes matemáticos.

— Gráfico de elipses de confianza —

# 1. Gráfico de Elipses de Confianza
plotellipses(res.mca)

  • Especie e Isla: Sus elipses están muy separadas y no se enciman. Tienen un alto poder para clasificar los datos, ya que cada especie y cada isla tienen un perfil biológico muy distinto.

  • Sexo: Las elipses de machos y hembras están prácticamente mezcladas y ancladas en el centro del gráfico (coordenadas 0,0). Esto indica que el sexo no influye en la forma en que se agrupan en este modelo.

  • Asociaciones Ecológicas: La especie Gentoo se asocia casi exclusivamente con la isla Biscoe (izquierda). La especie Chinstrap está ligada a Dream (derecha). La especie Adelie domina el cuadrante superior asociándose con Torgersen.

— Mapa de Categorías con Calidad de Representación (Cos2) —

# 2. Mapa de Categorías con Calidad de Representación (Cos2)
fviz_mca_var(res.mca,
             col.var = "cos2",
             gradient.cols = c("blue2", "green", "red"),
             repel = TRUE,
             ggtheme = theme_minimal()) +
  labs(title = "Nube de Puntos de Categorías (Cos2)")

  • Las estrellas del modelo (Rojos/Naranjas): Categorías como Gentoo, Chinstrap, y las islas brillan con un Cos2 superior a 0.6. El modelo explica casi a la perfección a estos grupos.

  • Las variables menos representativas (Azules): Las etiquetas de sexo y éxito de nidada se aglomeran en el centro con un Cos2 menor a 0.2, confirmando que este plano no captura su variabilidad y no son clave para diferenciar a la población.

— Contribución de las categorías a las Dimensiones 1 y 2 —

# 3. Contribución de las categorías a las Dimensiones 1 y 2
fviz_contrib(res.mca, choice = "var", axes = c(1,2), repel = TRUE) +
  labs(title = "Contribución de Categorías (Dim 1 y 2)")

# 4. Resultados Numéricos: Top 5 categorías con mayor contribución
print("--- TOP 5 CATEGORÍAS CON MAYOR CONTRIBUCIÓN (DIM 1) ---")
## [1] "--- TOP 5 CATEGORÍAS CON MAYOR CONTRIBUCIÓN (DIM 1) ---"
head(sort(res.mca$var$contrib[, 1], decreasing = TRUE), 5)
##         Gentoo penguin (Pygoscelis papua) 
##                                 24.632481 
##                                     Dream 
##                                 22.873923 
##                                    Biscoe 
##                                 22.715208 
## Chinstrap penguin (Pygoscelis antarctica) 
##                                 20.524307 
##                                        No 
##                                  5.366648
print("--- TOP 5 CATEGORÍAS CON MAYOR CONTRIBUCIÓN (DIM 2) ---")
## [1] "--- TOP 5 CATEGORÍAS CON MAYOR CONTRIBUCIÓN (DIM 2) ---"
head(sort(res.mca$var$contrib[, 2], decreasing = TRUE), 5)
##                                 Torgersen 
##                                 41.699222 
##       Adelie Penguin (Pygoscelis adeliae) 
##                                 25.870679 
## Chinstrap penguin (Pygoscelis antarctica) 
##                                 18.639063 
##                                     Dream 
##                                  6.514537 
##         Gentoo penguin (Pygoscelis papua) 
##                                  5.618322

La línea roja punteada marca el umbral esperado (10%).

  • Dimensión 1: Definida casi por completo por el contraste entre Gentoo (24.63%) / Biscoe (22.71%) frente a Chinstrap (20.52%) / Dream (22.87%). Estas cuatro dominan el eje horizontal.

  • Dimensión 2: Tiene un protagonista absoluto: la isla Torgersen (41.69%), acompañada por la especie Adelie (25.87%).

  • El sexo y la nidada se quedan muy por debajo del umbral, siendo factores irrelevantes para la estructura.

6. Análisis de Individuos: Agrupaciones y Observaciones

Proyectamos a los pingüinos sobre el plano bidimensional para identificar patrones ecológicos y “clones” estadísticos.

# 1. Mapa de Individuos (Pingüinos)
# Nota: Apagamos las etiquetas (label = "none") porque 333 nombres saturarían la gráfica.
fviz_mca_ind(res.mca,
             label = "none",
             alpha.ind = 0.7,
             ggtheme = theme_minimal()) +
  labs(title = "Nube de Puntos de Individuos (Pingüinos)")

fviz_mca_ind(res.mca,
             label = "none",
             habillage = "Species",
             addEllipses = TRUE,
             alpha.ind = 0.7,
             ggtheme = theme_minimal()) +
  labs(title = "Nube de Puntos de Individuos (Pingüinos)")

fviz_mca_ind(res.mca,
             label = "none",
             habillage = "Island",
             addEllipses = TRUE,
             alpha.ind = 0.7,
             ggtheme = theme_minimal()) +
  labs(title = "Nube de Puntos de Individuos (Pingüinos)")

Al mapear a los 333 pingüinos, descubrimos fronteras biológicas inquebrantables. No existe una mezcla aleatoria, sino una segregación territorial muy estricta, corroborando la dominancia de las variables de especie e isla en la agrupación geométrica.

# 2. Contribución de los Individuos a las Dimensiones 1 y 2
# Solo mostramos el top 20 para no saturar la gráfica de barras
fviz_contrib(res.mca, choice = "ind", axes = c(1,2), top = 20) +
  labs(title = "Top 20 Pingüinos con Mayor Contribución (Dim 1 y 2)")

# 3. Calidad de Representación (Cos2) del top 20 de individuos
fviz_cos2(res.mca, choice = "ind", axes = c(1,2), top = 20) +
  labs(title = "Top 20 Pingüinos con Mejor Calidad de Representación (Cos2)")

# 4. Resultados Numéricos: Top 5 pingüinos más extremos (Dim 1 y Dim 2)
print("--- TOP 5 PINGÜINOS ATÍPICOS (MAYOR CONTRIBUCIÓN DIM 1) ---")
## [1] "--- TOP 5 PINGÜINOS ATÍPICOS (MAYOR CONTRIBUCIÓN DIM 1) ---"
head(sort(res.mca$ind$contrib[, 1], decreasing = TRUE), 5)
##      266      283      288      290      292 
## 1.023876 1.023876 1.023876 1.023876 1.023876
print("--- TOP 5 PINGÜINOS ATÍPICOS (MAYOR CONTRIBUCIÓN DIM 2) ---")
## [1] "--- TOP 5 PINGÜINOS ATÍPICOS (MAYOR CONTRIBUCIÓN DIM 2) ---"
head(sort(res.mca$ind$contrib[, 2], decreasing = TRUE), 5)
##        2        8       11       12       14 
## 1.318151 1.318151 1.318151 1.318151 1.318151

Identidad de los Casos Extremos (Clones Ecológicos):

Los números confirman que en lugar de encontrar a un solo individuo “raro”, encontramos bloques de pingüinos que son exactamente iguales entre sí en la base de datos.

  • Dimensión 1: Los individuos 266, 283, 288, 290 y 292 aportan exactamente el mismo número (1.02%). Comparten la misma especie, isla y éxito de nidada.

  • Dimensión 2: Ocurre lo mismo con los pingüinos 2, 8, 11, 12 y 14, empatados con una contribución del 1.31%.

  • Al tener un Cos2 idéntico cercano a 0.8, sabemos que el modelo los dibuja a todos con el mismo nivel exacto de precisión.

7. Conclusión General: ¿Qué nos dicen realmente los datos?

Para cerrar este análisis, unimos todo lo que nos mostraron los mapas y los porcentajes para responder a la pregunta central: ¿Qué es lo que realmente separa y agrupa a los pingüinos en este archipiélago?

De forma muy directa y visual, descubrimos tres cosas clave:

  • La Especie y la Isla lo son todo: Las gráficas confirmaron que estas dos características son los verdaderos pilares del ecosistema. Tienen tanta fuerza estadística que, con solo saber de qué especie es un pingüino y dónde vive, ya conocemos prácticamente todo su perfil.

  • El sexo no marca diferencias: Contrario a lo que se podría suponer, ser macho o hembra no afecta en absoluto cómo se organizan estas aves. Los porcentajes de contribución del modelo ignoraron el sexo casi por completo, demostrando que no es un factor útil para clasificar a la población.

  • Sociedades de “clones” ecológicos: Al graficar a los pingüinos uno por uno, no vimos una mezcla desordenada, sino “bloques” súper compactos y separados entre sí. Esto significa que los pingüinos que comparten especie e isla (por ejemplo, los Gentoo exclusivos de la isla Biscoe) tienen características tan idénticas que el modelo matemático los ve como si fueran el mismo individuo repetido.

En resumen: Este ecosistema no es una mezcla al azar. Nuestro análisis prueba que las fronteras naturales y territoriales son sumamente estrictas. La vida de estas aves está dictada por su origen geográfico y su especie, dejando clarísimo que en esta región importa muchísimo más a qué grupo perteneces que tus rasgos individuales.

Información Adicional

Metodología del Análisis

Paso 1: Exploración y Limpieza de la Base (La Radiografía)

El objetivo de este paso es conocer con qué material vas a trabajar y evitar que errores técnicos arruinen el modelo matemático.

  1. Revisión de Estructura: Usa herramientas como str() o summary() para ver cuántas filas (individuos) y columnas (variables) tienes.
  2. Tratamiento de Datos Faltantes: Los modelos geométricos no toleran huecos. Localiza valores nulos y limpia la base (ej. usando na.omit()).
  3. Corrección de Tipos de Datos (Crítico): Asegúrate de que las variables de texto, categorías o grupos (incluso si están escritas con números como 1, 2, 3) estén forzosamente definidas como Factor. Deja como numéricas únicamente las que representan cantidades medibles.

Paso 2: Análisis Univariado y Detección de Escalas

Aquí buscas entender el comportamiento individual de cada variable antes de mezclarlas.

  1. Medidas de Tendencia Central: Compara la media y la mediana para detectar sesgos o distribuciones anormales.
  2. Identificación de Atípicos: Revisa si existen individuos con valores extremos que puedan jalar o distorsionar los ejes más adelante.
  3. Evaluación de Magnitudes: Revisa los promedios máximos y mínimos. Si una variable se mide en miles y otra en decimales, es obligatorio estandarizar los datos numéricos en el paso de ejecución.

Paso 3: Comprobación de Relaciones (La Justificación)

El análisis multivariado solo tiene sentido si las variables “hablan” entre sí. Si todas son completamente independientes, el modelo fracasará.

  1. Ruta Numérica (ACP): Genera una matriz de correlación (corrplot). Debes detectar multicolinealidad: variables fuertemente asociadas (positiva o negativamente) que indiquen información redundante que pueda ser comprimida.
  2. Ruta Categórica (ACM): Genera gráficos de asociación visual (ej. conteo de frecuencias cruzadas). Debes observar que las categorías no se distribuyen al azar, sino que muestran dependencias lógicas.

Paso 4: Ejecución y Retención de Dimensiones

Es el momento de correr el algoritmo y decidir cuánta información vas a conservar.

  1. Selección del Algoritmo:
    • Aplica ACP exclusivamente a tu subconjunto de variables numéricas.
    • Aplica ACM exclusivamente a tu subconjunto de variables categóricas (factores).
  2. Cálculo de Varianza: Extrae los eigenvalores y revisa el gráfico de sedimentación para ver cuánta inercia (información) explica cada nueva dimensión.
  3. El Criterio de Kaiser: Retén como dimensiones principales únicamente aquellas cuyo eigenvalor sea mayor a 1 (λ>1). La suma de sus porcentajes será tu varianza retenida total.

Paso 5: Análisis de Variables (El “Qué”)

El objetivo es darle un significado real (biológico, químico, económico) a las nuevas dimensiones abstractas creadas por el modelo.

  1. Calidad de Representación (cos2): Identifica qué variables están perfectamente dibujadas en el mapa (barras altas). Ignora las que tienen un cos2 bajo, pues su perspectiva está distorsionada.
  2. Contribución (%): Observa qué variables superan la línea roja de contribución promedio. Estas son los “pilares” que construyen y estiran las dimensiones.
  3. Interpretación Geométrica:
    • En ACP, lee el Círculo de Correlaciones: vectores largos, juntos o en oposición te dirán qué características dominan cada cuadrante.
    • En ACM, lee el Mapa de Categorías: las opciones que caen en el centro (0,0) no aportan nada; las que se alejan hacia los extremos marcan los perfiles de la población.

Paso 6: Análisis de Individuos (El “Quién”)

Aquí proyectas a las muestras físicas sobre el mapa construido en el paso anterior para buscar clasificaciones naturales.

  1. Agrupación y Elipses: Grafica a los individuos coloreándolos por tu variable cualitativa principal. Si las elipses se separan claramente, el modelo logró clasificar a la población con éxito basándose solo en su varianza. Si se enciman por completo, esa variable no define a los grupos.
  2. Detección de Atípicos (Extremos): Revisa el Top de individuos con mayor contribución. Estos son los sujetos con características extremas que dominan los bordes del mapa.
  3. Clones o Patrones Repetidos: Si ves varios individuos aportando exactamente el mismo porcentaje a una dimensión, significa que comparten un “código biológico” o perfil idéntico.

Paso 7: Integración de Resultados (Conclusión)

Cruza la información del Paso 5 y el Paso 6 para redactar el cierre.

  1. Menciona qué dimensión representa qué conjunto de características.
  2. Indica si la base de datos tiene fronteras estructuradas (los individuos se separan en grupos claros dictados por las variables de mayor contribución) o si es un ecosistema aleatorio.
  3. Responde directamente a tus preguntas de investigación iniciales basándote en la evidencia matemática y visual obtenida.

Glosario de Conceptos

  • Reducción de Dimensionalidad: Es el proceso matemático de resumir una base de datos con decenas de variables en unas cuantas “dimensiones” nuevas, perdiendo la menor cantidad de información (varianza) posible en el camino.
  • Varianza / Inercia: Representa la cantidad total de información, diversidad o “movimiento” que tiene tu base de datos. Tu meta siempre es retener el mayor porcentaje de varianza acumulada en las primeras dos o tres dimensiones.
  • Eigenvalores (Autovalores): Es el número que te dice cuánta varianza explica cada nueva dimensión creada por el algoritmo.
  • Criterio de Kaiser: Es la regla estricta para saber cuántas dimensiones conservar en un ACP. Solo debes retener aquellas dimensiones cuyo eigenvalor sea mayor a 1 (λ>1). Si es menor a 1, significa que esa dimensión aporta menos información que una sola de tus variables originales aisladas.
  • Multicolinealidad (Redundancia): Ocurre cuando dos o más variables están fuertemente correlacionadas y básicamente te están contando la misma historia (como ocurría con los Flavanoides y los Fenoles en los vinos). Es la justificación principal para aplicar un ACP, ya que el algoritmo fusionará estas variables redundantes en un solo eje.
  • Calidad de Representación (cos2): Es una métrica (del 0 al 1) que indica qué tan bien dibujado está un punto (individuo o categoría) en el mapa 2D. Si el valor es cercano a 1 (barras altas), significa que el mapa bidimensional retrata su perfil casi a la perfección. Puntos con un cos2 bajo no deben interpretarse visualmente porque están distorsionados por la perspectiva.
  • Contribución (%): Responde a la pregunta: ¿Quién construyó este eje? Indica qué porcentaje aportó una variable o un individuo para “estirar” el mapa matemático. Si una barra supera la línea roja punteada (el umbral promedio), significa que esa variable o individuo es determinante para el modelo.

ACP vs ACM

Nota: Tu primera decisión en el examen al ver una base de datos será elegir qué algoritmo usar. La regla es absoluta y depende del tipo de datos:

1. Análisis de Componentes Principales (ACP / PCA):

  • ¿Para qué datos? Exclusivo para variables numéricas y continuas (química, medidas, pesos, temperaturas, dinero).
  • ¿Qué mide? Correlaciones lineales entre variables.
  • Ejemplo: Tu base de datos de vinos, donde medías concentraciones exactas de magnesio, alcohol y prolina.

2. Análisis de Correspondencias Múltiples (ACM / MCA):

  • ¿Para qué datos? Exclusivo para variables categóricas cualitativas (etiquetas, grupos, nominales, binarias).
  • ¿Qué mide? Frecuencias, perfiles biológicos y asociación entre categorías.
  • Ejemplo: Tu base de pingüinos, donde analizabas texto: la especie, el nombre de la isla y si era macho o hembra.

Reglas de Oro (Checklist)

1. La Conversión Obligatoria a Factor (El error más común): Antes de cualquier análisis, debes asegurarte de que las variables cualitativas estén definidas como “Factor” en R (as.factor()). Incluso si una categoría está escrita con números (ej. Cultivar 1, 2 y 3), si la dejas como numérica, R intentará promediarla o sumarla, arruinando el análisis.

2. La Estandarización Innegociable (Solo en ACP): Si tus variables numéricas están en escalas distintas (ej. una se mide en miles y otra en decimales de 0.2), debes estandarizar usando scale.unit = TRUE dentro de la función de FactoMineR o scale(). Si omites esto, la variable con números más grandes dominará artificialmente todo el modelo.

3. Tolerancia Cero a los NAs: Los algoritmos geométricos (ACP y ACM) no pueden calcular distancias si hay datos vacíos. Siempre debes limpiar la base con na.omit() o imputar los datos antes de ejecutar el modelo.

4. Lectura del Círculo de Correlaciones (ACP): * Vectores muy juntos (mismo cuadrante): Variables fuertemente correlacionadas positivamente. * Vectores en ángulo de 90°: Variables totalmente independientes (no tienen nada que ver una con la otra). * Vectores apuntando a lados opuestos (180°): Variables con correlación negativa (si una sube, la otra baja).

5. Interpretación de Elipses y Origen (0,0): * Elipses separadas: Indican que esa variable tiene un enorme poder de clasificación; las poblaciones son claramente distintas (como los cultivares de vino o las especies de pingüinos). * Elipses encimadas en el centro (origen 0,0): Representan el “promedio”. Si una categoría está en el origen, significa que no aporta diferencias y no sirve para clasificar a la población.