Abrindo a Caixa Preta: PCA (Análise de Componentes Principais)

Felipe Veras
14 min readJul 18, 2021

--

Este é o primeiro artigo que escrevo da série “Abrindo a Caixa Preta”, onde vou escrever um pouco de tudo o que eu estou aprendendo sobre Ciência de Dados no MBA da USP/Esalq de Data Science and Analytics. Espero que possam aprender junto comigo sobre alguns dos principais algoritmos dessa área pela qual sou apaixonado!

A Análise Fatorial por Componentes Principais (PCA) configura-se em técnica exploratória que lida com variáveis MÉTRICAS que possuem, entre si, consideráveis valores de correlação, a fim de se estabelecer nova(s) variável(is) que capture(m) o comportamento conjunto das variáveis originais. Essas variáveis têm o nome de Fator.

Logo, temos 2 condições para se usar o PCA:

  1. As variáveis devem ser métricas;
  2. Elas devem ter um alto grau de correlação entre si.

Pode-se entender a PCA como uma técnica que agrupa as variáveis enquanto o Clustering agrupa observações. Como objetivo da PCA, podemos dizer que esta técnica serve para REDUZIR A DIMENSIONALIDADE da base de dados.

Um modo para se imaginar como funciona uma PCA é: Dado uma base de dados com N dimensões, onde N é o número de variáveis da sua base de dados, precisamos encontrar uma nova base ortogonal de ATÉ N dimensões que expliquem o máximo da variância dessas dimensões da base de dados original.

Mudança de base

Mas para que serve a PCA? Podemos encontrar algumas utilizações importantes dessa técnica para além da redução de dimensionalidade da base de dados conforme já dito.

  1. A evidenciação de variáveis ortogonais entre si;
  2. A validação de constructos
  3. A elaboração de rankings sem a utilização da ponderação arbitrária.

Primeiro Passo: Testar a adequabilidade dos dados

Como saber se eu preciso usar a PCA para a minha base de dados? Existem 3 métodos para descobrir a adequabilidade dos dados na utilização da Análise Fatorial.

A estatística KMO (Keiser-Meyer-Olkin)

  1. O KMO é uma estatística, não um teste estatístico;
  2. Tabela de Adequação: (PONDERAÇÃO ARBITRÁRIA)
Tabela de adequação do KMO

A estatística é calculada da seguinte maneira:

onde o r² é o quadrado dos elementos da matriz de correlações fora do eixo principal e q² é o quadrado da correlação parcial entre as variáveis.

O Teste de Esfericidade de Bartlett

O teste de esfericidade de Bartlett verifica a adequabilidade da sua matriz de correlações, como falamos anteriormente, com o propósito de verificar se a matriz de correlações da sua base de dados é estatisticamente igual a uma matriz identidade de mesma dimensão.

Para fazer este teste, assumimos como Hipótese Nula que a matriz de correlação ρ da sua base de dados é estatisticamente igual a uma matriz identidade. Ou seja, a matriz de correlação tem a diagonal principal igual a 1 e o resto dos valores igual a zero.

O que isso significa? Que temos uma base de dados onde não existe correlação entre nenhuma das variáveis que compõem essa base. Importante salientar que o teste verifica se as correlações entre as variáveis são ESTATISTICAMENTE IGUAIS a 0, o que não quer dizer que elas sejam 0.

Como Hipótese Alternativa, temos que a matriz de correlações da sua base de dados não é ESTATISTICAMENTE IGUAL a uma matriz identidade.

Fórmula geral do teste de esfericidade de Bartlett

O teste de esfericidade de Bartlett pode ser calculado da seguinte maneira

Onde p é o número de variáveis na sua base de dados, n é o tamanho da sua amostra e lRl é o determinante da matriz de correlação ρ

O teste segue uma distribuição qui quadrada com a seguinte quantidade de graus de liberdade

Onde p é o número de variáveis na sua base de dados

A partir do valor calculado na distribuição qui quadrada acima, precisamos agora calcular o p-value. Para rejeitarmos a Hipótese Nula, que é o que queremos, temos de ter que o valor calculado na distribuição qui quadrada acima deve ser maior que o valor dessa mesma distribuição para o nível de significância desejado. Se for maior, podemos rejeitar a hipótese nula e aceitarmos a hipótese alternativa.

Para a escolha do nível de significância, é necessária análise do problema em questão para que a escolha desse nível não seja muito pequena ou muito grande. Como padrão da estatística, adotou-se 5% de nível de significância.

