Sección 3 Análisis de Componentes Principales

El análisis de componenetes principales tiene como objetivo reducir la dimensión y conservar en lo posible su estructura, es decir la forma de la nube de datos para esto el primer paro es obtener la matriz de correlaciones y la matriz de covarianzas.

Cuando se trabaja con distintas unidades de medición, conviene hacer el análisis de componentes principales haciendo los cálculos con la matriz R de correlaciones.

3.1 Componentes principales para matriz de covarianza

Ejemplo 1: Calcular los componentes principales. Supongamos que las variables aleatorias \(X_1, X_2, X_3\) tienen matriz de covarianza:

Sigma <- matrix(c(1, -2, 0,
                  -2, 5, 0,
                  0,  0, 2),
                nrow = 3, byrow = TRUE)

Sigma
##      [,1] [,2] [,3]
## [1,]    1   -2    0
## [2,]   -2    5    0
## [3,]    0    0    2

Descomposición en valores y vectores propios:

eig <- eigen(Sigma)   
# por defecto para matrices simétricas devuelve autovalores en orden decreciente

lambda <- eig$values    # autovalores (orden descendente)
lambda
## [1] 5.8284271 2.0000000 0.1715729
P <- eig$vectors        # autovectores (columnas)
P
##            [,1] [,2]      [,3]
## [1,] -0.3826834    0 0.9238795
## [2,]  0.9238795    0 0.3826834
## [3,]  0.0000000    1 0.0000000

Vamos a ordenarlos:

autovalores <- eig$values
autovectores <- eig$vectors

cat("Autovalores:\n"); print(round(autovalores, 6))
## Autovalores:
## [1] 5.828427 2.000000 0.171573
cat("Autovectores (columnas):\n"); print(round(autovectores, 6))
## Autovectores (columnas):
##           [,1] [,2]     [,3]
## [1,] -0.382683    0 0.923880
## [2,]  0.923880    0 0.382683
## [3,]  0.000000    1 0.000000

