Análise de correlações, redução de variáveis e geração do conjunto usado na modelagem.
Esta etapa usa mapas de calor para examinar relações entre variáveis, filtra atributos com baixa correlação e salva a base preparada para os modelos.
Mostrar código
import pandas as pdimport numpy as npimport seaborn as snsimport osimport matplotlib.pyplot as pltcwd = os.getcwd()ROOT = os.path.join(cwd, '../')DATA_FOLDER = os.path.join(ROOT, 'data/')df = pd.read_pickle(os.path.join(DATA_FOLDER, 'saeb_pb_2017-2007_treated.pkl'))df.head()
correcao_licao_casa
faz_licao_casa
pai_le
pretensao_futura
reprovacao
tempo_trabalho_domestico
possui_tv
pai_sabe_ler_escrever
frequenta_espetaculo_exposicao
desempenho_aluno
...
utiliza_biblioteca_escola
responsaveis_comparecem_reuniao_pais
escola_publica
inicio_estudos
gosta_estudar_disciplina
leitura_historia_quadrinhos
frequenta_cinema
responsaveis_incentivam_comparecer_aulas
disciplina
desempenho_aluno_cat
8086
2.0
2.0
0.0
0.0
0.0
4.0
2.0
0.0
1.0
Proficiente
...
0.0
0.0
1
2.0
1.0
0.0
0.0
0.0
LP
2
10602
2.0
2.0
1.0
0.0
1.0
1.0
NaN
1.0
NaN
Insuficiente
...
2.0
2.0
1
1.0
1.0
2.0
2.0
1.0
LP
0
13975
2.0
2.0
1.0
0.0
1.0
1.0
NaN
1.0
NaN
Insuficiente
...
2.0
2.0
1
1.0
1.0
2.0
2.0
1.0
MT
0
17847
2.0
2.0
0.0
0.0
0.0
0.0
1.0
0.0
NaN
Insuficiente
...
0.0
1.0
1
1.0
1.0
2.0
NaN
1.0
MT
0
20664
2.0
1.0
NaN
0.0
1.0
2.0
2.0
1.0
0.0
Insuficiente
...
1.0
2.0
1
0.0
0.0
2.0
0.0
1.0
MT
0
5 rows × 51 columns
Mostrar código
# valores unicos para cada variável, menos as de excludeexclude = ['ano', 'sigla_uf', 'id_aluno', 'situacao_censo', 'disciplina', 'proficiencia', 'erro_padrao', 'proficiencia_saeb','erro_padrao_saeb', 'sexo', 'raca_cor','ano_nascimento', 'rede', 'id_escola', 'serie', 'turno', 'escola_publica', 'desempenho_aluno']for col in df.columns:if col notin exclude:print(f'{col}: {df[col].unique()}')
# colunas 'frequenta'# aplicando onehotencodercolumns_oi = [col for col in df.columns if'frequenta'in col] + ['desempenho_aluno_cat']df_frequenta = df[columns_oi]# renomeando colunas para remover 'frequenta'df_frequenta.columns = [col.split('_')[1] for col in df_frequenta.columns if'frequenta_'in col] + ['desempenho_aluno_cat']# adicionando colunas com onehotencoder, mas sem aplicar em 'desempenho_aluno_cat'df_frequenta = pd.get_dummies(df_frequenta, columns=[col for col in df_frequenta.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_frequenta.corr()plt.figure(figsize=(10, 10))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# variaveis leitura, usando dummiescolumns_oi = [col for col in df.columns if'leitura_'in col] + ['desempenho_aluno_cat']df_leitura = df[columns_oi]df_leitura.columns = [col.split('_')[1] for col in df_leitura.columns if'leitura_'in col] + ['desempenho_aluno_cat']df_leitura = pd.get_dummies(df_leitura, columns=[col for col in df_leitura.columns if col !='desempenho_aluno_cat'])#print(df_leitura.sample(1))# visualizando correlação com matriz de confusãocorrelation = df_leitura.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# variaveis responsavelcolumns_oi = [col for col in df.columns if'responsaveis_'in col] + ['desempenho_aluno_cat']df_responsaveis = df[columns_oi]#df_responsaveis.columns = [col.split('_')[1] for col in df_responsaveis.columns if 'responsaveis_' in col] + ['desempenho_aluno_cat']df_responsaveis = pd.get_dummies(df_responsaveis, columns=[col for col in df_responsaveis.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_responsaveis.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# licao de casacolumns_oi = [col for col in df.columns if'licao'in col] + ['utiliza_biblioteca_escola'] + ['desempenho_aluno_cat']df_licao = df[columns_oi]df_licao = pd.get_dummies(df_licao, columns=[col for col in df_licao.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_licao.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# tempo gasto com lazer / trabalho domésticocolumns_oi = [col for col in df.columns if'tempo'in col] + ['desempenho_aluno_cat']df_tempo = df[columns_oi]df_tempo = pd.get_dummies(df_tempo, columns=[col for col in df_tempo.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_tempo.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# escolaridade dos paiscolumns_oi = [col for col in df.columns if'escolaridade_'in col] + ['mae_le', 'pai_le', 'mae_sabe_ler_escrever', 'pai_sabe_ler_escrever'] + ['desempenho_aluno_cat']df_escolaridade = df[columns_oi]df_escolaridade = pd.get_dummies(df_escolaridade, columns=[col for col in df_escolaridade.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_escolaridade.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# questões 'possui'columns_oi = [col for col in df.columns if'possui'in col] + ['desempenho_aluno_cat']df_possui = df[columns_oi]df_possui = pd.get_dummies(df_possui, columns=[col for col in df_possui.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_possui.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# inicio estudos + gosta estudar disciplinacolumns_oi = [col for col in df.columns if'inicio_estudos'in col] + ['gosta_estudar_disciplina'] + ['desempenho_aluno_cat']df_inicio = df[columns_oi]df_inicio = pd.get_dummies(df_inicio, columns=[col for col in df_inicio.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_inicio.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
exclude = ['ano', 'sigla_uf', 'id_aluno', 'situacao_censo', 'disciplina', 'proficiencia', 'erro_padrao', 'proficiencia_saeb','erro_padrao_saeb', 'sexo', 'raca_cor','ano_nascimento', 'rede', 'id_escola', 'serie', 'turno', 'escola_publica', 'desempenho_aluno']exclude = ['ano', 'sigla_uf', 'id_aluno', 'situacao_censo', 'disciplina', 'proficiencia', 'erro_padrao', 'proficiencia_saeb','erro_padrao_saeb', 'sexo', 'raca_cor','ano_nascimento', 'rede', 'id_escola', 'serie', 'turno', 'escola_publica', 'desempenho_aluno']exclude += [col for col in df.columns if'leitura_'in col]exclude += [col for col in df.columns if'responsaveis_'in col]exclude += [col for col in df.columns if'licao'in col]exclude += [col for col in df.columns if'tempo'in col]exclude += [col for col in df.columns if'frequenta'in col]exclude += ['utiliza_biblioteca_escola']exclude += [col for col in df.columns if'escolaridade_'in col]exclude += ['mae_le', 'pai_le', 'mae_sabe_ler_escrever', 'pai_sabe_ler_escrever']exclude += [col for col in df.columns if'possui'in col]exclude += [col for col in df.columns if'inicio_estudos'in col]exclude += ['gosta_estudar_disciplina']columns_oi = [col for col in df.columns if col notin exclude]colunas_restantes = columns_oiprint(colunas_restantes)
exclude = ['ano', 'sigla_uf', 'id_aluno', 'situacao_censo', 'disciplina', 'proficiencia', 'erro_padrao', 'proficiencia_saeb','erro_padrao_saeb', 'sexo', 'raca_cor','ano_nascimento', 'rede', 'id_escola', 'serie', 'turno', 'escola_publica', 'desempenho_aluno']exclude += [col for col in df.columns if'leitura_'in col]exclude += [col for col in df.columns if'responsaveis_'in col]exclude += [col for col in df.columns if'licao'in col]exclude += [col for col in df.columns if'tempo'in col]exclude += [col for col in df.columns if'frequenta'in col]exclude += ['utiliza_biblioteca_escola']exclude += [col for col in df.columns if'escolaridade_'in col]exclude += ['mae_le', 'pai_le', 'mae_sabe_ler_escrever', 'pai_sabe_ler_escrever']exclude += [col for col in df.columns if'possui'in col]exclude += [col for col in df.columns if'inicio_estudos'in col]exclude += ['gosta_estudar_disciplina']columns_oi = [col for col in df.columns if col notin exclude] + ['desempenho_aluno_cat']df_geral = df[columns_oi]df_geral = pd.get_dummies(df_geral, columns=[col for col in df_geral.columns if col !='desempenho_aluno_cat'])# visualizando correlação com matriz de confusãocorrelation = df_geral.corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# aplicando dummies para cada coluna restante + colunas de interesse anterioresexclude = ['ano', 'sigla_uf', 'id_aluno', 'situacao_censo', 'disciplina', 'proficiencia', 'erro_padrao', 'proficiencia_saeb','erro_padrao_saeb', 'sexo', 'raca_cor','ano_nascimento', 'rede', 'id_escola', 'serie', 'turno', 'escola_publica', 'idade','desempenho_aluno']columns_oi = [col for col in df.columns if col notin exclude]df_restantes = df[columns_oi]df_restantes = pd.get_dummies(df_restantes, columns=[col for col in df_restantes.columns if col !='desempenho_aluno_cat'])# removendo colunas de correlação próxima a 0 (em relação a desempenho_aluno_cat)correlation = df_restantes.corr()correlation = correlation['desempenho_aluno_cat']correlation = correlation[correlation <0.1]correlation = correlation[correlation >-0.1]df_restantes = df_restantes.drop(columns=correlation.index)df_restantes['desempenho_aluno_cat'] = df['desempenho_aluno_cat']df_restantes['desempenho_aluno'] = df['desempenho_aluno']df_restantes['id_aluno'] = df['id_aluno']df_restantes['disciplina'] = df['disciplina']df_restantes['proficiencia'] = df['proficiencia']df_restantes['erro_padrao'] = df['erro_padrao']# visualizando correlação com matriz de confusãocorrelation = df_restantes.drop(columns=['desempenho_aluno', 'id_aluno', 'disciplina', 'proficiencia', 'erro_padrao']).corr()plt.figure(figsize=(15, 15))sns.heatmap(correlation, xticklabels=correlation.columns, yticklabels=correlation.columns, annot=True, fmt=".2f")
Mostrar código
# reordering columns# id_aluno, disciplina, proficiencia, erro_padrao, desempenho_aluno, desempenho_aluno_cat, ...features...columns = df_restantes.columns.tolist()columns = ['id_aluno', 'disciplina', 'proficiencia', 'erro_padrao', 'desempenho_aluno', 'desempenho_aluno_cat'] + [col for col in columns if col notin ['id_aluno', 'disciplina', 'proficiencia', 'erro_padrao', 'desempenho_aluno', 'desempenho_aluno_cat']]df_restantes = df_restantes[columns]df_restantes.head()
id_aluno
disciplina
proficiencia
erro_padrao
desempenho_aluno
desempenho_aluno_cat
faz_licao_casa_2.0
reprovacao_0.0
reprovacao_1.0
pai_sabe_ler_escrever_1.0
leitura_revista_comportamento_0.0
leitura_jornais_0.0
escolaridade_pai_4.0
mae_sabe_ler_escrever_1.0
leitura_internet_2.0
tempo_lazer_1.0
escolaridade_mae_4.0
gosta_estudar_disciplina_0.0
gosta_estudar_disciplina_1.0
8086
23061434
LP
0.665701
0.312872
Proficiente
2
True
True
False
False
True
True
False
True
True
True
False
False
True
10602
23065563
LP
-1.353424
0.484866
Insuficiente
0
True
False
True
True
False
False
False
False
True
True
False
False
True
13975
23065563
MT
-1.652930
0.564617
Insuficiente
0
True
False
True
True
False
False
False
False
True
True
False
False
True
17847
23065552
MT
-1.099605
0.467812
Insuficiente
0
True
True
False
False
False
False
False
True
False
False
False
False
True
20664
23095249
MT
-1.262341
0.512487
Insuficiente
0
False
False
True
True
False
False
False
True
True
False
False
True
False
Mostrar código
# save df_restantes to filesave =Falseif save: df_restantes.to_pickle(os.path.join(DATA_FOLDER, 'saeb_pb_2017-2007_fe.pkl'))