PORTFOLIO

Análise exploratória de dados — Parte 2

Utilizando o pandas-profiling

Danielle Calazans Dondoni
Danielle Calazans Dondoni

--

A análise exploratória de dados (EDA, acrônimo de Exploratory Data Analysis) é uma das primeiras e principais etapas a serem realizadas pelos cientistas de dados. Consiste em uma análise minuciosa dos dados afim de descobrir padrões, detectar anomalias, dados faltantes, equilíbrio de classes, testar hipótese e verificar suposições com a utilização de representações gráficas e dados estatísticos.¹

Feita essa breve introdução, aproveito para ressaltar que essa é a Parte 2 dessa minha jornada de EDA. O início está publicado no link abaixo e darei sequência às ideias apresentadas anteriormente.

Após importar as bibliotecas necessárias e carregar os dados, os códigos abaixo são usualmente utilizados para obter as informações do dataset (mas não se limitam aos apresentados aqui, são apenas exemplos).

  • df.describe() — Resumo estatístico das variáveis numéricas
  • df.dtypes() — Tipo de dados em cada coluna
  • df.shape() — Quantidade de linhas e colunas
  • df.columns() — Nome das colunas
  • df.info() — Resumo de valores não-nulos
  • df.isnull().sum() — Soma da quantidade valores nulos em cada coluna
  • df['column'].value_counts() — Frequência dos valores em uma coluna

Para análise gráfica outras bibliotecas e mais alguns códigos são necessários, mas não vou me estender nisso por enquanto. O foco principal deste post é apresentar a biblioteca pandas-profiling.

Em resumo, o pandas-profiling é uma ferramenta que gera um relatório com informações estatísticas e as principais características do dataset em poucas linhas de código e ainda é possível exportar esse resultado como um arquivo HTML (acrônimo de HyperText Markup Language, que em português significa Linguagem de Marcação de Hipertexto).

Vamos deixar o circunlóquio de lado e ver como isso realmente funciona! Sem essa preguicinha de panda (rá!).

Photo by Ningyu He on Unsplash

Exemplo de código

O código abaixo compreende desde a instalação da biblioteca à geração do relatório interativo. Retirando as linhas instruções e instalação de bibliotecas (que são essenciais para essa etapa de análise, independente da forma que tenhamos escolhido fazer), sobram 4 linhas. Quanto tempo você levaria para escrever ou copiar/colar isso?

E sabe quanto tempo demorou para gerar o relatório? Menos de um minuto para um dataset de 70000 linhas e 13 colunas. Eu acho isso fantástico!

O relatório está disponibilizado >> aqui << Se quiser acompanhar os próximos tópicos com ele, só clicar na caixinha de download e abrir o arquivo utilizando qualquer navegador (Chrome, Edge, Mozilla…). Na imagem abaixo mostro um pouquinho do relatório :)

Relatório gerado pelo pandas-profiling (Fonte: A autora, 2020)

Relatório gerado

Esse é o tópico principal do post, no qual vamos analisar o relatório gerado e avaliar o dataset. Ao final apresentarei uma série de observações que fiz com base nesse relatório e que me servirá na definição das transformações que serão realizadas (Parte 3 — Em breve!). 🕒

  • Overview → É a primeira seção do relatório, na qual é apresentada um resumo das características do dataset que estou utilizando: número de variáveis (13), número de observações (7000), se há dados faltantes ou se há linhas com duplicatas. Também escreve o tipo das variáveis NUM, BOOL e CAT (numérica, booleana e categórica, respectivamente) e a quantidade.
Relatório parcial gerado pelo pandas-profiling — Seção overview (Fonte: A autora, 2020)
  • Variables → Nesta seção temos as informações para cada variável individualmente, com semelhanças ao que conseguimos visualizar com o df.describe().

O lado esquerdo da tabela fornece os valores únicos e sua porcentagem e valores ausente e sua porcentagem. E no lado direito, para features do tipo numéricas, valor médio, máximo, mínimo, e quantidade de zeros.

Relatório parcial gerado pelo pandas-profiling — Seção variables (Fonte: A autora, 2020)

Na subseção Toggle details há 4 abas com informações relevantes para o EDA: Estatística (statistics), Histograma (histogram), Valores comuns (common values) e Valores extremos (extreme values). Para exemplificar será mostrado os dados da variável peso (weight).

Em Statistics são apresentadas duas tabelas. À esquerda tem dados sobre quantis, onde são apresentados o valor mínimo, percentil 5, primeiro quartil (Q1), segundo quartil (mediana), terceiro quartil (Q3), percentil 95, máximo, intervalo, intervalo interquartil (IQR). Na tabela à direita são apresentados os valores de estatísticas descritiva: desvio padrão, coeficiente de variação, curtose, média, desvio absoluto mediano, assimetria, soma, variância e monotonicidade.

Relatório parcial gerado pelo pandas-profiling — Seção variables — Toggle details — Statistics (Fonte: A autora, 2020)

Na aba Extreme Values são apresentado abaixo os valores mínimos de peso.

Relatório parcial gerado pelo pandas-profiling — Seção variables — Toggle details — Extreme values (Fonte: A autora, 2020)

Aproveito para iniciar uma análise um pouco mais detalhada, mesmo que não esteja avaliando o dataset como um todo: Temos valores de peso igual a 10 kg, esse valor é significativo?

