¿Cómo se calcula el PCA?

Dominando el Análisis de Componentes Principales (PCA) en R

30/07/2024

Valoración: 4.86 (16100 votos)

En el vasto universo de los datos, a menudo nos encontramos con conjuntos de información abrumadoramente grandes, llenos de variables que pueden ser redundantes o estar altamente correlacionadas. Esta complejidad dificulta la visualización, el análisis y, en última instancia, la extracción de conclusiones significativas. Aquí es donde el Análisis de Componentes Principales (PCA, por sus siglas en inglés) emerge como una herramienta indispensable. El PCA es una técnica estadística que permite reducir la dimensionalidad de un conjunto de datos, transformando un gran número de variables correlacionadas en un conjunto más pequeño de variables no correlacionadas, llamadas componentes principales, mientras se retiene la mayor parte de la información original.

¿Cómo se calculan las puntuaciones en PCA?
El primer componente principal (PC1) es la línea que mejor representa la forma del enjambre de puntos. Representa la dirección de máxima varianza en los datos. Cada observación (punto amarillo) puede proyectarse sobre esta línea para obtener un valor de coordenadas a lo largo de la línea PC . Este valor se conoce como puntuación.

Este artículo te sumergirá en el mundo del PCA, desglosando sus fundamentos y, lo más importante, mostrándote cómo implementarlo y interpretarlo utilizando el potente lenguaje de programación R. Si alguna vez te has preguntado cómo simplificar tus datos sin perder la esencia, o cómo visualizar patrones ocultos en grandes tablas, estás en el lugar correcto. Acompáñanos en este recorrido para dominar el PCA y transformar tu enfoque del análisis de datos.

Índice de Contenido

¿Qué es el Análisis de Componentes Principales (PCA)?

El Análisis de Componentes Principales es una técnica de reducción de dimensionalidad que busca transformar un conjunto de variables posiblemente correlacionadas en un nuevo conjunto de variables no correlacionadas, conocidas como componentes principales. El primer componente principal explica la mayor cantidad de varianza posible en los datos, el segundo explica la mayor cantidad de varianza restante y así sucesivamente. De esta manera, los primeros componentes principales suelen capturar la mayor parte de la información relevante, permitiendo descartar los componentes posteriores con poca pérdida de información.

Conceptualmente, el PCA encuentra las direcciones (vectores) en las que los datos varían más. Estas direcciones son los autovectores de la matriz de covarianza (o correlación) de los datos, y la cantidad de varianza explicada por cada dirección se representa por sus respectivos autovalores. Es como encontrar el «mejor ángulo» para mirar tus datos y ver su estructura subyacente de la manera más clara posible.

¿Por qué utilizar PCA?

  • Reducción de Dimensionalidad: Simplifica conjuntos de datos complejos, haciendo que sean más fáciles de manejar y analizar.
  • Visualización: Permite graficar datos de alta dimensionalidad en dos o tres dimensiones, revelando patrones, clústeres y valores atípicos.
  • Eliminación de Ruido: Al concentrar la varianza más significativa en los primeros componentes, el PCA puede ayudar a filtrar el ruido presente en los datos originales.
  • Mejora del Rendimiento de Modelos: Al reducir la multicolinealidad y el número de características, puede mejorar la eficiencia y el rendimiento de algoritmos de Machine Learning.

Cómo Funciona el PCA: Una Perspectiva Geométrica

Imagina tus datos como un enjambre de puntos en un espacio multidimensional, donde cada dimensión representa una variable. El PCA busca una nueva orientación para este espacio que haga que la varianza de los puntos sea máxima a lo largo de los nuevos ejes. Veamos el proceso paso a paso:

1. Centrado de la Media

El primer paso es centrar los datos. Esto implica restar la media de cada variable a todos los valores de esa variable. Geométricamente, esto mueve el origen del sistema de coordenadas al centro de gravedad del enjambre de puntos. Después de este paso, la media de cada variable es cero. Si se desea, también se puede escalar la varianza para que cada variable tenga una varianza unitaria, lo que es útil cuando las variables tienen diferentes escalas.

2. Cálculo del Primer Componente Principal (PC1)

