Visualização de Dados (também em Python)

Benilton S Carvalho

A importância da visualização de dados

  • Vivemos na era do Big Data, inundados por informações.
  • A análise de dados brutos é complexa e desafiadora.
  • A visualização de dados facilita a compreensão e extração de insights.

Uma imagem vale mais que mil palavras!

Benefícios da visualização de dados

  • Identificação de padrões: Visualizações revelam tendências, outliers e correlações ocultas em dados brutos.
  • Comunicação eficaz: Gráficos e dashboards comunicam insights de forma clara e concisa para diferentes públicos.
  • Tomada de decisão: Visualizações facilitam a análise de cenários e a tomada de decisão estratégica.
  • Engajamento: Visualizações atraentes e interativas aumentam o interesse e a compreensão dos dados.

Tipos mais comuns de visualização

  • Barras: Comparação de categorias.
  • Linhas: Tendências ao longo do tempo.
  • Setor (pizza): Proporções e percentuais.
  • Mapas de calor: Densidade e distribuição de dados.
  • Gráficos de Pontos: Correlação entre variáveis.
  • Redes: Relações entre entidades.

Boas práticas em visualização

  • Simplicidade: Evite gráficos complexos e poluídos.
  • Clareza: Utilize títulos, legendas e rótulos informativos.
  • Precisão: Represente os dados de forma honesta e objetiva.
  • Relevância: Escolha o tipo de gráfico adequado aos dados e à mensagem.
  • Acessibilidade: Crie visualizações acessíveis a pessoas com deficiência visual.
  • Razão Tinta/Informação: Crie visualizações que maximizem o volume de informação transmitida com o menos uso de tinta possível.

Top 10 Piores Gráficos (Karl Broman)

Piores Gráficos

Paradigma da Gramática dos Gráficos

  • Gráficos baseados na gramática de gráficos.
  • Componentes principais:
    1. Dados (data.frame())
    2. Mapeamento estético (ggplot())
    3. Geometria (geom_*())

Informações básicas

Conjuntos de dados:

  • economics: série temporal de dados econômicos norte-americanos.
  • mpg: dados de consumo de combustível para diversos veículos.
  • huron: dados do Lago Huron entre os anos de 1875 e 1972.

Biblioteca para gráficos:

  • plotnine: implementa ggplot no Python

Como se visualiza os dados?

!pip install plotnine
from plotnine.data import economics
print(economics)
          date      pce     pop  psavert  uempmed  unemploy
0   1967-07-01    507.4  198712     12.5      4.5      2944
1   1967-08-01    510.5  198911     12.5      4.7      2945
2   1967-09-01    516.3  199113     11.7      4.6      2958
3   1967-10-01    512.9  199311     12.5      4.9      3143
4   1967-11-01    518.1  199498     12.5      4.7      3066
..         ...      ...     ...      ...      ...       ...
569 2014-12-01  12122.0  320201      5.0     12.6      8688
570 2015-01-01  12080.8  320367      5.5     13.4      8979
571 2015-02-01  12095.9  320534      5.7     13.1      8705
572 2015-03-01  12161.5  320707      5.2     12.2      8575
573 2015-04-01  12158.9  320887      5.6     11.7      8549

[574 rows x 6 columns]

Quais são os dados?

Informações econômicas mensais entre 1967 e 2015. Cada linha possui as seguintes variáveis:

  • date: mês em que os dados foram observados.
  • pce: despesas de consumo pessoal (em bilhões de dólares)
  • pop: população total (em milhares)
  • psavert: taxa de poupança pessoal
  • uempmed: duração mediana do desemprego (em semanas)
  • unemploy: número de desempregados (em milhares)

Visualização de dados

Habitualmente, utilizamos gráficos de linhas para representar a evolução de uma certa observação ao longo do tempo.

from plotnine import ggplot, aes, geom_line
plot01 = (
  ggplot(economics)
  + aes(x = 'date', y = 'pop')
  + geom_line()
)

Gráfico de Linhas

plot01

A Gramática de Gráficos

Componentes obrigatórios:

  • Dados: a informação a ser utilizada para o gráfico.
  • Estética (aes): o mapeamento entre os dados e a estética.
  • Geometria (geom_*): a geometria a ser empregada na construção do gráfico.

A Gramática de Gráficos

Componentes opcionais:

  • Transformações estatísticas especificam cálculos e agregações a serem aplicados aos dados antes de plotá-los.
  • Escalas aplicam alguma transformação durante o mapeamento dos dados para as estéticas. Por exemplo, às vezes você pode usar uma escala logarítmica para refletir melhor alguns aspectos dos seus dados.
  • Facetas permitem dividir os dados em grupos com base em alguns atributos e, em seguida, plotar cada grupo em um painel separado no mesmo gráfico.

A Gramática de Gráficos

Componentes opcionais:

  • Sistemas de coordenadas mapeiam a posição dos objetos para uma localização gráfica 2D no gráfico. Por exemplo, você pode escolher inverter os eixos vertical e horizontal se isso fizer mais sentido na visualização que você está construindo.
  • Temas permitem controlar propriedades visuais como cores, fontes e formas.

Um outro conjunto de dados

from plotnine.data import mpg
print(mpg)
    manufacturer   model  displ  year  cyl       trans drv  cty  hwy fl  \