O que isso quer dizer? Que dado que rejeitamos a Hipótese Nula, existe uma probabilidade de 5% dela ser verdadeira. Ou seja, não deveríamos ter rejeitado a hipótese nula.

Para calcular o p-value, necessitamos encontrar qual distância em desvios padrão que a estatística calculada está do ponto do nível de significância, ou seja, os 5% à direita da distribuição qui quadrado. Usando a distribuição do qui quadrado com os parâmetros encontrados no teste, você vai encontrar o p-value.

Aplicação em Python — Teste de Esfericidade de Bartlett

from scipy.stats import bartlettstats, pvalue = bartlett(
dados_num[‘renda’], dados_num[‘quota’], dados_num[‘escolaridade’], dados_num[‘idade’], dados_num[‘renda’], dados_num[‘mortalidade’], dados_num[‘txcresc’], dados_num[‘causasext’], dados_num[‘favel’], dados_num[‘denspop’])

Utilizando a função bartlett da biblioteca scipy, não precisamos usar como parâmetro a matriz de correlação. Entretanto, esta função só aceita como parâmetros arrays de 1 dimensão, por isso tive que colocar como parâmetro cada coluna individualmente.

A função terá 2 saídas: “stats” que é a estatística calculada na distribuição qui quadrado para os dados de entrada e “pvalue” que é o p-valor da função. Assim como discutimos na seção teórica, caso o p-valor seja menor que que o nível de significância escolhido, podemos rejeitar a hipótese nula e realizar a PCA na base de dados.

Segundo Passo: Criar a matriz de Correlações

Para entender se é necessário utilizar a PCA, precisamos analisar a matriz de correlação dos dados. Mas o que significa correlação?

Definição de Correlação

“O Coeficiente de Correlação de Pearson é a covariância de 2 variáveis dividida pelo produto dos seus desvios padrão. Mais comumente representada pela letra grega ρ (Rho ou Rô).

Onde cov é a covariância, σx é o desvio-padrão da variável X e σy é o desvio-padrão da variável Y.

A covariância pode ser explicada da seguinte maneira

Onde X é a variável X, Y é a variável Y, μx e μy são as médias dessas variáveis.

logo, podemos reescrever a expressão da correlação da seguinte maneira

Onde σx e σy estão definidos acima, μx e μy, são as médias das variáveis x e y, e E é o Esperado.

Construção da Matriz de Correlação

A matriz de correlação de pearson traz informações muito importantes acerca dos dados da nossa base. Cada número mostra o quanto as variáveis estão relacionadas entre si, 2 a 2, podendo assumir valores de -1 à 1.

  • Valores positivos (>0) significam que as variáveis são diretamente proporcionais. Ou seja, quando uma aumenta, a outra aumenta também;
  • Valores negativos (<0) significam que as variáveis são inversamente proporcionais. Ou seja, quando uma aumenta, a outra diminui;
  • Quando o valor é 0, significa que não há nenhuma relação entre as 2 variáveis;
  • A correlação entre uma variável e ela mesma é sempre 1.
Matriz de Correlação geral

Logo, podemos assumir que quanto mais próximo de 0, mais fraca é essa relação e quanto mais longe, mais forte é essa relação.

Exemplo de uma Matriz de Correlação

Aplicação em Python — Criando a matriz de Correlação

Para construir a matriz de correlação, utilizamos a função corr() da biblioteca pandas. Para isso, aplicamos a função em cima de todo o dataframe, com o cuidado de separarmos as variáveis numéricas das variáveis categóricas.

import pandas as pdcorr = df_numerico.corr()

Como resultado, teremos a tabela acima. Para ter uma visualização melhor dessa matriz de correlação, podemos transformá-la num heatmap utilizando as bibliotecas matplotlib.pyplot e seaborn

fig, ax = plt.subplots()fig.set_figheight(10)
fig.set_figwidth(10)
sns.heatmap(corr, annot = True)

Como resultado, teremos o heatmap abaixo.

Terceiro Passo: Calcular os Autovalores e Autovetores

Falando um pouco dos Fatores, o resultado da PCA é uma lista de Fatores que vão representar os novos eixos da base ortogonal encontrada. O primeiro fator é a combinação que explica a maior quantidade de variância da amostra. O Segundo fator explica a 2ª maior quantidade de variância e não é correlacionada com a primeira, e assim vai… Assim, o output do PCA é um conjunto de variáveis não correlacionadas derivado de um conjunto de variáveis correlacionadas.

