capa pca-31

Análise de Componentes Principais (PCA): cálculo e aplicação no R

A PCA é um método estatístico multivariado que foi introduzido por Karl Pearson em 1901 e surgiu da necessidade de analisar variáveis correlacionadas.

A PCA é um método estatístico multivariado que foi introduzido por Karl Pearson em 1901.

Imagine um grande conjunto de dados com variáveis possivelmente correlacionadas. A necessidade de analisar esse banco de dados pode gerar algumas dúvidas:

  • Se existem muitas variáveis como podemos explorar esses dados?
  • Quais variáveis são mais importantes?

O foco é construir combinações lineares com as variáveis originais para reduzir dimensão. Essas combinações lineares são chamadas de componentes principais. Portanto, deseja-se reduzir o número de variáveis a serem avaliadas e interpretar as componentes principais criadas.

Se o banco de dados possui p variáveis, então é possível obter até p componentes principais. Mas, como a intenção é reduzir dimensão, aconselha-se contar com k (k < p) componentes. A informação contida nas p variáveis originais é substituída pela informação das k componentes.

Basicamente, deseja-se:

  • identificar padrões ocultos no conjunto de dados;
  • reduzir dimensão removendo ruídos.

Fatos importantes:

  • as componentes principais são não correlacionadas;
  • a normalidade multivariada dos dados NÃO é um requisito para utilizar a PCA. No entanto, caso os dados apresentem distribuição de probabilidade normal multivariada, as componentes principais são independentes e tem distribuição normal univariada.

Exemplos de utilização

  • Avaliação da reação de pacientes à radioterapia (Johnson; Wichern – 2002)
  • Comparação de estabelecimentos comerciais de Belo Horizonte, MG (Mingoti; Silva – 1997)
  • Controle de qualidade de processos (Kourti; MacGregor – 1996)
  • Estudos de calibração (Fisher; Mara – 1986)

Como obter as componentes principais?

Podemos extrair as componentes a partir da matriz de covariâncias ou da matriz de correlação.

  • Matriz de covariância:
matriz de covariância
  • Matriz de correlação:
matriz de correlação

Se os dados forem transformados deve-se utilizar a matriz de covariâncias das variáveis transformadas. Quando as variáveis são padronizadas (subtrair a média e dividir pelo desvio-padrão) a matriz de covariâncias dos dados padronizados equivale à matriz de correlação das variáveis originais.

Definições importantes

transformação de vetores

Na imagem (a) tem-se 2 vetores: v1 e v2. Ao transformar (a) em (b) o vetor v2 sofre uma mudança de magnitude e direção, já o vetor v1 sofre apenas uma mudança de magnitude. Essa mudança em v1 pode ser dada pela multiplicação de determinado valor (escalar = λ1).

  • v′1 é um autovetor da transformação
  • O escalar λ1 é o autovalor associado a v′1

Portanto, autovalores e autovetores são definicões relacionadas à transformações lineares.

Como o banco de dados possui p variáveis tem-se p autovalores, λ1λ2 ≥ ⋯ ≥ λp, da matriz de covariâncias (ou correlação) com os respectivos p autovetores normalizados e1, e2, ⋯, ep.

  • X = (X1 X2X2p)′: vetor aleatório (dados)
  • μ = (μ1 μ2μp)′: vetor de médias
  • Σpxp: matriz de covariâncias

j-ésima (j = 1, 2, ⋯, p) componente principal da matriz de covariâncias (ou correlação) é definida como:

Yj = e′j X =e j1 X1 + ej2 X2 + ⋯ + ejp Xp

  • OBS: Xi é uma variável do banco de dados com n observações.

Resuldados:

E[Yj] = e′j μ = ej1 μ1 + ej2 μ2 + ⋯ + ejp μp

Var[Yi] = e′j Σpxp ej = λj

Lembre-se que λ1 ≥ λ2 ≥ ⋯ ≥ λp, logo, a 1ª componente é a de maior variabilidade e a p-ésima é a de menor.

Se, a variância da j-ésima componente principal corresponde a λj, então, a variância total de X corresponde a soma dos autovalores (∑pi=1 λi). Portanto, a proporção da variância total de X que é explicada pela j-ésima componente principal é dada por:

proporção da variância total explicada pela j-ésima componente principal

Além disso, a proporção total que é explicada pelas k primeiras componentes principais é definida como:

proporção total que é explicada pelas k primeiras componentes principais

Como escolher o número k

O número k de componentes principais pode ser escolhido a partir de vários critérios. Alguns deles são:

1. Manter um número de componentes k que conjuntamente representam uma determinada porcentagem da variância total;