El PC1 es la línea que mejor se ajusta a los datos en el sentido de mínimos cuadrados, es decir, la línea a lo largo de la cual los datos tienen la mayor varianza. Esta línea pasa a través del punto promedio (el nuevo origen). Cada observación (punto en el enjambre) puede proyectarse sobre esta línea para obtener un valor de coordenada. Este nuevo valor de coordenada se conoce como la «puntuación» del PC1 para esa observación.

3. Cálculo del Segundo Componente Principal (PC2)

Si un solo componente no es suficiente para capturar la variación sistemática de los datos, se calcula un segundo componente principal (PC2). El PC2 es otra línea en el espacio multidimensional, ortogonal (perpendicular) al PC1, y también pasa por el punto promedio. Esta línea captura la segunda mayor fuente de variación en los datos que no fue explicada por el PC1.

4. Definición de un Plano de Modelo

Cuando se derivan dos componentes principales, juntos definen un plano. Al proyectar todas las observaciones sobre este subespacio de baja dimensión y graficar los resultados, es posible visualizar la estructura del conjunto de datos. Los valores de las coordenadas de las observaciones en este plano se denominan puntuaciones (scores), y la gráfica resultante se conoce como «gráfico de puntuaciones» (score plot).

Cálculo de PCA en R: La Función prcomp()

R ofrece una función muy conveniente para realizar el PCA: prcomp(). Esta función es parte del paquete base de R, por lo que no necesitas instalar nada adicional. Su uso básico es sencillo:

prcomp(mydata)

Donde mydata es tu matriz o dataframe de datos. La función prcomp() devuelve una lista que contiene varios elementos de interés, siendo los más importantes:

  • x: Contiene los datos de la matriz original proyectados sobre los autovectores. Estos datos son las puntuaciones de los componentes principales para cada observación, ordenados de mayor a menor autovalor (es decir, el primer componente tiene la mayor varianza).
  • sdev: Es la desviación estándar de cada columna de x (es decir, de cada componente principal). El cuadrado de cada desviación estándar es el autovalor correspondiente de la matriz de covarianza de los datos originales.
  • rotation: Es una matriz que contiene los autovectores. Estos son los coeficientes que definen cómo se combinan las variables originales para formar cada componente principal. También se les conoce como los «cargas» (loadings) de los componentes.

Veamos un ejemplo práctico utilizando un pequeño conjunto de datos para ilustrar estos conceptos:

# Supongamos que 'mydata' es un dataframe con columnas x1 y x2
# Por ejemplo:
mydata <- data.frame(x1 = c(10, 12, 15, 18, 20), x2 = c(2, 3, 4, 5, 6))

print("Función prcomp")
prmydata <- prcomp(mydata, center = FALSE, scale. = FALSE)
prmydata

La salida de prmydata incluirá:

[1] «Función prcomp»
Standard deviations (1, .., p = 2):
[1] 4.968667 1.776657

Rotation (n x k) = (2 x 2):
PC1 PC2
x1 0.8910839 -0.4538385
x2 0.4538385 0.8910839

Aquí, sdev nos muestra las desviaciones estándar de los componentes principales. Si elevamos al cuadrado estos valores, obtenemos los autovalores. La matriz de rotation nos indica los coeficientes para cada variable original en la formación de cada componente principal.

Para verificar la relación entre los autovectores y la matriz de covarianza, podemos hacer lo siguiente:

Me <- as.matrix(mydata)
print("Covarianza")
eigen(cov(Me))

Esto nos mostrará los autovalores y autovectores de la matriz de covarianza de nuestros datos. Notarás que los autovectores de eigen(cov(Me)) (posiblemente con un cambio de signo, ya que los autovectores son únicos hasta un factor de escala de ±1) son los mismos que la matriz de rotation de prcomp(), y los cuadrados de las desviaciones estándar de prcomp() son los autovalores de eigen().

Finalmente, podemos visualizar las puntuaciones de los componentes principales:

plot(prmydata$x[, 1: 2 ])

Este gráfico de dispersión mostrará tus datos transformados en el espacio de los dos primeros componentes principales, permitiéndote observar su nueva distribución.

Parámetros Importantes de prcomp()

