Você está na página 1de 1

Relatório: Análise de componentes principais - PCA

Lucas Sergio de Sousa Lopes


04/10/2020

Análise de Componentes Principais (PCA)


A análise de componentes principais (PCA) é uma técnica de estatística multivariada, que realiza a transformação de n-variáveis em n-
componentes principais. Tais componentes são combinações lineares e possuem como principal caracteristica o fato de não serem
correlacionados (Figura 1). Por apresentar tais atributos, a PCA é utilizada principalmente com o objetivo de reduzir o número de variáveis, uma
vez que os componentes gerados carregam grande parte da variação contida nos dados.

Figura 1: Abstração de uma análise de componentes principais. Fonte: Blog RPubs

Base de dados
Será utilizado nesse relatório um dataset com dados de um experimento para testar diferentes espaçamentos silviculturais de Pinus taeda no Sul
do Brasil. Os dados contidos nesse dataset são de parcelas amostrais na idade de 9 anos. Para cada espaçamento foram amostradas 9 parcelas.
Foram consideradas sete variáveis para o presente relatório:

Diâmetro a 1,3 m de altura (dap) em cm;

Altura total (ht) em m;

Área seccional (g) em m²;

Porcentagem de casca (Casca) em %;

Volume individual com casca (v) em m³;

Volume por área (vha) em m³/ha;

Área basal (AB) em m²/ha.

Aplicação no Rstudio
Para a execução da PCA no R é necessário a instalação dos pacotes factoextra e FactoMineR. Além disso, os pacotes readr, dplyr e ggplot
também serão utilizados.

library(readr)
library(dplyr)
library(ggplot2)
library(factoextra)
library(FactoMineR)

Criaremos o dataframe com os dados importados no formato csv, conforme mostrado abaixo.

pinus <- read_csv("../dados_limpos/pinus.csv")

## Warning: Missing column names filled in: 'X1' [1]

## Parsed with column specification:


## cols(
## X1 = col_double(),
## bloco = col_double(),
## rep = col_double(),
## trat = col_character(),
## spacing = col_double(),
## area = col_double(),
## dap = col_double(),
## ht = col_double(),
## g = col_double(),
## casca = col_double(),
## v = col_double(),
## vha = col_double(),
## AB = col_double()
## )

Em seguida utilizaremos a função PCA inclusa no pacote FactoMineR para obter os principais resultados da análise de componentes principais
para os dados de espaçamentos. O vetor “c(1:6)” exclui da análise as colunas do dataframe que não serão utilizadas na PCA. O argumento “ncp”
recebe o número de componentes principais a serem gerados, no nosso caso, serão 7 componentes, uma vez que detemos 7 variáveis. Por fim, o
argumento “graph” indica se os resultados serão apresentados graficamente.

A list “res.pca” contém os principais resultados da análise realizada.

res.pca <- FactoMineR::PCA(pinus[ ,-c(1:6)], ncp = 7, graph = FALSE)


print(res.pca)

## **Results for the Principal Component Analysis (PCA)**


## The analysis was performed on 81 individuals, described by 7 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"

Uma observação que sempre deve ser realizada ao utilizar uma PCA é quanto aos eigenvalues ou autovalores, que correspondem a variância
carregada por cada componente. Ou seja, quanto de variação dos dados originais está contida nos novos componentes. A função
“get_eigenvalue” permite a obtenção dos autovalores, ao passo que a função “fviz_eig” demonstra graficamente os resultados de variância por
componente. Podemos observar que para os nossos dados, os primeiros dois componentes carregam 97,3% da variação total dos dados (CP1 =
59,2% e CP2 = 38,1%). Diversos autores relatam que em PCA os dois primeiros componentes devem carregar pelo menos 80% da variação para
que a análise seja reduzivel.

eig_val = get_eigenvalue(X = res.pca)


fviz_eig(res.pca,
main = "Variância por componente",
addlabels = TRUE,
xlab = "Componente principal", ylab = "Variância (%)")

Analisando as variáveis com PCA


