<jupyter_start><jupyter_text>Análise Exploratória de Dados:1. Informações Gerais2. Tratamento de valores Nulos3.  Questions to answer:* How many features do you have?* How many observations do you have?* What is the data type of each feature?<jupyter_code># dimensoes - linhas e colunas
df.shape

# informações diversas:
# df.info()
# descricao dos dados sob analise:
df.describe(include='object')
# mostra valores faltantes dentro de uma amostra dos dados:
sns.heatmap(df.isnull())
plt.show()
# plota cada característica categorica:
for column in df.select_dtypes(include='object'):
    if df[column].nunique() < 10:
        sns.countplot(y=column, data=df)
        plt.show()<jupyter_output><empty_output><jupyter_text>Are there so many missing values for a variable that you should drop that variable from your dataset?<jupyter_code># remocao das colunas com maioria dos valores nulos:
#df.isnull().sum()
df[df.columns[df.isnull().any()]].isnull().sum() * 100 / df.shape[0]
# mostra colunas com qtd de valores nulos maior que 50% dos possiveis registros: 
total = df.isnull().sum().sort_values(ascending=False)
percent = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Missing Percent'])
missing_data['Missing Percent'] = missing_data['Missing Percent'].apply(lambda x: x * 100)
missing_data.loc[missing_data['Missing Percent'] > 50]
df.sample(5)
# o dataframe é o mesmo, só eliminei manualmente o identificador "Resultado" e ajeitei o header do arquivo:
data = pd.read_csv('data/03.1 - reacoes_formatadas.csv', index_col=0)
data.sample(5)
from pandas_profiling import ProfileReport
relatorio_inicial = ProfileReport(data, title="Reações - Relatorio Inicial", correlations={"cramers": {"calculate": False}})
relatorio_inicial.to_widgets()
relatorio_inicial.to_file("01 - relatorio-inicial_reacoes.html")<jupyter_output><empty_output><jupyter_text>Deleta (arbitrariamente) colunas com menos de 50% de preenchimento dos dados:As colunas com mais de 50% de valores nulos são, respectivamente:1, 39, 40, 45, 46, 48, 64, 67, 68, 69, 78 e 79;Logo, ...<jupyter_code># TODO: automatizar/melhorar isso aqui:
colunas_excluir = [ '1', '39', '40', '45', '46', '48', '64', '67', '68', '69', '78', '79' ]
# for coluna in colunas_excluir:

data.drop(columns=colunas_excluir, axis=0, inplace=True)

# dimensao atual, sem os 12 compostos removidos por pela alta taxa de valores em branco:
data.shape<jupyter_output><empty_output><jupyter_text>Verificar colunas com baixa cardinalidade (com cardinalidade igual a 1). Colunas cujos valores não possuem variação não contribuem para algoritmo de agrupamento;<jupyter_code># apenas um coluna apresenta cardinalidade == 1. Coluna correspondente ao composto 48. 
#Já removido na operação anterior por apresentar 92% dos dados faltantes.

# salva estado atual da tabela:
# salva estado atual do dataframe em arquivo CSV:
data.to_csv('03.1 - reacoes_col_removidas.csv')

# ainda temos valores nulos, vamos vê-los:

# mostra colunas com qtd de valores nulos maior que 40% dos possiveis registros: 
total = data.isnull().sum().sort_values(ascending=False)
percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Missing Percent'])
missing_data['Missing Percent'] = missing_data['Missing Percent'].apply(lambda x: x * 100)
missing_data.loc[missing_data['Missing Percent'] > 40]<jupyter_output><empty_output><jupyter_text>4 - Como tratar essa grande qtd de valores faltantes???1. Ignorar, tratar values faltantes com o vector de zeros do **Dummie Enconding**;2. Remover todos e tratar registros como linhas de uma matriz 'banguela';3. Converter esses valores para uma representação qualquer: fill in the missing values --converter e depois remover;4. Usar interpolação (**Impute**): decidir, de maneira inteligente o que deverá substituir o espaço em branco --geralmente ecolhe o valor com maior frequência;<jupyter_code># 4.1. Ignorar valores nulos e tratar tudo com o One Hot Encoding:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

data.columns
data.head()
# colunas para transformar: todas, exceto a coluna de índice (coluna zero)
# data[:-1]

data_encoded = pd.get_dummies(data, prefix=data.columns, prefix_sep=' ', dummy_na=False)

# a diferenca esta no drop_firt=True
# este parametro permite que o dataframe fique mais enxuto gerando k-1 registros no One-Hot-Encoding:
# o uso do drop_first permite que o encoding utilizado seja o verdadeiro dunny encoding (sem el o metodo faz o one hot encoding)
# data_encoded2 = pd.get_dummies(data, prefix=data.columns, prefix_sep=' ', dummy_na=False, drop_first=True)

data_encoded.head(7)
data_encoded.shape # não é um metodo .shape() e sim uma propriedade .shape
# salva estado atual do dataframe em arquivo CSV:
data_encoded.to_csv('04.1 - reacoes_one-hot_encoded.csv')

# gera o dataframe resultante do verdadeiro dummy_encoding:

data_encoded2 = pd.get_dummies(data, prefix=data.columns, prefix_sep=' ', dummy_na=False, drop_first=True)

# salva estado atual do dataframe em arquivo CSV:
data_encoded2.to_csv('04.2 - reacoes_dummy_encoded.csv')

data_encoded2.head()
# 4.2 - TODO: construção da Matriz 'Banguela':
data.sample(6)
# 4.3 - TODO:


# 4.4 - TODO:


# geração do relatório do Pandas Profiling, novamente:
relatorio_final = ProfileReport(data_encoded2, title="Reações - Relatorio Final", correlations={"cramers": {"calculate": False}})

relatorio_final.to_widgets()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11310270657823983, 'fraction_numerical': 0.022046961821114895, 'mean_word_length': 5.948941469489415, 'pattern_counts': {'":': 4, '<': 22, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '5883', 'license': 'MIT', 'n_tokens_mistral': 2038, 'n_tokens_neox': 1923, 'n_words': 570, 'path': '01.pre_processamento.ipynb', 'repo_name': 'JohnnyUFT/KDD', 'size': '5579'}