Dito isso, o Fator é a combinação linear de k variáveis originais, sendo cada variável influenciada por um valor s, que chamaremos de Score Fatorial.

Para o cálculo dos Scores Fatoriais, é necessário encontrar os Autovalores e o Autovetores da matriz de correlação ρ da sua base de dados. Os Autovalores podem ser encontrados a partir do seguinte cálculo:

det(𝞀 — 𝝺² * I) = 0

onde det é o determinante da matriz, 𝞀 é a matriz de correlação, 𝝺 são os autovalores e I é a matriz identidade.

Definição de Autovalores

A definição de Autovalor depende do nicho que estamos estudando. Para falar sobre Análise Fatorial, vamos definir Autovalores como “vetores independentes, advindos de uma matriz quadrada, que capturam o máximo da variabilidade dos dados. Pode-se entender, portanto, os autovalores como parcelas da variância total capturada das variáveis estudadas.”

Podemos então dizer que a fórmula do Autovalor apresentado acima pode ser reescrita matricialmente como

e o determinante dessa matriz resultará numa equação de ordem k, onde k é o número de variáveis na sua base de dados, que é chamada de “polinômio característico”. Resolvendo o polinômio característico, encontraremos uma lista com k autovalores.

Uma forma de pensarmos os Autovalores neste contexto é que, ordenados do maior para o menor, de maneira análoga, o maior autovalor captura a variância de de i variáveis, onde i é o autovalor, o segundo autovalor captura a variância de j variáveis, onde j é o autovalor.

Por fim, uma propriedade interessante dos autovalores neste contexto é que a soma de todos os autovalores vai ser sempre k, onde k é o número de variáveis da sua base de dados.

O cálculo do autovalor é importante pois, com ele, conseguimos calcular a variância compartilhada entre cada Fator e as variáveis originais.

Mas o que isso quer dizer? Quer dizer que se a variância compartilhada para o primeiro autovalor for 50%, o primeiro Fator consegue explicar 50% de toda a variância de sua base de dados.

Para o cálculo da variância compartilhada, precisamos dividir o Autovalor encontrado pela soma de todos os autovalores, ou como já vimos, por k.

Variância Compartilhada = 𝝺²/k ou 𝝺²/∑𝝺²

a soma de todas as variância compartilhadas, de todos os autovalores, é por definição 1, ou 100%.

Definição de Autovetores

Um modo de ver os Autovetores no contexto de Análise Fatorial é “Os autovetores são projeções da variância capturada, utilizados para o cálculo dos scores fatoriais e das cargas fatoriais.” A determinação dos autovetores v11, v21, …, vk1, a partir do primeiro autovalor (𝝺²¹) pode ser dada por:

Cada autovalor vai conter k autovetores, onde k é o número de variáveis na sua base de dados. Assim, podemos interpretar esses autovetores como sendo as projeções das variâncias capturadas das variáveis originais. Assim, conseguimos inferir quais as variáveis que impactam mais na construção de cada fator.

Aplicação em Python — Autovalores e Autovetores

Para nossa sorte, a biblioteca sklearn.decomposition já nos traz os autovalores e autovetores quando aplicamos a PCA. Assim, mostrarei UM MODO de encontrar os autovalores e os autovetores para a sua PCA.

from sklearn.decomposition import PCApca = PCA()
pca.fit(dados_num)
autovalores = pca.explained_variance_
autovetores = pca.components_

Os Autovalores estarão ordenados do maior para o menor e os autovetores ordenados de acordo com os autovalores.

Quarto Passo: Definir a quantidade de Fatores

Agora que já calculamos os autovalores e autovetores, já sabemos da variância compartilhada de cada fator em relação às variáveis de sua base de dados e das projeções das variâncias de cada variável em cada fator, precisamos definir a quantidade de fatores que vamos utilizar.

A princípio, a escolha da quantidade de fatores depende do seu problema de negócio ou de pesquisa, mas existem alguns métodos utilizados para definição da quantidade de fatores. Vamos falar de 2 deles abaixo.

  1. Método de Keiser: Esse método consiste na escolha dos fatores onde seus respectivos autovalores possuam um valor acima de 1. Ou seja, queremos utilizar apenas os fatores que explicam o equivalente à variância de 1 ou mais variáveis.
  2. Análise das Variâncias Compartilhadas: Esse método é mais subjetivo, onde é analisada a soma variância compartilhada acumulada. Queremos, com esse método, escolher a quantidade de fatores que explicam a maior quantidade de variância que possui mantendo a menor quantidade de fatores possível. Para isso, dependendo do seu problema de negócio, 70~90% da variância compartilhada explicada pode ser o suficiente, logo, serão definidos os fatores que somando, obtenham entre 70% e 90% da variância compartilhada.

