Introducción
El objetivo de este estudio es analizar los patrones de consumo de diferentes categorías alimentarias en 25 países europeos mediante técnicas de estadística multivariada. En particular, se empleará el Análisis de Componentes Principales (PCA) para identificar estructuras subyacentes, relaciones entre variables y agrupamientos entre países.
Carga y preparación de datos
setwd("C:/Users/HECTOR HERNANDEZ/Documents/BackUp Dell 8Oct21/Del 2026/Ejercicios para PUBLICAR")
data <- read.csv("PCA_Protein_Consumption.csv")
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds FruitsVeg
## Albania 10 1 1 9 0 42 1 6 2
## Austria 9 14 4 20 2 28 4 1 4
## Belgium 14 9 4 18 5 27 6 2 4
## Bulgaria 8 6 2 8 1 57 1 4 4
## Czechoslovakia 10 11 3 13 2 34 5 1 4
## Denmark 11 11 4 25 10 22 5 1 2
## E.Germany 8 12 4 11 5 25 7 1 4
## Finland 10 5 3 34 6 26 5 1 1
## France 18 10 3 20 6 28 5 2 7
## Greece 10 3 3 18 6 42 2 8 7
## Hungary 5 12 3 10 0 40 4 5 4
## Ireland 14 10 5 26 2 24 6 2 3
## Italy 9 5 3 14 3 37 2 4 7
## Netherlands 10 14 4 23 3 22 4 2 4
## Norway 9 5 3 23 10 23 5 2 3
## Poland 7 10 3 19 3 36 6 2 7
## Portugal 6 4 1 5 14 27 6 5 8
## Romania 6 6 2 11 1 50 3 5 3
## Spain 7 3 3 9 7 29 6 6 7
## Sweden 10 8 4 25 8 20 4 1 2
## Switzerland 13 10 3 24 2 26 3 2 5
## UK 17 6 5 21 4 24 5 3 3
## USSR 9 5 2 17 3 44 6 3 3
## W.Germany 11 13 4 19 3 19 5 2 4
## Yugoslavia 4 5 1 10 1 56 3 6 3
Fuente: Weber (1973), presentado por Manly en Multivariate Statistical Methods: A Primer. Los valores representan el consumo promedio diario de proteína per cápita (g/persona/día). Yugoslavia y Checoslovaquia corresponden a entidades geopolíticas históricas incluidas en la base de datos original.
Analisis Exploratorio
Perfil alimenticio
Cambiar Formato Base de Datos
# Convertir a Formato Largo
pais <- rep(
rownames(datos_pca),
times = ncol(datos_pca)
)
categoria <- rep(
names(datos_pca),
each = nrow(datos_pca)
)
consumo <- c(as.matrix(datos_pca))
data_long <- data.frame(
pais,
categoria,
consumo
)
Gráficos de Barras Perfil alimenticio
Boxplot Consumo de Proteína por Categoria
geom_boxplot() paquete ggplot2 # Visualización de la distribución (mediana , cuartiles) y valores atípicos
colores <- c(
"firebrick",
"sandybrown",
"gold",
"lightblue",
"steelblue",
"darkolivegreen3",
"tan",
"turquoise3",
"forestgreen"
)
ggplot(data_long,aes(x=categoria,y=consumo,fill=categoria))+
geom_boxplot(fill=colores)+
labs(
title = "Boxplot Consumo de Proteina",
x="Fuente de Proteína",
y="Consumo(gramos/persona/día)")+
scale_y_continuous(breaks=seq(1,60,2.5))+
stat_summary(
fun=median,
geom = "text",
aes(label = round(after_stat(y),2)), #toma el valor
position = position_nudge(x=0.5),
size = 2)+
theme_bw()+
theme(
plot.title = element_text(hjust = 0.5)
)
Estadística descriptiva
A continuación se presenta un resumen descriptivo de las variables analizadas.
summary() # Estadísticos descriptivos básicos de R
describe () # Estadísticos descriptivos ampliados (paquete psych)
#library(DT)
datatable(
round(sapply(datos_pca,summary),2),
caption = "Estadísticos descriptivos de consumo alimenticio"
)
datatable(
round(describe(datos_pca),2),
caption = "Estadísticos descriptivos de consumo alimenticio")
Media por País (renglones) y por Categoría alimenticia (columnas)
round(rowMeans(datos_pca),2)
## Albania Austria Belgium Bulgaria Czechoslovakia
## 8.00 9.56 9.89 10.11 9.22
## Denmark E.Germany Finland France Greece
## 10.11 8.56 10.11 11.00 11.00
## Hungary Ireland Italy Netherlands Norway
## 9.22 10.22 9.33 9.56 9.22
## Poland Portugal Romania Spain Sweden
## 10.33 8.44 9.67 8.56 9.11
## Switzerland UK USSR W.Germany Yugoslavia
## 9.78 9.78 10.22 8.89 9.89
round(colMeans(datos_pca),2)
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds
## 9.80 7.92 3.08 17.28 4.28 32.32 4.36 3.08
## FruitsVeg
## 4.20
#library(corrplot)
par("mar")
## [1] 5.1 4.1 4.1 2.1
par("xpd")
## [1] FALSE
corr_matrix <- round(cor(datos_pca),2)
print(corr_matrix)
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds FruitsVeg
## RMeat 1.00 0.19 0.58 0.54 0.06 -0.51 0.15 -0.41 -0.06
## WMeat 0.19 1.00 0.60 0.30 -0.20 -0.44 0.33 -0.67 -0.07
## Eggs 0.58 0.60 1.00 0.61 0.05 -0.70 0.41 -0.60 -0.16
## Milk 0.54 0.30 0.61 1.00 0.16 -0.59 0.21 -0.62 -0.40
## Fish 0.06 -0.20 0.05 0.16 1.00 -0.52 0.44 -0.12 0.23
## Cereals -0.51 -0.44 -0.70 -0.59 -0.52 1.00 -0.58 0.64 0.04
## Starch 0.15 0.33 0.41 0.21 0.44 -0.58 1.00 -0.50 0.07
## Seeds -0.41 -0.67 -0.60 -0.62 -0.12 0.64 -0.50 1.00 0.35
## FruitsVeg -0.06 -0.07 -0.16 -0.40 0.23 0.04 0.07 0.35 1.00
corrplot(
corr_matrix,
method = "circle",
order = "hclust",
type = "lower",
tl.srt = 45,
tl.col = "black",
tl.cex = 0.9,
tl.pos = "ld",
col= colores2
)
mtext("Matriz de Correlaciones",side = 3, line=3)
Matriz de correlaciones La matriz de correlaciones permite identificar relaciones entre las categorías alimenticias. Existen relaciones altas entre las categorías lo cual justifica realizar el PCA, Se observan grupos alimenticios con correlaciones positivas como carnes rojas con Huevo y Leche, Hay correlaciones negativas, altas como carnes rojas con cereales o carnes blancas con semillas, en estos casos de correlaciones negativas es un indicador de que el consumo de unos alimentos se asocia con un consumo menor de otros. Algunas correlaciones son cercanas a cero, en este casos son alimentos cuyo consumo es independiente. Las correlaciones parecen adecuadas para el estudio, se confirmará mediante las pruebas de supuestos del modelo PCA
Heatmap
El mapa de calor permite identificar patrones de consumo similares entre países y categorías alimenticias. La comparación por categorías (columnas) compara como esta un país respecto al promedio de los otros países. se utilizan datos estandarizados
función pheatmap() del paquete pheatmap.
pheatmap(as.matrix(datos_pca),
color = colores2,
scale = "column",
main = " Heat Map Consumo de Proteinas por país (columna)")
# Construcción Tabla Estandarizada
options(width=200)
datos_col <- scale(datos_pca)
datatable(round(as.data.frame(datos_col),3),
caption = "Datos Estandarizados para Heat Map")
Supuestos del Modelo PCA
det(corr_matrix)
## [1] 0.003873461
det > 0.00001 , indica la existencia de correlaciones
cortest.bartlett(corr_matrix,
n = nrow(datos_pca))
## $chisq
## [1] 111.9977
##
## $p.value
## [1] 1.001365e-09
##
## $df
## [1] 36
p-value < .05 Las variables están correlacionadas.
KMO(datos_pca)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = datos_pca)
## Overall MSA = 0.68
## MSA for each item =
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds FruitsVeg
## 0.66 0.53 0.77 0.81 0.41 0.78 0.77 0.69 0.39
KMO =0.68 > 0.60 .La estructura es buena para reducir dimensiones.
función: prcomp()
pca <- prcomp(datos_pca,
scale. = TRUE)
names(pca)
## [1] "sdev" "rotation" "center" "scale" "x"
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9
## Standard deviation 2.0237 1.2747 1.0418 0.9513 0.65325 0.58902 0.51916 0.36677 0.33391
## Proportion of Variance 0.4551 0.1805 0.1206 0.1006 0.04742 0.03855 0.02995 0.01495 0.01239
## Cumulative Proportion 0.4551 0.6356 0.7562 0.8568 0.90417 0.94272 0.97266 0.98761 1.00000
#pca$sdev
#pca$sdev^2 #varianzas
#pca$rotation #cargas factoriales (eigenvectores)
#pca$x # Scores ,Coordenadas de los países
#pca$center
#pca$scale
print(round((pca$sdev^2),3))
## [1] 4.096 1.625 1.085 0.905 0.427 0.347 0.270 0.135 0.111
print(round(pca$rotation[,1:4],3))
## PC1 PC2 PC3 PC4
## RMeat -0.311 -0.070 -0.355 -0.597
## WMeat -0.316 -0.215 0.628 -0.040
## Eggs -0.421 -0.100 0.081 -0.255
## Milk -0.379 -0.169 -0.404 0.032
## Fish -0.134 0.652 -0.300 0.235
## Cereals 0.430 -0.254 0.068 0.020
## Starch -0.296 0.389 0.281 0.305
## Seeds 0.422 0.129 -0.140 -0.251
## FruitsVeg 0.122 0.504 0.340 -0.604
print(round(pca$x[,1:4],3))
## PC1 PC2 PC3 PC4
## Albania 3.406 -1.432 -1.597 -0.084
## Austria -1.396 -1.078 1.235 -0.029
## Belgium -1.627 0.274 -0.009 -0.416
## Bulgaria 3.100 -1.503 0.082 -0.307
## Czechoslovakia -0.428 -0.574 1.159 0.220
## Denmark -2.442 0.283 -0.677 1.020
## E.Germany -1.425 0.608 1.747 0.877
## Finland -1.701 -0.583 -1.973 1.581
## France -1.435 0.896 -0.162 -1.951
## Greece 2.329 0.865 -1.227 -1.757
## Hungary 1.430 -0.951 1.783 0.266
## Ireland -2.581 -0.820 -0.162 -0.513
## Italy 1.550 0.162 -0.053 -1.336
## Netherlands -1.712 -0.780 0.766 -0.259
## Norway -0.957 1.109 -1.320 1.216
## Poland -0.129 0.632 1.523 -0.031
## Portugal 1.885 4.236 0.235 0.641
## Romania 2.636 -1.102 0.169 0.604
## Spain 1.404 2.440 0.249 -0.242
## Sweden -1.920 -0.089 -1.086 0.904
## Switzerland -0.886 -0.798 -0.229 -1.069
## UK -1.940 -0.329 -1.274 -1.192
## USSR 0.861 -0.158 -0.216 1.043
## W.Germany -1.801 -0.344 0.873 -0.263
## Yugoslavia 3.777 -0.964 0.162 1.076
Interpretación
El Análisis de Componentes Principales se basa en la descomposición de la matriz de correlaciones en eigenvalores y eigenvectores, cuando estandarizamos los datos, esto ocurre cuando se tienen dimensiones muy diferentes en las variables. de no ser así trabajamos con la matriz de covarianzas. Los eigenvectores dan origen a las cargas de los Componentes Principales, las cuales permiten identificar la contribución de cada variable a las nuevas dimensiones. Por su parte, los eigenvalores cuantifican la varianza explicada por cada componente y sirven como criterio para determinar cuántas componentes conservar.
Como regla práctica, suele buscarse un conjunto de componentes que explique el 80% de la varianza total. Tipicamente las primeras componentes explican el mayor porcentaje de la variabilidad, por lo que se consideran suficientes para representar la estructura principal de los datos y realizar su interpretación.
Seleccionaremos las variables con mayores coeficientes de componente obtenidos en la matriz de cargas de los componentes. La distribución de la varianza explicada por los componentes puede observarse en el Scree Plot, con la varianza acumulada presentado más adelante.
Un Componente principal es una combinación lineal de las variables estandarizadas provenientes de la matriz de correlación, o sin estandarizar de la matriz de covarianza. Los componentes explican la máxima variabilidad de los datos, en los primeros componentes se encuentra la mayor parte de la varianza , es por ello que nos enfocamos en el análisis de estos, generalemente el 80%, de la varianza total.
Los componentes están formados por las variables de mayor contribución en el componente.
Para calcular los Componentes Principales se utiliza una combinación lineal , con la fórmula:
\[ PC_i=a_{i1}z_1+a_{i2}z_2+\cdots+a_{ip}z_p \]
donde:
\(PC_i\): Componente principal \(i\).
\(a_{ij}\): Carga de la variable \(j\) en el componente \(i\).
\(z_j\): Variable estandarizada \(j\).
\(p\): Número total de variables.
Selección de Variables con mayor contribución al componente principal
Tomamos los componentes generados con la función prcomp() para el análisis de componentes princiaples, mediante (rotation) obtenemos la matriz de cargas de los componentes principales.
# Matriz de Cargas
pca$rotation[,1:3]
## PC1 PC2 PC3
## RMeat -0.3106693 -0.06957085 -0.35546338
## WMeat -0.3159279 -0.21457197 0.62841986
## Eggs -0.4205930 -0.09986721 0.08050675
## Milk -0.3788776 -0.16867961 -0.40414435
## Fish -0.1341071 0.65161517 -0.29971395
## Cereals 0.4298291 -0.25366332 0.06815673
## Starch -0.2959618 0.38888491 0.28085511
## Seeds 0.4218085 0.12932932 -0.14030066
## FruitsVeg 0.1223681 0.50377330 0.34041535
Seleccion de Cargas de los componentes
El criterio de selección es tomar los componentes que representan el 80% de la varianza. Nos enfocaremos en explicar el desarrollo de los tres primeros componentes (75% de la Varianza total) seleccionaremos las cargas, de cada componente usando la salida del analisis de componentes principales.
Coeficientes de las cargas en los Componentes Principales
cargas1 <- pca$rotation[,1]
cargas2 <- pca$rotation[,2]
cargas3 <- pca$rotation[,3]
par(
mfrow = c(1,3),
mar = c(8,4,3,2),
oma = c(0,0,5,0)
)
barplot(
cargas1,
main = "Componente Principal 1",
ylab = "Carga",
las = 2, #orientacion etiquetas ejes
ylim = c(-0.4,0.7),
yaxt = "n", #no se dibuja el eje
col = ifelse(cargas1 > 0, "steelblue", "tomato")
)
abline(h = 0, lwd = 2)
axis(2,seq(-0.4,0.6,0.1),
las=1)
barplot(
cargas2,
main = "Componente Principal 2",
ylab = "Carga",
las = 2,
ylim = c(-0.4,0.7),
yaxt = "n",
col = ifelse(cargas2 > 0, "steelblue", "tomato")
)
abline(h = 0, lwd = 2)
axis(2,seq(-0.4,0.6,0.1),
las=1)
barplot(
cargas3,
main = "Componente Principal 3",
ylab = "Carga",
las = 2,
ylim = c(-0.4,0.7),
yaxt = "n",
col = ifelse(cargas3 > 0, "steelblue", "tomato")
)
abline(h = 0, lwd = 2)
axis(2,seq(-0.4,0.6,0.1),
las=1)
mtext(
"Diagrama de Cargas de los Primeros Componentes Principales",
side = 3,
outer = TRUE,
line = 2,
cex = 1.3,
font = 2
)
pca$rotation[,1:3]
## PC1 PC2 PC3
## RMeat -0.3106693 -0.06957085 -0.35546338
## WMeat -0.3159279 -0.21457197 0.62841986
## Eggs -0.4205930 -0.09986721 0.08050675
## Milk -0.3788776 -0.16867961 -0.40414435
## Fish -0.1341071 0.65161517 -0.29971395
## Cereals 0.4298291 -0.25366332 0.06815673
## Starch -0.2959618 0.38888491 0.28085511
## Seeds 0.4218085 0.12932932 -0.14030066
## FruitsVeg 0.1223681 0.50377330 0.34041535
# restablecer valores iniciales graficos
par(
mfrow = c(1,1),
mar = c(5.1,4.1,4.1,2.1),
oma = c(0,0,0,0)
)
Observamos las variables de mayor tamaño en valor absoluto para determinar las cargas de los componentes en la ecuación
Cargas del PC1 El eje negativo está conformado por una lado las variables con mayor carga negativa (barras azules) y del otro los de mayor cargas positivas (barras rojas) quedando:
Negativos: Rmeat, Wmeat, Eggs, Milk. los nombraremos alimentos de origen animal
Positivos: Cereles,Semillas nombrandolos alimentos de origen Vegetal
De esta manera se logra la reducción de variables en un un componente principal PC1 formado por un eje, integrado en la parte negativa por los alimentos con proteínas de origen animal y la parte positiva los alimentos de origen vegetal
En general tomamos aquellas variables con mayor carga y quitamos las que tienen menor carga en la caracterización de un componente.
usamos diferentes criterios entre ellos el sentido que tiene la agrupación de las variables y sus cargargas. Más adelante veremos criterios otros criterios alternativos como la contribución al componente y del de cos2, así como los umbrales de magnitud de las cargas, para ver el grado de representación que tienen, sirviendo así también de forma complementaria en la selección de variables.
Cargas del PC2 Observando las cargas y las grafica de pc2 observamos que las que aportan en mayor medida al componente 2 son en el lado positivo: Pescado,Frutas y Verduras, Almidón este sería el eje positivo, para del componente PC2
En el caso de los cereales con signo negativo, sería la mayor en la dirección negativa del eje, sin embargo su carga (coeficiente) es menor = -0.25, podriamos seleccionarlo al ser el mayor, sin embargo tenemos que considerar que su coeficiente es pequeño de tal manera que su contribución es baja en el componente y no define realmente el eje negativo por lo que no la consideraremos dentro de la ecuación, más adelante revisamos su contribución y su representación con el método cos².
Con lo anterior , eje del PC2 queda definido por las variables positivas -Pescado,Frutas y Verduras, Almidón-
Tabla comparativa PC2 vs. variables En esta taba podemos visualizar la influencia del Cereal en el componente PC2, en comparación con otras variables, no significa que no exista consumo de cereales, sino más bien que en la composición de este eje PC2 tiene baja Influencia.
# 1. Estandarizar datos originales
datos_std <- as.data.frame(scale(datos_pca))
# 2. Crear tabla comparativa
comparacion_ordenada <- data.frame(
Pais = rownames(datos_pca),
PC2 = pca$x[, 2],
Fish = datos_std$Fish,
FruitsVeg = datos_std$FruitsVeg,
Starch = datos_std$Starch,
Cereals = datos_std$Cereals
)
# 3. Ordenar de mayor a menor PC2
comparacion_ordenada <- comparacion_ordenada[
order(comparacion_ordenada$PC2, decreasing = TRUE),
]
# 4. Redondear solo columnas numéricas
comparacion_ordenada[, -1] <- round(comparacion_ordenada[, -1], 3)
# 5. Ver tabla
print(comparacion_ordenada)
## Pais PC2 Fish FruitsVeg Starch Cereals
## Portugal Portugal 4.236 2.801 1.984 0.991 -0.483
## Spain Spain 2.440 0.784 1.462 0.991 -0.302
## Norway Norway 1.109 1.648 -0.627 0.387 -0.846
## France France 0.896 0.496 1.462 0.387 -0.392
## Greece Greece 0.865 0.496 1.462 -1.426 0.879
## Poland Poland 0.632 -0.369 1.462 0.991 0.334
## E.Germany E.Germany 0.608 0.207 -0.104 1.595 -0.665
## Denmark Denmark 0.283 1.648 -1.149 0.387 -0.937
## Belgium Belgium 0.274 0.207 -0.104 0.991 -0.483
## Italy Italy 0.162 -0.369 1.462 -1.426 0.425
## Sweden Sweden -0.089 1.072 -1.149 -0.217 -1.119
## USSR USSR -0.158 -0.369 -0.627 0.991 1.061
## UK UK -0.329 -0.081 -0.627 0.387 -0.756
## W.Germany W.Germany -0.344 -0.369 -0.104 0.387 -1.210
## Czechoslovakia Czechoslovakia -0.574 -0.657 -0.104 0.387 0.153
## Finland Finland -0.583 0.496 -1.671 0.387 -0.574
## Netherlands Netherlands -0.780 -0.369 -0.104 -0.217 -0.937
## Switzerland Switzerland -0.798 -0.657 0.418 -0.822 -0.574
## Ireland Ireland -0.820 -0.657 -0.627 0.991 -0.756
## Hungary Hungary -0.951 -1.233 -0.104 -0.217 0.698
## Yugoslavia Yugoslavia -0.964 -0.945 -0.627 -0.822 2.151
## Austria Austria -1.078 -0.657 -0.104 -0.217 -0.392
## Romania Romania -1.102 -0.945 -0.627 -0.822 1.606
## Albania Albania -1.432 -1.233 -1.149 -2.030 0.879
## Bulgaria Bulgaria -1.503 -0.945 -0.104 -2.030 2.242
Cargas del PC3 La tercera componente principal contrapone países con consumo de Carnes Rojas y Leche (signo negativo) con aquellos paises que tienen consumo de carnes blancas con frutas y verduras (signo positivo).
Fórmula para el cálculo de componentes Usamos el siguiente Código para calcular la fórmula de cada componente, en función del tamaño de carga que se requiera ,para filtrar las variables.
formula_PC <- function(pca, componente, corte){
coef <- pca$rotation[, componente]
coef <- coef[abs(coef) >= corte]
ecuacion <- paste0(
ifelse(coef > 0, "+", ""),
round(coef, 2),
"(",
names(coef),
")"
)
paste0(
"PC", componente, " = ",
paste(ecuacion, collapse = " ")
)
}
pc1 <- formula_PC(pca, 1, 0.30)
print(pc1)
## [1] "PC1 = -0.31(RMeat) -0.32(WMeat) -0.42(Eggs) -0.38(Milk) +0.43(Cereals) +0.42(Seeds)"
pc2 <- formula_PC(pca, 2, 0.35)
print(pc2)
## [1] "PC2 = +0.65(Fish) +0.39(Starch) +0.5(FruitsVeg)"
pc3 <- formula_PC(pca, 3, 0.30)
print(pc3)
## [1] "PC3 = -0.36(RMeat) +0.63(WMeat) -0.4(Milk) +0.34(FruitsVeg)"
Contribución de las variables al componente
#library(factoextra)
#library(ggpubr)
g1 <- fviz_contrib(
pca,
choice = "var",
axes = 1,
top = 9,
sort.val = "desc"
)
g2 <- fviz_contrib(
pca,
choice = "var",
axes = 2,
top = 9,
sort.val = "desc"
)
g3 <- fviz_contrib(
pca,
choice = "var",
axes = 3,
top = 9,
sort.val = "desc"
)
fig <-ggarrange(
g1, g2, g3,
ncol = 3,
nrow = 1
)
annotate_figure(
fig,
top = text_grob(
"Contribución de las variables a los PC",
face = "bold",
size = 14
)
)
La contribución de las variables nos ayuda a saber cual es la participación de la carga en la varianza del componente de tal manera que seleccionamos las de mayor tamaño, en valor absoluto- Las variables arriba de la línea roja tienen una mayor contribución. este es un método complementario , de la librería(factoextra).
Representación de las Variables con Cos2
Como forma alternativa para determinar que tan bien está representada una variable por un componente principal usamos la fórmula cos2, la cual mide qué proporción de la información total de una variable es explicada por una componente principal.
\[
\cos^2(X_j,PC_k)=a_{jk}^2\lambda_k
\]
\(X_j\) = Variable original.
\(PC_k\) = Componente principal.
\(a_{jk}^{2}\) = Carga factorial al cuadrado.
\(\lambda_k\) = Eigenvalor del componente \(k\).
En general:
cos² > 0.50 → buena representación.
0.30 ≤ cos² ≤ 0.50 → representación moderada.
cos² < 0.30 → representación débil.
Tabla cos² Representación de las variables
lamda1 <- pca$sdev[1]^2
a1 <- pca$rotation[,1]
cos2_PC1 <- a1^2*lamda1
lamda2 <- pca$sdev[2]^2
a2 <- pca$rotation[,2]
cos2_PC2 <- a2^2*lamda2
lamda3 <- pca$sdev[3]^2
a3 <- pca$rotation[,3]
cos2_PC3 <- a3^2*lamda3
tabla_cos2 <- cbind(
PC1 = round(cos2_PC1,3),
PC2 = round(cos2_PC2,3),
PC3 = round(cos2_PC3,3)
)
print(tabla_cos2)
## PC1 PC2 PC3
## RMeat 0.395 0.008 0.137
## WMeat 0.409 0.075 0.429
## Eggs 0.724 0.016 0.007
## Milk 0.588 0.046 0.177
## Fish 0.074 0.690 0.097
## Cereals 0.757 0.105 0.005
## Starch 0.359 0.246 0.086
## Seeds 0.729 0.027 0.021
## FruitsVeg 0.061 0.412 0.126
Vemos por ejemplo la representación de Cereales es muy baja con 0.105 por lo cual confirmamos su exclusión en PC2.En el caso del Almidón en PC1 es de 0.359 observamos que su contribución es moderada, podria ser considerada.
Visualización de los componentes principales El
análisis se realizó en R mediante la función prcomp(). Las
visualizaciones fueron elaboradas con el paquete
factoextra.
Varianza explicada
fviz_eig(pca,
addlabels = TRUE)
cumsum(pca$sdev^2 /
sum(pca$sdev^2)) * 100
## [1] 45.50596 63.56044 75.61959 85.67534 90.41687 94.27176 97.26647 98.76116 100.00000
Los tres primeros componentes corresponden al 75.6% de la variación.
biplot(pca,
scale = 0,
cex = 0.5,
)
mtext("Biplot PCA", side = 3, outer = TRUE, line = -1)
El Biplot muestra dos ejes con los 2 primeros componentes PC1 y PC2, Las categorias(variables) , son las flechas en rojo . Los ejes primarios (abajo e izquierda), es el valor o score de los componentes. para las categorías, su lectura se muestra en el eje superior y en el derecho.
El Biplot nos sirve para ubicar la posición relativa de los países en el espacio generado por dos componentes en este caso PC1 y PC2 de esta manera podemos identificar individuos o los grupos de países con patrones de alimentación similares de acuerdo a su perfil multivariado.
Podemos observar el un grupo de países como UK, W Alemania ,Irlanda, Holanda y Finlanda, al tener score negativos consumen proteinas de alimentos de origen animal en el eje PC1, y en cuanto a la dimensión PC2 su patrón de consumo es opuesto a Pescado-Frutas y Verduras ya que su score en este componente es negativo.
si necesitamos obtener los scores ordenados por componentes, facilitando la visualización usamos:
sort(pca$x[,1:2])
## [1] -2.58097911 -2.44225940 -1.93967651 -1.91960525 -1.80077577 -1.71155913 -1.70064975 -1.62719110 -1.50333675 -1.43542965 -1.43187183 -1.42499129 -1.39617086 -1.10164486 -1.07844406 -0.96425165
## [17] -0.95715106 -0.95052166 -0.88626436 -0.82037615 -0.79798276 -0.78012960 -0.58298031 -0.57418064 -0.42778825 -0.34409820 -0.32877834 -0.15774231 -0.12851061 -0.08881654 0.16192833 0.27394175
## [33] 0.28305004 0.60782538 0.63184836 0.86076573 0.86546599 0.89590251 1.10929163 1.40428419 1.43026874 1.55015763 1.88543641 2.32917419 2.43957843 2.63617304 3.09961149 3.40621747
## [49] 3.77691323 4.23632323
round(pca\(rotation[,2],3) round(pca\)rotation[,3],3)
fviz_pca_var(
pca,
repel = TRUE
)
PC1 contrapone cereales y semillas frente a carnes, huevos y lácteos, mientras que PC2 representa un patrón asociado con pescado, frutas y verduras, y Carbohidratos. La cercanía entre vectores indica correlación positiva y la oposición entre ellos, correlación negativa. Por ejemplo las variables cereales y semillas tiene una asociación positiva con la componente PC1, mientras que Rmeat,Wmeat, Eggs y Milk se asocian negativamente en esta dimensión.
fviz_pca_biplot(
pca,
repel = TRUE,
labelsize = 3,
col.var = "red",
col.ind = "blue"
)
Mapa de Scores
fviz_pca_ind(
pca,
repel = TRUE,
title = "Mapa de individuos"
)
Grafica de contribución de indiviudos (Países)
HeatMap Componentes Principales
Descripción de los componentes principales
Interpretación del heatmap
Los tonos azules representan scores positivos, indicando una mayor asociación con el patrón alimentario definido por el componente principal correspondiente. Los tonos amarillos representan scores negativos, indicando una menor asociación con dicho patrón. La intensidad del color es proporcional a la magnitud del score; por tanto, colores más intensos reflejan una mayor separación respecto al promedio (score = 0).
Podemos observar por ejemplo que países como Rumanía,
Valores Rumania
pca$x["Romania",1] #Score PC1
## [1] 2.636173
datos_pca["Romania",]#datos originales
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds FruitsVeg
## Romania 6 6 2 11 1 50 3 5 3
En PC1 tiene color verde obscuro en el eje positivo, que es encima del promedio esto significa que su alimentación es de (alimentos de origen vegetal “cereales y semillas”) .En PC2 tiene color naranja obscuro en el eje negativo, por lo que su alimentación es debajo del promedio opuesta a pescado, frutas y verduras, almidón En PC3 su alimentación es naranja claro , cercano a cero lo cual indica que no presenta una orientación definida en este eje.
Valores Rumania
pca$x["Romania",1:2] #Scores PC1 y PC2
## PC1 PC2
## 2.636173 -1.101645
datos_pca["Romania",]#datos originales
## RMeat WMeat Eggs Milk Fish Cereals Starch Seeds FruitsVeg
## Romania 6 6 2 11 1 50 3 5 3
ggplot(
subset(data_long, pais == "Romania"),
aes(x = categoria, y = consumo, fill = categoria)
)+
labs(title = "Consumo Rumania")+
geom_col() +
coord_flip()
Grafica de los 3 primeros componentes 3D scores 3d, paquete rgl paquete(plotly)
Grafica Componentes principales en 3d, paquete rgl
library(rgl)
library(htmlwidgets)
library(htmltools)
scores <- pca$x[, 1:3]
loadings <- pca$rotation[, 1:3]
rownames(scores) <- iconv(rownames(scores), to = "ASCII//TRANSLIT")
rownames(loadings) <- iconv(rownames(loadings), to = "ASCII//TRANSLIT")
factor <- 4.8
open3d()
## wgl
## 1
bg3d(color = "white")
plot3d(
scores,
type = "s",
radius = 0.075,
col = "royalblue4",
xlab = "PC1",
ylab = "PC2",
zlab = "PC3"
)
text3d(
scores[,1],
scores[,2],
scores[,3],
texts = rownames(scores),
cex = 0.85,
col = "black"
)
for(i in 1:nrow(loadings)){
segments3d(
x = c(0, loadings[i,1] * factor),
y = c(0, loadings[i,2] * factor),
z = c(0, loadings[i,3] * factor),
col = "firebrick4",
lwd = 4
)
text3d(
x = loadings[i,1] * factor * 1.08,
y = loadings[i,2] * factor * 1.08,
z = loadings[i,3] * factor * 1.08,
texts = rownames(loadings)[i],
col = "firebrick4",
cex = 1.05
)
}
aspect3d(1, 1, 1)
rglwidget()
Gráfico 3d con el paquete plotly
library(plotly)
library(htmltools)
scores_3d <- data.frame(
Pais = rownames(pca$x),
PC1 = pca$x[, 1],
PC2 = pca$x[, 2],
PC3 = pca$x[, 3]
)
grafica_pca_3d <- plot_ly(
data = scores_3d,
x = ~PC1,
y = ~PC2,
z = ~PC3,
type = "scatter3d",
mode = "markers+text",
text = ~Pais,
textposition = "top center",
marker = list(
size = 5,
color = "royalblue"
)
) %>%
layout(
title = "PCA 3D: Primeros tres componentes principales",
scene = list(
xaxis = list(title = "PC1"),
yaxis = list(title = "PC2"),
zaxis = list(title = "PC3")
)
)
grafica_pca_3d
Conclusiones
El Análisis Multivariado, nos ayudó a reducir el gran número de variables en este caso categoría alimenticias, en pocas variables determinadas por los componente principales, al presentar las variables originales una estructura de correlación apropiada para el análisis. El análisis de componentes principales tiene un gran número de aplicaciones en la mayoría de los segmentos, en dónde se necesita explicar y reducir el gran número de variables por pocas variables (componentes principales)
rownames(scores) rownames(loadings)
ANEXOS
© 2026 Héctor Hernández Sinencio Data source as referenced in Manly (2005). Analysis, code, visualizations, interpretations, and written content are the work of, the author . Please cite this publication if you use or reference any part of this work.
Manly, B. F. J. (2005). Multivariate Statistical Methods: A Primer. Chapman & Hall/CRC.
Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2010). Multivariate Data Analysis (7th ed.). Pearson.
R Core Team. R: A Language and Environment for Statistical Computing.
Kassambara, A., & Mundt, F. factoextra: Extract and Visualize the Results of Multivariate Data Analyses.
The interactive display of the results was created using the
datatable() function from the DT package.
HL