El objetivo de esta práctica es mostrar el funcionamiento de una función que regrese todas las salidas utiles de un PCA; utilizando, al menos, una base de datos precargada en R. Estas bases las podemos encontrar en el paquete datasets
Tomaremos como ejemplo los datos datasets::sunspots, los cuales son números mensuales promedio relativos de manchas solares desde 1749 hasta 1983. Recolectados en el Observatorio Federal Suizo, Zurich hasta 1960, y luego en el Observatorio Astronómico de Tokio.
De acuerdo a lo anterior, tenemos una serie de tiempo; para este ejercicio, se considerará que cada mes es una variable aleatoria independiente del resto.
Se considerará que las mediciones que se realizaron en cada mes utilizan la misma técnica, por lo que no se estandarizarán los datos.
A los datos se le realización algunas manipulaciones para que tengan un mejor formato
library(tidyverse)
data <- sunspots
data <- matrix(data = data, ncol = 12)
data <- as_data_frame(data) %>% mutate(Year = 1749:1983) %>% rename(
January = V1,
Febrary = V2,
March = V3,
April = V4,
May = V5,
Jun = V6,
July = V7,
August = V8,
September = V9,
October = V10,
November = V11,
December = V12
)
data %>% head(10)
Ahora, un rápido perfilamiento con las funciones hechas en la practica anterior
source("ProfilingV2.R")
Profiling <- profiling(data %>% select(-Year))
Vistazo general de los datos:
Profiling$general_view
¿Que tal los datos de tipo numérico?
Profiling$First_glance_numerical
¿Hay valores perdidos? No.
Profiling$missin_numbers
Profiling$missin_percent
¿Hay valores numéricos con una gran cantidad de datos únicos?
Profiling$big_numerical
## [1] "The variable: January has a lot of levels to graph as above"
## [2] "The variable: Febrary has a lot of levels to graph as above"
## [3] "The variable: March has a lot of levels to graph as above"
## [4] "The variable: April has a lot of levels to graph as above"
## [5] "The variable: May has a lot of levels to graph as above"
## [6] "The variable: Jun has a lot of levels to graph as above"
## [7] "The variable: July has a lot of levels to graph as above"
## [8] "The variable: August has a lot of levels to graph as above"
## [9] "The variable: September has a lot of levels to graph as above"
## [10] "The variable: October has a lot of levels to graph as above"
## [11] "The variable: November has a lot of levels to graph as above"
## [12] "The variable: December has a lot of levels to graph as above"
Al parecer todos, como se menciono al inicio.
Finalmente, un correlograma
Profiling$correlogram
Este útlimo gráfico nos interesa ya que es de nuestro interés acumular toda la varianza en la menor cantidad de variables (combinaciones lineales de las variables antes expuestas) posibles; al menos hasta obtener una cantidad de varianza deseada para trabajar.
Ahora, veamos el funcionamiento de la función RealPCA() la cual se encuentra en RPCA.R de RstudioCloud
Esta función regresa una lista con varias cosas útiles para un análisis de componentes principales. Iremos viendo cada una de estas a lo largo de este proyecto.
centerPrimero, se obtienen los “centros” que considera la función prcomp, los cuales son evidentes a la hora de escalar los datos, en este caso, se tienen los siguientes
source("RPCA.R")
pca <- RealPCA(data %>% select(-Year))
pca$center
## January Febrary March April May Jun July
## 43.53660 68.46128 43.36383 16.60809 55.40383 57.01617 49.21660
## August September October November December
## 31.69404 37.21702 50.83489 86.98851 74.85064
rotationUn data frame que contiene las “cargas variables”, es decir, contiene los vectores propios.
pca$rotation
new_dataData frame que contiene los nuevos datos con los que se trabajarían, es decir, las combinaciones lineales obtenidas en el PCA.
pca$new_data
proportion_varianceObtenemos la proporción de la varianza que contiene cada componente.
pca$proportion_variance
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9
## 0.36062 0.33493 0.09819 0.07331 0.04363 0.02437 0.01698 0.01383 0.01158
## PC10 PC11 PC12
## 0.01047 0.00713 0.00495
Como vemos, lo cual sucede siempre que las condiciones para realizar el PCA sean las adecuadas, a medida que incrementan la cantidad de componentes, el componente contiene una menor varianza de los datos.
cumulative_proportionDe manera similar, obtenemos la proporción de la varianza acumulada que contiene cada componente.
pca$cumulative_proportion
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9
## 0.36062 0.69554 0.79374 0.86705 0.91069 0.93506 0.95204 0.96586 0.97745
## PC10 PC11 PC12
## 0.98792 0.99505 1.00000
Por ejemplo,si desearamos conservar más del 85% de los datos, nos bastaría con tomar hasta la cuarta componente. Esto se aprecia visualmente mejor en la gráfica acumulated_variance.
acumulated_varianceGráfico en el cual se muestra como va acumulandose la varianza a medida que consideramos un mayor número de componentes
pca$acumulated_variance
Así es más sencillo ver el impacto que tienen las primeras componentes en la retención de la varianza.
first_component, second_component & third_componentEstas tres gráficas muestran la “importancia” que tienen las primeras tres componentes sobre las variables originales, esto ayudará a dar una mejor interpretación a lo que significa cada componente en cada caso particular que se este analizando.
Por el momento, solo se considerán las primeras tres componentes.
pca$first_component
pca$second_component
pca$third_component
Como se puede apreciar, la primera componente tiene un mayor peso en la variable november, la segunda componente en December y la tercera componente en March. Recordemos que lo anterior es equivalente a decir que los coeficientes en cada una de las combinaciones lineales sobre las variables (PCA’s) son más lejanos al cero, por lo que, estos pesos, alterar mayormente, o tienen una importancia más grande sobre el valor final de la combinación lineal.
bitplotFinalmente, un bitplot de las primeras dos componentes.
pca$bitplot
Podemos apreciar, nuevamente, que November tiene una mayor relevancia sobre la primera componente y december sobre la segunda.