SÉRIE DE GRÁFICOS: CORRELOGRAMAS
Olá, Letícia da Minha Estatística aqui :). Click here to go to the post in English.
Essa semana estamos de volta com a Série de Gráficos, e vamos mergulhar nos gráficos de correlação - ou como são chamados, correlogramas. Até agora cobrimos os Gráfico de Violino para analizar a distruibuição dos dados e os Gráfico de Barras Circular para exibição de dados ordenados. Agora, é hora de explorar como os correlogramas podem ajudar a entender as relações entre as variáveis.
Existe uma variante do correlograma conhecida como heatplots ou mapas de calor, que representam visualmente as correlações quando o conjunto de dado está no formato matricial (ou seja, matriz de correlação). Esses gráficos usam cores para representar os valores dentro da matriz enquanto também usa dendogramas para exibir agrupamentos hierárquicos (clusters). Há algumas maneiras de usar os mapas de calor em termos de formato dos dados: estes podem estar no formato long ou no formato wide. O formato long fornece um eixo y com cada observação e sua densidade (nesse caso, você não usa a matriz de correlação como input); para o fomato wide, a matriz de correlação será usada como input.
Os correlogramas, muito como os mapas de calor, exibem a matriz de correlação e normalmente não aceitam variáveis categóricas - com exceção de quando um correlograma clássico é criado utilizando uma matriz de dispersão (scatterplot matrix). O correlograma pode ser mais diverso que o mapa de calor, permitindo mais variação em como os dados são exibidos; o que os correlogramas e os heatmaps têm em comum é que ambos apresentam as correlações dentro dos dados para fins exploratórios.
A correlação é um coeficiente escrito como \(\rho(X, Y)\), e é a versão padronizada da covariância, que indica se as variáveis exercem influência entre si. A vantagem da correlação é que ela não é sensível às unidades das variáveis, já que sua fórmula básica é expressa como:
\[ \rho(X, Y) = \frac{\text{Cov}(X, Y)}{\sqrt{\text{Var}(X) \text{Var}(Y)}}\quad\text{com}\quad-1 \leq \rho(X,Y) \leq 1 \]Onde \(p = 1\) indica uma correlação forte, \(p = 0\) indica nenhuma correlação e \(p = -1\) indica uma correlação negativa perfeita. Como o foco deste post não é especificamente sobre correlação, vamos nos concentrar nos correlogramas e heatplots e deixar um post futuro para tratar exclusivamente de correlações.
Como sempre, estarei mostrando os passos para criar os correlogramas e heatmaps tanto em R quanto em Python. Para isso, escolhi dois conjuntos de dados: anorexia, que inclui uma variável categórica (tipo de tratamento) e duas variáveis numéricas (peso antes e após o tratamento); e crabs, que inclui duas variáveis categóricas (sexo e espécie) e cinco variáveis numéricas que descrevem características observadas, como a profundidade do corpo. Então, vamos começar.
1) Gráfico em R
Comece carregando as bibliotecas necessárias para acessar o conjunto de dados (MASS) e para plotagem (GGally, ggplot2).
# Carregar bibliotecas necessárias
library(MASS)
library(GGally)
library(ggplot2)
# Carregar dados
data("anorexia")
Dentro da biblioteca GGally, a função ggpairs é uma excelente ferramenta para criar o correlograma clássico, com uma matriz de dispersão.
ggpairs(anorexia, columns = 1:ncol(anorexia),
mapping = aes(color = Treat, alpha = 0.5),
axisLabels = "show",
upper = list(continuous = wrap("points", alpha = 1),
combo = wrap("dot_no_facet", alpha = 1)),
lower = list(continuous = wrap("points", alpha = 1),
combo = wrap("box_no_facet", alpha = 1)),
#diag = list(continuous = "densityDiag",
#discrete = "barDiag", na = "naDiag"),
title = "Correlograma do Conjunto de Dados Anorexia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5)
)
Com isso, você pode ajustar os argumentos lower, upper e diag (com diag sendo mostrado o padrão). Quando os dados são contínuos, implica que o argumento também será continuous, que pode ter valores como = "cor", que exibirá os valores de correlação entre cada variável, ou = "points", que exibirá um gráfico de linha com a correlação de acordo com a posição das variáveis na matriz.
Enquanto isso, o argumento combo em ambas as posições lower e upper, coloca boxplots e gráficos de dispersão com jitter onde as variáveis se cruzam com a variável categórica. O gráfico gerado será algo assim:
Agora, serão mostradas duas maneiras diferentes de criar o correlograma, além da sua forma clássica. Para os próximos passos, você precisará do conjunto de dados crabs (também da biblioteca MASS), do pacote corrgram para o próximo gráfico, e do pacote GGally para o segundo correlograma.
# Carregar dados
data("crabs")
library(corrgram)
# Remover colunas com variáveis categóricas
crabs = crabs[,-c(1:3)]
Se as variáveis categóricas não forem removidas, elas serão ignoradas automaticamente. O argumento panel pode ter valores para exibir os dados de diferentes maneiras, como: panel.pts, panel.pie, panel.shade, panel.fill, panel.bar, panel.ellipse, panel.conf e panel.cor. Também há a opção de exibir valores na diagonal, onde estão os nomes das variáveis, como mostrado no comentário do código.
corrgram(crabs, lower.panel = panel.pie,
upper.panel = panel.cor,
#diag.panel=panel.minmax, #Valores min e max na diagonal
col.regions = colorRampPalette(c("darkgreen")),
order = TRUE, # Order variables based on correlation
main = "Correlograma do Conjunto de Dados Crabs",
cex.main = 1.5, cex.axis = 1.2, cex.cor = 1.2) # Ajustar tamanho das legendas
Este próximo correlograma é mais parecido com uma matriz, mostrando uma diagonal e os valores de correlação. A escala pode ser ajustada, incluindo seu ponto médio, assim como o formato geométrico (que também pode ser um círculo, por exemplo). Este é um correlograma mais simples equanto mantém o valor analítico, funcionando de maneira semelhante a um heatmap, exceto pelo fato de que a entrada não é uma matriz e não há variáveis categóricas.
# Biblioteca GGally
ggcorr(crabs,
method = c("everything", "pearson"), # Definir método de correlação
label = TRUE,
#geom = "circle", min_size = 2, max_size = 15, # Altera a exibição para círculos
label_size = 3, # Ajusta legendas
label_color = "white",
low = "white",
mid = "navy",
high = "red",
midpoint = 0.9, # Define o ponto médio
limits = c(0.8, 1), # Limites
legend.position = "right",
legend.size = 8) +
ggtitle("Matriz de Correlação do Conjunto de Dados Crabs") + # Adiciona o título
theme(plot.title = element_text(size = 15, hjust = 0.5)) # Estiliza o título
É importante observar como o input foi mantido no seu formato original até este ponto. Para o heatmap, será necessário alterá-lo para uma matriz de correlação:
# Para os gráficos a seguir, você precisará destas bibliotecas:
library(pheatmap)
library(RColorBrewer) # Para a paleta de cores
crabs_matrix = as.matrix(crabs)
cor_matrix <- cor(crabs_matrix)
Com a função pheatmap, você pode criar um heatmap completo, com todas as suas características, incluindo dendogramas (que foram removidos na segunda linha do código). Esses gráficos tipicamente exibem os valores das correlações para melhor legibilidade.
pheatmap(cor_matrix, display_numbers = TRUE,
cluster_rows = FALSE, cluster_cols = FALSE,
color = brewer.pal(5, "Set2"))
Essas são algumas opções para exibir e visualizar correlações, demonstradas em R. Agora, vamos criá-los em Python.
2) Gráfico em Python
Para criar os gráficos em Python, comece importando as bibliotecas necessárias e o conjunto de dados.
# Importe as bibliotecas necessárias
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Carrege os dados
anorexia = pd.read_csv('caminho_para_o_seu_conjunto_de_dados/anorexia.csv', delimiter=',')
Para criar o correlograma clássico, é necessário usar a biblioteca seaborn juntamente com a função pairplot. O argumento kind pode ser ajustado conforme o tipo de gráfico a ser representado, com opções como 'scatter', 'kde', 'hist' e 'reg'. Da mesma forma, o argumento diag_kind controla o tipo de gráfico exibido na diagonal, aceitando valores como 'auto', 'hist', 'kde' e None.
sns.pairplot(anorexia, kind="scatter", hue="Treat",palette="Set2")
plt.suptitle('Correlograma do Conjunto de Dados Anorexia', size=13)
plt.subplots_adjust(top=0.95)
plt.show()
O argumento hue atribui cores às observações com base em suas categorias.
Outra forma de representar o correlograma, além de sua forma clássica, é uma exibição com o formato matricial. Para isso, carregue o novo conjunto de dados e remova as variáveis categóricas, já que estamos trabalhando com correlações. O próximo passo é criar um DataFrame com as correlações.
# Carrege os dados
crabs = pd.read_csv('caminho_para_o_seu_conjunto_de_dados/crabs.csv', delimiter=',')
# Remova variáveis categóricas
crabs = crabs.drop(columns=['rownames','sex','index'])
corr_matrix = crabs.corr()
Agora, com o DataFrame correto contendo a matriz de correlação, para deixar o gráfico diagonal, crie uma matriz preenchida com zeros, com o tamanho do conjunto de dados, e em seguida retorne os índices para o triângulo superior da matriz. O gráfico será gerado onde há \(0\)'s na matriz. A função para esse gráfico é heatmap. Como já estamos trabalhando com uma matriz de correlação, podemos muito bem referir-nos ao gráfico como um heatmap.
mask = np.zeros_like(corr_matrix) # Cria uma matriz diagonal
mask[np.triu_indices_from(mask)] = True
array([[1., 1., 1., 1., 1.],
[0., 1., 1., 1., 1.],
[0., 0., 1., 1., 1.],
[0., 0., 0., 1., 1.],
[0., 0., 0., 0., 1.]])
sns.heatmap(corr_matrix, mask=mask, square=True,annot=True, fmt='.1f')
plt.yticks([ ])
plt.title('Matriz de Correlação do Conjunto de Dados Crabs')
plt.show()
Se você não quer o mapa de calor diagonal, simplesmente use a função com a matriz de correlação sem o argumento mask:
sns.heatmap(corr_matrix,cmap='Set2')
plt.title('Heatmap da Correlação do Conjunto de Dados Crabs')
plt.show()
Os mapas de calor podem ser úteis ao trabalhar com séries temporais também, como demonstrado no gráfico do conjunto de dados AirPassengers abaixo:
Estas são algumas formas de aplicar correlogramas e heatmaps na prática, proporcionando insights úteis sobre correlações e padrões nos dados, seja para análise exploratória ou para revelar relações entre as variáveis!
Conclusão
Neste post, exploramos a utilidade e versatilidade de correlogramas e heatmaps na análise de correlações e visualização de dados. Essas ferramentas são fundamentais para descobrir padrões, identificar relações e aprofundar a compreensão das correlações entre variáveis em um conjunto de dados. Utilizando bibliotecas em R e Python, demonstramos como criar diferentes tipos de correlogramas e mapas de calor, desde o clássico matriz de dispersão até representações com displays em forma de matriz.
Seja para realizar análises exploratórias ou apresentar relações complexas de forma visualmente clara, correlogramas e heatmaps são poderosas adições ao seu arsenal analítico. Ao adaptar os dados de entrada e os métodos de visualização às suas necessidades específicas, você pode revelar novos insights e comunicar suas descobertas de maneira eficaz.
Esperamos que este guia inspire você a incorporar essas visualizações em seus próprios projetos. Fique ligado para mais posts na Série de Gráficos, enquanto continuamos a explorar a interseção entre dados e visualização!
Também estamos no Instagram @minhaestatistica, e estou ansiosa para ver você por lá!
Letícia - Minha Estatística.
Referências
- Dekking, F.M., Kraaikamp,C., Lopuhaä,H.P. & Meester, L.E. (2005). A Modern Introduction to Probability and Statistics: Understanding Why and How. Springer.
- R Graph Gallery
- Seaborn: Statistical Data Visualization








Comentários
Postar um comentário