Sim se estiverem se referindo a dados de um bebê com cerca de um ano. Mas para um adulto, esse valor tem algum sentido?

Do que olhei rapidamente na internet, o caso mais extremo era de uma mulher na faixa dos 30 anos e 1,60m e que pesava cerca de 26 kg devido uma anomalia que afeta seu metabolismo. Casos assim devem ser mantidos na análise?

O mais interessante do pandas-profiling é que ele acelera o processo de análise de dados por deixar em evidência as informações que estão destoando das demais.

  • Correlation → Essa seção apresenta a matriz de correlação (em inglês Correlation Matrix), que indica o quanto duas ou mais variáveis estão relacionadas. No pandas é possível obter os coeficientes de correlação de Pearson a partir da função df.corr() no pandas-profiling obtém-se também a correlação de Spearman, Kendall, Philk e Cramers (os detalhes estatísticos não me arrisco a descrever por enquanto).
Relatório parcial gerado pelo pandas-profiling — Aba correlations (Fonte: A autora, 2020)
  • Missing Value → Nesta seção são apresentados a quantidade de valores faltantes para cada uma das colunas. Nesse dataset todas as linhas e colunas estão associadas a algum valor. No pandas essas informações seriam obtidas com df.isnull().sum().
  • Sample → E por último, na última seção são apresentadas as 10 primeiras e as 10 últimas linhas do conjunto de dados, semelhante ao df.head(10) e df.tail(10) do pandas.
Relatório parcial gerado pelo pandas-profiling — Aba Sample — First rows (Fonte: A autora, 2020)

Pontos a serem avaliados

Só com o relatório do pandas-profiling já é possível delinear um caminho para a limpeza dos dados. Apresento uma série de tratamentos que pretendo realizar:

  1. Transformar os dados da coluna Age para anos — está atualmente em dias.
  2. Excluir linhas em que os valores de ap_hi (pressão arterial sistólica) e ap_lo (pressão arterial diastólica) são negativos.
  3. Excluir linhas em que os valores de ap_hi é menor do que a ap_lo. (Essa é um situação muito rara, possível fisicamente apenas quando o paciente possui algum dispositivo no coração).
  4. Excluir valores impossíveis: ap_hi tem valor máximo de 16020 e ap_lo tem máximo de 11000, por exemplo. Definir uma faixa com valores que representam a realidade.
  5. Avaliar a questão da altura dos pacientes. Acredito que casos de nanismo e gigantismo oferecem outros riscos cardíacos inerentes à essa condição.
  6. Criar nova variável -IMC (índice de massa corporal)- para avaliar a questão de sobrepeso ou magreza excessiva e verificar como fica a correlação com a target cardio.
  7. Criar nova variável -PAM (pressão arterial média)- e verificar como fica a correlação com a target cardio.

Relatório de datasets grandes

Para dados com elevada quantidade de informações é possível gerar um relatório que não contém alguns dos cálculos que exigiriam maior desempenho computacional, como correlações e classificação dinâmica. Para tal, é utilizado o parâmetro minimal = True conforme código abaixo:

Outras ferramentas para EDA

Vou deixar disponível o código Python para outras duas ferramentas que podem ser utilizadas nessa etapa de EDA. Eu confesso que não explorei todas as funcionalidades ainda, tampouco posso afirmar que vá muito além do que é obtido com os códigos que apresentarei. A intenção é mostrar que sempre há mais de uma opção para ser utilizado nas análises.

O SweetViz permite comparar dois datasets em um único relatório, para mim esse é o principal ponto positivo que notei numa rápida avaliação. É útil, por exemplo, para verificar se os dados de teste mantém as características principais dos dados de treino. Pontos negativos: Fornecer menos informações que o pandas-profiling e eu não gostei do layout do relatório gerado (mas isso é uma opinião tão particular que nem sei se seria adequado colocar aqui).

Já o AutoViz tem como principal ponto positivo a confecção de inúmeros gráficos com uma única linha de código. Quando eu digo inúmeros, estou me referindo a histogramas, gráfico de dispersão, gráfico de barras, diagrama de caixa (boxplot), gráfico violino, mapa de calor (heatmap) e etc, sendo possível ainda definir a variável alvo e realizar as comparações entre ela e as demais features.

Conclusão

Uma das coisas que mais chamam minha atenção no pandas-profiling (além das análises descritivas e estatísticas) é o layout limpo e organizado, que me ajudam a concentrar em uma coisa por vez, sem interferência do conteúdo ao redor.

Em poucas linhas de código e em menos de 5 minutos, é possível obter informações detalhadas sobre os dados. O arquivo gerado pode ser utilizado numa apresentação inicial do projeto ou discussão com integrantes de outros setores, que talvez fiquem mais confortáveis em ver ‘uma página da internet’ do que uma sequência exaustiva de código_tabela + código_gráfico em um loop quase infinito.

O próximo artigo certamente terá mais mão na massa, mas eu não poderia perder a oportunidade de apresentar essas ferramenta com uma pouco mais de detalhe. Até breve!!!

— Glória, o que você achou desse texto?

Referências

[1]Patil, Prasad. What is Exploratory Data Analysis? Março, 2018. Disponível em: https://towardsdatascience.com/exploratory-data-analysis-8fc1cb20fd15. Acessado em: 27 de setembro de 2020.

--

--