Verifiquemos que \(P' \Sigma P\) debe ser diagonal con los autovalores en la diagonal.

P <- autovectores
D <- t(P) %*% Sigma %*% P
cat("P' Sigma P (debe ser diagonal con los autovalores):\n")
## P' Sigma P (debe ser diagonal con los autovalores):
print(round(D, 8))
##          [,1] [,2]      [,3]
## [1,] 5.828427    0 0.0000000
## [2,] 0.000000    2 0.0000000
## [3,] 0.000000    0 0.1715729

Comprobación directa: lam varianza de cada componente principal y covarianzas entre ellas

\(Y_i = t(a_i) * X \rightarrow var(Y_i) = t(a_i) * \Sigma * a_i\)

\(Y_i = t(P[,i]) * X \rightarrow var(Y_i) = t(P[,i]) * \Sigma * P[,i]\)

vars_pc <- sapply(1:3, function(i) as.numeric(t(P[,i]) %*% Sigma %*% P[,i]))
covs_pc <- matrix(0, 3, 3)
for(i in 1:3) for(j in 1:3) covs_pc[i,j] <- as.numeric(t(P[,i]) %*% Sigma %*% P[,j])

cat("Varianzas de las CP (deben ser los autovalores):\n"); print(round(vars_pc, 8))
## Varianzas de las CP (deben ser los autovalores):
## [1] 5.8284271 2.0000000 0.1715729
cat("Matriz de covarianzas entre CP (debe ser prácticamente 0 fuera de la diagonal):\n"); print(round(covs_pc,8))
## Matriz de covarianzas entre CP (debe ser prácticamente 0 fuera de la diagonal):
##          [,1] [,2]      [,3]
## [1,] 5.828427    0 0.0000000
## [2,] 0.000000    2 0.0000000
## [3,] 0.000000    0 0.1715729

Verificamos que la traza de \(\Sigma\) sea la suma de los autovalores.

traza_sigma <- sum(diag(Sigma))
suma_autovalores <- sum(autovalores)
cat("Traza(Sigma) = ", traza_sigma, "\n")
## Traza(Sigma) =  8
cat("Suma de autovalores = ", round(suma_autovalores, 8), "\n")
## Suma de autovalores =  8

Las fórmulas explícitas de cada componente principal (coeficientes) son:

cat("\nFormas lineales (cada componente principal Yi = ai1 * X1 + ai2 * X2 + ai3 * X3):\n")
## 
## Formas lineales (cada componente principal Yi = ai1 * X1 + ai2 * X2 + ai3 * X3):
for(i in 1:3){
  coeffs <- round(P[,i], 6)
  cat(sprintf("Y%d = %6.6f * X1 + %6.6f * X2 + %6.6f * X3\n", i, coeffs[1], coeffs[2], coeffs[3]))
}
## Y1 = -0.382683 * X1 + 0.923880 * X2 + 0.000000 * X3
## Y2 = 0.000000 * X1 + 0.000000 * X2 + 1.000000 * X3
## Y3 = 0.923880 * X1 + 0.382683 * X2 + 0.000000 * X3

Proporción de varianza explicada por cada componente

total_var <- sum(diag(Sigma))
prop_explained <- lambda / total_var
cum_prop <- cumsum(prop_explained)
cat("\nProporción de varianza explicada por componente:\n")
## 
## Proporción de varianza explicada por componente:
for(i in 1:length(lambda)){
  cat(sprintf("PC%d: lambda=%.6f  prop=%.4f  cumul=%.4f\n",
              i, lambda[i], prop_explained[i], cum_prop[i]))
}
## PC1: lambda=5.828427  prop=0.7286  cumul=0.7286
## PC2: lambda=2.000000  prop=0.2500  cumul=0.9786
## PC3: lambda=0.171573  prop=0.0214  cumul=1.0000

Correlaciones entre CPs \((Y_i)\) y variables originales \((X_j)\)

\[\rho_{_{Y_i, X_j}} = e_{j,i} * \sqrt{\lambda_i} / \sqrt{\sigma_{jj}}\]

sigma_diag <- diag(Sigma)
ncomp <- length(lambda)
rho <- matrix(NA, nrow = ncomp, ncol = ncol(P),
              dimnames = list(paste0("Y",1:ncomp), paste0("X",1:ncol(P))))

for(i in 1:ncomp){
  for(j in 1:ncol(P)){
    rho[i,j] <- P[j,i] * sqrt(lambda[i]) / sqrt(sigma_diag[j])
  }
}

cat("\nCorrelaciones rho_{Yi, Xj} (filas = Yi, columnas = Xj):\n")
## 
## Correlaciones rho_{Yi, Xj} (filas = Yi, columnas = Xj):
print(round(rho, 6))
##           X1       X2 X3
## Y1 -0.923880 0.997484  0
## Y2  0.000000 0.000000  1
## Y3  0.382683 0.070889  0

La variable \(X_2\), con coeficiente \(0.924\) recibe el mayor peso en la componente \(Y_1\). Tiene la mayor correlación con \(Y_1\). La correlaciónde \(X_1\) con \(Y_1\) también es alta, casi como la de \(X_2\), esto indica que las variables son casi igual de importantes en la primer componente. Los tamaños delos coeficientes \(X_1\) y \(X_2\) sugieren que \(X_2\) contribuye más a la determinación de \(Y_1\) que \(X_1\). Como ambos coeficientes son grandes y tienen signos opuestos, podemos argumentar que ambas variables son importantes para la interpretación de \(Y_1\).

Comprobaciones adicionales

  1. \(Var(Y_i) = \lambda_i\)
cat("\nVarianzas de Yi (por construccion, deben ser los autovalores):\n")
## 
## Varianzas de Yi (por construccion, deben ser los autovalores):
print(round(lambda, 6))
## [1] 5.828427 2.000000 0.171573
  1. \(Cov(Y_i, Y_j)=0\) para \(i\neq j\).
cov_Y <- t(P) %*% Sigma %*% P
cat("\nCovarianzas entre Yi (t(P) %*% Sigma %*% P) (debe ser diagonal):\n")
## 
## Covarianzas entre Yi (t(P) %*% Sigma %*% P) (debe ser diagonal):
print(round(cov_Y, 8))
##          [,1] [,2]      [,3]
## [1,] 5.828427    0 0.0000000
## [2,] 0.000000    2 0.0000000
## [3,] 0.000000    0 0.1715729
  1. Traza
cat("\nTraza(Sigma) = ", sum(diag(Sigma)), "  Suma autovalores = ", round(sum(lambda),8), "\n")
## 
## Traza(Sigma) =  8   Suma autovalores =  8

3.2 Componentes principales para matriz de correlación

Ejemplo 2: Consideremos la siguiente matriz de covarianza

Sigma <- matrix(c(1, 4,
                  4, 100), nrow = 2, byrow = TRUE)

Sigma
##      [,1] [,2]
## [1,]    1    4
## [2,]    4  100

y la siguiente matriz de correlaciones

# Matriz de correlacion (estandarizando Sigma)
sd_vec <- sqrt(diag(Sigma))
R_mat <- diag(1/ sd_vec) %*% Sigma %*% diag(1/ sd_vec)
round(R_mat, 6)
##      [,1] [,2]
## [1,]  1.0  0.4
## [2,]  0.4  1.0

Descomposición en valores/vectores propios de \(\Sigma\):

eig_Sigma <- eigen(Sigma)
lambda_S <- eig_Sigma$values
P_S <- eig_Sigma$vectors

cat("Eigen Sigma:\n"); print(round(lambda_S,6))
## Eigen Sigma:
## [1] 100.161353   0.838647
cat("Autovectores Sigma (columnas):\n"); print(round(P_S,6))
## Autovectores Sigma (columnas):
##          [,1]      [,2]
## [1,] 0.040306 -0.999187
## [2,] 0.999187  0.040306

Componentes principales (formas lineales) - para \(\Sigma\):

cat("\nFormas lineales (Sigma): Yi = a1 * X1 + a2 * X2  (autovectores col)\n")
## 
## Formas lineales (Sigma): Yi = a1 * X1 + a2 * X2  (autovectores col)
for(i in 1:2){
  coefs <- round(P_S[,i], 6)
  cat(sprintf("Y%d = %6.6f * X1 + %6.6f * X2\n", i, coefs[1], coefs[2]))
}
## Y1 = 0.040306 * X1 + 0.999187 * X2
## Y2 = -0.999187 * X1 + 0.040306 * X2

Descomposición en valores/vectores propios de \(R\):

eig_R <- eigen(R_mat)
lambda_r <- eig_R$values
P_r <- eig_R$vectors

cat("\nEigen R:\n"); print(round(lambda_r,6))
## 
## Eigen R:
## [1] 1.4 0.6
cat("Autovectores R (columnas):\n"); print(round(P_r,6))
## Autovectores R (columnas):
##          [,1]      [,2]
## [1,] 0.707107 -0.707107
## [2,] 0.707107  0.707107

Componentes principales \(R\), equivalente a trabajar con \(Z\) estandarizadas:

cat("\nFormas lineales (R, sobre Z estandarizadas): Yi = b1 * Z1 + b2 * Z2\n")
## 
## Formas lineales (R, sobre Z estandarizadas): Yi = b1 * Z1 + b2 * Z2
for(i in 1:2){
  coefs <- round(P_r[,i], 6)
  cat(sprintf("Y%d = %6.6f * Z1 + %6.6f * Z2\n", i, coefs[1], coefs[2]))
}
## Y1 = 0.707107 * Z1 + 0.707107 * Z2
## Y2 = -0.707107 * Z1 + 0.707107 * Z2

Que es lo mismo que:

\(Y_1 = e_{11}\left( \frac{X_1-\mu_1}{\sqrt{\sigma_{_{11}}}} \right) + e_{12}\left( \frac{X_2-\mu_2}{\sqrt{\sigma_{_{22}}}} \right) = 0.707\left( \frac{X_1-\mu_1}{1} \right) + 0.707\left( \frac{X_2-\mu_2}{10} \right)\)

y

\(Y_2 = e_{21}\left( \frac{X_1-\mu_1}{\sqrt{\sigma_{_{11}}}} \right) + e_{22}\left( \frac{X_2-\mu_2}{\sqrt{\sigma_{_{22}}}} \right) = - 0.707\left( \frac{X_1-\mu_1}{1} \right) + 0.707\left( \frac{X_2-\mu_2}{10} \right)\)

Debido a su gran varianza, \(X_2\) domina por completo la primer componente principal determinada por \(\Sigma\).

Proporciones de varianza explicada (\(\Sigma\)):

total_var_S <- sum(diag(Sigma))
prop_S <- lambda_S / total_var_S
cat("\nProporciones (Sigma):\n")
## 
## Proporciones (Sigma):
for(i in 1:2) cat(sprintf("PC%d: lambda=%.6f prop=%.4f cumul=%.4f\n",
                          i, lambda_S[i], prop_S[i], cumsum(prop_S)[i]))
## PC1: lambda=100.161353 prop=0.9917 cumul=0.9917
## PC2: lambda=0.838647 prop=0.0083 cumul=1.0000

Proporciones de varianza explicada (\(R\), variables estandarizadas):

total_var_r <- sum(diag(R_mat))  # = 2
prop_r <- lambda_r / total_var_r
cat("\nProporciones (R - variables estandarizadas):\n")
## 
## Proporciones (R - variables estandarizadas):
for(i in 1:2) cat(sprintf("PC%d: lambda=%.6f prop=%.4f cumul=%.4f\n",
                          i, lambda_r[i], prop_r[i], cumsum(prop_r)[i]))
## PC1: lambda=1.400000 prop=0.7000 cumul=0.7000
## PC2: lambda=0.600000 prop=0.3000 cumul=1.0000

Correlaciones \(R_{Y_i, X_j}\) usando la formula:

\(R_{Y_i, X_j} = e_{j,i} * \sqrt{\lambda_i} / \sqrt{\sigma_{jj}}\)

sigma_diag <- diag(Sigma)
rho_YX_Sigma <- matrix(NA, 2, 2, dimnames=list(paste0("Y",1:2), paste0("X",1:2)))
for(i in 1:2) for(j in 1:2){
  rho_YX_Sigma[i,j] <- P_S[j,i] * sqrt(lambda_S[i]) / sqrt(sigma_diag[j])
}
cat("\nCorrelaciones entre Yi (de Sigma) y Xj:\n")
## 
## Correlaciones entre Yi (de Sigma) y Xj:
print(round(rho_YX_Sigma,6))
##           X1       X2
## Y1  0.403380 0.999993
## Y2 -0.915032 0.003691

Correlaciones para las variables estandarizadas \(Z\), se deben usar autovectores y autovalores de \(R\):

En ese caso \(\sigma_{jj}= 1\), y la formula reduce a \(e_{j,i} * \sqrt{\lambda_i}\)

R_YZ_R <- matrix(NA, 2, 2, dimnames=list(paste0("Y",1:2), paste0("Z",1:2)))
for(i in 1:2) for(j in 1:2){
  R_YZ_R[i,j] <- P_r[j,i] * sqrt(lambda_r[i])    # / sqrt(1) = 1
}
cat("\nCorrelaciones entre Yi (de R) y Zj (variables estandarizadas):\n")
## 
## Correlaciones entre Yi (de R) y Zj (variables estandarizadas):
print(round(R_YZ_R,6))
##           Z1       Z2
## Y1  0.836660 0.836660
## Y2 -0.547723 0.547723

Comprobación: reconstruir \(t(P) * \Sigma * P\), debe ser diagonal con las \(\lambda\) de \(\Sigma\):

cat("\nP_S' Sigma P_S  (debe ser diagonal = autovalores de Sigma)\n")
## 
## P_S' Sigma P_S  (debe ser diagonal = autovalores de Sigma)
print(round(t(P_S) %*% Sigma %*% P_S, 8))
##          [,1]      [,2]
## [1,] 100.1614 0.0000000
## [2,]   0.0000 0.8386468

Comprobación para \(R\): \(t(P_r) * R * P_r\)

cat("\nP_r' R P_r (debe ser diagonal = autovalores de R)\n")
## 
## P_r' R P_r (debe ser diagonal = autovalores de R)
print(round(t(P_r) %*% R_mat %*% P_r, 8))
##      [,1] [,2]
## [1,]  1.4  0.0
## [2,]  0.0  0.6

3.3 El número de Componentes Principales

Uno de los pasos fundamentales en el análisis de componentes principales (PCA) consiste en determinar cuántos componentes deben retenerse para describir adecuadamente la estructura de los datos. No existe un criterio único y universal, por lo que en la práctica se suelen combinar varias estrategias complementarias. A continuación se describen tres de los métodos más utilizados: el scree plot, la regla de Kaiser y el procedimiento de Horn.

3.3.1 Scree plot

El scree plot es una herramienta gráfica propuesta por Cattell (1966), en la que se representan los valores propios (varianzas explicadas) en función del número de componente. La idea es identificar el punto a partir del cual los valores propios dejan de decrecer de manera pronunciada y se estabilizan. Esta “zona de estabilización” se conoce como codo (elbow). Los componentes anteriores al codo explican la mayor parte de la variabilidad estructural, mientras que los posteriores suelen corresponderse con ruido. Aunque el criterio del codo es visual y puede ser subjetivo, es una aproximación muy útil como primera guía.

En R, el scree plot se puede obtener con funciones como screeplot(obj_pca) o haciendo un plot usual de los eigenvalores.

Ejemplo: Vamos a cargar la base de datos USArrests. Calculamos los componentes principales con la función prcomp y guardaresmos los eigenvalores en una variable.

data("USArrests")
datos <- na.omit(USArrests)
pca_obj <- prcomp(datos, scale. = TRUE)
eigenvalues <- pca_obj$sdev^2
eigenvalues
## [1] 2.4802416 0.9897652 0.3565632 0.1734301

Tenemos tres formas de realizar este plot, unos usando los valores de los eigenvalores y el segundo usando la función de screeplot o usando la función fviz_eig de factoextra.

plot(eigenvalues, type = "b", xlab = "Componente principal", ylab = "Eigenvalor", 
     main = "Scree plot")
abline(h = 1, lty = 2) # línea de referencia en 1 (útil para Kaiser)

screeplot(pca_obj, type="lines")

Si utilizamos el paquete factoextra, el scree plot también puede mostrar directamente la proporción de varianza explicada:

library(factoextra)
## Cargando paquete requerido: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_eig(pca_obj, addlabels = TRUE, ylim = c(0, 100))

La interpretación consiste en buscar el “codo” en la gráfica: el punto a partir del cual la pendiente deja de ser pronunciada y los eigenvalores se estabilizan. En los tres plots, podemos ver que en la componente dos, se forma el “codo”, además de que las primeras dos componentes tienen una mayor variabilidad. Este método nos sugiere quedarnos con las primeras dos componentes principales.

3.3.2 Regla de Kaiser

La regla de , fue propuesta por Kaiser en 1959. Propone retener únicamente los componentes cuyos eigenvalores sean mayores que 1 (cuando el PCA se realiza sobre la matriz de correlaciones). La justificación es que cada componente debe explicar al menos tanta variabilidad como una variable original estandarizada. Este criterio es sencillo de aplicar, pero puede sobrestimar el número de componentes cuando el número de variables es grande o cuando la estructura de los datos es débil.

Una forma de hacer esto es la siguiente:

componentes_kaiser <- which(eigenvalues > 1)
componentes_kaiser
## [1] 1
length(componentes_kaiser) 
## [1] 1

Podríamos resumir también esto en una tabla:

prop_var <- eigenvalues / sum(eigenvalues)
tabla_pca <- data.frame(
Componente = paste0("PC", seq_along(eigenvalues)),
Eigenvalor = eigenvalues,
PropVar    = prop_var,
PropVarAcum = cumsum(prop_var),
Kaiser     = eigenvalues > 1
)
tabla_pca
##   Componente Eigenvalor    PropVar PropVarAcum Kaiser
## 1        PC1  2.4802416 0.62006039   0.6200604   TRUE
## 2        PC2  0.9897652 0.24744129   0.8675017  FALSE
## 3        PC3  0.3565632 0.08914080   0.9566425  FALSE
## 4        PC4  0.1734301 0.04335752   1.0000000  FALSE

Aunque la componente 2 es menor a 1, si podría considerarse.

3.3.3 Procedimiento de Horn (parallel analysis)

El procedimiento de Horn, propuesto por Horn en 1965, también llamado análisis paralelo, es uno de los métodos más robustos para decidir el número de componentes. Consiste en comparar los eigenvalores obtenidos a partir de los datos reales con los eigenvalores obtenidos de matrices aleatorias generadas bajo ausencia de estructura (ruido). En lugar de tomar todos los eigenvalores mayores a 1, propone tomar otro corte dependiendo de los valores obtenidos de matrices aleatoias. Se retienen únicamente aquellos componentes cuyo eigenvalor sea mayor al correspondiente eigenvalor promedio de las matrices aleatorias.

Este procedimiento reduce los riesgos tanto de incluir componentes irrelevantes como de descartar componentes importantes. En R se puede implementar con el paquete psych mediante la función fa.parallel() o con funciones específicas de análisis paralelo para PCA.

library(psych)
## 
## Adjuntando el paquete: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
set.seed(123) # para reproducibilidad

fa.parallel(datos, 
            fa = "pc", # especifica que queremos análisis de componentes principales
            n.iter = 100, # número de matrices aleatorias
            show.legend = TRUE,
            main = "Análisis paralelo (Procedimiento de Horn)"
            )

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  1

Además de los criterios clásicos, como el scree plot o la regla de Kaiser, el paquete nFactors ofrece una forma integrada de comparar varios métodos para decidir cuántos componentes principales deben retenerse. Este enfoque combina:

  • Los eigenvalores reales obtenidos del PCA;

  • Los eigenvalores simulados mediante análisis paralelo (procedimiento de Horn);

  • Criterios gráficos, como el scree plot refinado (Cattell);

  • La regla de Kaiser (eigenvalores mayores que 1 cuando se usa una matriz de correlaciones).

A continuación se describe el procedimiento y el significado de cada paso.

Eigenvalores reales: El primer paso consiste en obtener los eigenvalores de la matriz de correlaciones. Si los datos han sido estandarizados o se usa directamente la matriz de correlaciones, cada variable tiene varianza igual a 1 y la regla de Kaiser puede aplicarse de manera directa.

cor_mat <- cor(datos, use = "pairwise.complete.obs")
# Eigenvalores de la matriz de correlaciones
ev_cor <- eigen(cor_mat)

Análisis paralelo (Procedimiento de Horn): El análisis paralelo compara los eigenvalores reales con eigenvalores obtenidos a partir de matrices aleatorias sin estructura (ruido). Los componentes se retienen únicamente si su eigenvalor es mayor que el correspondiente eigenvalor simulado bajo el escenario nulo.

En nFactors, esto se realiza con:

library(nFactors)
ap <- parallel(
  subject = nrow(datos),   # número de observaciones
  var     = ncol(datos),   # número de variables
  rep     = 100,                 # número de simulaciones
  cent    = .05                  # percentil usado para ajustar los eigenvalores simulados
)

La salida ap$eigen$qevpea contiene los eigenvalores simulados promediados y ajustados, que se usarán más adelante para la comparación.

Función nScree(): Kaiser + Scree + Análisis paralelo en una sola función. El paquete nFactors permite integrar todos los criterios anteriores usando la función nScree(). Esta función toma:

  • los eigenvalores reales

  • los eigenvalores simulados del análisis paralelo

  • información adicional si se trabaja con la matriz de correlaciones (cor = TRUE)

y produce una recomendación conjunta.

num_cp <- nScree(x = ev_cor$values,           # eigenvalores reales
                 aparallel = ap$eigen$qevpea, # eigenvalores simulados
                 cor       = TRUE       # indica que provienen de una matriz de correlaciones
                 )
num_cp
## $Components
##   noc naf nparallel nkaiser
## 1   1   1         1       1
## 
## $Analysis
##   Eigenvalues       Prop      Cumu Par.Analysis  Pred.eig     OC Acc.factor
## 1   2.4802416 0.62006039 0.6200604    1.1460230 1.3979327 (< OC)         NA
## 2   0.9897652 0.24744129 0.8675017    0.9951257 0.5396963         0.8572745
## 3   0.3565632 0.08914080 0.9566425    0.7977450        NA         0.4500689
## 4   0.1734301 0.04335752 1.0000000    0.5471219        NA                NA
##       AF
## 1 (< AF)
## 2       
## 3       
## 4       
## 
## $Model
## [1] "components"
## 
## attr(,"class")
## [1] "nScree"

La salida num_cp resume cuántos componentes recomienda cada criterio:

  • Regla de Kaiser: componentes con eigenvalor > 1.

  • Scree Test (Cattell): número de componentes hasta el “codo”.

  • Parallel analysis: eigenvalores observados mayores que los simulados.

  • nScree solution: recomendación final combinada.

Puede visualizarse con:

plotnScree(num_cp)

Esta gráfica muestra simultáneamente los eigenvalores reales y los simulados, así como las líneas marcando los puntos de corte según cada método.

Interpretación

Usar nScree() tiene la ventaja de ofrecer una visión amplia e integradora:

  • La regla de Kaiser es rápida pero puede sobreestimar componentes.

  • El scree plot puede ser subjetivo.

  • El análisis paralelo es el más estable y recomendado en literatura moderna.

  • La solución nScree combina los tres, ofreciendo un punto de vista equilibrado.

La recomendación final debe tomarse considerando la interpretación sustantiva del problema, la proporción de varianza explicada y la finalidad del PCA.

3.4 Visualización de los componentes principales

Una vez seleccionado el número adecuado de componentes principales, es fundamental apoyarse en diversas visualizaciones para interpretar la estructura de los datos y la contribución de las variables. En PCA, los gráficos más comunes son:

  • el score plot (individuos en el espacio de los componentes),

  • el loading plot (contribución de variables),

  • el biplot o bibiplot, que combina ambos.

3.4.1 Score plot: individuos en el espacio PCA

El score plot muestra las observaciones proyectadas en los ejes principales (típicamente PC1 y PC2). Permite identificar:

  • agrupamientos naturales,

  • valores atípicos,

  • diferencias entre grupos (si se colorean por una variable categórica).

Veamos un ejemplo en Factoextra

library(factoextra)

# PCA
pca_obj <- prcomp(datos, scale. = TRUE)

# Score plot PC1 vs PC2
fviz_pca_ind(pca_obj,
             geom = "point",
             pointsize = 2,
             col.ind = "steelblue",
             addEllipses = FALSE,
             title = "Score plot: individuos en el espacio PC1-PC2"
             )

3.4.2 Loading plot: contribución de las variables

Los loadings representan cuánto contribuye cada variable a los componentes principales.

Un loading alto (positivo o negativo) indica que la variable influye fuertemente en ese componente.

Las variables agrupadas en el gráfico suelen estar correlacionadas. En el plano definido por los componentes principales, el ángulo entre dos vectores (flechas) refleja el signo y la fuerza de la correlación entre las variables:

  • Ángulos menores a 90°: correlación positiva.

  • Ángulo aproximadamente de 90°: variables prácticamente no correlacionadas en el plano PC1–PC2.

  • Ángulos mayores a 90°: correlación negativa.

  • Ángulo cercano a 180°: correlación negativa muy fuerte.

fviz_pca_var(pca_obj,
             col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE, # evita que las etiquetas se traslapen
             title = "Loading plot: contribución de variables"
)

3.4.3 Biplot y Bibiplot

El biplot es una visualización conjunta de:

  • scores (puntos = observaciones)

  • loadings (flechas = variables)

Esto permite ver simultáneamente:

  • cómo se distribuyen las observaciones en el espacio PCA,

  • qué variables explican esa distribución.

Interpretación esencial del biplot

  • Flechas largas: variables con mayor contribución.

  • Flechas cercanas: variables correlacionadas.

  • Observaciones proyectadas en dirección de una flecha: altas en esa variable.

Ángulos entre flechas:

  • \(< 90\)°: correlación positiva

  • \(\sim 90\)°: independencia

  • \(> 90\)°: correlación negativa

En R base se puede obtener de la siguiente forma:

biplot(pca_obj, scale = 0, cex = 0.8)

Sin embargo, el biplot base suele ser poco estético y difícil de interpretar cuando hay muchas variables.

Con el paquete factoextra podemos personalizarlo un poco más.

fviz_pca_biplot(pca_obj,
                repel = TRUE,
                col.ind = "gray30",
                col.var = "firebrick",
                geom.ind = "point",
                label = "var",
                title = "Bibiplot de componentes principales"
                )

Se puede colorear individuos según un grupo. Vamos a agregar una columna de las regiones.

# Crear variable de grupo por región
region <- state.region   # vector ya incluido en R, en el mismo orden de estados

# Hacemos de nuevo el PCA
pca_obj <- prcomp(USArrests, scale. = TRUE)

fviz_pca_biplot(pca_obj,
                repel = TRUE,
                col.ind = region,      # vector con factor o variable categórica
                palette = "Dark2",
                geom.ind = "point",
                addEllipses = TRUE,
                title = "Bibiplot coloreado por grupo"
                )

3.4.4 Gráficos adicionales útiles

Además de los gráficos tradicionales del PCA (score plot, loading plot y biplot), existen otras visualizaciones que permiten comprender mejor la importancia y calidad de representación de cada variable en los componentes principales. A continuación se describen tres tipos de gráficos muy utilizados en análisis exploratorio: contribuciones, calidad de representación (\(\cos^2\)) y visualización separada de individuos y variables.

a) Contribuciones por componente: Las contribuciones indican qué porcentaje del total de varianza explicada por un componente proviene de cada variable. Este gráfico permite identificar cuáles variables son las más influyentes en cada componente principal.