A função “get_pca_var” cria uma lista com diversos componentes da PCA referentes as variáveis utilizadas. A partir da estimativa desses
parâmetros é possivel avaliar a contribuição das variáveis individualmente, bem como, criar gráficos com as coordenadas.No trecho de código
abaixo iremos criar a lista “var” e posteriormente extrair as coord. A interpretação dessas coordenadas é realizada partindo do pressuposto de
que quanto mais proximo de 1 e/ou -1 mais importante é aquela variável para o componente. O sinal de negatividade indica relação de oposição
entre as variáveis. Interpretando os resultados abaixo podemos notar que as variáveis dap, g, vha e AB apresentam as maiores importâncias no
primeiro componente. No segundo componente, as variáveis ht e casca têm os maiores valores de importância.

var <- get_pca_var(res.pca)


var$coord

## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6


## dap 0.8601644 0.4992870 0.09327969 0.04535573 0.006944696 -0.004277153
## ht -0.3186162 0.9346844 -0.15624667 0.01718712 0.004755763 0.010302930
## g 0.8518465 0.5106632 0.11325175 -0.02333582 0.007390258 -0.011992696
## casca 0.5780309 -0.7944878 0.18519690 0.01109054 0.008288797 0.013155245
## v 0.7464990 0.6600426 0.07763024 -0.02673471 -0.012502866 0.013412186
## vha -0.9233164 0.3445309 0.16623966 -0.01126562 0.031852380 0.002439018
## AB -0.9145412 0.3083968 0.26024010 0.01149617 -0.025366093 -0.001982782
## Dim.7
## dap -0.002231066
## ht 0.003397009
## g 0.003431570
## casca 0.002619390
## v -0.002376198
## vha -0.001510866
## AB 0.001155782

A tarefa de avaliar a importância das variáveis fica mais didatica ao plotarmos o circulo de correlação com as setas e coordenadas. A função
“fviz_pca_var” plota o gráfico de importância das variáveis, é necessário indicar quais componentes serão os eixos do plote (geralmente aqueles
com maiores autovalores) através do comando axes.

Observando o gráfico gerado, fica evidente que as variáveis de povoamento (vha e AB) são inversamente proporcionais e altamente
correlacionadas com variáveis de carater dendrométrico (dap, v e g). Esse comportamente pode ser observado devido a relação de oposição das
setas no gráfico e a sua proximidade com o circulo de correlação. Essa relação inversa se justifica por conta da densidade de árvores nos
diferentes espaçamentos, que ocasiona em caracteristicas especificas de crescimento. Os espaçamentos mais densos, possuem maiores
produções volumétricas e área ocupada por fustes de árvores, no entanto com menor crescimento em diâmetro e árvores com menores
volumetrias médias.

fviz_pca_var(res.pca, axes = c(1, 2), repel = TRUE)

Analisando os individuos (observações) com PCA


Também é possivel analisar os individuos ou observações do dataset e como eles se comportam em relação aos componentes principais.
Basicamente, podemos espacializar em um gráfico as coordenadas PCA de cada individuo. As funções “get_pca_ind” e “fviz_pca_ind” funcionam
de forma semelhante ao exemplo anterior. O código para sua utilização está escrito abaixo.

ind <- get_pca_ind(res.pca)


fviz_pca_ind(res.pca, repel = TRUE)

Podemos melhorar o código da função “fviz_pca_ind” para colorir as parcelas por espaçamento e traçar as elipses que separam os espaçamentos
avaliados, conforme o código escrito abaixo. Observa-se que algumas elipses apresentam interseção, como é o caso dos espaçamentos de
menor densidade (1,5 x 2 m; 1,5 x 2,5 m; 1,5 x 3 m; 2,5 x 2 m) e espaçamentos intermediarios (2,5 x 2,5 m; 2,5 x 3 m e 2,5 x 2 m). Isso indica que
há certas similaridades entre estes grupos, porém de forma geral, os dois componentes principais foram eficientes na distinção das parcelas.

fviz_pca_ind(res.pca,
geom = "text",
col.ind = as.factor(pinus$trat),
palette = "jco",
addEllipses = TRUE,
legend.title = "Espaçamentos")

Analisando conjuntamente variáveis e individuos: Gráfico biplot


O maior “poder” de uso da PCA se dar quando a análise é realizada de forma conjunta, observando o comportamento das variáveis e suas
correlações juntamente com as coordenadas dos individuos. O gráfico que permite este tipo de visualização é denominado de biplot, pois integra
o circulo de correlação das variáveis com as coordenadas das observações.

A confecção deste gráfico no ambiente R é possivel utilizando o comando “fviz_pca_biplot”.