2. Caso seja usada a matriz de correlação, manter apenas as componentes com autovalor ^λi≥1 (Critério de Kaiser, 1958);

3. Interpretação, a escolha de k pode ser definida pela natureza prática das componentes.

Aplicação e Script no R

Carregando os pacotes necessários:

library(tidyverse) # Para manipular os dados
library(stats) # Para PCA
library(factoextra) # Para criar alguns gráficos

Descrição da base de dados mtcars

A base de dados mtcars (revista Motor Trend de 1974) descreve o consumo de combustível e 10 aspectos do design e desempenho de 32 automóveis.

Ao todo há 11 diferentes variáveis:

data("mtcars")

mtcars <- mtcars %>% rename(
  "milhas_galao" = "mpg", # consumo de combustível em milhas por galão
  # carros mais potentes e mais pesados tendem a consumir mais combustível
  "cilindros" = "cyl", # número de cilindros
  # carros mais potentes geralmente têm mais cilindros
  "deslocamento" = "disp", # volume combinado dos cilindros do motor
  "potencia_bruta" = "hp", # potência gerada pelo carro
  "relacao_et" = "drat", # relação do eixo traseiro
  # valores mais altos diminuirão a eficiência do combustível
  "peso" = "wt", #(1.000 libras)
  "tempo_14" = "qsec", # tempo de 1/4 de milha, velocidade e aceleração dos carros
  "forma_motor" = "vs", # 0 = forma de V e 1 = reto (mais comum)
  "transmissao" = "am", # 0 = automática e 1 = manual
  "marchas" = "gear", # número de marchas para frente
  # carros esportivos tendem a ter mais marchas
  "carburador" = "carb" # número de carburadores, associados a motores mais potentes
)

head(mtcars)
##                   milhas_galao cilindros deslocamento potencia_bruta relacao_et
## Mazda RX4                 21.0         6          160            110       3.90
## Mazda RX4 Wag             21.0         6          160            110       3.90
## Datsun 710                22.8         4          108             93       3.85
## Hornet 4 Drive            21.4         6          258            110       3.08
## Hornet Sportabout         18.7         8          360            175       3.15
## Valiant                   18.1         6          225            105       2.76
##                    peso tempo_14 forma_motor transmissao marchas carburador
## Mazda RX4         2.620    16.46           0           1       4          4
## Mazda RX4 Wag     2.875    17.02           0           1       4          4
## Datsun 710        2.320    18.61           1           1       4          1
## Hornet 4 Drive    3.215    19.44           1           0       3          1
## Hornet Sportabout 3.440    17.02           0           0       3          2
## Valiant           3.460    20.22           1           0       3          1

Para calcular as componentes principais somente as 9 variáveis numéricas serão consideradas.

# Filtrando variáveis númericas
dados_pca <- mtcars[,c(1:7, 10, 11)]

# Calculando o desvio padrão das variáveis
sapply(dados_pca, sd)
##   milhas_galao      cilindros   deslocamento potencia_bruta     relacao_et 
##      6.0269481      1.7859216    123.9386938     68.5628685      0.5346787 
##           peso       tempo_14        marchas     carburador 
##      0.9784574      1.7869432      0.7378041      1.6152000

Obtendo as componentes

A função prcomp permite obter as componentes de forma simples.

# PCA com a matriz de covariâncias
pca_cov <- prcomp(dados_pca)
summary(pca_cov)
## Importance of components:
##                            PC1      PC2     PC3     PC4     PC5     PC6    PC7
## Standard deviation     136.532 38.14735 3.06642 1.27492 0.90474 0.64734 0.3054
## Proportion of Variance   0.927  0.07237 0.00047 0.00008 0.00004 0.00002 0.0000
## Cumulative Proportion    0.927  0.99938 0.99985 0.99993 0.99997 0.99999 1.0000
##                           PC8    PC9
## Standard deviation     0.2859 0.2159
## Proportion of Variance 0.0000 0.0000
## Cumulative Proportion  1.0000 1.0000

O desvio padrão (Standard deviation) da j-ésima componente corresponde a √λj.

Como as variáveis estão em diferentes escalas, o mais adequado é utilizar a matriz de correlação.

# PCA com a matriz de correlação (variáveis padronizadas)
pca_corr <- prcomp(dados_pca, center = TRUE, scale = TRUE)
summary(pca_corr)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6     PC7
## Standard deviation     2.3782 1.4429 0.71008 0.51481 0.42797 0.35184 0.32413
## Proportion of Variance 0.6284 0.2313 0.05602 0.02945 0.02035 0.01375 0.01167
## Cumulative Proportion  0.6284 0.8598 0.91581 0.94525 0.96560 0.97936 0.99103
##                           PC8     PC9
## Standard deviation     0.2419 0.14896
## Proportion of Variance 0.0065 0.00247
## Cumulative Proportion  0.9975 1.00000
fviz_eig(pca_corr)
scree plot

