Análise exploratória das classes de desempenho e projeções por componentes principais.
A quarta etapa investiga a distribuição das classes de desempenho e usa análise de componentes principais (PCA) para observar a estrutura dos dados em menos dimensões.
Mostrar código
import seaborn as snsimport matplotlib.pyplot as pltimport pandas as pdimport oscwd = 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_fe.pkl'))df = df.dropna()print(len(df))df.head()
232882
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
desempenho_aluno
id_aluno
disciplina
proficiencia
erro_padrao
8086
2
True
True
False
False
True
True
False
True
True
True
False
False
True
Proficiente
23061434
LP
0.665701
0.312872
10602
0
True
False
True
True
False
False
False
False
True
True
False
False
True
Insuficiente
23065563
LP
-1.353424
0.484866
13975
0
True
False
True
True
False
False
False
False
True
True
False
False
True
Insuficiente
23065563
MT
-1.652930
0.564617
17847
0
True
True
False
False
False
False
False
True
False
False
False
False
True
Insuficiente
23065552
MT
-1.099605
0.467812
20664
0
False
False
True
True
False
False
False
True
True
False
False
True
False
Insuficiente
23095249
MT
-1.262341
0.512487
Distribuição das Classes
Mostrar código
# analisando proficiencia e desempenho (descobrir em que categorias estão cada nível de proficiencia)ordem = ['Insuficiente', 'Básico', 'Proficiente', 'Avançado']sns.violinplot(x='proficiencia', y='desempenho_aluno', data=df, inner=None, order=ordem)plt.show()
# analisando proficiencia e desempenho (descobrir em que categorias estão cada nível de proficiencia)ordem = ['Insuficiente', 'Básico', 'Proficiente', 'Avançado']sns.violinplot(x='proficiencia', y='desempenho_aluno', data=_df, inner=None, order=ordem)plt.show()
# analisando proficiencia e desempenho (descobrir em que categorias estão cada nível de proficiencia)ordem = ['Insuficiente', 'Básico', 'Proficiente']sns.violinplot(x='proficiencia', y='desempenho_aluno', data=_df, inner=None, order=ordem)plt.show()
Mostrar código
# histograma das proficiencias e desempenhosns.histplot(data=_df, x='proficiencia', hue='desempenho_aluno_cat', multiple='stack')
Mostrar código
# desempenhos originais para comparaçãosns.histplot(data=df, x='proficiencia', hue='desempenho_aluno_cat', multiple='stack')
# aplicando PCA para redução de dimensionalidadefrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerX = _df[[col for col in _df.columns if col notin exclude]]scaler = StandardScaler()X = scaler.fit_transform(X)pca_model = PCA(n_components=2)X = pca_model.fit_transform(X)_df.loc[:, 'pca1'] = X[:, 0]_df.loc[:, 'pca2'] = X[:, 1]sns.scatterplot(data=_df, x='pca1', y='pca2', hue='desempenho_aluno_cat', alpha=0.4)
Mostrar código
# applying hue only for class 0 sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==0], x='pca1', y='pca2', hue='desempenho_aluno_cat')sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==1], x='pca1', y='pca2', palette='light:b', hue='desempenho_aluno_cat', alpha=0.05)sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==2], x='pca1', y='pca2', palette='light:b', hue='desempenho_aluno_cat', alpha=0.05)
/usr/lib/python3/dist-packages/IPython/core/pylabtools.py:152: UserWarning: Creating legend with loc="best" can be slow with large amounts of data.
fig.canvas.print_figure(bytes_io, **kw)
Mostrar código
# applying hue only for class 1sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==1], x='pca1', y='pca2', hue='desempenho_aluno_cat')sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==0], x='pca1', y='pca2', palette='rocket', hue='desempenho_aluno_cat', alpha=0.05)sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==2], x='pca1', y='pca2', palette='rocket', hue='desempenho_aluno_cat', alpha=0.05)
/usr/lib/python3/dist-packages/IPython/core/events.py:82: UserWarning: Creating legend with loc="best" can be slow with large amounts of data.
func(*args, **kwargs)
Mostrar código
# applying hue only for class 2sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==2], x='pca1', y='pca2', hue='desempenho_aluno_cat', palette='tab10')sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==0], x='pca1', y='pca2', palette='rocket', hue='desempenho_aluno_cat', alpha=0.05)sns.scatterplot(data=_df[_df['desempenho_aluno_cat'] ==1], x='pca1', y='pca2', palette='rocket', hue='desempenho_aluno_cat', alpha=0.05)
/usr/lib/python3/dist-packages/IPython/core/pylabtools.py:152: UserWarning: Creating legend with loc="best" can be slow with large amounts of data.
fig.canvas.print_figure(bytes_io, **kw)
Mostrar código
# PCA com 3 componentesfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerimport matplotlib.pyplot as pltpca = PCA(n_components=3)X = _df[[col for col in _df.columns if col notin exclude]]scaler = StandardScaler()X = scaler.fit_transform(X)X = pca.fit_transform(X)_df.loc[:, 'pca1'] = X[:, 0]_df.loc[:, 'pca2'] = X[:, 1]_df.loc[:, 'pca3'] = X[:, 2]# plottando em 3 dimensõesfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = fig.add_subplot(111, projection='3d')# Corrigindo a chamada para ax.scatterax.scatter(_df['pca1'], _df['pca2'], _df['pca3'], c=_df['desempenho_aluno_cat'])ax.view_init(elev=0, azim=45)plt.show()
Mostrar código
import plotly.express as pximport pandas as pdfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerX = _df[[col for col in _df.columns if col notin exclude]]scaler = StandardScaler()X = scaler.fit_transform(X)pca = PCA(n_components=3)X_pca = pca.fit_transform(X)_df['pca1'] = X_pca[:, 0]_df['pca2'] = X_pca[:, 1]_df['pca3'] = X_pca[:, 2]# Criando o gráfico interativo com Plotlyfig = px.scatter_3d( _df, x='pca1', y='pca2', z='pca3', color='desempenho_aluno_cat', title='PCA 3D Scatter Plot')# Salvar o gráfico como um arquivo HTMLfig.write_html('pca_3d_scatter_plot.html')# Para visualizar o gráfico no navegadorimport webbrowserwebbrowser.open('pca_3d_scatter_plot.html')
True
image-2.png
Mostrar código
# pca 3d sem a classe 1df_no = df_no[df_no['desempenho_aluno_cat'] !=1]df_no = df_no[df_no['desempenho_aluno_cat'] !=2]X = df_no[[col for col in df_no.columns if col notin exclude]]scaler = StandardScaler()X = scaler.fit_transform(X)pca = PCA(n_components=3)X_pca = pca.fit_transform(X)df_no['pca1'] = X_pca[:, 0]df_no['pca2'] = X_pca[:, 1]df_no['pca3'] = X_pca[:, 2]# Criando o gráfico interativo com Plotlyfig = px.scatter_3d( df_no, x='pca1', y='pca2', z='pca3', color='desempenho_aluno_cat', title='PCA 3D Scatter Plot')# Salvar o gráfico como um arquivo HTMLfig.write_html('pca_3d_scatter_plot.html')# Para visualizar o gráfico no navegadorimport webbrowserwebbrowser.open('pca_3d_scatter_plot.html')