fviz_contrib(pca_obj, choice = "var", axes = 1)

fviz_contrib(pca_obj, choice = "var", axes = 2)

Cómo interpretarlo:

  • Las barras más altas representan variables que explican mayor parte de la varianza del componente.

  • Una variable con alta contribución en PC1 influye más en la dirección en que PC1 separa las observaciones.

  • Si una variable contribuye poco a todos los componentes, tiene poca relevancia estructural para el PCA.

  • Factoextra suele marcar con una línea roja la “contribución esperada” si todas las variables aportaran por igual.

    • Barras por arriba de esa línea: variables relevantes.

    • Barras por abajo: variables menos informativas.

Es un gráfico muy útil para responder preguntas como:

“¿Qué variables están definiendo principalmente el primer componente?”

b) Mapa de calidad de representación (\(\cos^2\)): El valor \(\cos^2\) es la calidad de representación de una variable o individuo en el plano principal (usualmente PC1–PC2). Es decir, indica qué tan bien está proyectada la variable en ese plano.

fviz_pca_var(pca_obj,
             col.var = "cos2",
             gradient.cols = c("blue", "yellow", "red"),
             repel = TRUE
             )

Cómo interpretarlo:

  • Un valor alto de \(\cos^2\) (cercano a 1) indica que la variable está bien representada en el plano PC1–PC2.

  • Valores bajos (cercanos a 0) indican que la variable tiene componente importante en PC3, PC4, etc.

  • El color indica la calidad de representación:

    • Rojo: excelente representación (\(\cos^2\) alto)

    • Amarillo: intermedia

    • Azul: pobre representación

