Capítulo 02 - Visualizando dados
Acredito que a visualização é um dos meios mais poderosos de alcançar objetivos pessoais. (Harvey Mackay).
Acredito que a visualização é um dos meios mais poderosos de alcançar objetivos pessoais. (Harvey Mackay).
Uma parte fundamental do kit de ferramentas do cientista de dados é a visualização de dados. Embora seja muito fácil criar visualizações, é muito mais difícil produzir boas.
Existem dois usos primários para a visualização de dados:
Para explorar dados e;
Para comunicar dados.
Neste capítulo, nos concentraremos na construção das habilidades que você precisará para começar a explorar seus próprios dados e produzir as visualizações que usaremos durante o restante do nosso estudo. Como a maioria dos nossos tópicos de capítulos, a visualização de dados é um rico campo de estudo que merece um livro próprio. No entanto, tentarei dar a você uma noção do que contribui para uma boa visualização e o que não.
matplotlib
Existe uma grande variedade de ferramentas para visualizar dados. Usaremos a biblioteca matplotlib, que é amplamente usada (embora meio que mostra sua idade). Se você estiver interessado em produzir visualizações interativas elaboradas para a web, provavelmente não é a escolha certa, mas para gráficos de barras simples, gráficos de linha e gráficos de dispersão, funciona muito bem.
Como mencionado anteriormente, o matplotlib não faz parte das bibliotecas inclusas do Python. Com o seu ambiente virtual ativado, instale-a usando este comando:
pip install matplotlib
Usaremos o módulo matplotlib.pyplot. Em seu uso mais simples, o pyplot mantém um estado interno no qual você cria um passo a passo de visualização. Depois de terminar, você pode salvá-la com o savefig ou exibi-la com o show.
Por exemplo, fazer gráficos simples (como a Figura 1) é bem simples:
import matplotlib.pyplot as plt
anos = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
pib = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]
# --- Criar um gráfico de pontos, onde os anos estão no eixo X e o PIB no eixo Y --- #
plt.plot(
anos,
pib,
color='green',
marker='o',
linestyle='solid'
)
# --- Adicionar o título --- #
plt.title('PIB Nominal')
# --- Adicionar legenda ao eixo Y --- #
plt.ylabel('Bilhões de dólares')
# --- Mostrar o gráfico --- #
plt.show()
Figura 1: Um gráfico de pontos simples.
Fazer com que os gráficos pareçam com a qualidade da publicação é mais complicado e está além do escopo deste capítulo. Existem muitas maneiras de personalizar seus gráficos, por exemplo, rótulos de eixos, estilos de linha e marcadores pontuais. Em vez de tentar um tratamento abrangente dessas opções, apenas usaremos (e chamaremos a atenção) alguns deles em nossos exemplos.
Embora não estejamos usar grande parte dessa funcionalidade, o matplotlib é capaz de produzir gráficos com gráficos dentro, formatação sofisticada e visualizações interativas. Confira sua documentação se você quiser ir mais fundo do que neste capítulo.
Gráfico de barras
Um gráfico de barras é uma boa escolha quando você deseja mostrar como alguma quantidade varia entre algum conjunto discreto de itens. Por exemplo, a Figura 2 mostra quantos Oscars foram ganhos por cada um de vários filmes:
import matplotlib.pyplot as plt
filmes = ['Noivo Neurótico, \nNoiva Nervosa', 'Ben-Hur', 'Casablanca', 'Gandhi', 'West Side Story']
num_oscars = [5, 11, 3, 8, 10]
# --- O eixo X leva os filmes e o eixo Y a quantidade de Oscars --- #
plt.bar(range(len(filmes)), num_oscars)
# --- Título e legenda no eixo Y --- #
plt.title('Filmes ganhadores de Oscars')
plt.ylabel('Nº de Oscars')
# --- O eixo X recebe o nome dos filmes centralizado na barra --- #
plt.xticks(range(len(filmes)), filmes)
# --- Mostrar o gráfico --- #
plt.show()
Figura 2: Um gráfico de barras simples.
Um gráfico de barras também pode ser uma boa opção para plotar histogramas de valores numéricos, como na Figura 3, a fim de explorar visualmente como os valores são distribuídos:
import matplotlib.pyplot as plt
from collections import Counter
notas = [83, 95, 91, 87, 70, 0, 85, 82, 100, 67, 73, 77, 0]
# --- Contar quantas notas estão entre a menor nota e 90 --- #
histograma = Counter(min(nota // 10 * 10, 90) for nota in notas)
plt.bar([x + 5 for x in histograma.keys()], # Movimentar as barras em 5 para preencher o decil
histograma.values(), # informar a altura de cada barra
10, # a espessura da barra será 10
edgecolor=(0, 0, 0) # o contorno das barras será preto
)
plt.axis(
[-5, 105, # o eixo X vai de -5 a 105
0, 5] # o eixo Y vai de 0 a 5
)
plt.xticks([10 * i for i in range(11)]) # as labels no eixo X vão de 0 a 100
plt.xlabel('Nota')
plt.ylabel('Quantidade de estudantes')
plt.title('Distribuição de notas')
plt.show()
Figura 3: Usando um gráfico de barras para criar um histograma.
O terceiro argumento para o plt.bar especifica a largura da barra. Aqui escolhemos uma largura de 10, para preencher todo o gráfico. Também mudamos as barras diretamente em 5, de modo que, por exemplo, a barra “10” (que corresponde ao decil 10–20) teria seu centro aos 15 e, portanto, ocuparia o intervalo correto. Também adicionamos uma borda preta a cada barra para torná-las visualmente distintas.
A chamada para o plt.axis indica que queremos que o eixo X varie de –5 a 105 (apenas para deixar um pouco de espaço à esquerda e à direita), e que o eixo Y deve variar de 0 a 5. E a chamada para o plt.xticks coloca os rótulos do eixo X em 0, 10, 20,…, 100.
Seja criterioso ao usar o plt.axis. Ao criar gráficos de barras, é considerado uma forma especialmente ruim para o seu eixo Y não começar em 0, já que essa é uma maneira fácil de enganar as pessoas (Figura 4):
import matplotlib.pyplot as plt
mencoes = [500, 505]
anos = [2017, 2018]
plt.bar(anos, mencoes, 0.8)
plt.xticks(anos)
plt.ylabel('Qtde. de vezes que ouvi alguém falar "data science"')
# --- Colocar que o eixo Y mostra somente valores maiores que 500 --- #
plt.axis([2016.5, 2018.5, 499, 506])
plt.title('Veja o quanto "aumentou"!')
plt.show()
Figura 4: Um gráfico de barra com escala errônea no eixo Y.
Na Figura 5, usamos eixos mais sensíveis e parece muito menos impressionante:
import matplotlib.pyplot as plt
mencoes = [500, 505]
anos = [2017, 2018]
plt.bar(anos, mencoes, 0.8)
plt.xticks(anos)
plt.ylabel('Qtde. de vezes que ouvi alguém falar "data science"')
plt.axis([2016.5, 2018.5, 0, 550])
plt.title('Veja o quanto "aumentou"!')
plt.show()
Figura 5: O mesmo gráfico com a escala correta no eixo Y.
Gráfico de linha
Podemos fazer gráficos de linha usando o plt.plot. Esta é uma boa escolha para mostrar tendências, conforme ilustrado na Figura 6:
import matplotlib.pyplot as plt
variancia = [1, 2, 4, 8, 16, 32, 64, 128, 256]
vies_quadrado = [256, 128, 64, 32, 16, 8, 4, 2, 1]
erro_total = [x + y for x, y in zip(variancia, vies_quadrado)]
xs = [i for i, _ in enumerate(variancia)]
# --- Podemos realizar mútiplas chamadas de plt.plot() no mesmo gráfico --- #
plt.plot(xs, variancia, 'g-', label='variancia') # linha sólida verde
plt.plot(xs, vies_quadrado, 'r-.', label='vies²') # linha ponto-traço vermelha
plt.plot(xs, erro_total, 'b:', label='erro total') # linha pontilhada azul
# --- Como colocamos legenda, vamos posicionar o quadro da legenda no meio do grífico --- #
plt.legend(loc=9)
plt.xlabel('Complexidade do modelo')
plt.xticks([])
plt.title('Vies e variância')
plt.show()
Figura 6: Várias linhas no mesmo gráfico com legenda.
Gráfico de pontos
Um gráfico de dispersão é a escolha certa para visualizar o relacionamento entre dois conjuntos de dados emparelhados. Por exemplo, a Figura 7 ilustra a relação entre o número de amigos que seus usuários têm e o número de minutos que gastam no site todos os dias:
import matplotlib.pyplot as plt
amigos = [70, 65, 72, 63, 71, 64, 60, 64, 67]
minutos = [175, 170, 205, 120, 220, 130, 105, 145, 190]
rotulos = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
plt.scatter(amigos, minutos)
# --- Rotular cada ponto --- #
for rotulo, qtde_amigos, qtde_minutos in zip(rotulos, amigos, minutos):
plt.annotate(rotulo,
xy=(qtde_amigos, qtde_minutos), # colocar o rótulo do ponto
xytext=(5, -5), # ajeitar a posição do texto
textcoords='offset points'
)
plt.title('Minutos diários x Qtde. de amigos')
plt.xlabel('Nº de amigos')
plt.ylabel('Tempo (minutos)')
plt.show()
Figura 7: Gráfico de pontos indicando a quantidade de amigos e o tempo gasto no site.
Se você estiver plotanto variáveis comparáveis, poderá obter uma imagem enganosa se deixar matplotlib escolher a escala, como na Figura 8:
import matplotlib.pyplot as plt
notas_1 = [99, 90, 85, 97, 80]
notas_2 = [100, 85, 60, 90, 70]
plt.scatter(notas_1, notas_2)
plt.title('Os eixos não são comparáveis')
plt.xlabel('Notas 1')
plt.ylabel('Notas 2')
plt.show()
Figura 8: Gráfico de pontos com os eixos incomparáveis.
Se incluirmos uma chamada para plt.axis('equal'), o gráfico (Figura 9) mostra com mais precisão que a maior parte da variação ocorre em notas_2:
Figura 9: A mesma plotagem com os eixos iguais.
Isso é o suficiente para você começar a fazer a visualização. Vamos aprender muito mais sobre a visualização ao longo do nosso estudo.
Para um estudo adicional
A galeria matplotlib fornecerá uma boa ideia dos tipos de coisas que você pode fazer com o matplotlib (e como fazê -los).
O seaborn é construído com base no matplotlib e permite que você produz visualizações mais bonitas (e mais complexas).
O Altair é uma biblioteca Python para criar visualizações declarativas.
O D3.js é uma biblioteca JavaScript para produzir visualizações interativas sofisticadas para a web. Embora não esteja no Python, é amplamente utilizado e vale a pena estar familiarizado com ele.
Bokeh é uma biblioteca que traz visualizações no estilo D3 ao Python.
A biblioteca Plotly possui gráficos interativos, muito utilizado para colocar em sites.