Ao começar a trabalhar com um novo conjunto de dados, é fundamental compreendê-lo. Para isso, por exemplo, é necessário descobrir os intervalos de valores que as variáveis podem assumir, seus tipos e também saber quantos valores estão ausentes.
A biblioteca pandas nos oferece uma variedade de ferramentas úteis para realizar análise exploratória de dados (Exploratory Data Analysis, EDA). No entanto, antes de utilizá-las, geralmente é necessário começar com funções mais gerais, como df.describe(). Vale ressaltar que as capacidades oferecidas por funções desse tipo são limitadas, e as etapas iniciais de trabalho com qualquer conjunto de dados durante a EDA muitas vezes são bastante semelhantes entre si.
O autor do material que publicamos hoje menciona que não é fã de realizar tarefas repetitivas. Por isso, em busca de ferramentas que permitam realizar análises exploratórias de dados de forma rápida e eficaz, ele encontrou a biblioteca . Os resultados do seu trabalho não são apresentados como indicadores isolados, mas na forma de um relatório HTML bastante detalhado, que contém a maioria das informações sobre os dados analisados que podem ser necessárias antes de avançar para uma análise mais aprofundada.
Aqui, serão abordadas as particularidades do uso da biblioteca pandas-profiling com o conjunto de dados Titanic.
Análise exploratória de dados com pandas
Decidi experimentar o pandas-profiling no conjunto de dados Titanic devido à diversidade de tipos de dados que ele contém e à presença de valores ausentes. Acredito que a biblioteca pandas-profiling é especialmente interessante em casos onde os dados ainda não estão limpos e necessitam de um tratamento adicional, que depende das suas características. Para realizar esse tipo de tratamento com sucesso, é necessário saber por onde começar e a que prestar atenção. É aqui que as funcionalidades do pandas-profiling se tornam úteis.
Para começar, vamos importar os dados e usar o pandas para obter as métricas de estatísticas descritivas:
# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np
# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# вычисление показателей описательной статистики
df.describe()Após a execução deste trecho de código, teremos o que é mostrado na próxima imagem.

As métricas de estatísticas descritivas obtidas com as ferramentas padrão do pandas
Embora haja uma abundância de informações úteis aqui, não está tudo o que seria interessante saber sobre os dados em análise. Por exemplo, pode-se supor que, no DataFrame, na estrutura DataFrame, existem 891 linhas. Se isso precisa ser verificado, será necessária mais uma linha de código que determine o tamanho do DataFrame. Embora esses cálculos não sejam particularmente exigentes em termos de recursos, a repetição constante deles levará inevitavelmente à perda de tempo, que provavelmente seria melhor gasta na limpeza dos dados.
Análise exploratória de dados usando pandas-profiling
Agora faremos o mesmo utilizando pandas-profiling:
pandas_profiling.ProfileReport(df)A execução da linha de código apresentada acima permitirá gerar um relatório com métricas de análise exploratória de dados. O código mostrado acima resultará na saída de informações encontradas sobre os dados, mas pode-se fazê-lo de forma que o resultado seja um arquivo HTML, que, por exemplo, pode ser mostrado a alguém.
A primeira parte do relatório conterá a seção Overview (Visão Geral), que fornece informações básicas sobre os dados (número de observações, número de variáveis, e assim por diante). Além disso, conterá uma lista de avisos, alertando o analista sobre o que merece atenção especial. Esses avisos podem servir como dicas sobre onde concentrar esforços na limpeza dos dados.

Seção do relatório Overview
Análise exploratória das variáveis
Após a seção Overview, o relatório pode revelar informações úteis sobre cada variável. Elas incluem, entre outras coisas, pequenos gráficos que descrevem a distribuição de cada variável.

Informações sobre a variável numérica Idade
Como pode ser visto no exemplo anterior, o pandas-profiling nos dá vários indicadores úteis, como a porcentagem e a quantidade de valores ausentes, bem como as métricas de estatísticas descritivas que já vimos. Como Idade é uma variável numérica, a visualização de sua distribuição em forma de histograma nos permite concluir que ela apresenta uma distribuição assimétrica à direita.
Ao considerar uma variável categórica, os indicadores apresentados diferem um pouco daqueles encontrados para a variável numérica.

