top of page
  • Foto do escritorDiogo Vidal

Análise Exploratória de Dados - O que é?

A Análise Exploratória de Dados, também conhecida como Exploração de Dados, é uma etapa do Processo de Análise de Dados, onde uma série de técnicas são usadas para melhor compreender o conjunto de dados que está sendo usado.

'Compreender o conjunto de dados' pode referir-se a uma série de coisas...

  • Extraindo variáveis ​​importantes e deixando para trás variáveis ​​inúteis

  • Identificar outliers (são dados que se diferenciam drasticamente de todos os outros, são pontos fora da curva), valores ausentes ou erro humano

  • Compreender a (s) relação (ões), ou a falta de, entre as variáveis

  • Em última análise, maximizando suas percepções de um conjunto de dados e minimizando possíveis erros posteriormente no processo

Por quê isso é importante?!


Você já ouviu a frase “entra lixo, sai lixo”?


Com a AED, é mais como, "entra o lixo, executa a AED, possivelmente sai o lixo".

Ao conduzir a AED, você pode transformar um conjunto de dados quase utilizável em um conjunto de dados completamente utilizável. Não estou dizendo que a AED pode limpar magicamente qualquer conjunto de dados - isso não é verdade. No entanto, muitas técnicas de AED podem solucionar alguns problemas comuns que estão presentes em todos os conjuntos de dados.


A Análise Exploratória de Dados tem como principio dois pontos principais:


1. Ajuda a limpar um conjunto de dados.

2. Dar uma melhor compreensão das variáveis ​​e das relações entre elas.


Componentes de AED


Para mim, existem componentes principais para explorar dados:

  1. Compreendendo suas variáveis

  2. Limpando seu conjunto de dados

  3. Analisando relações entre variáveis

Neste artigo, daremos uma olhada nos dois primeiros componentes.


1. Compreendendo suas variáveis


Você não sabe o que você não sabe. E se você não sabe o que não sabe, como pode saber se seus insights fazem sentido ou não? Você não vai.

Para dar um exemplo, eu estava explorando os dados fornecidos pela NFL (dados aqui ) para ver se conseguia descobrir alguma informação sobre as variáveis ​​que aumentam a probabilidade de lesões. Uma descoberta que tive foi que os Linebackers acumularam mais de oito vezes mais lesões do que os Tight Ends. No entanto, eu não tinha ideia de qual era a diferença entre um Linebacker e um Tight End, e por causa disso, eu não sabia se minhas idéias faziam sentido ou não. Claro, posso pesquisar no Google quais são as diferenças entre os dois, mas nem sempre poderei confiar no Google! Agora você pode ver por que entender seus dados é tão importante. Vamos ver como podemos fazer isso na prática.

Como exemplo, usei o mesmo conjunto de dados que usei para criar meu primeiro modelo Random Forest, o Conjunto de Dados de Carros Usados aqui . Primeiro, importei todas as bibliotecas que sabia que precisaria para minha análise e conduzi algumas análises preliminares.


#Importando bibliotecas 
import numpy as np 
import pandas as pd 
import matplotlib.pylab as plt 
import seaborn as sns

#Compreendendo minhas variáveis 
df.shape 
df.head () 
df.columns

.shape retorna o número de linhas pelo número de colunas do meu conjunto de dados. Minha saída foi (525839, 22), o que significa que o conjunto de dados tem 525839 linhas e 22 colunas.


.head () retorna as primeiras 5 linhas do meu conjunto de dados. Isso é útil se você deseja ver alguns valores de exemplo para cada variável.


.columns retorna o nome de todas as suas colunas no conjunto de dados.


saída df.columns


Depois de saber todas as variáveis ​​do conjunto de dados, quis entender melhor os diferentes valores de cada variável.

df.nunique (axis = 0) 
df.describe (). apply (lambda s: s.apply (lambda x: format (x, 'f')))

.nunique (axis = 0) retorna o número de valores exclusivos para cada variável.

.describe () resume a contagem, média, desvio padrão, mínimo e máximo para variáveis ​​numéricas. O código que segue simplesmente formata cada linha para o formato regular e suprime a notação científica.

df.nunique(axis=0) output

df.describe (). apply (lambda s: s.apply (lambda x: format (x, 'f'))) output


Percebi um problema com preço, ano e hodômetro. Por exemplo, o preço mínimo e máximo são $ 0,00 e $ 3.048.344.231,00. Veja como lidei com isso na próxima seção. Eu ainda queria entender melhor minhas variáveis ​​discretas.

