library(dplyr)
library(plotly)
library(magrittr)
library(tidyr)
library(caret)
knitr::opts_chunk$set(collapse = TRUE)

Componentes principais são bastante utilizados em modelagem estatística, mas a sua definição matemática rigorosa faz com que a ACP pareça um conceito mais abstrato do que somos capazes de compreender, em particular quando falam “maximizar a variância total” e “diminuir a dimensionalidade”. A primeira reação é um grande “HEIN?”.

Abaixo tem alguns gráficos em 3 dimensões que eu acredito que dê uma boa ilustração sobre o que essas duas afirmativas querem dizer.

O primeiro gráfico é a representação com 100% da informação em três dimensões. O segundo gráfico é como fica a representação do mesmo conjunto de dados, mas com uma dimensão a menos (redução de dimensionalidade).

Ao diminuir uma dimensão, perdemos informação e essa perda é mensurada pela variância explicada pelas dimensões que deixamos para trás.

Exemplo 1 - Tetraedro

a <- 1
tetraedro <- data.frame( x = c(a * sqrt(3)/3, - a * sqrt(3)/6, - a * sqrt(3)/6, 0),
                         y = c(0, - a/2, a/2, 0),
                         z = c(0, 0, 0, a * sqrt(6)/3),
                         cor = c("a", "b", "c", "d"),
                         id = 1:4)

tetraedro_linhas <- combn(x = tetraedro$id, m = 2) %>%
  t %>%
  as.data.frame.matrix %>%
  set_names(c("id1", "id2")) %>%
  mutate(id_par = 1:n()) %>%
  gather(id_ordem, id, id1, id2) %>%
  left_join(tetraedro, by = "id") %>%
  arrange(id_ordem)
tetraedro_pc <- prcomp(tetraedro %>% dplyr::select(x, y, z))
summary(tetraedro_pc)
## Importance of components:
##                           PC1    PC2    PC3
## Standard deviation     0.4082 0.4082 0.4082
## Proportion of Variance 0.3333 0.3333 0.3333
## Cumulative Proportion  0.3333 0.6667 1.0000

p1 <- plot_ly(x = ~x, y = ~y, z = ~z, width = "50%", height = "50%") %>%
  add_lines(data = tetraedro) %>%
  add_markers(data = tetraedro) 

p2 <- plot_ly(x = ~PC2, y = ~PC3, z = ~PC3, width = "50%", height = "50%") %>%
  add_lines(data = tetraedro_pc %>% predict %>% as.data.frame) %>%
  add_markers(data = tetraedro_pc %>% predict %>% as.data.frame) 


htmltools::tagList(list(p1, p2))