<jupyter_start><jupyter_text>Limpando DatasetUma vez das posse dos dados precisamos garantir que eles estejam em um formato no qual nos podemos usar para criar modelos de aprendizado de máquina. A maioria dos modelos da biblioteca *sciki-learn* requer que nossa variaveis (*features*) sejam numericas (inteiras ou pontos flutuantes). Alem disso, muitos modelos falham quando recebem valores ausentes (NaN no pandas ou numpy). Nosso objetivo nesse notebook será conhecer o conjunto de dados que vamos trabalhar e verificar como está sua estrutura antes de analisarmos os dados respondendo algumas perguntas como:* Os tipos dos dados fazem sentido em relação a sua variável?* Nosso conjunto de dados apresenta valores ausentes, caso sim como lidar?* Existem valores discrepantes?A limpeza dos dados, em alguns casos, pode tomar bastante tempo mas é uma parte fundamental para análise exploratória de dados.<jupyter_code># importando bibliotecas
import numpy as np
import pandas as pd

# configuracoes globais pandas
pd.set_option('display.max_rows', 200)
pd.set_option('display.max_columns', 200)

import matplotlib.pyplot as plt

# biblioteca para visualizacao grafica dos dados ausentes
import missingno as msno
# importando o conjunto de dados

enem_df = pd.read_csv("enem_goias.csv")
# visualizando as primeira entradas

enem_df.head()<jupyter_output><empty_output><jupyter_text>Quais são os tipos de dados das minhas features?Vamos realizar o levantamento dos tipos de variáveis que compõem o DataFrame a fim de estabelecer a divisão entre as variáveis numéricas e as variáveis categóricas. Esse passo é interessante de se realizar porque quando carregamos um conjunto de dados com o pandas ele tentar interpretar esses dados e em alguns casos ele pode falhar então é interessante verificar se os dados foram lidos corretamente e estão coerentes. Sem falar que contamos com o dicionario de variaveis que foi disponibilizado pelo Enem que fala como eles categorizaram as variaveis.<jupyter_code># criando dataframe com nome da variavel e seu tipo
var_tipos = enem_df.dtypes.to_frame(name="tipo")
print(f"{var_tipos}\n")

# numero total de cada tipo
print(f"Representacao dos tipos de dados:\n{var_tipos.tipo.value_counts(normalize=True)}")<jupyter_output>tipo
NU_INSCRICAO                   int64
NU_ANO                         int64
CO_MUNICIPIO_RESIDENCIA        int64
NO_MUNICIPIO_RESIDENCIA       object
CO_UF_RESIDENCIA               int64
SG_UF_RESIDENCIA              object
NU_IDADE                       int64
TP_SEXO                       object
TP_ESTADO_CIVIL                int64
TP_COR_RACA                    int64
TP_NACIONALIDADE               int64
CO_MUNICIPIO_NASCIMENTO      float64
NO_MUNICIPIO_NASCIMENTO       object
CO_UF_NASCIMENTO             float64
SG_UF_NASCIMENTO              object
TP_ST_CONCLUSAO                int64
TP_ANO_CONCLUIU                int64
TP_ESCOLA                      int64
TP_ENSINO                    float64
IN_TREINEIRO                   int64
CO_ESCOLA                    float64
CO_MUNICIPIO_ESC             float64
NO_MUNICIPIO_ESC              object
CO_UF_ESC                    float64
SG_UF_ESC                     object
TP_DEPENDENCIA_ADM_ESC       float64
T[...]<jupyter_text>Nosso conjunto de dados tem majoritariamente variáveis numéricas e 30% sendo representado por variáveis categóricas (*object*). Temos um conjunto de dados que foi bem tratado e suas variáveis estão bem representadas segundo o dicionario fornecido pelo Enem. Vale lembra que caso queira usar as variáveis do tipo *object* na criação do modelo de aprendizado de máquina será necessário tratá-las antes de alimentar o modelo.  Valores AusentesUm passo importante na análise de dados é verificação de dados ausentes, isso porque a qualidade de um conjunto de dados está diretamente relacionada à quantidade de valores ausentes. É importante entender logo no início se esses valores nulos são significativos comparados ao total de entradas. Caso eles sejam significativos será necessário um tratamento nos dados antes de realizarmos nossas análises<jupyter_code>(enem_df.isna().sum()/enem_df.shape[0]*100).sort_values(ascending=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.03568879371877231, 'fraction_numerical': 0.011896264572924102, 'mean_word_length': 3.6248624862486247, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '348897', 'license': 'Apache-2.0', 'n_tokens_mistral': 1417, 'n_tokens_neox': 1330, 'n_words': 472, 'path': 'Data_Cleaning.ipynb', 'repo_name': 'DanOliveira-DS/imersao-dados-alura', 'size': '4203'}