O primeiro passo ao começar a trabalhar com um novo conjunto de dados é entendê-lo. Para fazer isso, você precisa, por exemplo, descobrir os intervalos de valores aceitos pelas variáveis, seus tipos, e também saber a quantidade de valores faltantes.
A biblioteca pandas nos fornece muitas ferramentas úteis para realizar análise exploratória de dados (EDA). Mas antes de usá-los, geralmente você precisa começar com funções mais gerais, como df.describe(). No entanto, deve-se notar que os recursos fornecidos por tais funções são limitados e os estágios iniciais de trabalho com quaisquer conjuntos de dados ao realizar EDA são muitas vezes muito semelhantes entre si.
O autor do material que publicamos hoje diz que não gosta de realizar ações repetitivas. Como resultado, em busca de ferramentas para realizar análises exploratórias de dados de forma rápida e eficiente, ele encontrou a biblioteca
Aqui veremos os recursos de uso da biblioteca pandas-profiling usando o conjunto de dados Titanic como exemplo.
Análise exploratória de dados usando pandas
Decidi experimentar o perfil do pandas no conjunto de dados do Titanic devido aos diferentes tipos de dados que ele contém e à presença de valores ausentes nele. Acredito que a biblioteca pandas-profiling seja especialmente interessante nos casos em que os dados ainda não foram limpos e requerem processamento adicional dependendo de suas características. Para realizar esse processamento com êxito, você precisa saber por onde começar e no que prestar atenção. É aqui que os recursos de criação de perfil do pandas são úteis.
Primeiro, importamos os dados e usamos pandas para obter 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 executar este trecho de código, você obterá o que é mostrado na figura a seguir.
Estatísticas descritivas obtidas usando ferramentas padrão do pandas
Embora haja aqui muita informação útil, não contém tudo o que seria interessante saber sobre os dados em estudo. Por exemplo, pode-se supor que num quadro de dados, numa estrutura DataFrame
, existem 891 linhas. Se isso precisar ser verificado, será necessária outra linha de código para determinar o tamanho do quadro. Embora esses cálculos não consumam muitos recursos, repeti-los o tempo todo certamente desperdiçará um tempo que provavelmente poderia ser melhor gasto na limpeza dos dados.
Análise exploratória de dados usando pandas-profiling
Agora vamos fazer o mesmo usando o pandas-profiling:
pandas_profiling.ProfileReport(df)
A execução da linha de código acima gerará um relatório com indicadores exploratórios de análise de dados. O código mostrado acima irá gerar os dados encontrados, mas você pode fazer com que ele gere um arquivo HTML que pode ser mostrado a alguém, por exemplo.
A primeira parte do relatório conterá uma seção Visão Geral, fornecendo informações básicas sobre os dados (número de observações, número de variáveis, etc.). Também conterá uma lista de alertas, notificando o analista sobre coisas às quais deve prestar atenção especial. Esses alertas podem fornecer pistas sobre onde você pode concentrar seus esforços de limpeza de dados.
Seção do relatório de visão geral
Análise Exploratória de Variáveis
Abaixo da seção Visão geral do relatório você pode encontrar informações úteis sobre cada variável. Incluem, entre outras coisas, pequenos gráficos que descrevem a distribuição de cada variável.
Sobre a variável numérica idade
Como você pode ver no exemplo anterior, o perfil do pandas nos fornece vários indicadores úteis, como a porcentagem e o número de valores ausentes, bem como as medidas estatísticas descritivas que já vimos. Porque Age
é uma variável numérica, a visualização da sua distribuição em forma de histograma permite-nos concluir que temos uma distribuição assimétrica para a direita.
Ao considerar uma variável categórica, os resultados de saída são ligeiramente diferentes daqueles encontrados para uma variável numérica.
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 de criação de perfil do pandas encontrou o número de classes. Porque Sex
— uma variável binária, seus valores são representados por duas classes.
Se você gosta de examinar o código como eu, pode estar interessado em saber como exatamente a biblioteca pandas-profiling calcula essas métricas. Descobrir isso, visto que o código da biblioteca é aberto e está disponível no GitHub, não é tão difícil. Como não sou muito fã de usar caixas pretas em meus projetos, dei uma olhada no código-fonte da biblioteca. Por exemplo, é assim que se parece o mecanismo de processamento de variáveis numéricas, representado pela função
def describe_numeric_1d(series, **kwargs):
"""Compute summary statistics of a numerical (`TYPE_NUM`) variable (a Series).
Also create histograms (mini an full) of its distribution.
Parameters
----------
series : Series
The variable to describe.
Returns
-------
Series
The description of the variable as a Series with index being stats keys.
"""
# Format a number as a percentage. For example 0.25 will be turned to 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']
# To avoid to compute it several times
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# The dropna() is a workaround for 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)
# Histograms
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name)
Embora esse trecho de código possa parecer bastante grande e complexo, na verdade é muito simples de entender. A questão é que no código-fonte da biblioteca existe uma função que determina os tipos de variáveis. Se descobrir que a biblioteca encontrou uma variável numérica, a função acima encontrará as métricas que estávamos observando. Esta função usa operações padrão do pandas para trabalhar com objetos do tipo Series
, como series.mean()
. Os resultados do cálculo 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 funcionar com diferentes tipos de conjuntos de dados.
Indicadores de correlação e dados amostrais estudados
Após os resultados da análise das variáveis, o pandas-profiling, na seção Correlações, exibirá as matrizes de correlação de Pearson e Spearman.
Matriz de correlação de Pearson
Se necessário, você pode, na linha de código que aciona a geração do relatório, definir os indicadores dos valores 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.
Por fim, o relatório pandas-profiling, na seção Amostra, exibe, como exemplo, um dado retirado do início do conjunto de dados. Esta abordagem pode levar a surpresas desagradáveis, uma vez que as primeiras observações podem representar uma amostra que não reflete as características de todo o conjunto de dados.
Seção contendo dados amostrais em estudo
Como resultado, não recomendo prestar atenção a esta última seção. Em vez disso, é melhor usar o comando df.sample(5)
, que selecionará aleatoriamente 5 observações do conjunto de dados.
Resultados de
Resumindo, a biblioteca pandas-profiling oferece ao analista alguns recursos úteis que serão úteis nos casos em que você precisa obter rapidamente uma ideia aproximada dos dados ou passar um relatório de análise de inteligência para alguém. Ao mesmo tempo, o trabalho real com os dados, tendo em conta as suas características, é realizado, como sem a utilização do pandas-profiling, manualmente.
Se você quiser dar uma olhada em como são todas as análises de dados de inteligência em um notebook Jupyter, dê uma olhada em
Caros leitores! Por onde você começa a analisar novos conjuntos de dados?
Fonte: habr.com