Galeritas: uma biblioteca para visualização de dados
Este artigo foi escrito em conjunto com Bruno Belluomini
Geralmente, temos códigos e funções que podem ser reutilizados em diversos projetos. Aqui no time de Data Science da Creditas isso também acontece e, por isso, nós criamos uma biblioteca interna que possui diversas funções que utilizamos nos mais variados projetos que temos: desde as que usamos para fazer testes estatísticos com as variáveis dos nossos conjuntos de dados até funções para gerar gráficos para nossas análises exploratórias.
O problema de se ter essa biblioteca única é que ao longo dos anos ela começou a ficar cada vez maior e isso também fez com que ela ficasse um pouco bagunçada, visto que várias pessoas do time foram acrescentando seus códigos ao longo do tempo e não tínhamos uma categorização do que havia nela e nem um padrão definido para que as pessoas pudessem seguir.
Assim, sentimos a necessidade de organizá-la e compartimentalizar algumas de suas partes que, por si só, poderiam gerar bibliotecas mais específicas e serem utilizadas somente para os projetos em que fossem necessárias.
Além disso, nosso time também tinha um grande desejo de contribuir com a comunidade de Data Science de alguma forma, mas como essa biblioteca única possui várias funções específicas para o contexto da Creditas, não faria sentido deixá-la aberta a todas as pessoas.
Foi assim que surgiu a ideia de criarmos o Galeritas.
O que é o Galeritas?
O Galeritas é uma biblioteca open source voltada para visualização de dados em Python. Ele contém uma série de gráficos que podem ser utilizados para (mas não se limitando à) análise exploratória de dados e avaliação de modelos criados em projetos de Data Science.
Optamos por criar uma biblioteca contendo gráficos porque eles podem ser utilizados para os mais diversos dados e contextos e, desse modo, achamos que essa seria uma ótima forma de fazer a contribuição para a comunidade que tanto desejávamos, visto que há diversos gráficos mais trabalhosos de serem feitos com o Seaborn ou o Matplotlib. Bastaria então utilizar as funções já disponíveis na biblioteca ao invés de ter que descobrir como criá-las e desenvolvê-las.
Além disso, ela ajuda no dia a dia do nosso time, uma vez que não precisamos ficar procurando em diversos notebooks até conseguirmos encontrar um gráfico que outra pessoa do time utilizou uma vez e que queremos reutilizar no projeto que estamos trabalhando atualmente.
Que gráficos já existem na biblioteca?
No momento em que escrevemos este artigo, o Galeritas conta com 4 gráficos. Nós já criamos uma documentação para a biblioteca (você pode encontrá-la aqui) na qual descrevemos esses gráficos e seus parâmetros, mas abaixo também vamos descrever brevemente as funções que podem gerá-los e dar exemplos de como eles são para facilitar a sua compreensão.
Bar plot with population proportion
Essa função tem como principal objetivo produzir um gráfico de barras com uma informação adicional do tamanho da população presente nas categorias representadas por cada uma das barras presente no gráfico.
Abaixo, temos um exemplo de código utilizando essa função, no qual precisamos fornecer três parâmetros obrigatórios:
- df: o conjunto de dados;
- x: o nome da coluna que contém as categorias que serão descritas pelas barras;
- y: o nome da coluna contendo os valores que serão descritos no eixo Y.
Com o código acima, geramos o gráfico abaixo, no qual podemos visualizar 3 barras mostrando a mediana (que é a métrica default para esse gráfico, mas outras podem ser utilizadas) para as respectivas categorias e a quantidade e proporção da população do conjunto de dados presente em cada uma delas. Por exemplo, a categoria Gentoo tem uma mediana de cerca de 5.000 e 124 exemplos do conjunto de dados é dessa categoria (que representa 36,05% do total de exemplos):
Essa função também contém vários outros parâmetros opcionais (como o título do gráfico e seu tamanho que usamos no exemplo acima) caso se deseje tornar o gráfico mais customizado. Por exemplo, com essa função também é possível dividir a barra de uma mesma categoria mostrando as métricas para os valores positivos e negativos que ela possui.
Plot ECDF curve
Essa função foi criada para gerar uma função de distribuição empírica. Caso você queira saber mais sobre ela, pode conferir este artigo aqui.
O Seaborn agora conta com uma versão para esse gráfico, mas sentíamos falta de algumas coisas nessa implementação, como indicações sobre percentis, o que nos motivou a criar uma versão no Galeritas.
Novamente, temos um exemplo de código abaixo. Para essa função, apenas 2 parâmetros são obrigatórios:
- df: o conjunto de dados;
- column_to_plot: o nome da coluna que contém os valores que utilizaremos para gerar a distribuição.
Com o código acima, produzimos o gráfico abaixo, no qual temos as distribuições para as mesmas categorias que havíamos observado no gráfico anterior. É possível observar que 25% dos exemplos na categoria Gentoo possuem um valor para a variável body_mass_g de até cerca de 4.700. Além disso, conseguimos notar que as distribuições das categorias Adelie e Chinstrap são mais similares do que a distribuição de Gentoo:
Como dissemos anteriormente, esse gráfico só possui dois parâmetros obrigatórios, mas também possui alguns opcionais como o hue, que usamos no exemplo acima para gerar distribuições para cada uma das categorias presente na coluna species do conjunto de dados utilizado.
Precision and recall by probability threshold
Essa função gera um gráfico mostrando as métricas de precisão, recall (ou revocação/sensibilidade) e suporte para diferentes limiares de predições de um modelo. O código dessa função foi adaptado daqui.
Ela exige três parâmetros obrigatórios:
- df: o conjunto de dados;
- prediction_column_name: o nome da coluna que contém as predições feitas pelo modelo;
- target_name: o nome da coluna o target do modelo.
Apesar dessa função ter somente três parâmetros obrigatórios, é importante ter atenção ao parâmetro opcional target, visto que ela indica a classe que será utilizada para gerar as métricas. No exemplo abaixo, usamos o valor do parâmetro target igual a 1 (classe survived = 1), que é o valor default. No entanto, caso quiséssemos ver o gráfico considerando a classe survived = 0, precisaríamos passar este valor para o parâmetro target:
Com o código acima, conseguimos gerar o gráfico abaixo, no qual podemos observar os valores de precisão, recall e suporte para cada limiar de valores preditos pelo modelo. Além disso, como fazemos uma amostragem para ver o desempenho das predições para cada uma das métricas, também é possível notar o intervalo de confiança que temos para cada uma delas:
Assim, para o exemplo acima, se definíssemos um limiar das predições em 0,3, temos, aproximadamente, uma precisão entre 0,66 e 0,81, um recall entre 0,75 e 0,89 e um suporte entre 0,40 e 0,52 .
Stacked percentage bar plot
Por fim, temos a função stacked_percentage_bar_plot, que foi criada para gerar um gráfico de barras empilhadas, de modo a exibir barras para uma determinada categoria e, dentro de cada uma delas, ter barras empilhadas mostrando a proporção de exemplos dela considerando uma segunda categoria.
Abaixo, temos um exemplo de código utilizando essa função, no qual precisamos fornecer três parâmetros obrigatórios:
- df: o conjunto de dados;
- categorical_feature: o nome da coluna que contém as categorias que serão descritas pelas barras;
- hue: o nome da coluna contendo a segunda categoria que será empilhada em cada uma das barras do gráfico.
Com o código acima, geramos o gráfico abaixo no qual podemos observar que, considerando a variável island, quando ela é igual a Biscoe, temos cerca de 25% de exemplos Adelie e 75% Gentoo. Por outro lado, todos os exemplos da categoria Torgersen são Adelie para a variável species:
Todas as funções que acabamos de descrever possuem uma série de parâmetros opcionais que podem ser utilizados para customizar os gráficos (cores, labels, títulos, exibição de nulos, posição da legenda, etc.). Então, caso tenha ficado com curiosidade, não deixe de conferir a documentação para aprender a explorar os gráficos do Galeritas com todo seu potencial!
Como posso utilizar o Galeritas?
A instalação e utilização do Galeritas é bem simples! A biblioteca já consta no Pypi, então para instalá-la basta utilizar o comando abaixo:
pip install galeritas
Após isso, basta importar a biblioteca inteira:
import galeritas
Também é possível importar só as funções dos gráficos que você gostaria de utilizar em seus notebooks, por exemplo:
from galeritas import plot_ecdf_curve
Como posso contribuir com o projeto?
Primeiramente, caso queira fazer parte da comunidade do projeto, deixamos aqui o convite para você entrar no nosso servidor do Discord por este link! O servidor conta com alguns canais para interação e contribuições:
Abaixo, deixamos listadas as diversas maneiras de contribuir com o Galeritas:
- Nos ajudando a resolver issues do projeto;
- Nos ajudando a revisar pull requests (PR);
- Nos ajudando a desenvolver algumas sugestões de gráficos mais votados pela comunidade;
- Criar e reportar uma issue quando encontrar algum bug ou problema;
- Compartilhar ideias de melhorias ou sugestões de novos gráficos;
- Ajudar a divulgar o projeto para pessoas que conhece e que poderiam usá-lo! 💚
Para mais detalhes sobre como essas contribuições podem ser feitas, veja os canais no servidor do Discord ou o repositório do Galeritas no Github.
Por fim, também é importante salientar que quem quiser contribuir com o desenvolvimento e melhoria de códigos, precisa se atentar ao fato de que a biblioteca segue o padrão PEP8 do Python e todos os gráficos devem possuir testes unitários (como referências sobre isso, deixamos um artigo que fala sobre testes unitários para profissionais de dados e também um artigo sobre testes unitários em Python para visualização de dados) para mantermos o padrão e a qualidade do Galeritas 😉
Conclusão e próximos passos
O Galeritas já tem facilitado bastante o fluxo de trabalho do nosso time de Data Science, pois basta instalar a biblioteca no ambiente do projeto, importá-la no notebook e gerar os gráficos desejados!
Como próximos passos, já estamos trabalhando em adicionar mais uma série de gráficos que já usamos ou que achamos interessantes para o nosso time (dando alguns spoilers, podemos citar o gráfico do teste de Kolmogorov-Smirnov (KS) e um scatterplot com quadrantes e informações sobre densidade). Também queremos melhorar a documentação do Galeritas, descrevendo-a melhor e adicionando alguns exemplos de saída das funções para facilitar o seu entendimento.
Esperamos que você tenha se animado para testar a biblioteca e também contribuir para que ela cresça cada vez mais e facilite o trabalho de diversas pessoas (inclusive o seu)! 💚
Tem interesse em trabalhar conosco? Nós estamos sempre procurando por pessoas apaixonadas por tecnologia para fazer parte da nossa Tripulação! Você pode conferir nossas vagas aqui.