Informações sobre a variável categórica Sexo
Ou seja, em vez de encontrar a média, o mínimo e o máximo, a biblioteca pandas-profiling encontrou o número de classes. Como Sexo — uma variável binária, seus valores são representados por duas classes.
Se você, assim como eu, gosta de explorar o código, pode se interessar por como exatamente a biblioteca pandas-profiling calcula essas métricas. Descobrir isso, considerando que o código da biblioteca é aberto e acessível no GitHub, não é tão difícil. Como não sou muito fã de utilizar 'caixas pretas' em meus projetos, olhei o código-fonte da biblioteca. Por exemplo, veja como é o mecanismo de processamento de variáveis numéricas, apresentado pela função :
def describe_numeric_1d(series, **kwargs):
"""Computa estatísticas de resumo de uma variável numérica (`TYPE_NUM`) (uma Série).
Também cria histogramas (mini e completo) de sua distribuição.
Parâmetros
----------
series : Série
A variável a ser descrita.
Retorna
-------
Série
A descrição da variável como uma Série com índice sendo as chaves das estatísticas.
"""
# Formata um número como uma porcentagem. Por exemplo, 0.25 será convertido em 25%.
_percentile_format = "{:.0%}"
stats = dict()
stats['type'] = base.TYPE_NUM
stats['mean'] = series.mean()
stats['std'] = series.std()
stats['variance'] = series.var()
stats['min'] = series.min()
stats['max'] = series.max()
stats['range'] = stats['max'] - stats['min']
# Para evitar calcular várias vezes
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# O dropna() é uma solução alternativa para https://github.com/pydata/pandas/issues/13098
stats[_percentile_format.format(percentile)] = _series_no_na.quantile(percentile)
stats['iqr'] = stats['75%'] - stats['25%']
stats['kurtosis'] = series.kurt()
stats['skewness'] = series.skew()
stats['sum'] = series.sum()
stats['mad'] = series.mad()
stats['cv'] = stats['std'] / stats['mean'] if stats['mean'] else np.NaN
stats['n_zeros'] = (len(series) - np.count_nonzero(series))
stats['p_zeros'] = stats['n_zeros'] * 1.0 / len(series)
# Histogramas
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name) Embora este fragmento de código possa parecer bastante grande e complexo, na verdade, é muito simples de entender. O que acontece é que no código-fonte da biblioteca há uma função que determina os tipos de variáveis. Se a biblioteca encontrar uma variável numérica, a função acima encontrará as métricas que discutimos. Esta função utiliza operações padrão do pandas para trabalhar com objetos do tipo Série, como series.mean(). Os resultados dos cálculos são armazenados em um dicionário stats. Os histogramas são gerados usando uma versão adaptada da função matplotlib.pyplot.hist. A adaptação visa garantir que a função possa trabalhar com diferentes tipos de conjuntos de dados.
Indicadores de correlação e amostra dos dados analisados
Após a análise das variáveis pelo pandas-profiling, na seção Correlações, serão exibidas as matrizes de correlação de Pearson e Spearman.

Matriz de correlação de Pearson
Se necessário, é possível, na linha de código que inicia a geração do relatório, definir os valores de limite utilizados no cálculo da correlação. Ao fazer isso, você pode especificar qual força de correlação é considerada importante para sua análise.
E, finalmente, no relatório do pandas-profiling, na seção Amostra, um fragmento de dados, retirado do início do conjunto de dados, é exibido como exemplo. Essa abordagem pode levar a surpresas indesejadas, pois as primeiras observações podem representar uma amostra que não reflete as características de todo o conjunto de dados.

Seção que contém a amostra dos dados analisados
Como resultado, eu não recomendo prestar atenção a essa última seção. Em vez disso, é melhor usar o comando df.sample(5), que aleatoriamente selecionará 5 observações do conjunto de dados.
Resultados
Em resumo, pode-se notar que a biblioteca pandas-profiling oferece algumas funcionalidades úteis que são valiosas em casos onde é necessário obter rapidamente uma visão geral das informações ou passar um relatório de análise exploratória de dados para outra pessoa. No entanto, o trabalho real com os dados, levando em consideração suas particularidades, é feito, assim como sem o pandas-profiling, manualmente.
Se você deseja ver como fica toda a análise exploratória de dados em um único notebook Jupyter — confira meu projeto, criado com o nbviewer. E no repositório do GitHub você pode encontrar o código correspondente.
Prezados leitores! Por onde você começa a analisar novos conjuntos de dados?
Fonte: habr.com
