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")

Evaluación de Supuestos del PCA

Supuestos del Modelo PCA

Determinante de la matriz de correlaciones

det(corr_matrix)
## [1] 0.003873461

det > 0.00001 , indica la existencia de correlaciones

Prueba de Bartlett

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.

Índice KMO

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.

Análisis de Componentes Principales

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 clásico

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)

Círculo de correlaciones

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.

Biplot PCA con fviz

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

  • PC1: alimento animal (−) ↔︎ alimento vegetal (+).
  • PC2: componente pescado, frutas y verduras, almidón (+).
  • PC3: carne roja, leche (−) ↔︎ carne blanca, frutas y verduras (+).

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()
Descripción de los componentes principales

PC1: alimento animal (−) ↔ alimento vegetal (+).

PC2: componente pescado, frutas y verduras, almidón (+).

PC3: carne roja, leche (−) ↔ carne blanca, frutas y verduras (+).

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
Descripción de los componentes principales

PC1: alimento animal (−) ↔ alimento vegetal (+).

PC2: componente pescado, frutas y verduras, almidón (+).

PC3: carne roja, leche (−) ↔ carne blanca, frutas y verduras (+).

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

Acknowledgments

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

References

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