0           audi      a4    1.8  1999    4    auto(l5)   f   18   29  p   
1           audi      a4    1.8  1999    4  manual(m5)   f   21   29  p   
2           audi      a4    2.0  2008    4  manual(m6)   f   20   31  p   
3           audi      a4    2.0  2008    4    auto(av)   f   21   30  p   
4           audi      a4    2.8  1999    6    auto(l5)   f   16   26  p   
..           ...     ...    ...   ...  ...         ...  ..  ...  ... ..   
229   volkswagen  passat    2.0  2008    4    auto(s6)   f   19   28  p   
230   volkswagen  passat    2.0  2008    4  manual(m6)   f   21   29  p   
231   volkswagen  passat    2.8  1999    6    auto(l5)   f   16   26  p   
232   volkswagen  passat    2.8  1999    6  manual(m5)   f   18   26  p   
233   volkswagen  passat    3.6  2008    6    auto(s6)   f   17   26  p   

       class  
0    compact  
1    compact  
2    compact  
3    compact  
4    compact  
..       ...  
229  midsize  
230  midsize  
231  midsize  
232  midsize  
233  midsize  

[234 rows x 11 columns]

Conjunto de dados mpg

  • manufacturer: fabricante
  • model: modelo
  • displ: tamanho do motor em litros
  • year: ano
  • cyl: número de cilindros
  • trans: tipo de câmbio
  • cty: consumo na cidade
  • hwy: consumo na estrada

Visualização 1

from plotnine import ggplot, aes, geom_point
(
  ggplot(mpg)
  + aes(x = 'class', y = 'hwy')
  + geom_point()
)

Visualização 2

from plotnine import (
  ggplot, aes, geom_point, geom_boxplot,
  geom_jitter, theme_bw, labs
)
plot02 = (
  ggplot(mpg)
  + aes(x = 'class', y = 'hwy')
  + geom_boxplot()
  + geom_jitter(width=0.2, alpha=0.5)
  + theme_bw()
  + labs(x = "Tipo de Veículo",
         y = "Consumo na Estrada (mpg)")
)

Visualização 2 Melhorada

plot02

Visualização 2 Ainda Melhor

from plotnine import (
  ggplot, aes, geom_point, geom_boxplot,
  geom_jitter, theme_bw, labs
)
plot03 = (
  ggplot(mpg)
  + aes(x = 'class', y = 'hwy * 0.4251')
  + geom_boxplot()
  + geom_jitter(width=0.2, alpha=0.5)
  + theme_bw()
  + labs(x = "Tipo de Veículo",
         y = "Consumo na Estrada (km/l)",
         title = "Consumo de Combustível",
         subtitle = "Veículos fabricados entre 1999 e 2008")
)

Visualização 2 Ainda Melhor

plot03

Consumo vs. Número de Cilindros

(
  ggplot(mpg) + aes(x = 'cyl', y = 'hwy') + geom_point()
)

Consumo vs. Número de Cilindros

  • O número de cilindros é, na prática, visto como uma variável categórica
from plotnine import ggplot, aes, geom_boxplot, coord_flip, theme_bw
plot04 = (
  ggplot(mpg) + aes(x = 'factor(cyl)', y = 'hwy*0.4251') + geom_boxplot()
  + coord_flip() + theme_bw()
  + labs(x = 'Número de Cilindros', y = 'Consumo na Estrada (km/L)')
)

Consumo vs. Número de Cilindros

plot04

Não aos gráficos 3D!

Qual é a associação entre o consumo na estrada (hwy) e o tamanho do motor (displ) para cada combinação de tipo de veículo (class) e ano de fabricação (year)?

Este é um gráfico que requer o uso de mais que duas dimensões. Devemos fixar as duas primeiras dimensões na associação de interesse principal e utilizar outros recursos para representar as dimensões adicionais!

Representando mais que 2 dimensões

from plotnine import ggplot, aes, geom_point, facet_grid
plot05 = (
  ggplot(mpg) + aes(x = 'displ', y = 'hwy*0.4251') + geom_point()
  + facet_grid("year", "class") + theme_bw()
  + labs(x = "Tamanho do Motor", y = "Consumo na Estrada (km/L)")
)

Uso de Facetas

plot05

Representando mais que 2 dimensões

from plotnine import ggplot, aes, geom_point, facet_grid
plot06 = (
  ggplot(mpg) + aes(x = 'displ', y = 'hwy*0.4251', color = 'factor(year)')
  + geom_point()
  + facet_grid(cols = "class") + theme_bw()
  + labs(x = "Tamanho do Motor", y = "Consumo na Estrada (km/L)",
         color = "Ano de Fabricação",
         title = "Consumo de Combustível em Função do Tamanho do Motor",
         subtitle = "Motores maiores consomem mais combustível")
)

Mais Sobre Consumo

print(plot06)

Gravando Gráficos em Arquivos

from plotnine import ggplot, aes, geom_point, facet_grid
plot07 = (
  ggplot(mpg) + aes(x = 'displ', y = 'hwy*0.4251', color = 'factor(year)')
  + geom_point()
  + facet_grid(cols = "class") + theme_bw()
  + labs(x = "Tamanho do Motor", y = "Consumo na Estrada (km/L)",
         color = "Ano de Fabricação",
         title = "Consumo de Combustível em Função do Tamanho do Motor",
         subtitle = "Motores maiores consomem mais combustível")
)
plot07.save("grafico07.png", dpi = 600)