terça-feira, 14 de março de 2017

DataViz - Ferramentas para visualização de dados em Python!

Olá pessoal! Tudo bem?

Hoje quero mostrar algumas ferramentas muito interessantes para visualização de dados. Pretendo retomar o assunto do post anterior, onde usamos um pouco de machine learning para categorizar reportagens em português, mas a pausa é bem justificada!


O Início


Se você já leu qualquer tutorial da internet sobre data analysis, machine learning, deep learning e etc em Python, com certeza você já viu o matplotlib em ação! Ela, provavelmente, é a primeira ferramenta de plotagem que a maioria das pessoas tem contato (visto sua frequência de uso nos tutoriais), mas não se engane pois se trata de uma biblioteca muito poderosa!

É usada para gerar imagens em 2D de várias formas, como gráficos de barra, linha, pizza, histogramas e outros. Vamos ver um exemplo:


import numpy as np
import matplotlib.pyplot as plt

#data
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [3, 2, 5, 7, 4, 2, 4, 6, 7, 8]
ysize = [10, 20, 4, 15, 9, 9, 14, 8, 4, 9]
    

for i in range (0, len(x)):
    plt.plot(x[i], y[i], linestyle="None", marker="o", markersize=ysize[i], color="red")
    
plt.plot(x, y, linestyle="dotted", color="red")


plt.xlim(np.min(x)-1.3, np.max(x)+1.3) #optional 
plt.ylim(np.min(y)-1.3, np.max(y)+1.3) #optional 

plt.xlabel("random y")
plt.ylabel("random x")

plt.show()


















Exemplo retirado de http://mple.m-artwork.eu/home/posts/plotwithdefinedmarkersizesmatplotlib

Para saber mais sobre matplotlib vale a pena conferir a documentação oficial que é ótima e cheia de exemplos. Outra fonte interessante que me ajudou foi o post do Felipe Galvão sobre o assunto!

O Passo Seguinte


Outra ferramenta de visualização muito utilizada em tutoriais, artigos e treinamentos é o Seaborn. Esta foi a segunda ferramenta que tive contato para este fim e acredito que seja assim para muita gente!

O Seaborn é baseado no matplotlib e tem o objetivo de prover uma interface de mais alto nível para a geração de visualizações estatísticas.


import seaborn as sns
%matplotlib inline

sns.set(style="darkgrid", color_codes=True)

tips = sns.load_dataset("tips")
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg",
                  xlim=(0, 60), ylim=(0, 12), color="r", size=7)


























Exemplo retirado de https://seaborn.pydata.org/examples/regression_marginals.html

Neste gráfico vemos a correlação entre 2 conjuntos de dados que foram carregados pela própria biblioteca, tudo de forma bem simples e com pouco código!

Indo alem! Interatividade!


Recentemente conheci o Bokeh e fiquei impressionado! Ele usa o D3.js para gerar visualizações interativas dos dados nos navegadores. Assim, podemos interagir com as visualizações através de zoom, seleção, navegação e etc!


from bokeh.charts import Line, show
from bokeh.plotting import output_notebook
output_notebook()

# build a dataset where multiple columns measure the same thing
data = dict(python=[2, 3, 7, 5, 26, 221, 44, 233, 254, 265, 266, 267, 120, 111],
            pypy=[12, 33, 47, 15, 126, 121, 144, 233, 254, 225, 226, 267, 110, 130],
            jython=[22, 43, 10, 25, 26, 101, 114, 203, 194, 215, 201, 227, 139, 160],
            test=['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar',
                  'foo', 'bar', 'foo', 'bar']
            )

# create a line chart where each column of measures receives a unique color and dash style
line = Line(data, y=['python', 'pypy', 'jython'],
            dash=['python', 'pypy', 'jython'],
            color=['python', 'pypy', 'jython'],
            legend_sort_field = 'color',
            legend_sort_direction = 'ascending',
            title="Interpreter Sample Data", ylabel='Duration', legend=True)

show(line)








Caso não consiga visualizar o gráfico ou interagir com ele,  acesse: http://bokeh.pydata.org/en/latest/docs/gallery/line_chart.html

O Bokeh, assim como as outras ferramentas, pode gerar imagens em arquivos separados ou integrados ao Jupyter Notebook. Para saber mais sobre essa integração acesse essa documentação especifica.

No blog do Felipe Galvão também há um artigo sobre o Bokeh que recomendo a leitura!

Visualização em 3D


Chegamos agora a ferramenta que me motivou a escrever este post, o Ipyvolume! Trata-se de uma biblioteca para visualização interativa em 3D da forma mais simples possível! O projeto esta em desenvolvimento, mas em sua versão 0.3 já surpreende com as funcionalidades disponíveis (realidade virtual, por exemplo!).

Podemos gerar visualizações 3D com outras ferramentas (o site do projeto cita algumas) e até com matplotlib, mas o esforço é bem maior. Vamos a um exemplo:


import ipyvolume.pylab as p3
import numpy as np

# create 2d grids: x, y, and r
u = np.linspace(-10, 10, 50)
x, y = np.meshgrid(u, u)
r = np.sqrt(x**2+y**2)
print("x,y and z are of shape", x.shape)
# and turn them into 1d
x = x.flatten()
y = y.flatten()
r = r.flatten()
print("and flattened of shape", x.shape)

# create a sequence of 15 time elements
time = np.linspace(0, np.pi*2, 15)
z = np.array([(np.cos(r + t) * np.exp(-r/5)) for t in time])
print("z is of shape", z.shape)

# draw the scatter plot, and add controls with animate_glyphs
p3.figure()
s = p3.scatter(x, z, y, marker="sphere")
p3.animate_glyphs(s, interval=200)
p3.ylim(-3,3)
p3.show()




Caso tenha problemas para visualizar ou interagir com o gráfico, acesse a página do projeto: http://ipyvolume.readthedocs.io/en/latest/animation.html

Concluindo...


O objetivo deste post era apenas mostrar algumas ferramentas interessantes para a visualização e análise de dados e por isso demos pouca atenção ao código. Pretendo escrever mais sobre este assunto com mais detalhes assim que começar a aplicar estas (ou outras) ferramentas em minhas análises. 

Todas as referencias que usei estão lincadas ao longo do texto para te ajudar a saber mais sobre cada ferramenta!

Você conhece ou usa outras ferramentas para visualização de dados? Gostou do post? Tem alguma dica, dúvida ou sugestão? Então comenta aqui em baixo e vamos conversando!

Espero ter ajudado! Um abraço!