df.condition.unique ()

Usando .unique () , dei uma olhada em minhas variáveis ​​discretas, incluindo 'condition'.

df.condition.unique()


Você pode ver que existem muitos sinônimos entre si, como 'excelente' e 'como novo'. Embora este não seja o melhor exemplo, haverá alguns casos em que é ideal agrupar palavras diferentes. Por exemplo, se você estava analisando padrões climáticos, pode querer reclassificar 'nublado', 'cinza', 'nublado com possibilidade de chuva' e 'muito nublado' simplesmente como 'nublado'.

Posteriormente, você verá que acabo omitindo esta coluna por ter muitos valores nulos, mas se você quiser reclassificar os valores da condição, poderá usar o código abaixo:


# Reclassificar coluna da condição 
def clean_condition(row):
    good = ['good','fair']
    excellent = ['excellent','like new']       
    if row.condition in good:
        return 'good'   
    if row.condition in excellent:
        return 'excellent'    
    return row.condition    

    # Limpar dataframe 
def clean_df(playlist):
    df_cleaned = df.copy()
    df_cleaned['condition'] = df_cleaned.apply(lambda row: clean_condition(row), axis=1)
    return df_cleaned# Get df with reclassfied 'condition' column
df_cleaned = clean_df(df)print(df_cleaned.condition.unique())

E você pode ver que os valores foram reclassificados abaixo.

print(df_cleaned.condition.unique()) output


2. Limpando seu conjunto de dados


Agora você sabe como reclassificar dados discretos se necessário, mas há várias coisas que ainda precisam ser verificadas.

uma. Removendo variáveis ​​redundantes

Primeiro, livrei-me de variáveis ​​que considerava redundantes. Isso inclui url, image_url e city_url.

df_cleaned = df_cleaned.copy().drop(['url','image_url','city_url'], axis=1)

b. Seleção Variável

Em seguida, eu queria me livrar de todas as colunas que tinham muitos valores nulos. Usei o código a seguir para remover todas as colunas que tinham 40% ou mais de seus dados como valores nulos. Dependendo da situação, posso querer aumentar ou diminuir o limite. As colunas restantes são mostradas abaixo.

NA_val = df_cleaned.isna().sum()def na_filter(na, threshold = .4): 

#somente selecione as variáveis ​​que passam o limite
    col_pass = []
    for i in na.keys():
        if na[i]/df_cleaned.shape[0]<threshold:
            col_pass.append(i)
    return col_passdf_cleaned = df_cleaned[na_filter(NA_val)]
df_cleaned.columns

c. Removendo outliers

Eu defino parâmetros de preço, ano e hodômetro para remover quaisquer valores fora dos limites definidos. Nesse caso, usei minha intuição para determinar parâmetros - tenho certeza de que existem métodos para determinar os limites ideais, mas ainda não investiguei isso!


df_cleaned = df_cleaned[df_cleaned['price'].between(999.99, 99999.00)]
df_cleaned = df_cleaned[df_cleaned['year'] > 1990]
df_cleaned = df_cleaned[df_cleaned['odometer'] < 899999.00]df_cleaned.describe().apply(lambda s: s.apply(lambda x: format(x, 'f')))

Você pode ver que os valores mínimo e máximo foram alterados nos resultados abaixo.

d. Removendo Linhas com Valores Nulos

Por último, usei .dropna (axis = 0) para remover todas as linhas com valores nulos. Após o código abaixo, passei de 371982 para 208765 linhas.


df_cleaned = df_cleaned.dropna (axis = 0) 
df_cleaned.shape

Matriz de correlação


A primeira coisa que gosto de fazer ao analisar minhas variáveis ​​é visualizá-las por meio de uma matriz de correlação, porque é a maneira mais rápida de desenvolver um entendimento geral de todas as minhas variáveis. ​​Assim, uma matriz de correlação é uma tabela que mostra os coeficientes de correlação entre muitos variáveis.

Usei sns.heatmap () para traçar uma matriz de correlação de todas as variáveis ​​no conjunto de dados de carros usados.


# calcular matriz de correlação 
corr = df_cleaned.corr()

# plot mapa de calor
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))