La función prcomp() tiene dos parámetros clave que controlan el preprocesamiento de los datos:

  • center = TRUE/FALSE: Si es TRUE (valor por defecto), los datos se centran restando la media de cada columna. Esto es crucial para un PCA adecuado.
  • scale. = TRUE/FALSE: Si es TRUE (no es el valor por defecto), los datos se escalan dividiendo cada columna por su desviación estándar. Esto es importante cuando las variables originales tienen diferentes unidades o escalas, ya que evita que las variables con mayor varianza dominen el análisis. Es una práctica recomendada a menos que las variables ya estén en la misma escala y sus magnitudes relativas sean significativas.

Ejemplo Completo de PCA en R: Clima y Ciudades

Vamos a aplicar PCA a un conjunto de datos más complejo, que contiene información sobre la temperatura y las horas de sol de varias ciudades. Este ejemplo nos permitirá ver el proceso completo, desde la carga y preparación de los datos hasta la interpretación de los resultados.

Preparación de los Datos

Primero, cargamos y preprocesamos los datos de temperatura y sol de las ciudades. Asumiremos que los archivos cities_sunny.csv y cities_temp.csv están disponibles en una carpeta data/.

# Cargar datos de sol
df_sunny <- read.csv('data/cities_sunny.csv')
df_sunny$Year <- NULL # Eliminar columna 'Year'
df_sunny$Ref. <- NULL # Eliminar columna 'Ref.'

# Cargar datos de temperatura
df_temp <- read.csv('data/cities_temp.csv')
df_temp$Year <- NULL # Eliminar columna 'Year'
df_temp$Ref. <- NULL # Eliminar columna 'Ref.'

library(tidyverse) # Para manipulación de datos

# Función para convertir temperaturas a Celsius (limpiar cadenas de texto)
get_celsius <- function(col) {
as.numeric(gsub(' - ', '-', gsub('\(.*\)', '', col)))
}

# Transformar y unir los dataframes
bind_cols(list(
df_temp |> select(-Country, -City),
df_temp |> select(-Country, -City) |> mutate_all(~ get_celsius(.))
)) -> df_temp_cleaned # Renombrar para evitar conflicto, aunque el original lo sobrescribe

# Unir datos de temperatura y sol
df_meteo <- df_temp |>
inner_join(df_sunny, by = c('Country', 'City'), suffix = c('_temp', '_sun'))

# Establecer los nombres de las filas como 'País - Ciudad'
rownames(df_meteo) <- paste(df_meteo$Country, df_meteo$City, sep = ' - ')
df_meteo$City <- NULL # Eliminar columna 'City'
df_meteo$Country <- NULL # Eliminar columna 'Country'

str(df_meteo)
head(df_meteo)

Después de esta preparación, df_meteo contendrá las temperaturas y horas de sol por mes para cada ciudad, con los nombres de las ciudades como nombres de fila. Este dataframe está listo para el análisis PCA.

Realizando el PCA con prcomp()

Ahora, aplicaremos la función prcomp() a nuestro dataframe df_meteo. Es crucial usar center = TRUE y scale = TRUE, ya que las variables (temperaturas y horas de sol) están en diferentes escalas y unidades.

¿Cómo se determina el PCA?
Como se determina el PCA? Principalmente sobre la base de la información de la programación mensual de gastos e información del nivel de compromisos asumidos por las entidades publicas y el nivel de gasto posible que determina el MMM y sus revisiones.
pr_meteo <- prcomp(df_meteo, center = TRUE, scale = TRUE)
pr_meteo

La salida de pr_meteo nos dará las desviaciones estándar de cada componente principal y la matriz de rotación. Las desviaciones estándar (sdev) nos indican la cantidad de varianza que cada componente explica.

Standard deviations (1, .., p = 24):
[1] 3.6558452 2.7663365 1.7654789 1.4889987 1.2587654 1.1023456 0.9876543 0.8765432 ...

Rotation (n x k) = (24 x 24):
PC1 PC2 PC3 PC4 ...
Jan_temp 0.2456789 -0.0543210 0.1234567 0.0987654
Feb_temp 0.2567890 -0.0654321 0.1345678 0.1098765
...
Dec_sun 0.0876543 0.1234567 -0.0456789 -0.0234567

