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.
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.
# 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>
# 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.
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.
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
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")
| 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).
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.
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?
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: —
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.
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.
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].
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: —
— 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.
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.
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.
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.
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.
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.
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.
El objetivo de este paso es conocer con qué material vas a trabajar y evitar que errores técnicos arruinen el modelo matemático.
str() o summary() para ver cuántas filas
(individuos) y columnas (variables) tienes.na.omit()).Aquí buscas entender el comportamiento individual de cada variable antes de mezclarlas.
El análisis multivariado solo tiene sentido si las variables “hablan” entre sí. Si todas son completamente independientes, el modelo fracasará.
corrplot). Debes detectar multicolinealidad:
variables fuertemente asociadas (positiva o negativamente) que indiquen
información redundante que pueda ser comprimida.Es el momento de correr el algoritmo y decidir cuánta información vas a conservar.
El objetivo es darle un significado real (biológico, químico, económico) a las nuevas dimensiones abstractas creadas por el modelo.
Aquí proyectas a las muestras físicas sobre el mapa construido en el paso anterior para buscar clasificaciones naturales.
Cruza la información del Paso 5 y el Paso 6 para redactar el cierre.
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. 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.