Aplicação em Python — Fazendo Screeplot e a Variância Comaprtilhada

Para fazer o Screeplot, precisamos apenas dos autovalores, já calculados na sessão anterior. Vamos utilizar a biblioteca matplotlib.pyplot para criar esse plot.

fatores_x = ['F1','F2','F3', 'F4','F5','F6', 'F7','F8','F9']
fig, ax = plt.subplots()
fig.set_figheight(10)
fig.set_figwidth(10)
ax.bar(x=fatores_x, height= autovalores)plt.show()

Como resultado, teremos o gráfico de barra abaixo. Para definir a quantidade de fatores a serem utilizados usando o método de Keiser, baixa pegar os fatores que explicam a variância de mais de 1 variável. Neste caso, usaríamos os 3 primeiros fatores.

Para a análise de variâncias compartilhadas, usaremos a mesma biblioteca mas agora vamos analisar a soma acumulada da variância explicada de cada fator em relação ao total.

fatores_x = ['F1','F2','F3', 'F4','F5','F6', 'F7','F8','F9']
fig, ax = plt.subplots()
fig.set_figheight(10)
fig.set_figwidth(10)
ax.bar(x=fatores_x, height= np.cumsum(covar_explicada_perc))for x,data in enumerate(np.cumsum(covar_explicada_perc)):
plt.text(x = fatores_x[x], y = data , s = f'{data}')
plt.show()

Como resultado, teremos o plot abaixo (eu sei que a enumeração ficou horrível mas ela cumpre seu propósito)

Assim como o Screeplot, poderíamos escolher 3 ou 4 fatores segundo a Análise das Variâncias Compartilhadas.

Quinto Passo: Calcular os Scores Fatoriais

Calculados os Autovalores e os Autovetores, conseguimos agora calcular agora os scores fatoriais, que multiplicados pelas variáveis transformadas pelo z-score, encontraremos os fatores. Para este cálculo vamos usar a seguinte fórmula:

Ou seja, um Score Fatorial vai ter k valores, sendo k podendo ser de 1 até o número de variáveis presentes na sua base de dados, e será representado como uma matriz de k linhas e 1 coluna.

Voltando à imagem da página 6, que copiei abaixo, vamos agora ter todos os dados necessários para o cálculo dos fatores.

Para o cálculo do primeiro Fator, vamos multiplicar os valores dos scores fatoriais encontrados anteriormente pelas variáveis padronizadas e assim somar tudo. Para o cálculo do segundo fator, repete-se o cálculo acima só que considerando apenas os scores fatoriais provenientes do 2º autovalor.

Normalização das variáveis

Para o cálculo dos fatores, precisamos normalizar as variáveis, ou seja, trazer todas as variáveis para um mesmo intervalo. Para isto, usamos o método do Z-score, onde calculamos os seguintes parâmetros para cada variável:

  • Média:
onde xi são os valores das observações da variável e n é o número de variáveis.
  • Desvio Padrão:
Onde xi são os valores das observações da variável, μ é a média da variável e N é o total de observações

Assim, para a padronização, usa-se a fórmula do Z-score, abaixo

Cálculo dos Fatores

Finalmente, para o cálculo dos fatores, vamos fazer o cálculo acima descrito. Multiplicar cada score fatorial pelo valor de uma variável de uma das linhas e somar tudo.

PONTO DE ATENÇÃO: A multiplicação de cada score fatorial com o valor da variável respectiva e a soma do total vai trazer como output o VALOR DAQUELA OBSERVAÇÃO PARA O FATOR.

Aplicação em Python — Aplicação do PCA

Primeiramente, precisamos normalizar todas as variáveis que vamos utilizar para o cálculo dos fatores. Para isso, vamos utilizar a biblioteca sklearn.preprocessing.StandardScaler. Fazendo isso, consigo manter a distribuição de cada uma das variáveis e colocá-las todas dentro de um mesmo intervalo.

from sklearn.preprocessing import StandardScalerstd = StandardScaler()dados_std = std.fit_transform(dados_num)

Agora, a aplicação do PCA é simples e rápida, utilizando apenas a função transform() depois de criado o objeto PCA e depois de já fitado.

