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.

center

Primero, 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

rotation

Un data frame que contiene las “cargas variables”, es decir, contiene los vectores propios.

pca$rotation

new_data

Data 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_variance

Obtenemos 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_proportion

De 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_variance

Grá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_component

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

bitplot

Finalmente, 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.