A partir da análise do biplot fica mais evidente a forma com que as variáveis estão relacionadas aos distintos espaçamentos. Os espaçamentos de
menor densidade (3,5 x 3 m; 3,5 x 2,5 m; 3,5 x 2 m; 2,5 x 3 m) estão localizados sob as setas das variáveis dendrométricas (dap, v e g) e os de
maior densidade (1,5 x 2 m; 1,5 x 2,5 m; 1,5 x 3 m) sob influencia das variáveis de povoamento (vha e AB).

fviz_pca_biplot(res.pca,
col.ind = as.factor(pinus$trat),
palette = "jco",
addEllipses = TRUE, label = "var",
col.var = "black", repel = TRUE,
legend.title = "Espaçamentos")

Random Forest
Para exemplificar a utilização dos componentes principais em outros modelos estatisticos ou de aprendizado de máquina e o poder de
redutibilidade de variáveis através de componentes, iremos utilizar um exemplo prático com um modelo de floresta aleatória (random forest).

Segundo Breiman (1999) o classificador random forest consiste em uma combinação de classificadores de árvore de regressão onde cada
classificador é gerado usando um vetor aleatório amostrado independentemente do vetor de entrada, e cada árvore lança um voto de unidade
para a classe mais popular para classificar um vetor de entrada.

Iremos utilizar a classificação por random forest para classificar as parcelas em espaçamentos, utilizando como entradas para o modelo os
componentes principais gerados na PCA. Primeiramente, será necessaria instalar e carregar o pacote random forest. Cria-se um dataframe (dd)
com os componentes principais e os dados rotulados de espaçamento, em seguida a função “randomForest” executa o treinamento.

library(randomForest)

## randomForest 4.6-14

## Type rfNews() to see new features/changes/bug fixes.

##
## Attaching package: 'randomForest'

## The following object is masked from 'package:ggplot2':


##
## margin

## The following object is masked from 'package:dplyr':


##
## combine

res.pca <- FactoMineR::PCA(pinus[ ,-c(1:6)], ncp = 7, graph = FALSE)


vx = res.pca$ind$coord

dd = data.frame(pinus = as.factor(pinus$trat), vx)

set.seed(313)
fit = randomForest(pinus ~ ., data = dd)
fit

##
## Call:
## randomForest(formula = pinus ~ ., data = dd)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 50.62%
## Confusion matrix:
## 1.5 x 2 1.5 x 2.5 1.5 x 3 2.5 x 2 2.5 x 2.5 2.5 x 3 3.5 x 2 3.5 x 2.5
## 1.5 x 2 7 2 0 0 0 0 0 0
## 1.5 x 2.5 4 3 2 0 0 0 0 0
## 1.5 x 3 0 2 4 3 0 0 0 0
## 2.5 x 2 0 0 4 3 2 0 0 0
## 2.5 x 2.5 0 0 0 4 2 1 2 0
## 2.5 x 3 0 0 0 0 1 2 4 2
## 3.5 x 2 0 0 0 0 1 3 5 0
## 3.5 x 2.5 0 0 0 0 0 2 0 6
## 3.5 x 3 0 0 0 0 0 0 0 1
## 3.5 x 3 class.error
## 1.5 x 2 0 0.2222222
## 1.5 x 2.5 0 0.6666667
## 1.5 x 3 0 0.5555556
## 2.5 x 2 0 0.6666667
## 2.5 x 2.5 0 0.7777778
## 2.5 x 3 0 0.7777778
## 3.5 x 2 0 0.4444444
## 3.5 x 2.5 1 0.3333333
## 3.5 x 3 8 0.1111111

Os principais resultados gerados são a matriz de confusão, que indica a quantidade de observações classificadas corretamente e o plot de
importância das variáveis, no nosso caso, dos componentes principais. Podemos constatar que embora os componentes 1 e 2 carreguem
maiores autovalores, no treinamento via random forest essa tendência não foi observada (componentes 1 e 4 com maior importância).

fit$importance

## MeanDecreaseGini
## Dim.1 20.879531
## Dim.2 8.008494
## Dim.3 6.841514
## Dim.4 11.115772
## Dim.5 8.548775
## Dim.6 8.476584
## Dim.7 7.232146

varImpPlot(fit)

Você também pode gostar