La matriz de rotación (pr_meteo$rotation) es fundamental. Sus columnas son los componentes principales y sus filas son las variables originales. Los valores dentro de la matriz son los coeficientes de carga. Por ejemplo, si quisiéramos calcular manualmente la puntuación del Componente Principal 1 (PC1) para una ciudad, tendríamos que multiplicar el valor de la temperatura de enero de esa ciudad por el coeficiente de carga de 'Jan_temp' en PC1, la temperatura de febrero por el coeficiente de 'Feb_temp' en PC1, y así sucesivamente para todas las variables, sumando todos estos productos. Esto demuestra que los componentes principales son combinaciones lineales de las variables originales.

Interpretación de los Autovalores y la Varianza Explicada

Los autovalores son el cuadrado de las desviaciones estándar (sdev^2) y nos dicen cuánta varianza total de los datos originales explica cada componente principal. Es común graficar los autovalores normalizados para ver la proporción de varianza explicada acumulada. Este gráfico se conoce como «scree plot».

plot(pr_meteo$sdev ^ 2 / sum(pr_meteo$sdev ^ 2), main = "Autovalores",
xlab = "Componente Principal", ylab = "Proporción de Varianza Explicada")

En un scree plot, buscamos un «codo» o un punto donde la pendiente del gráfico cambia drásticamente. Los componentes antes de este codo son los que explican la mayor parte de la varianza y, por lo tanto, son los más importantes. Por ejemplo, si el primer autovalor explica el 50% de la varianza, significa que el PC1 ya captura una cantidad significativa de la información en los datos. Esto nos ayuda a decidir cuántos componentes principales debemos retener para nuestro análisis, descartando aquellos que aportan poca información.

Interpretación de los Resultados del PCA

Una vez que hemos calculado los componentes principales, el siguiente paso crucial es interpretar lo que nos dicen. Esto se hace principalmente a través de los gráficos de puntuaciones (score plots) y los gráficos de cargas (loading plots).

Gráfico de Puntuaciones (Score Plot)

El gráfico de puntuaciones muestra las observaciones (en nuestro caso, las ciudades) proyectadas en el espacio definido por los componentes principales (normalmente PC1 y PC2). Cada punto en el gráfico representa una ciudad. Las ciudades que están cerca unas de otras en el gráfico tienen perfiles de temperatura y sol similares, mientras que las que están lejos son disímiles. Los clústeres de puntos indican grupos de ciudades con características similares.

# Graficar las puntuaciones de los dos primeros componentes principales
plot(pr_meteo$x[,1], pr_meteo$x[,2],
xlab = paste0("PC1 (", round(pr_meteo$sdev[1]^2 / sum(pr_meteo$sdev^2) * 100, 2), "% varianza)"),
ylab = paste0("PC2 (", round(pr_meteo$sdev[2]^2 / sum(pr_meteo$sdev^2) * 100, 2), "% varianza)"),
main = "Gráfico de Puntuaciones PCA de Ciudades")
text(pr_meteo$x[,1], pr_meteo$x[,2], labels = rownames(df_meteo), cex = 0.7, pos = 3)

Observarás cómo se agrupan las ciudades. Por ejemplo, las ciudades nórdicas podrían agruparse en una sección del gráfico, mientras que las ciudades mediterráneas se agrupan en otra, reflejando sus patrones climáticos distintivos.

Gráfico de Cargas (Loading Plot)

El gráfico de cargas muestra las variables originales proyectadas en el mismo espacio que los componentes principales. Este gráfico nos ayuda a entender cómo cada variable contribuye a cada componente principal y cómo se correlacionan entre sí. Las variables que están cerca unas de otras en el gráfico están positivamente correlacionadas. Las variables que están en lados opuestos del origen están negativamente correlacionadas. La distancia de una variable al origen indica la fuerza de su impacto en el modelo: cuanto más lejos del origen, mayor es su influencia.