from sklearn.decomposition import PCApca = PCA()
dados_pca = pca.fit_transform(dados_std_df)

Sexto Passo: Calcular as cargas fatoriais e a comunalidade

Definição de Cargas Fatoriais

As cargas fatoriais nada mais são que as correlações de Pearson entre os fatores e as variáveis originais utilizadas para a elaboração da PCA. Assim, é possível entender qual a relação entre os fatores e as variáveis da base de dados. Os resultados serão análogos aos resultados já vistos pelos Autovetores.

Uma característica interessante dessas cargas fatoriais é que quando você soma os quadrados dessas cargas fatoriais para cada Fator, o resultado será o Autovalor referente àquele fator.

Para o cálculo das cargas fatoriais, basta juntar as bases de dados das variáveis originais e dos fatores e usar a mesma lógica de correlações explicada no 2º passo.

Definição de Comunalidade

A comunalidade representa a variância total compartilhada da cada uma das variáveis originais com todos os fatores extraídos. Ou seja, o que é comum de cada variável nos fatores?

Para fazer esse cálculo, precisamos apenas usar a fórmula apresentada no subtópico anterior. Para entender as partes comuns entre as variáveis e apenas 2 dos fatores, podemos elevar ao quadrado as cargas fatoriais desses 2 fatores e somar, resultando na comunalidade. O que isso quer dizer? Essa comunalidade vai representar toda a variância total compartilhada entre esses 2 fatores e as variáveis da sua base de dados.

Aplicação em Python — Cargas Fatoriais

Conforme falamos anteriormente, as cargas fatoriais nada mais são do que as correlações entre os Fatores e as variáveis originais da base de dados. Para isso, um dos modos é juntar os DataFrames da base de dados original com a base de dados transformada e usar a função corr() já utilizada antes.

dados_cargas = dados_num.copy()
dados_cargas['F1'] = dados_fatores['F1']
dados_cargas['F2'] = dados_fatores['F2']
dados_cargas['F3'] = dados_fatores['F3']
print(dados_cargas.corr().iloc[0:9,9:12])

O resultado será a tabela abaixo.

Revisão de Conceitos

  • Teste da esfericidade de Bartlett: Teste para verificar se devemos rejeitar a hipótese de que a matriz de correlação de uma base de dados é igual a uma matriz identidade. Se rejeitarmos (p-value < nível de significância), podemos utilizar a PCA para redução de dimensionalidade.
  • Matriz de Correlação: Mostra a relação 2 a 2 entre cada uma das variáveis da base de dados. Valores podem assumir entre -1 e 1 e quanto mais longe do 0, mais forte a relação entre estas 2 variáveis.
  • Autovalores: Para o universo da PCA, podemos dizer que os autovalores mostram quantas variáveis cada autovalor representa em termos de variância. Quando dividimos os Autovalores pelo número de variáveis na base de dados, conseguimos entender a variância explicada que cada fator terá sobre a variância total das variáveis originais.
  • Autovetores: Para o universo da PCA, podemos definir os autovetores como sendo as projeções das variâncias capturadas das variáveis originais. Ele vai mostrar o quanto cada fator está capturando da variância de cada variável.

OBS: Enquanto o autovalor vai mostrar o quanto cada fator explica da variância TOTAL das variáveis, os autovetores vão mostrar o quanto da variância DE CADA variável está sendo explicada por cada fator.

  • Método de Keiser: Para definir quantos fatores serão utilizados no modelo, utiliza-se apenas aqueles com os autovalores mais que 1.
  • Scores Fatoriais: Calculado como a divisão entre o Autovetor pela raiz do seu respectivo autovalor, os scores fatoriais representam o “peso” ou a “influência” que cada variável terá no cálculo do fator.
  • Cargas Fatoriais: As cargas fatoriais nada mais são que as correlações de Pearson entre os fatores e as variáveis originais utilizadas para a elaboração da PCA.

Comunalidade: A comunalidade representa a variância total compartilhada da cada uma das variáveis originais com todos os fatores extraídos. Ou seja, o que é comum de cada variável nos fatores?

Agradeço a todos que leram até aqui! Este foi um exercício de estudo do tema e espero que tenha ajudado mais alguém! Se tiverem alguma coisa à acrescentar, corrigir ou debater, pode me enviar um email felipeverasaraujo@gmail.com!

Me sigam também no Linkedin

--

--

Felipe Veras

Analista de Dados de Recife e estudante de Ciência de Dados!