Regla práctica:

  • Solo interpretar direcciones, ángulos y correlaciones para variables con \(\cos^2\) alto.

  • Variables con \(\cos^2\) bajo pueden llevar a interpretaciones erróneas.

c) Variables y observaciones en paneles separados: Aunque el biplot combina individuos y variables en una sola figura, a veces es más claro analizarlos por separado:

fviz_pca_ind(pca_obj)

fviz_pca_var(pca_obj)

Gráfico Es útil para… Interpretación clave
Contribuciones Ver qué variables definen los componentes Barras grandes = variables muy influyentes
\(\cos^2\) Evaluar calidad de representación Colores cálidos = buena representación en PC1–PC2
Individuos Ver similitudes entre observaciones Puntos cercanos = perfiles similares
Variables Analizar correlaciones y direcciones Ángulos < 90° = correlación positiva; > 90° = correlación negativa

3.4.5 Recomendaciones prácticas de interpretación

Usar PC1 y PC2 como primera aproximación, pero revisar también PC3 si la varianza explicada no es alta. Interpretar siempre el biplot considerando:

  • magnitud y dirección de las flechas,

  • ángulos entre variables,

  • ubicación de individuos respecto a las flechas.

Evitar interpretaciones fuertes cuando las \(\cos^2\) sean bajas (mala representación en el plano).

3.5 Ejemplos con Bases de datos

En R existen varios paquetes que nos permiten realizar análisis de componentes principales. Algunas de las funciones son prcomp(), princomp(), PCA().

Los argumentos de la función prcomp() son:

  • x: una matriz numérica o dataframe.
  • scale: un valor lógico indicando si las variables deberían ser escaladas para tener varianza unitaria antes de realizar el análisis.

Los argumentos de princomp() son los siguientes:

  • x: una matrix numérica o dataframe.
  • cor: un valor lógico indicando si los datos se centraran y escalaran antes de realizar el análisis.
  • scores: un valor lógico indicando si se calcularan las coordenadas de cada componente principal.

Ambas funciones nos regresan los siguientes valores:

  • sdev: las desviaciones estándar de las componentes principales.
  • rotation, loadings: la matriz de las cargas donde las columnas son los eigenvectores.
  • center: las medias de las variables, las que fueron restadas.
  • scale: las desviaciones estandar de las variables.
  • x, scores: las coordenadas de las observaciones/individuos de las componentes principales.

Vamos a usar el paquete factoextra para visualizar los resultados.

library(factoextra)

Ejemplo 1: Vamos a cargar la base de datos siguiente:

NationalTrackRecords

library(readxl)
records <- read_excel("data/NationalTrackRecords2.xlsx")
## New names:
## • `` -> `...1`
head(records)
## # A tibble: 6 × 8
##   ...1     `100m` `200m` `400m` `800m` `1500m` `3000m` Marathon
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 argentin   11.6   22.9   54.5   2.15    4.43    9.79     179.
## 2 australi   11.2   22.4   51.1   1.98    4.13    9.08     152.
## 3 austria    11.4   23.1   50.6   1.99    4.22    9.34     159.
## 4 belgium    11.4   23.0   52     2       4.14    8.88     158.
## 5 bermuda    11.5   23.0   53.3   2.16    4.58    9.81     170.
## 6 brazil     11.3   23.2   52.8   2.1     4.49    9.77     169.

¿Necesitamos escalar los datos? ¿Cómo son las varianzas y covarianzas? ¿Es conveniente trabajar con la matriz de correlación en vez de con la de varianzas y covarianzas?

records2 <- records[,2:8]
rownames(records2) <- records$...1
var(records2)
cor(records2)

¿Es apropiado hacer un análisis de componentes principales? ¿por qué? Si lo es, ya que hay muchas correlaciones altas, entonces se podría disminuir la dimensión.

library(corrplot)
## corrplot 0.95 loaded
res1 <- cor.mtest(records2, conf.level= .95)
res2 <- cor.mtest(records2, conf.level= .99)
cor.mat <- cor(records2, use="complete.obs")

corrplot(cor.mat)

Vamos a calcular los componentes principales primero con la función princomp.

cp1 <- princomp(records2, cor = TRUE)
summary(cp1)
## Importance of components:
##                           Comp.1     Comp.2     Comp.3     Comp.4      Comp.5
## Standard deviation     2.4094991 0.80848347 0.54761522 0.35422802 0.231984732
## Proportion of Variance 0.8293837 0.09337793 0.04284035 0.01792536 0.007688131
## Cumulative Proportion  0.8293837 0.92276161 0.96560196 0.98352731 0.991215445
##                             Comp.6      Comp.7
## Standard deviation     0.197608919 0.149808546
## Proportion of Variance 0.005578469 0.003206086
## Cumulative Proportion  0.996793914 1.000000000

Con la instrucción loadings lo que obtenemos son las cargas de los componentes principales. Es decir, lo que obtenemos son los coeficientes que se usarán en las combinaciones lineales para calcular cada componente principal. Por ejemplo, para un conjunto de datos \(X_1, X_2,..., X_p\) la primera columna que está denotada por Comp.1 tiene los coeficientes \(\phi_{11}, \phi_{21},... ,\phi_{p1}\) de la combinación lineal con la que se obtiene la primera componente principal:

\[Z_1=\phi_{11}X_1+\phi_{21}X_2+... +\phi_{p1}X_p\]

Esta primera componente principal será la que refleje la mayor variabilidad de los datos. Las cargas son las entradas de cada eigenvector son las siguientes:

cp1$loadings
## 
## Loadings:
##          Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
## 100m      0.368  0.490  0.286  0.319  0.231  0.620       
## 200m      0.365  0.537  0.230               -0.711 -0.109
## 400m      0.382  0.247 -0.515 -0.347 -0.572  0.191  0.208
## 800m      0.385 -0.155 -0.585         0.620        -0.315
## 1500m     0.389 -0.360         0.430        -0.231  0.693
## 3000m     0.389 -0.348  0.153  0.363 -0.463        -0.598
## Marathon  0.367 -0.369  0.484 -0.672  0.131  0.142       
## 
##                Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
## SS loadings     1.000  1.000  1.000  1.000  1.000  1.000  1.000
## Proportion Var  0.143  0.143  0.143  0.143  0.143  0.143  0.143
## Cumulative Var  0.143  0.286  0.429  0.571  0.714  0.857  1.000

Usando estos valores, la fórmula de la primer componente principal se escribiría como:

\[(0.368, 0.365, 0.382,0.385,0.389, 0.389, 0.367)(100m-mean(100m), 200m-mean(200m),...,Marathon-mean(Marathon))\]

Las desviaciones estándar son las raíces de las lambdas.

cp1$sdev
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6    Comp.7 
## 2.4094991 0.8084835 0.5476152 0.3542280 0.2319847 0.1976089 0.1498085