Podemos ver que existe uma correlação positiva entre preço e ano e uma correlação negativa entre preço e odômetro. Isso faz sentido, pois os carros mais novos são geralmente mais caros e os carros com mais quilometragem são relativamente mais baratos. Também podemos ver que há uma correlação negativa entre ano e hodômetro - quanto mais novo um carro, menor o número de milhas com o carro.


Gráfico de dispersão


É muito difícil superar os mapas de calor de correlação quando se trata de visualizações de dados, mas os gráficos de dispersão são indiscutivelmente uma das visualizações mais úteis quando se trata de dados.

Um gráfico de dispersão é um tipo de gráfico 'plot' os valores de duas variáveis ​​ao longo de dois eixos, como idade e altura.

Os gráficos de dispersão são úteis por muitos motivos: como matrizes de correlação, permitem que você entenda rapidamente uma relação entre duas variáveis, são úteis para identificar valores discrepantes e são instrumentais quando modelos de regressão múltipla polinomial.

Usei .plot () e configurei o 'tipo' de gráfico como dispersão. Também defino o eixo x como 'odômetro' e o eixo y como 'preço', pois queremos ver como diferentes níveis de quilometragem afetam o preço.

df_cleaned.plot(kind='scatter', x='odometer', y='price')

Isso narra a mesma história que uma matriz de correlação - há uma correlação negativa entre odômetro e preço.

O que é interessante sobre os gráficos de dispersão é que eles comunicam mais informações do que apenas isso. Outra ideia que você pode presumir é que a milhagem tem um efeito decrescente no preço.

Em outras palavras, a quantidade de quilometragem que um carro acumula no início de sua vida afeta o preço muito mais do que mais tarde, quando o carro envelhece. Você pode ver isso porque os gráficos mostram uma queda acentuada no início, mas se torna menos acentuada à medida que mais quilometragem é adicionada.

É por isso que as pessoas dizem que comprar um carro novo não é um bom investimento!

df_cleaned.plot(kind='scatter', x='year', y='price')

Para dar outro exemplo, o gráfico de dispersão acima mostra a relação entre ano e preço - quanto mais novo o carro, mais caro provavelmente será.

Como bônus, sns.pairplot () é uma ótima maneira de criar gráficos de dispersão entre todas as suas variáveis.

sns.pairplot(df_cleaned)

Histograma


Matrizes de correlação e gráficos de dispersão são úteis para explorar a relação entre duas variáveis. Mas e se você quisesse apenas explorar uma única variável?

É quando os histogramas entram em jogo. Os histogramas parecem gráficos de barras, mas mostram a distribuição do conjunto de valores de uma variável.

df_cleaned['odometer'].plot(kind='hist', bins=50, figsize=(12,6), facecolor='grey',edgecolor='black')

df_cleaned['year'].plot(kind='hist', bins=20, figsize=(12,6), facecolor='grey',edgecolor='black')
df_cleaned['year'].plot(kind='hist', bins=20, figsize=(12,6), facecolor='grey',edgecolor='black')

Podemos notar rapidamente que o carro médio tem um hodômetro de 0 a pouco mais de 200.000 km e um ano em torno de 2.000 a 2020.

A diferença entre os dois gráficos é que a distribuição de 'hodômetro' é positivamente distorcida enquanto a distribuição de 'ano 'é inclinado negativamente.

A assimetria é importante, especialmente em áreas como finanças, porque muitos modelos pressupõem que todas as variáveis ​​são normalmente distribuídas, o que normalmente não é o caso.


Boxplot


Outra forma de visualizar a distribuição de uma variável é um boxplot. Vamos olhar para 'preço' desta vez como um exemplo.

df_cleaned.boxplot('price')

Os boxplots não são tão intuitivos quanto os outros gráficos mostrados acima, mas comunicam muitas informações de sua própria maneira.

A imagem abaixo explica como ler um boxplot. Imediatamente, você pode ver que há vários valores discrepantes para o preço na faixa superior e que a maioria dos preços está entre 0 e $ 40.000.



Existem vários outros tipos de visualizações que você pode usar dependendo do conjunto de dados, como gráficos de barras empilhados, plotagens de área, plotagens de violino e até mesmo visuais geoespaciais.


Ao passar pelas três etapas da análise exploratória de dados, você terá um entendimento muito melhor de seus dados, o que tornará mais fácil escolher seu modelo, seus atributos e refiná-los de maneira geral.


 

Diogo Vidal

40 visualizações0 comentário

Posts recentes

Ver tudo
bottom of page