ViolinPlot: uma arma poderosa e elegante para análise de dados

Entenda a sua estrutura e suas vantagens em relação ao boxplot e histogramas

Iury Rosal
Data Hackers
13 min readApr 6, 2021

--

0. Introdução

Visualização de dados é uma área fascinante que permite fazermos análises dos nossos dados, relacioná-los com as regras de negócio e retirar insights para uma tomada de decisão. Esse processo é importante quando falamos em um contexto de projeto de modelagem, pois é muito importante compreender os dados e, assim, já entender que procedimentos fazer dentro de um contexto de pré-processamento.

O ViolinPlot é uma arma poderosa e eu, Iury Rosal, particularmente, adoro esse gráfico. Mas o que ele tem de especial? Por que utilizá-lo? Bem, assim como outros posts que já realizei, seguiremos o Círculo de Ouro, começando pelo porquê, entendendo os “pais” do ViolinPlot: histogramas e box plots, e as vantagens desse gráfico. Após isso, veremos como utilizar e construir um violin plot, com a biblioteca Seaborn no Python. Por fim, veremos o que podemos fazer com essa visualização, que interpretações podemos fazer, com alguns exemplos.

Fonte: Pixabay

1. Os Histogramas

Os histogramas possuem uma estrutura que se assemelha à um gráfico de barras. Todavia, histogramas são utilizados para visualizar a frequência de um conjunto de dados de dados numéricos discretos ou contínuos, que são divididos em determinadas faixas de valores. Dessa forma, você pode avaliar a distribuição de um conjunto de dados e poder avaliar coisas como assimetria (skewness) e presença de outliers.

Outliers são dados que se encontram muito distantes dos demais dados, normalmente são dados muito distantes do ponto central da distribuição dos dados, ou seja, um dado outlier se encontra muito longe da média e mediana dos dados, para mais ou para menos.

No entanto, existem outras visualizações complementares ao histograma que auxiliam no estudo da distribuição dos dados e na identificação de outliers, veremos elas a seguir.

Exemplo de visualização de histograma. Veja que os dados foram divididos em faixas de valores (bins), que representa a largura da barra associada à faixa, e a quantidade de vezes que essa faixa aparece na base é repetido n vezes, sendo a frequência, representando a altura da barra no gráfico.

2. Os BoxPlots

O entendimento dos boxplots é importantíssimo para o entendimento dos ViolinPlots. Arrisco a dizer que o BoxPlot é o pai do ViolinPlot. O Boxplot é uma estrutura importantíssima da estatística para avaliar a distribuição dos dados, auxiliando na identificação de outliers e no estudo da concentração dos dados.

Inicialmente, pegamos um conjunto de dados e colocamos em ordem crescente, procedimento conhecido como deixar os dados em rol. Vamos utilizar como exemplo, esse conjunto de dados:

[30, 6, 34, 32, 10, 19, 56, 20, 35, 40, 80, 94, 120, 350, 40, 40, 240, 42, 343, 10, 5, 12]

Suponha que esses valores representam as distâncias, em quilômetros (km), de 22 cidades de um estado, em relação a capital desse mesmo estado.

Colocando em rol:

[6, 5, 10, 10, 12, 19, 20, 30, 32, 34, 35, 40, 40, 40, 42, 56, 80, 94, 120, 240, 343, 350]

Após isso, podemos dividir nossos dados em 4 partes, os conhecidos quartis. Essa divisão segue a seguinte lógica:

  • 1° Quartil: Representa 25% dos dados desse conjunto. Para localizar o elemento que pertence ao 1° quartil, efetuamos o seguinte cálculo:

Q1 = 0.25 x Total de dados = 0.25 x 22 = 5,5 ~ 6

Logo, o 1° quatil é a 6° posição do conjunto de dados. Na nossa organização em rol, o 6° valor é 19. A interpretação que podemos fazer é que 25% das cidades desse estado possuem menos ou exatamente 19 km de distância da capital.

Cuidado!

O quartil guarda a posição, não o valor que se encontra nessa posição. Então, o Q1 é 6, que significa que até a posição 6 do conjunto de dados organizados em rol temos 25% do conjunto. Após esse pocisionamento, temos o valor atrelado a essa posição.

  • 2° Quartil: Representa 50% dos dados desse conjunto, o valor que se encontra no 2° quartil é a mediana. Efetuamos o seguinte cálculo:

Q2 = 0.5 x Número Total de Dados = 0.5 x 22 = 11

O dado que se encontra na 11° posição é 35 (mediana = 35). Ou seja, 50% das cidades do estado possuem até 35 km de distância da capital.

Cuidado!

Caso o valor da posição (2° quartil) resulte em um número quebrado, pois a quantidade total de dados é ímpar, o ideal não é arrendondar para obter o valor que se encontra nesse quartil (no caso, a mediana), como fizemos no 1° quartil, mas sim fazer a média entre o dado da posição N/2 e (N/2 + 1): ( N/2 +(N/2 + 1) ) / 2, considerando truncamento do valor resultante de N/2. Ou seja, se o resultado fosse 4.5 para o 2° quartil, teríamos que realizar a média entre o valor da 4° e 5° posição para obter o valor da mediana.

  • 3° Quartil: Representa 75% dos dados desse conjunto. O seu cálculo é análogo ao do 1° quartil:

Q3 = 0.75 x Número Total de Dados = 0.75 x 22= 16,5 ~17

O dado da organização em rol na 17° posição é 80. Isso é interpretado como 75% das cidades se encontram com distância de até 80 km da capital.

Realizando esses quartis, dividimos o conjunto de dados em 4 partes. Conforme mostra o desenho abaixo:

Observe que os quartis divide o conjunto de dados em 4 partes iguais, cada parte representando uma quantidade aproximada a 25% do total do número de dados. Dessa forma, conseguimos entender algumas características do conjunto de dados.

Só com os quartis, já conseguimos retirar algumas interpretações do conjunto de dados. Supondo em uma situação que um projeto do governo do estado é refazer o asfalto de estradas entre essas cidades e a capital do estado, considerando que o estado deseja focar nas cidades mais próximas, ou seja, cidades que tenham uma distância inferior a 50 km em relação a capital. Como na nossa análise vimos que 50% das cidades do estado possuem 35 km de distância da capital, mas que 75% das cidades possuem 80 km em relação à capital, vemos que um pouco mais da metade das cidades do estado serão beneficiadas pelo projeto.

No entanto, não paramos por aqui…

Intervalo Interquartil (IQR)

Representa a distância entre o 1° quartil e o 3° quartil. Pode ser calculado pegando a posição do 3° quartil e subtraindo da posição do 1° quartil, análogo à como se fossemos buscar um comprimento de uma caixa.

O cálculo desse termo é importantíssimo para entendermos a dispersão dos dados. Mas Iury, por que usar isso? Já temos o desvio padrão, variância, etc.. Bem, no cálculo do intervalo interquartil utilizamos o 3° quartil e o 1° quartil, para obtê-los tivemos que colocar os dados em rol. E aí está a diferença. As medidas de dispersão, como desvio padrão, não consideram a organização dos dados em ordem crescente, enquanto o Intervalo Interquartil considera isso.

Quanto menor o intervalo interquartil, mais concentrados estão os dados, ou seja, menos dispersos. Quanto maior o intervalor interquartil, menos concentrados estão os dados, ou seja, mais dispersos.

Para nosso exemplo, o cálculo do intervalo interquartil é:

Q3 - Q1 = 17 - 6 = 11 = IQR

Um destaque é que o IQR representa uma faixa, um range que abrange 50% dos dados, já que parte do 1° quartil (25% do conjunto) e termina no 3° quartil (75% do conjunto), sendo a faixa mais central do conjunto e sem existência de outliers.

Limite Inferior e Superior

O cálculo do limite inferior e superior auxilia na identificação de outliers do conjunto de dados. Para calcularmos esses limites, utilizamos as seguintes fórmulas:

  • Limite Inferior (LI): Q1 - (c x IQR), ou seja, pegamos a posição do 1° quartil e subtraimos por c do Intervalo Interquartil. Esse c é uma constante racional que define o quanto será considerado o limite inferior, costuma-se utilizar 1.5 do intervalor interquartil. Todos os dados que se encontrarem abaixo dessa posição do Limite Inferior serão considerados outliers.
  • Limite superior (LS): Q3 + (c x IQR), que é análogo ao Limite Inferior, com a diferença que aqui pegamos o 3° Quartil e somamos por c do Intervalo Interquartil. O ideal é que o mesmo valor que foi utilizado de c para o cáculo do Limite inferior seja o mesmo para o superior. Todos os dados que se encontrarem acima dessa posição do limite superior serão considerados outliers.