Interpretação:

A 1ª componente explica 62,84% da variância total dos dados. Portanto, quase 2/3 das informações contidas nas 9 variáveis do banco de dados podem ser encapsulada apenas nessa componente. A 2ª componente explica 23,13% da variância total. Com apenas 2 componentes 85,98% da variância dos dados é explicada.

# Coeficientes das componentes principais (autovetores da matriz de correlação)
summary(pca_corr)$rotation #Pode-se trocar os sinais
##                       PC1         PC2         PC3          PC4        PC5
## milhas_galao   -0.3931477  0.02753861 -0.22119309 -0.006126378 -0.3207620
## cilindros       0.4025537  0.01570975 -0.25231615  0.040700251  0.1171397
## deslocamento    0.3973528 -0.08888469 -0.07825139  0.339493732 -0.4867849
## potencia_bruta  0.3670814  0.26941371 -0.01721159  0.068300993 -0.2947317
## relacao_et     -0.3118165  0.34165268  0.14995507  0.845658485  0.1619259
## peso            0.3734771 -0.17194306  0.45373418  0.191260029 -0.1874822
## tempo_14       -0.2243508 -0.48404435  0.62812782 -0.030329127 -0.1482495
## marchas        -0.2094749  0.55078264  0.20658376 -0.282381831 -0.5624860
## carburador      0.2445807  0.48431310  0.46412069 -0.214492216  0.3997820
##                        PC6         PC7         PC8         PC9
## milhas_galao    0.72015586 -0.38138068 -0.12465987  0.11492862
## cilindros       0.22432550 -0.15893251  0.81032177  0.16266295
## deslocamento   -0.01967516 -0.18233095 -0.06416707 -0.66190812
## potencia_bruta  0.35394225  0.69620751 -0.16573993  0.25177306
## relacao_et     -0.01536794  0.04767957  0.13505066  0.03809096
## peso           -0.08377237 -0.42777608 -0.19839375  0.56918844
## tempo_14        0.25752940  0.27622581  0.35613350 -0.16873731
## marchas        -0.32298239 -0.08555707  0.31636479  0.04719694
## carburador      0.35706914 -0.20604210 -0.10832772 -0.32045892

No caso em que todos os coeficientes apresentarem o mesmo sinal (positivo OU negativo) a componente é chamada de índice global. Quando os sinais são opostos a componente é chamada de índice comparativo.

^Y1 = −0.393 Z1 + 0.403 Z2 + 0.397 Z3 + 0.367 Z4 − 0.312 Z5 + 0.373 Z6 − 0.224 Z7 − 0.209 Z8 + 0.245 Z9

^Y1 = 0.393 Z1 − 0.403 Z2 − 0.397 Z3 − 0.367 Z4 + 0.312 Z5 − 0.373 Z6 + 0.224 Z7 + 0.209 Z8 − 0.245 Z9

  • OBS: Zi é a variável i padronizada.

Interpretação PC1:

Em geral, os coeficientes estão equilibrados (todos estão relativamente próximos), sendo que, a variável Z2 apresentou o maior peso (-0.403). Além disso, trata-se de um índice de comparação entre os seguintes grupos de variáveis:

  • Grupo 1 – Z1, Z5, Z7 e Z8 (coeficientes positivos)
  • Grupo 2 – Z2, Z3, Z4, Z6 e Z9 (coeficientes negativos)

Quanto maior o valor das variáveis do Grupo 1, maior o valor do escore de ^Y1.

Quanto maior o valor das variáveis do Grupo 2, menor o valor do escore de ^Y1.

Escores

Cada automovel tem 1 escore para cada componente principal.