Para calcular la varianza debemos elevar al cuadrado cada una de las entradas.

varianza.cp1 <- (cp1$sdev)^2
varianza.cp1
##     Comp.1     Comp.2     Comp.3     Comp.4     Comp.5     Comp.6     Comp.7 
## 5.80568576 0.65364552 0.29988243 0.12547749 0.05381692 0.03904928 0.02244260

Para obtener la proporción de la varianza que explica cada componente lo que tenemos que hacer es dividir el valor de la varianza de la componente \(j\) entre la suma de las varianzas de todas las componentes. El siguiente código muestra como realizarlo. Además, en la instrucción summary vemos que estos valores coinciden con los de la segunda fila.

proporcion.varianza.cp1 <- (cp1$sdev)^2/sum((cp1$sdev)^2)
proporcion.varianza.cp1
##      Comp.1      Comp.2      Comp.3      Comp.4      Comp.5      Comp.6 
## 0.829383680 0.093377931 0.042840347 0.017925356 0.007688131 0.005578469 
##      Comp.7 
## 0.003206086

Si lo que queremos es el porcentaje, entonces solo hay que multiplicar por 100

porcentaje_varianza <- (cp1$sdev)^2*100/sum((cp1$sdev)^2)
porcentaje_varianza
##     Comp.1     Comp.2     Comp.3     Comp.4     Comp.5     Comp.6     Comp.7 
## 82.9383680  9.3377931  4.2840347  1.7925356  0.7688131  0.5578469  0.3206086

Para encontrar la proporción de varianza acumulada, lo que tenemos que hacer es dividir la suma de los primeros \(j-\)ésimos eigenvalores entre entre la suma de todos los eigenvalores.

proporcion_acumulada_varianza <- cumsum(proporcion.varianza.cp1)
proporcion_acumulada_varianza
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6    Comp.7 
## 0.8293837 0.9227616 0.9656020 0.9835273 0.9912154 0.9967939 1.0000000

Cálculamos los eigenvalores de la matriz cuadrada de correlación.

eigen_base <- (eigen(cor.mat))
eigen_base
## eigen() decomposition
## $values
## [1] 5.80568576 0.65364552 0.29988243 0.12547749 0.05381692 0.03904928 0.02244260
## 
## $vectors
##            [,1]       [,2]        [,3]        [,4]        [,5]         [,6]
## [1,] -0.3683561  0.4900597  0.28601157 -0.31938631 -0.23116950 -0.619825234
## [2,] -0.3653642  0.5365800  0.22981913  0.08330196 -0.04145457  0.710764580
## [3,] -0.3816103  0.2465377 -0.51536655  0.34737748  0.57217791 -0.190945970
## [4,] -0.3845592 -0.1554023 -0.58452608  0.04207636 -0.62032379  0.019089032
## [5,] -0.3891040 -0.3604093 -0.01291198 -0.42953873 -0.03026144  0.231248381
## [6,] -0.3888661 -0.3475394  0.15272772 -0.36311995  0.46335476 -0.009277159
## [7,] -0.3670038 -0.3692076  0.48437037  0.67249685 -0.13053590 -0.142280558
##             [,7]
## [1,]  0.05217655
## [2,] -0.10922503
## [3,]  0.20849691
## [4,] -0.31520972
## [5,]  0.69256151
## [6,] -0.59835943
## [7,]  0.06959828

La varianza de las Componentes Principales, es igual a los eigenvalores. Es decir, la desviación estándar de las componentes, es igual a la raíz de los valores propios.

desv_base <- cp1$sdev
desv_base
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6    Comp.7 
## 2.4094991 0.8084835 0.5476152 0.3542280 0.2319847 0.1976089 0.1498085
desv_rounded_base <- round(cp1$sdev, 1)
desv_rounded_base
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 
##    2.4    0.8    0.5    0.4    0.2    0.2    0.1
round(sqrt(eigen_base$values),1) == desv_rounded_base
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 
##   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE

Por otra parte, se puede afirmar que la traza de la matriz lambda es igual a la suma de la varianza de cada valor observado.

lambda_matriz <- round(diag(eigen_base$values), 2)
lambda_matriz
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] 5.81 0.00  0.0 0.00 0.00 0.00 0.00
## [2,] 0.00 0.65  0.0 0.00 0.00 0.00 0.00
## [3,] 0.00 0.00  0.3 0.00 0.00 0.00 0.00
## [4,] 0.00 0.00  0.0 0.13 0.00 0.00 0.00
## [5,] 0.00 0.00  0.0 0.00 0.05 0.00 0.00
## [6,] 0.00 0.00  0.0 0.00 0.00 0.04 0.00
## [7,] 0.00 0.00  0.0 0.00 0.00 0.00 0.02
traza_lambda <- sum(diag(lambda_matriz))
traza_lambda
## [1] 7

Además, el porcentaje de la varianza generalizada que es explicado por la componente \(j\)-ésima es igual a la relación que hay entre los eigenvalores divididos por la suma de la diagonal de eigenvalores. Es decir, esto es igual al porcentaje de varianza acumulada por la función summary, y hecho a mano con la suma acumulada de los valores propios.

cumsum(eigen_base$values/traza_lambda) 
## [1] 0.8293837 0.9227616 0.9656020 0.9835273 0.9912154 0.9967939 1.0000000

Esta matriz es la diagonal con los eigenvalores.

lambda_matriz <- round(diag(eigen_base$values), 2)
lambda_matriz
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] 5.81 0.00  0.0 0.00 0.00 0.00 0.00
## [2,] 0.00 0.65  0.0 0.00 0.00 0.00 0.00
## [3,] 0.00 0.00  0.3 0.00 0.00 0.00 0.00
## [4,] 0.00 0.00  0.0 0.13 0.00 0.00 0.00
## [5,] 0.00 0.00  0.0 0.00 0.05 0.00 0.00
## [6,] 0.00 0.00  0.0 0.00 0.00 0.04 0.00
## [7,] 0.00 0.00  0.0 0.00 0.00 0.00 0.02

La traza de la matriz \(\Lambda\) es igual a la suma de las varianzas acumuladas por los Componentes.

traza_lambda <- sum(diag(lambda_matriz))
traza_lambda
## [1] 7

Una forma de ver con cuantos componentes nos conviene trabajar es con el gráfico de codo.

screeplot(cp1, type="lines")

¿Con cuántas componentes nos conviene quedarnos?

El biplot es una forma de representar los resultados de PCA.

biplot(cp1)

Vamos a analizar el biplot a detalle.

¿Qué mide la primera componente? o ¿Cómo la interpretas?

La interpretación no se hace en función delos individuos sino de las variables que explica cada componente. Como en esta primer componente, todas las cargas son positivas y muy similares para todas las variables, podríamos nombrar a esta variable “velocidad en las carreras” por ejemplo.

En el biplot, los países que quedan a la derecha del cero, ¿qué tipo de corredores tienen? Los lentos.

En el biplot, los países que quedan con puntajes altos en la segunda componente, tienen velocistas rápidos y fondistas lentos o viceversa?

Los pesos positivos están en las carreras de velocidad y los pesos negativos en las de fondo. Es decir, un país con valores altos (tiempos grandes) en las carreras X100, X200, X400, tendrá valores positivos y grandes al multiplicar por las cargas de componente 2, y sí tiene tiempos bajos en las carreras de fondo, al multiplicar por las cargas negativas de la componente 2, el score para ese país en el componente 2 será positivo. Caso contrario pasaría con un país con tiempos cortos en las carreras de 100 a 200 m, y tiempos largos en las carreras de fondo.

¿En qué cuadrante se encuentran los países que tienen a los velocistas más rápidos? Sería III, pues es el cuadrante opuesto a la dirección de los vectores de las variables X100, X200, X400 ( cuadrante I, en donde se ubican los velocistas más lentos).

¿En qué cuadrante se encuentran los países que tienen a los fondistas más rápidos? Sería el cuadrante II, opuesto a la dirección de los vectores de marathon, X800, X1500 (ubicados en cuadrante IV, en donde están los fondistas mas lentos).

¿Qué país tiene los velocistas más lentos? Sí observas el biplot CP1 vs CP2, Cookis está hacia donde están apuntando los vectores positivos de las carreras de velocidad, lo cual quiere decir que ese país tiene tiempos largos en esas carreras de velocidad y en consecuencia, su score en componente 2 resulta muy positiva.

¿Qué país tiene los fondistas más lentos?

Sí observas el biplot CP1 vs CP2, wsamoa está hacia donde están apuntando los vectores de las carreras de fondo (X800, X1500, Xmarathon), lo cual quiere decir que ese país tiene tiempos largos en esas carreras de fondo y en consecuencia, su score en componente 2 resulta muy negativa.

Ejemplo 2: Vamos a cargar la base de datos decathlon2 del paquete factoextra y vamos a extraer los individuos del 1:23 y las variables 1:10.

data("decathlon2")
decathlon2_activos <- decathlon2[1:23,1:10]
head(decathlon2_activos[,1:6])
##           X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## SEBRLE    11.04      7.58    14.83      2.07 49.81        14.69
## CLAY      10.76      7.40    14.26      1.86 49.37        14.05
## BERNARD   11.02      7.23    14.25      1.92 48.93        14.99
## YURKOV    11.34      7.09    15.19      2.10 50.42        15.31
## ZSIVOCZKY 11.13      7.30    13.48      2.01 48.62        14.17
## McMULLEN  10.83      7.31    13.76      2.13 49.91        14.38

¿Necesitamos escalar los datos? ¿Cómo son las varianzas y covarianzas?

var(decathlon2_activos)
cor(decathlon2_activos)