Pegando no nosso exemplo e, para este caso, considerando c = 0.3:

  • LI: 6 -(0.3 x 11) = 2.7 ~ 3
  • LS: 17 + (0.3 x 11) = 20.3 ~20

A cidade que se encontra na 3° posição possui 10 km, então as outras duas cidades que se encontram no conjunto de dados e com menos de 10 km de distância da capital são considerados outliers. Enquanto, na posição 20, temos 240 km, ou seja, as outras duas cidades com mais de 240 km de distância da capital são considerados outliers em comparação as demais.

Um ponto importante a ressaltar é que os outliers nem sempre são dados preenchidos incorretamente ou que devem ser obrigatoriamente descartáveis, ás vezes podem ser apenas situações atípicas que realmente aconteceram e podem ser considerados relevantes para a análise da solução para um determinado problema.

O BoxPlot

Iury, tu falou muitos termos, cade o boxplot??? Calma! Agora posso apresentá-lo. A necessidade de reunir e explicar todos esses termos estatísticos é devido ao boxplot ser basicamente uma visualização desses elementos. A imagem abaixo associa bem tudo que vimos até aqui com a visualização do boxplot:

Estrutura do boxplot associado ao termos estatísticos abordados anteriormente. Fonte: Cláudio Siervi

Você pode construir um boxplot utilizando a função boxplot() da biblioteca Seaborn. Neste artigo não entraremos em muitos detalhes da codificação do boxplot, justamente para manter nosso foco no escopo deste artigo.

Por que utilizar o boxplot? O boxplot traz algumas informações adicionais em relação à distribuição de dados, que o histograma não explicita muito bem.. Além disso, o boxplot permite visualizarmos todos os elementos que já vimos anteriormente, o que traz valiosas interpretações. No subtópico a seguir faço algumas associações entre o histograma e o boxplot.

BoxPlot x Histogramas

Quanto mais “espaçado” é o histograma, menos os dados estão concentrados e, como vimos, o intervalo interquartil está diretamente ligado com isso. Nas imagens abaixo, fica ilustrado um comparativo entre o boxplot e o histograma.

Comparativo de histograma e boxplot de gráfico com baixa dispersão, com desvio padrão = 1.4. Fonte: Wikipedia
Comparativo de histograma e boxplot de gráfico com alta dispersão, com desvio padrão = 5. Fonte: Wikipedia

Observe que quanto menor o desvio padrão, mais concentrado são os dados, sendo refletido tanto no histograma como no boxplot. Lembre-se que o comprimento da caixa representa o intervalo interquartil, então quanto menor a caixa, menor é o intervalo interquartil, logo, mais concentrados são os dados.

Note, também, que a medida que o desvio padrão aumenta, junto com a dispersão do histograma e o tamanho da caixa, também são aumentados os limites inferiores e superiores, o que faz sentido já que o calculo desses limites condiz com o intervalo interquartil.

Uma vantagem do boxplot é a facilidade de identificação de outliers em comparação ao histograma. Mas você deve estar se perguntando se existe alguma forma de unificar a visualização que o histograma fornece junto com a do boxplot. E a resposta é que SIM, EXISTE, e essa visualização é justamente o ViolinPlot.

3. Violin Plot: Um casamento entre Histogramas e Boxplots

Como mencionado, o ViolinPlot combina a visualização do boxplot juntamente com um plot de densidade (similar ao que vemos nos histogramas). Dentro do ViolinPlot encontramos os mesmos elementos que encontramos no BoxPlot, conforme mostra a figura abaixo:

Comparativo estrutural entre boxplot e violinplot. Fonte: Eryk Lewinson (Adaptado)

Dentro do gráfico de violino temos o próprio boxplot que estudamos anteriormente. A vantagem do uso do ViolinPlot é que, além das informações que o boxplot já traz consigo, existe a exibição da densidade dos dados. Na figura, a área formada em torno do boxplot representa a distribuição dos dados. Os locais de maior área (onde é mais “gordo” o gráfico), existe uma grande concentração de dados, enquanto em locais de menor área (onde o gráfico é mais “fino”) existe uma baixa concentração de dados.