summary(pca_corr)$x
##                             PC1        PC2         PC3         PC4         PC5
## Mazda RX4           -0.66422351  1.1734476 -0.20431724 -0.12601751  0.75200784
## Mazda RX4 Wag       -0.63719807  0.9769448  0.11077779 -0.08567709  0.65668822
## Datsun 710          -2.29973601 -0.3265893 -0.21014955 -0.10862524 -0.07622329
## Hornet 4 Drive      -0.21529670 -1.9768101 -0.32946822 -0.30806225 -0.24391787
## Hornet Sportabout    1.58697405 -0.8287285 -1.03299254  0.14738418 -0.22270405
## Valiant              0.04960512 -2.4466838  0.11177774 -0.87154914 -0.12574876
## Duster 360           2.71439677  0.3610529 -0.65206041  0.09633337  0.29674234
## Merc 240D           -2.04370658 -0.8006412  0.84898795 -0.27451338 -0.26307848
## Merc 230            -2.29506729 -1.3056004  1.96848450  0.05055875 -0.45988113
## Merc 280            -0.38252133  0.5811211  0.88632274  0.07026946  0.45835852
## Merc 280C           -0.36652708  0.4121971  1.14860950  0.06150898  0.48309076
## Merc 450SE           1.88466875 -0.7241198 -0.20604588 -0.21856675  0.27996207
## Merc 450SL           1.67107231 -0.7144354 -0.32644071 -0.28933625  0.28061777
## Merc 450SLC          1.77692371 -0.8411687 -0.08557921 -0.28421711  0.34961695
## Cadillac Fleetwood   3.64958983 -0.9480878  0.88315862  0.21645793 -0.34788247
## Lincoln Continental  3.71033756 -0.8426945  0.93230325  0.34099021 -0.34260485
## Chrysler Imperial    3.33196300 -0.4805609  0.67061959  0.65189724 -0.43940743
## Fiat 128            -3.45236266 -0.4327074 -0.22604214  0.10018032 -0.33470301
## Honda Civic         -3.85477722  0.7084152 -0.22670973  1.19340342  0.53954318
## Toyota Corolla      -3.85488283 -0.3872111 -0.25488964  0.21962306 -0.30372397
## Toyota Corona       -1.90375523 -1.5725638  0.06620424  0.07989679  0.50126570
## Dodge Challenger     1.80402354 -1.1340965 -1.00776416 -0.58796239  0.09903732
## AMC Javelin          1.46483534 -0.9777629 -0.76680342 -0.03308788  0.26871378
## Camaro Z28           2.60135738  0.7649595 -0.48915140  0.95247550  0.53065965
## Pontiac Firebird     1.87424485 -0.9791561 -0.89787633  0.22438738 -0.50770999
## Fiat X1-9           -3.14830645 -0.2552569 -0.36230545  0.06406082  0.03361267
## Porsche 914-2       -2.77939557  1.6373369 -0.35969974  0.31886540 -0.43251030
## Lotus Europa        -2.90895427  1.3962368 -0.91635036 -0.90254314 -0.75861156
## Ford Pantera L       1.54812696  3.0206982 -0.51945216  0.86560850 -0.86048411
## Ferrari Dino         0.08049995  2.8346567  0.34481747 -1.14659658  0.29944552
## Maserati Bora        2.96252801  3.9993896  0.70296512 -0.73000448 -0.22756074
## Volvo 142E          -1.90443632  0.1084190  0.39906976  0.31285789  0.11738974
##                             PC6         PC7          PC8          PC9
## Mazda RX4           -0.12506777 -0.42357334 -0.003259165 -0.167051112
## Mazda RX4 Wag       -0.06619437 -0.44849307  0.056643244 -0.071592094
## Datsun 710          -0.56693648  0.38612406 -0.202035744  0.114505030
## Hornet 4 Drive       0.08382435  0.03299362 -0.023714111 -0.145255757
## Hornet Sportabout    0.18280435 -0.05793795  0.152342587 -0.154646072
## Valiant             -0.23043022  0.22451528  0.098663134 -0.004233901
## Duster 360           0.27763557  0.44227307 -0.306373481 -0.186980810
## Merc 240D           -0.19042527 -0.39416400 -0.187088365 -0.010461330
## Merc 230             0.20443847  0.53713423  0.413455512 -0.169005773
## Merc 280            -0.07984989 -0.26113412  0.204105964  0.110461785
## Merc 280C           -0.16066456 -0.07979514  0.352641772  0.027108266
## Merc 450SE           0.17135058 -0.08914480  0.092140434  0.396034809
## Merc 450SL           0.33682412  0.03346598  0.182323579  0.196526577
## Merc 450SLC          0.13926264  0.20632469  0.295340402  0.147796262
## Cadillac Fleetwood  -0.24002207 -0.31053111 -0.171865268 -0.251117818
## Lincoln Continental -0.22646211 -0.28589695 -0.239313268 -0.028994385
## Chrysler Imperial    0.31045750 -0.38304409 -0.359765688  0.223097923
## Fiat 128             0.57303421 -0.24650594 -0.066340528  0.220271421
## Honda Civic          0.37207104 -0.20055288  0.087333576 -0.241702175
## Toyota Corolla       0.83750899 -0.10186868  0.104053562  0.042833437
## Toyota Corona       -0.07212137  0.74680802 -0.408144457 -0.082722856
## Dodge Challenger    -0.33920894 -0.14045443  0.156086022 -0.050247532
## AMC Javelin         -0.31479492  0.03753417  0.370979414 -0.043466032
## Camaro Z28           0.05970074  0.38212238 -0.289612990  0.082069840
## Pontiac Firebird     0.20785973 -0.32709161  0.027471038 -0.130958896
## Fiat X1-9           -0.09586730  0.10352270 -0.020876499  0.021084764
## Porsche 914-2       -0.69006515 -0.26313120 -0.105695694  0.085027267
## Lotus Europa         0.05473409 -0.03491081 -0.236552376 -0.046341050
## Ford Pantera L      -0.50704173  0.37940892  0.548070377  0.053196712
## Ferrari Dino        -0.08124583 -0.26924964 -0.123537656 -0.047915313
## Maserati Bora        0.65580986  0.49422807 -0.082329298 -0.053112079
## Volvo 142E          -0.48091826  0.31102454 -0.315146031  0.165790892