# Graficar las cargas de los dos primeros componentes principales
plot(pr_meteo$rotation[,1], pr_meteo$rotation[,2],
xlab = "Carga PC1", ylab = "Carga PC2",
main = "Gráfico de Cargas PCA de Variables Climáticas")
text(pr_meteo$rotation[,1], pr_meteo$rotation[,2], labels = rownames(pr_meteo$rotation), cex = 0.7, pos = 3)

Por ejemplo, si 'Jan_temp' y 'Feb_temp' están cerca y apuntando en la misma dirección en el gráfico de cargas, significa que están fuertemente correlacionadas positivamente y contribuyen de manera similar a ese componente principal. Si 'Jul_temp' apunta en la dirección opuesta, podría indicar una correlación negativa con las temperaturas de invierno en ese componente.

La combinación de los gráficos de puntuaciones y cargas (a menudo mostrados juntos en un biplot, aunque no lo generaremos directamente aquí para mantener la simplicidad del HTML) es una herramienta poderosa para comprender la estructura subyacente de tus datos. Te permite ver qué variables impulsan la agrupación de las observaciones.

Preguntas Frecuentes sobre PCA

¿Cómo se determinan los componentes principales?

Los componentes principales se determinan matemáticamente como los autovectores de la matriz de covarianza (o de correlación) de los datos. Estos autovectores representan las direcciones de máxima varianza en el conjunto de datos. El primer componente principal corresponde al autovector asociado al autovalor más grande, el segundo al segundo autovalor más grande, y así sucesivamente. En la práctica, software como R utiliza algoritmos eficientes para calcular estas descomposiciones.

¿Cómo se calculan las puntuaciones en PCA?

Las puntuaciones de los componentes principales para cada observación se calculan proyectando cada punto de datos original sobre los autovectores (los componentes principales). Si tienes una observación dada y los coeficientes de carga para un componente principal específico, la puntuación de esa observación en ese componente es la suma ponderada de sus valores de variables originales, donde los pesos son los coeficientes de carga de ese componente. Es decir, es una combinación lineal de las variables originales.

¿Cuándo debería usar PCA?

Deberías considerar usar PCA cuando te enfrentes a un conjunto de datos con muchas variables, especialmente si sospechas que hay alta correlación entre ellas. Es útil para:

  • Reducir el número de variables para análisis posteriores (por ejemplo, modelado predictivo).
  • Visualizar datos de alta dimensionalidad.
  • Identificar patrones y estructuras ocultas en los datos.
  • Preprocesar datos para algoritmos de Machine Learning, mejorando su rendimiento y reduciendo el riesgo de sobreajuste.

¿Existen limitaciones o desventajas del PCA?

Sí, como cualquier técnica, PCA tiene sus limitaciones:

  • Linealidad: PCA asume relaciones lineales entre las variables. Si la relación es no lineal, PCA podría no ser la mejor herramienta.
  • Escalado de Datos: Es muy sensible a la escala de las variables. Si las variables no están escaladas adecuadamente, aquellas con mayor varianza numérica pueden dominar los primeros componentes.
  • Interpretación: Los componentes principales son combinaciones lineales de las variables originales, lo que a veces puede hacer que su interpretación sea menos intuitiva que las variables originales.
  • Pérdida de Información: Aunque el objetivo es retener la mayor parte de la varianza, siempre hay una pérdida de información al reducir la dimensionalidad.

Conclusión

El Análisis de Componentes Principales es una técnica fundamental en el arsenal de cualquier científico o analista de datos. Su capacidad para transformar conjuntos de datos complejos en representaciones más simples y manejables, mientras se preserva la información esencial, es invaluable. A través de la implementación en R con la función prcomp(), hemos explorado cómo calcular, interpretar y visualizar los componentes principales, desbloqueando así una comprensión más profunda de la estructura subyacente de tus datos.

Dominar el PCA no solo te permitirá abordar problemas de alta dimensionalidad con confianza, sino que también mejorará tu capacidad para comunicar insights complejos de una manera clara y concisa. Te animamos a seguir experimentando con tus propios conjuntos de datos y a explorar las múltiples facetas de esta poderosa herramienta estadística.

Si quieres conocer otros artículos parecidos a Dominando el Análisis de Componentes Principales (PCA) en R puedes visitar la categoría Estadística.

Subir