Para entendermos melhor, faremos um comparativo entre o gráfico de ViolinPlot com o BoxPlot e o Histograma.

Código para construção do comparativo e geração de uma distribuição normal. Fonte: Eryk Lewinson (Adaptado)
Comparação de uma visualização de uma distribuição normal com histograma, boxplot e violinplot.

Comparando o ViolinPlot com o histograma vemos que ambos possuem um formato semelhante, indicando uma distribuição normal. E comparando o ViolinPlot com o BoxPlot, observamos que a mesma estrutura do BoxPlot se encontra dentro do ViolinPlot. Acredito que essa visualização auxilie intuitivamente associar os gráficos e entender as informações que o ViolinPlot carrega.

4. Como construí-los?

Neste tópico e no seguinte (Tópico 5), iremos nos basear nesta base de dados, dispobilizada pelo Seaborn, que representa informações a respeito das contas de clientes de um restautante, contendo informações sobre o valor total da conta, valor da gorjeta, sexo, dia, horário e se a pessoa é fumante ou não.

Carregamento da base e exibição das features disponíveis nessa base.

Para construir os ViolinPlots podemos utilizar a biblioteca Seaborn, do Python, por meio da função violinplot(). Vejamos as possibilidades com esses gráficos.

Utilizando variáveis numéricas

Utilizando apenas 1 feature numérica, você consegue realizar o plot da visualização desse gráfico, podendo avaliar a distribuição unicamente para essa feature.

Construímos um violinplot para estudarmos a variável “total_bill”:

Avaliando unicamente a distribuição da variável numérica (análise acondicionada).

Aqui verificamos que boa parte dos valores das contas se encontram entre 10 e 30, com 50% das contas tendo valor de até 20, aproximadamente. Além disso, pela forma do gráfico, vemos uma leve assimetria à direita, com grande presença de outliers para a direita.

Adiciono a visualização comparativa entre esse gráfico, com um boxplot e um histograma, que reforça as interpretações comentadas anteriormente:

Comparativo de visualizações. Observe que a assimetria percebida no violinplot se destaca no histograma e que a presença dos outliers fica ainda mais evidente no boxplot.

Combinando uma variável numérica com uma categórica

O violinplot() da biblioteca Seaborn permite colocarmos uma variável categórica juntamente com uma numérica, o que ajuda no estudo de como cada classe de uma feature categórica se encontra relacionada com aquela feature numérica. Faremos um exemplo com a feature numérica “total_bill” e uma feature categórica “day” (dia da semana).

Para essa visualização, adicionamos o parâmetro y. Caso a variável categórica esteja no x e a numérica no y, o gráfico fica verticalizado, se ocorrer o contrário, o gráfico fica horizontalizado.

Adicionando a variável categórica no eixo x e a variável numérica no eixo y, conseguimos ter uma visualização do ViolinPlot condicionada e verticalizada.
Para cada classe da feature categórica do eixo X será gerado um ViolinPlot, para avaliarmos a distribuição dessa variável numérica dentro daquele classe (análise condicionada).

Combinando duas variáveis categóricas com uma numérica

Uma possibildiade é avaliarmos a distribuição de uma variável categórica condicionada a duas classes diferentes. Na minha visão, são poucos gráficos que possibilitam essa visualização única com 3 features diferentes. Para isso, utilizamos o parâmetro hue. Faremos um exemplos com a feature numérica “total_bill”, a feature categórica “day” (dia da semana) e a feature categórica “sex” (sexo). Para cada classe da variável categórica no eixo X (no nosso caso), gerará 1 violin plot para cada classe da feature categórica do hue. No nosso caso, a variável “sex” possui duas classes, então para cada classe de “day” (4 classes) teremos 2 violin plots, tendo ao todo 4 x 2 = 8 violins plots.

Visualização de ViolinPlot de uma variável numérica combinada com a condição de 2 features categóricas.

Um incremento interessante é caso a variável categórica que esteja no hue possua duas classes apenas, você pode adicionar o parâmetro split = True, que possibilita uma visualização mais compacta. No entanto, você terá o boxplot, dentro do violin plot, da distribuição da variável numérica sem nenhuma condicional em relação ao hue, tendo apenas como diferenciação entre as duas classes presentes da variável hue o gráfico de densidade. O que difere do gráfico anterior, em que você tinha uma estrutura única para cada classe (exibindo de forma separada tanto a densidade como o boxplot).