Gráficos

Interpretação geral dos gráficos:

transformação de vetores

Os quadrantes com circulos azuis indicam que uma componente explicou mais as variáveis presentes nesse quadrante do que a outra componente.

# Gráfico de indivíduos (automóveis)
fviz_pca_ind(pca_corr,
             col.ind = "cos2", #Cor pela qualidade de representação
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE, # Texto não sobreposto
             legend.title = "Representação"
)
Individuals - PCA
# Gráfico das variáveis
fviz_pca_var(pca_corr,
             col.var = "contrib", # Cor por contribuições para o PC
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE,     
             legend.title = "Contribuição"
)
Variables - PCA
# Gráfico das variáveis e indivíduos
fviz_pca_biplot(pca_corr, repel = TRUE,
                col.var = "#2E9FDF", # cor das variáveis
                col.ind = "#696969"  # cor dos automoveis
)
PCA - Biplot
# Trocando os nomes das categorias
mtcars <- mtcars %>% mutate(
  forma_motor = case_when(forma_motor == 0 ~ "Forma V",
                          TRUE ~ "Forma reta"),
  transmissao = case_when(transmissao == 0 ~ "Automática",
                          TRUE ~ "Manual")
)

fviz_pca_ind(pca_corr,
             col.ind = mtcars$forma_motor, # cor por forma
             palette = c("#00AFBB",  "#FC4E07"),
             addEllipses = TRUE, 
             ellipse.type = "confidence",
             legend.title = "Forma do motor",
             repel = TRUE
)
Individuals - PCA
fviz_pca_ind(pca_corr,
             col.ind = as.factor(mtcars$transmissao), # cor por transmissao
             palette = c("#00AFBB",  "#FC4E07"),
             addEllipses = TRUE, 
             ellipse.type = "confidence",
             legend.title = "Transmissão",
             repel = TRUE
)
Individuals - PCA
# Gráfico das variáveis e indivíduos
fviz_pca_biplot(pca_corr, repel = TRUE,
                col.var = "black", # cor das variáveis
                col.ind = as.factor(mtcars$transmissao),  # cor dos automoveis
                addEllipses = TRUE,
                legend.title = "Transmissão"
)
PCA - Biplot

Gostou desse artigo? Siga-nos nas redes sociais para saber sempre que lançarmos conteúdos novos.

Share the Post:

4 comentários em “Análise de Componentes Principais (PCA): cálculo e aplicação no R”

  1. Olá gostei do texto gostaria de saber quais informações(dados) de Banco ou Finança eu posso usar para aplicação de componentes principais.

    1. Oi Adjilson! A ideia do uso do PCA é reduzir a dimensionalidade dos dados. Se a base de dados possui muitas variáveis, o objetivo do uso da PCA é explorar esses dados, reduzindo o número de variáveis a serem avaliadas, interpretar essas componentes sem que haja a perda de informação. Em relação a dúvida, seria interessante ter variáveis numéricas.

    1. Bom dia, Roger!

      Depende. Não podemos excluir uma variável apenas porque ela apresenta dados faltantes. O mais indicado é avaliar a importância dessa variável para o estudo, bem como a quantidade de dados faltantes e o quanto eles estão impactando nos resultados.
      Se for uma quantidade pequena de dados faltantes, é possível realizar as análises a depender do tipo de estudo. Caso contrário, é melhor avaliar os resultados considerando todas as observações (incluindo os NA) como também sem considerar os dados faltantes.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Related Posts

Pesquisa Operacional

Artigo feito em colaboração com Valéria Nicéria A Pesquisa Operacional, ou PO, ganhou destaque durante a Segunda Guerra Mundial. Devido

Read More