Vamos a calcular la matriz de correlaciones.

library(corrplot)
res1 <- cor.mtest(decathlon2_activos, conf.level= .95)
res2 <- cor.mtest(decathlon2_activos, conf.level= .99)
cor.mat <- cor(decathlon2_activos, use="complete.obs")

corrplot(cor.mat)

Removemos algunas de las variables correlacionadas.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
base.cp1 <- decathlon2_activos
base.cp1 <- base.cp1 %>%
    dplyr::select(-Pole.vault)
cor.mat.aj <- cor(base.cp1, use = "complete.obs")
corrplot(cor.mat.aj)

Usaremos la función prcomp() y primero realizaremos el análisis sin quitar la variable anterior.

res.pca <- prcomp(decathlon2_activos, scale = TRUE )

Visualizamos lo eigenvalores.

fviz_eig(res.pca)

summary(res.pca)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6     PC7
## Standard deviation     2.0308 1.3559 1.1132 0.90523 0.83759 0.65029 0.55007
## Proportion of Variance 0.4124 0.1839 0.1239 0.08194 0.07016 0.04229 0.03026
## Cumulative Proportion  0.4124 0.5963 0.7202 0.80213 0.87229 0.91458 0.94483
##                            PC8     PC9   PC10
## Standard deviation     0.52390 0.39398 0.3492
## Proportion of Variance 0.02745 0.01552 0.0122
## Cumulative Proportion  0.97228 0.98780 1.0000

¿Cuál es la proporción de la varianza explicada de las componentes?

¿Con cuántas componentes nos conviene quedarnos? ¿Porqué?

Vamos a graficar a los individuos y corolearlos por perfiles similares.

fviz_pca_ind(res.pca,
             col.ind = "cos2", # color por la calidad de representación
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE     # evitar que se sobrelape el texto
             )

Para graficar las variables y ver sus correlaciones realizamos lo siguiente. Variables correlacionadas negativamente apuntan a lados opuestos.

fviz_pca_var(res.pca,
             col.var = "contrib", # Color por contribución al PCA
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE    
             )

Un objeto importante en estos análisis de PCA son los biplots.

fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF", # Variables 
                col.ind = "#696969"  # Individuos
                )

fviz_pca_biplot(res.pca, repel = TRUE, axes = c(1,3),
                col.var = "#2E9FDF", # Variables 
                col.ind = "#696969"  # Individuos
                )

Vamos a acceder a los resultados del PCA.