Visualização “splitada”, onde existe o boxplot da distribuição acodicionada junto com a exibição de densidades de forma condicionada.

Uma última curiosidade é a possibilidade de retirar o boxplot de dentro do ViolinPlot e substituí-lo por uma marcação dos quartis. Isso pode ser feito com o parâmetro inner, passando como valor quartile. Realizando essa adaptação, recuperamos a ideia de avaliarmos a distribuição da variável numérica dentro de cada classe do hue e do eixo x, informação que tinha sido “perdida” na adição do parâmetro split.

Nesta visualização, temos de uma forma mais explícita a exibição dos quartis. Sendo o primeiro traço mais pontilhado (de baixo pra cima), o 1° quartil, o segundo traço menos pontilhado, o 2° quartil, e o terceiro traço mais pontilhado, o 3° quartil.

Na visualização acima, podemos fazer algumas interpretações, como:

  • Vemos que no Domingo (‘Sun’), as mulheres possuem uma mediana (2° Quartil) menor que o dos homens. Isso mostra que as mulheres, costumam ter contas de menores valores, nos dias de Domingo, comparando aos homens;
  • Na Sexta (‘Fri’), o intervalo interquartil das mulheres é menor do que o dos homens, o que mostra que, neste dia, as mulheres costumam ter uma maior concentração em torno do valor da conta (que é baixo) em comparação aos homens, onde ocorre uma menor concentração, permitindo que a conta chegue em valores cada vez maiores.

Para mais customizações do gráfico de ViolinPlot, recomenda-se a leitura da documentação do Seaborn.

Curiosidade:

Algumas dessas configurações do ViolinPlot e formas de visualização são semelhantes e análogas ao gráfico BoxPlot do Seaborn. Para mais informações, recomenda-se leitura da documentação do boxplot().

5. O que fazer com eles?

Bem, no tópico anterior vimos diferentes usos para o ViolinPlot e como construí-los visando esses usos. Resumidamente, podemos utilizar o violin plot em:

  • análises acondicionadas de variáveis numéricas, onde queremos unicamente avaliar a distribuição dessa variável numérica de forma indenpendente, sem levar em conta outras variáveis do problema;
  • análises condicionadas de uma variável numérica, em relação a uma variável categórica. Nesta análise, vemos como a variável numérica se comporta dentro de cada classe, permitindo um estudo das relações entre elas (análise bivariada) e o comportamente de cada classe;
  • análises condicionadas de uma variável numérica, em relação à duas variáveis categóricas. Aqui montamos pares com as classes das duas variáveis categóricas e avaliamos o comportamento da variável numérica dentro desses pares.

Por meio do ViolinPlot podemos visualizar várias informações sem a necessidade de plotar vários histogramas e boxplots, o que já auxilia bastante na análise. No entanto, para alguns casos, onde existe uma alta concentração de dados, o violinplot pode ficar um pouco ilegível, dificultando a visualização e, normalmente, necessitando a construção de um gráfico complementar. Ressalto que o uso de 3 features, dependendo da quantidade de classes que as 2 features categóricas possuem, a visualização do gráfico pode ser prejudicada, então deve-se ter muito cuidado para não poluir muito o gráfico com um grande volume de informações.

Para complementar este artigo, deixo abaixo um projeto de estudo, que desenvolvi, de análise fescritiva, onde utilizo histogramas, boxplots e violinplots na análise, sendo um ótimo exemplo do que abordamos neste artigo.

Projeto de estudo de análise descritiva desenvolvido por Iury Rosal

6. Conclusão

Neste artigo estudamos a estrutura dos gráficos de Histograma e Boxplot, a fim de entendermos as estruturas que foram herdadas pelo ViolinPlot, permitindo entender suas vantagens e desvantagens em relação à outras visualizações. Espero que o artigo tenha sido útil. Para qualquer feedback ou sugestão de melhoria, deixo disponível meu Linkedin.

--

--

Iury Rosal
Data Hackers

Analista de Dados @Accenture | Bacharel em Engenharia de Computação @UFC