# Eigenvalores
eig.val <- get_eigenvalue(res.pca)
eig.val
##        eigenvalue variance.percent cumulative.variance.percent
## Dim.1   4.1242133        41.242133                    41.24213
## Dim.2   1.8385309        18.385309                    59.62744
## Dim.3   1.2391403        12.391403                    72.01885
## Dim.4   0.8194402         8.194402                    80.21325
## Dim.5   0.7015528         7.015528                    87.22878
## Dim.6   0.4228828         4.228828                    91.45760
## Dim.7   0.3025817         3.025817                    94.48342
## Dim.8   0.2744700         2.744700                    97.22812
## Dim.9   0.1552169         1.552169                    98.78029
## Dim.10  0.1219710         1.219710                   100.00000
# Resulados para las variables
res.var <- get_pca_var(res.pca)
res.var$coord          # Coordenadas
##                     Dim.1       Dim.2       Dim.3       Dim.4      Dim.5
## X100m        -0.850625692 -0.17939806 -0.30155643  0.03357320 -0.1944440
## Long.jump     0.794180641  0.28085695  0.19054653 -0.11538956  0.2331567
## Shot.put      0.733912733  0.08540412 -0.51759781  0.12846837 -0.2488129
## High.jump     0.610083985 -0.46521415 -0.33008517  0.14455012  0.4027002
## X400m        -0.701603377  0.29017826 -0.28353292  0.43082552  0.1039085
## X110m.hurdle -0.764125197 -0.02474081 -0.44888733 -0.01689589  0.2242200
## Discus        0.743209016  0.04966086 -0.17652518  0.39500915 -0.4082391
## Pole.vault   -0.217268042  0.80745110 -0.09405773 -0.33898477 -0.2216853
## Javeline      0.428226639  0.38610928 -0.60412432 -0.33173454  0.1978128
## X1500m        0.004278487  0.78448019  0.21947068  0.44800961  0.2632527
##                     Dim.6        Dim.7        Dim.8       Dim.9       Dim.10
## X100m        -0.035374780 -0.091336386 -0.104716925 -0.30306448  0.044417974
## Long.jump     0.033727883 -0.154330810 -0.397380703 -0.05158951  0.029719453
## Shot.put      0.239789034 -0.009886612  0.024359049  0.04778655  0.217451948
## High.jump     0.284644846  0.028157465  0.084405578 -0.11213822 -0.133566774
## X400m         0.049289996  0.286106008 -0.233552216  0.08216041 -0.034170673
## X110m.hurdle -0.002632395 -0.370072158 -0.008344682  0.16176025 -0.015629914
## Discus       -0.198544870 -0.142725641 -0.039559255  0.01336209 -0.172590426
## Pole.vault    0.327464549 -0.010393176  0.032914942 -0.02576874 -0.137211339
## Javeline     -0.362097598  0.133564318  0.052841099 -0.04045397 -0.003854347
## X1500m       -0.042050151 -0.111367083  0.194469730 -0.10224014  0.062834809
res.var$contrib        # Contribuciones a las componentes
##                     Dim.1      Dim.2      Dim.3       Dim.4     Dim.5
## X100m        1.754429e+01  1.7505098  7.3386590  0.13755240  5.389252
## Long.jump    1.529317e+01  4.2904162  2.9300944  1.62485936  7.748815
## Shot.put     1.306014e+01  0.3967224 21.6204325  2.01407269  8.824401
## High.jump    9.024811e+00 11.7715838  8.7928883  2.54987951 23.115504
## X400m        1.193554e+01  4.5799296  6.4876363 22.65090599  1.539012
## X110m.hurdle 1.415754e+01  0.0332933 16.2612611  0.03483735  7.166193
## Discus       1.339309e+01  0.1341398  2.5147385 19.04132022 23.755756
## Pole.vault   1.144592e+00 35.4618611  0.7139512 14.02307063  7.005084
## Javeline     4.446377e+00  8.1086683 29.4531777 13.42963254  5.577615
## X1500m       4.438531e-04 33.4728757  3.8871610 24.49386930  9.878367
##                     Dim.6       Dim.7       Dim.8      Dim.9      Dim.10
## X100m         0.295915322  2.75705260  3.99520353 59.1740009  1.61756139
## Long.jump     0.269003613  7.87159392 57.53322220  1.7146826  0.72414393
## Shot.put     13.596858744  0.03230371  0.21618512  1.4712015 38.76768578
## High.jump    19.159607001  0.26202607  2.59565787  8.1015517 14.62649091
## X400m         0.574509906 27.05274658 19.87344405  4.3489667  0.95730504
## X110m.hurdle  0.001638634 45.26163460  0.02537025 16.8579392  0.20028870
## Discus        9.321746508  6.73226823  0.57016606  0.1150295 24.42174410
## Pole.vault   25.357622290  0.03569883  0.39472201  0.4278065 15.43559151
## Javeline     31.004964393  5.89573984  1.01729950  1.0543458  0.01217993
## X1500m        0.418133591  4.09893563 13.77872941  6.7344755  3.23700871
res.var$cos2           # Calidad de la representación
##                     Dim.1        Dim.2       Dim.3        Dim.4      Dim.5
## X100m        7.235641e-01 0.0321836641 0.090936280 0.0011271597 0.03780845
## Long.jump    6.307229e-01 0.0788806285 0.036307981 0.0133147506 0.05436203
## Shot.put     5.386279e-01 0.0072938636 0.267907488 0.0165041211 0.06190783
## High.jump    3.722025e-01 0.2164242070 0.108956221 0.0208947375 0.16216747
## X400m        4.922473e-01 0.0842034209 0.080390914 0.1856106269 0.01079698
## X110m.hurdle 5.838873e-01 0.0006121077 0.201499837 0.0002854712 0.05027463
## Discus       5.523596e-01 0.0024662013 0.031161138 0.1560322304 0.16665918
## Pole.vault   4.720540e-02 0.6519772763 0.008846856 0.1149106765 0.04914437
## Javeline     1.833781e-01 0.1490803723 0.364966189 0.1100478063 0.03912992
## X1500m       1.830545e-05 0.6154091638 0.048167378 0.2007126089 0.06930197
##                     Dim.6        Dim.7        Dim.8        Dim.9       Dim.10
## X100m        1.251375e-03 0.0083423353 1.096563e-02 0.0918480768 1.972956e-03
## Long.jump    1.137570e-03 0.0238179990 1.579114e-01 0.0026614779 8.832459e-04
## Shot.put     5.749878e-02 0.0000977451 5.933633e-04 0.0022835540 4.728535e-02
## High.jump    8.102269e-02 0.0007928428 7.124302e-03 0.0125749811 1.784008e-02
## X400m        2.429504e-03 0.0818566479 5.454664e-02 0.0067503333 1.167635e-03
## X110m.hurdle 6.929502e-06 0.1369534023 6.963371e-05 0.0261663784 2.442942e-04
## Discus       3.942007e-02 0.0203706085 1.564935e-03 0.0001785453 2.978746e-02
## Pole.vault   1.072330e-01 0.0001080181 1.083393e-03 0.0006640282 1.882695e-02
## Javeline     1.311147e-01 0.0178394271 2.792182e-03 0.0016365234 1.485599e-05
## X1500m       1.768215e-03 0.0124026272 3.781848e-02 0.0104530472 3.948213e-03
# Resultados para individuos
res.ind <- get_pca_ind(res.pca)
res.ind$coord          
##                  Dim.1      Dim.2       Dim.3       Dim.4         Dim.5
## SEBRLE       0.1912074  1.5541282 -0.62836882  0.08205241  1.1426139415
## CLAY         0.7901217  2.4204156  1.35688701  1.26984296 -0.8068483724
## BERNARD     -1.3292592  1.6118687 -0.19614996 -1.92092203  0.0823428202
## YURKOV      -0.8694134 -0.4328779 -2.47398223  0.69723814  0.3988584116
## ZSIVOCZKY   -0.1057450 -2.0233632  1.30493117 -0.09929630 -0.1970241089
## McMULLEN     0.1185550 -0.9916237  0.84355824  1.31215266  1.5858708644
## MARTINEAU   -2.3923532 -1.2849234 -0.89816842  0.37309771 -2.2433515889
## HERNU       -1.8910497  1.1784614 -0.15641037  0.89130068 -0.1267412520
## BARRAS      -1.7744575 -0.4125321  0.65817750  0.22872866 -0.2338366980
## NOOL        -2.7770058 -1.5726757  0.60724821 -1.55548081  1.4241839810
## BOURGUIGNON -4.4137335  1.2635770 -0.01003734  0.66675478  0.4191518468
## Sebrle       3.4514485  1.2169193 -1.67816711 -0.80870696 -0.0250530746
## Clay         3.3162243  1.6232908 -0.61840443 -0.31679906  0.5691645854
## Karpov       4.0703560 -0.7983510  1.01501662  0.31336354 -0.7974259553
## Macey        1.8484623 -2.0638828 -0.97928455  0.58469073 -0.0002157834
## Warners      1.3873514  0.2819083  1.99969621 -1.01959817 -0.0405401497
## Zsivoczky    0.4715533 -0.9267436 -1.72815525 -0.18483138  0.4073029909
## Hernu        0.2763118 -1.1657260  0.17056375 -0.84869401 -0.6894795441
## Bernard      1.3672590 -1.4780354  0.83137913  0.74531557  0.8598016482
## Schwarzl    -0.7102777  0.6584251  1.04075176 -0.92717510 -0.2887568007
## Pogorelov   -0.2143524  0.8610557  0.29761010  1.35560294 -0.0150531057
## Schoenbeck  -0.4953166  1.3000530  0.10300360 -0.24927712 -0.6452257128
## Barras      -0.3158867 -0.8193681 -0.86169481 -0.58935985 -0.7797389436
##                   Dim.6       Dim.7        Dim.8        Dim.9      Dim.10
## SEBRLE       0.46389755 -0.20796012  0.043460568 -0.659344137  0.03273238
## CLAY        -1.30420016 -0.21291866  0.617240611 -0.060125359 -0.31716015
## BERNARD      0.40062867 -0.40643754  0.703856040  0.170083313 -0.09908142
## YURKOV      -0.10286344 -0.32487448  0.114996135 -0.109524039 -0.11969720
## ZSIVOCZKY   -0.89554111  0.08825624 -0.202341299 -0.523103099 -0.34842265
## McMULLEN    -0.18657283  0.47828432  0.293089967 -0.105623196 -0.39317797
## MARTINEAU    0.45666350 -0.29975522 -0.291628488 -0.223417655 -0.61640509
## HERNU       -0.43623496 -0.56609980 -1.529404317  0.006184409  0.55368016
## BARRAS      -0.09026010  0.21594095  0.682583078 -0.669282042  0.53085420
## NOOL        -0.49716399 -0.53205687 -0.433385655 -0.115777808 -0.09622142
## BOURGUIGNON  0.08200220 -0.59833739  0.563619921  0.525814030  0.05855882
## Sebrle       0.08279306  0.01016177 -0.030585843 -0.847210682  0.21970353
## Clay        -0.77715960  0.25750851 -0.580638301  0.409776590 -0.61601933
## Karpov       0.32958134 -1.36365568  0.345306381  0.193055107  0.21721852
## Macey        0.19728082 -0.26927772 -0.363219506  0.368260269  0.21249474
## Warners      0.55673300 -0.26739400 -0.109470797  0.180283071  0.24208420
## Zsivoczky    0.11383190  0.03991159  0.538039776  0.585966156 -0.14271715
## Hernu        0.33168404  0.44308686  0.247293566  0.066908586 -0.20868256
## Bernard      0.32806564  0.36357920  0.006165316  0.279488675  0.32067773
## Schwarzl     0.68891640  0.56568604 -0.687053339 -0.008358849 -0.30211546
## Pogorelov    1.59379599  0.78370119 -0.037623661 -0.130531397 -0.03697576
## Schoenbeck  -0.16172381  0.85752368 -0.255850722  0.564222295  0.29680481
## Barras      -1.17415412  0.94512710  0.365550568  0.102255763  0.61186706
res.ind$contrib        
##                   Dim.1      Dim.2        Dim.3       Dim.4        Dim.5
## SEBRLE       0.03854254  5.7118249 1.385418e+00  0.03572215 8.091161e+00
## CLAY         0.65814114 13.8541889 6.460097e+00  8.55568792 4.034555e+00
## BERNARD      1.86273218  6.1441319 1.349983e-01 19.57827284 4.202070e-02
## YURKOV       0.79686310  0.4431309 2.147558e+01  2.57939100 9.859373e-01
## ZSIVOCZKY    0.01178829  9.6816398 5.974848e+00  0.05231437 2.405750e-01
## McMULLEN     0.01481737  2.3253860 2.496789e+00  9.13531719 1.558646e+01
## MARTINEAU    6.03367104  3.9044125 2.830527e+00  0.73858431 3.118936e+01
## HERNU        3.76996156  3.2842176 8.583863e-02  4.21505626 9.955149e-02
## BARRAS       3.31942012  0.4024544 1.519980e+00  0.27758505 3.388731e-01
## NOOL         8.12988880  5.8489726 1.293851e+00 12.83761115 1.257025e+01
## BOURGUIGNON 20.53729577  3.7757623 3.534995e-04  2.35877858 1.088816e+00
## Sebrle      12.55838616  3.5020697 9.881482e+00  3.47006223 3.889859e-03
## Clay        11.59361384  6.2315181 1.341828e+00  0.53250375 2.007648e+00
## Karpov      17.46609555  1.5072627 3.614914e+00  0.52101693 3.940874e+00
## Macey        3.60207087 10.0732890 3.364879e+00  1.81387486 2.885677e-07
## Warners      2.02910262  0.1879390 1.403071e+01  5.51585696 1.018550e-02
## Zsivoczky    0.23441891  2.0310492 1.047894e+01  0.18126182 1.028128e+00
## Hernu        0.08048777  3.2136178 1.020764e-01  3.82170515 2.946148e+00
## Bernard      1.97075488  5.1661961 2.425213e+00  2.94737426 4.581507e+00
## Schwarzl     0.53184785  1.0252129 3.800546e+00  4.56119277 5.167449e-01
## Pogorelov    0.04843819  1.7533304 3.107757e-01  9.75034337 1.404313e-03
## Schoenbeck   0.25864068  3.9969003 3.722687e-02  0.32970059 2.580092e+00
## Barras       0.10519467  1.5876667 2.605305e+00  1.84296038 3.767994e+00
##                   Dim.6        Dim.7        Dim.8        Dim.9      Dim.10
## SEBRLE       2.21256620  0.621426384 2.992045e-02 12.177477305  0.03819185
## CLAY        17.48801877  0.651413899 6.035125e+00  0.101262442  3.58568943
## BERNARD      1.65019840  2.373652810 7.847747e+00  0.810319793  0.34994507
## YURKOV       0.10878629  1.516564073 2.094806e-01  0.336009790  0.51072064
## ZSIVOCZKY    8.24561722  0.111923276 6.485544e-01  7.664919832  4.32741147
## McMULLEN     0.35788945  3.287016354 1.360753e+00  0.312501167  5.51053518
## MARTINEAU    2.14409841  1.291109482 1.347216e+00  1.398195851 13.54402896
## HERNU        1.95655942  4.604850849 3.705288e+01  0.001071345 10.92781554
## BARRAS       0.08376135  0.670038259 7.380544e+00 12.547331617 10.04537028
## NOOL         2.54127369  4.067669683 2.975270e+00  0.375477289  0.33003418
## BOURGUIGNON  0.06913582  5.144247534 5.032108e+00  7.744571086  0.12223626
## Sebrle       0.07047579  0.001483775 1.481898e-02 20.105546253  1.72063803
## Clay         6.20972751  0.952824148 5.340583e+00  4.703566841 13.52708188
## Karpov       1.11680500 26.720158115 1.888802e+00  1.043988269  1.68193477
## Macey        0.40014909  1.041910483 2.089853e+00  3.798767930  1.60957713
## Warners      3.18673563  1.027384225 1.898339e-01  0.910422384  2.08904756
## Zsivoczky    0.13322327  0.022889042 4.585705e+00  9.617852173  0.72605208
## Hernu        1.13110069  2.821027418 9.687304e-01  0.125399768  1.55234328
## Bernard      1.10655655  1.899449022 6.021268e-04  2.188071254  3.66566729
## Schwarzl     4.87961053  4.598122119 7.477531e+00  0.001957159  3.25357879
## Pogorelov   26.11665608  8.825322559 2.242329e-02  0.477268755  0.04873597
## Schoenbeck   0.26890572 10.566272800 1.036933e+00  8.917302863  3.14020004
## Barras      14.17432302 12.835417603 2.116763e+00  0.292892746 13.34533825
res.ind$cos2            
##                   Dim.1      Dim.2        Dim.3       Dim.4        Dim.5
## SEBRLE      0.007530179 0.49747323 8.132523e-02 0.001386688 2.689027e-01
## CLAY        0.048701249 0.45701660 1.436281e-01 0.125791741 5.078506e-02
## BERNARD     0.197199804 0.28996555 4.294015e-03 0.411819183 7.567259e-04
## YURKOV      0.096109800 0.02382571 7.782303e-01 0.061812637 2.022798e-02
## ZSIVOCZKY   0.001574385 0.57641944 2.397542e-01 0.001388216 5.465497e-03
## McMULLEN    0.002175437 0.15219499 1.101379e-01 0.266486530 3.892621e-01
## MARTINEAU   0.404013915 0.11654676 5.694575e-02 0.009826320 3.552552e-01
## HERNU       0.399282749 0.15506199 2.731529e-03 0.088699901 1.793538e-03
## BARRAS      0.616241975 0.03330700 8.478249e-02 0.010239088 1.070152e-02
## NOOL        0.489872515 0.15711146 2.342405e-02 0.153694675 1.288433e-01
## BOURGUIGNON 0.859698130 0.07045912 4.446015e-06 0.019618511 7.753120e-03
## Sebrle      0.675380606 0.08395940 1.596674e-01 0.037079012 3.558507e-05
## Clay        0.687592867 0.16475409 2.391051e-02 0.006274965 2.025440e-02
## Karpov      0.783666922 0.03014772 4.873187e-02 0.004644764 3.007790e-02
## Macey       0.363436037 0.45308203 1.020057e-01 0.036362957 4.952707e-09
## Warners     0.255651956 0.01055582 5.311341e-01 0.138081100 2.182965e-04
## Zsivoczky   0.045053176 0.17401353 6.051030e-01 0.006921739 3.361236e-02
## Hernu       0.024824321 0.44184663 9.459148e-03 0.234196727 1.545686e-01
## Bernard     0.289347476 0.33813318 1.069834e-01 0.085980212 1.144234e-01
## Schwarzl    0.116721435 0.10030142 2.506043e-01 0.198892209 1.929118e-02
## Pogorelov   0.007803472 0.12591966 1.504272e-02 0.312101619 3.848427e-05
## Schoenbeck  0.067070098 0.46204603 2.900467e-03 0.016987442 1.138116e-01
## Barras      0.018972684 0.12765099 1.411800e-01 0.066043061 1.156018e-01
##                    Dim.6        Dim.7        Dim.8        Dim.9       Dim.10
## SEBRLE      0.0443241299 8.907507e-03 3.890334e-04 8.954067e-02 0.0002206741
## CLAY        0.1326907339 3.536548e-03 2.972084e-02 2.820119e-04 0.0078471026
## BERNARD     0.0179131165 1.843634e-02 5.529104e-02 3.228572e-03 0.0010956493
## YURKOV      0.0013453555 1.341980e-02 1.681440e-03 1.525225e-03 0.0018217256
## ZSIVOCZKY   0.1129176906 1.096685e-03 5.764478e-03 3.852703e-02 0.0170924251
## McMULLEN    0.0053876990 3.540616e-02 1.329562e-02 1.726733e-03 0.0239268142
## MARTINEAU   0.0147210347 6.342774e-03 6.003515e-03 3.523552e-03 0.0268211980
## HERNU       0.0212478795 3.578167e-02 2.611676e-01 4.270425e-06 0.0342288717
## BARRAS      0.0015944528 9.126203e-03 9.118662e-02 8.766746e-02 0.0551531863
## NOOL        0.0157010551 1.798232e-02 1.193105e-02 8.514912e-04 0.0005881295
## BOURGUIGNON 0.0002967459 1.579887e-02 1.401866e-02 1.220108e-02 0.0001513277
## Sebrle      0.0003886276 5.854423e-06 5.303795e-05 4.069384e-02 0.0027366539
## Clay        0.0377627839 4.145976e-03 2.107924e-02 1.049876e-02 0.0237264222
## Karpov      0.0051379747 8.795817e-02 5.639959e-03 1.762907e-03 0.0022318265
## Macey       0.0041397727 7.712721e-03 1.403282e-02 1.442502e-02 0.0048028954
## Warners     0.0411689767 9.496848e-03 1.591742e-03 4.317040e-03 0.0077841113
## Zsivoczky   0.0026253777 3.227467e-04 5.865332e-02 6.956790e-02 0.0041268259
## Hernu       0.0357707217 6.383462e-02 1.988402e-02 1.455601e-03 0.0141595965
## Bernard     0.0166586433 2.046050e-02 5.883405e-06 1.209056e-02 0.0159167991
## Schwarzl    0.1098063093 7.403638e-02 1.092132e-01 1.616543e-05 0.0211173850
## Pogorelov   0.4314162233 1.043115e-01 2.404103e-04 2.893750e-03 0.0002322016
## Schoenbeck  0.0071500829 2.010275e-01 1.789520e-02 8.702893e-02 0.0240826922
## Barras      0.2621297474 1.698426e-01 2.540745e-02 1.988116e-03 0.0711836486

El conjunto de datos tiene unas variables categóricas en la columna 13 que se quitó al inicio que corresponde al tipo de competición. Vamos a usar esa variable para agrupar los individuos.

groups <- as.factor(decathlon2$Competition[1:23])
fviz_pca_ind(res.pca,
             col.ind = groups, # color by groups
             palette = c("#00AFBB",  "#FC4E07"),
             addEllipses = TRUE, # Concentration ellipses
             ellipse.level=0.7,
             legend.title = "Groups",
             repel = TRUE
             )

Explica las componentes. ¿Cómo podrías llamar a las componentes 1 y 2?

3.6 Ejercicios PCA

Ejercicio 1: Carga la base de datos siguiente y realiza el análisis de componentes principales. Decide y justifica que matriz usaras, la de varianzas y covarianzas o la de correlaciones. ¿Con cuántas componentes te quedarías? ¿por qué? ¿Qué explica cada componente de las que te quedaste? ¿Cuál es la varianza total explicada por esas componentes? ¿Qué tortuga es la más grande? ¿Qué variable tiene la mayor varianza? ¿Las variables están correlacionadas positivamente? ¿Porqué?

Tortugas

library(readr)
turtledata <- read_delim("data/turtledata.csv", 
    delim = ";", escape_double = FALSE, trim_ws = TRUE)
## Rows: 48 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## dbl (4): length, width, height, female
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Ejercicio 2: Trabajaremos con la base de datos Whisky, disponible en la librería FactoClass. Esta base contiene información de 35 marcas de whisky, a cada una de las cuales se le miden las siguientes variables cuantitativas:

  • price: precio en francos franceses;

  • malt: proporción de malta añadida;

  • aging: años de añejamiento;

  • taste: calificación promedio otorgada por un panel de catadores.

Además, se incluye una variable categórica:

  • type: clasificación del whisky según su contenido de malta (1 = bajo, 2 = medio, 3 = puro).
library(FactoClass)
## Cargando paquete requerido: ade4
## Cargando paquete requerido: ggrepel
## Cargando paquete requerido: xtable
## Cargando paquete requerido: scatterplot3d
data(Whisky)
head(Whisky)
##   price malt type aging taste
## 1    70   20  low   5.0     3
## 2    60   20  low   5.0     2
## 3    65   20  low   7.5     2
## 4    74   25  low  12.0     2
## 5    70   25  low  12.0     3
## 6    73   30  low   5.0     0

Utiliza esta base para responder las siguientes preguntas.

  1. ¿Por qué sería conveniente aplicar PCA a esta base de datos? ¿Es importante estandarizar los datos?

  2. ¿Cuántas componentes principales serán necesarios para el análisis?

  3. ¿Cuál es la variable que más contribuye en cada eje? ¿Cuál es la que menos contribuye?

  4. ¿Qué representa el primer eje? ¿Qué nombre le asignaría? ¿Qué representa el segundo eje?

  5. ¿Cuál es el individuo mejor representado en el primer plano factorial? ¿Cuál es la peor?

  6. ¿Cómo podemos representar los niveles en los datos en las dos primeras componentes?

Ejercicio tomado de https://rpubs.com/JairoAyala/PCA.

Ejercicio 3: En este ejercicio trabajarás con el conjunto de datos Glass Identification, disponible en datos y descripciones . Este dataset contiene mediciones químicas sobre muestras de vidrio, con el objetivo original de clasificar cada muestra según su tipo (ventanas, recipientes, vidrio flotado, etc.).

El conjunto incluye n = 214 observaciones y p = 9 variables numéricas asociadas a la composición química del vidrio:

  • RI: índice de refracción

  • Na: Sodio

  • Mg: Magnesio

  • Al: Aluminio

  • Si: Silicio

  • K: Potasio

  • Ca: Calcio

  • Ba: Bario

  • Fe: Hierro

Además, contiene una variable categórica Type que identifica el tipo de vidrio (1–7). Este set de datos fue descargado de UCI Machine Learning Repository.

Aplica un análisis de componentes principales (PCA) para:

  1. Explorar la variabilidad del conjunto de datos.

  2. Detarmina si se deben estandarizar o no los datos.

  3. ¿Qué matriz usarás para el PCA?

  4. Determinar el número adecuado de componentes principales.

  5. Interpretar los componentes obtenidos.

  6. Visualizar la estructura de los datos en el espacio PCA.

  7. Evaluar si existe separación entre los tipos de vidrio mediante PCA.