emanoelopes commited on
Commit
50c816d
·
1 Parent(s): b45e502

some errors

Browse files
oulad.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4601482a182ed9a7adaf0e93e3b2d4732e4efbb4d081000003cc0d090990ab0b
3
+ size 143341
webapp/home.py CHANGED
@@ -1,70 +1,134 @@
1
  import streamlit as st
2
-
3
-
4
- st.sidebar.markdown(
5
- '''
6
- Mestrado Profissional
7
- PPGTE
8
- IUVI
9
-
10
- Orientador:
11
- Prof. Leonardo Oliveira Moreira
12
-
13
- Aluno:
14
- [Emanoel Lopes](http://emanoel.pro.br)
15
- '''
16
- )
17
-
18
- st.markdown('# Sistema de Identificação de Dificuldades de Aprendizagem ')
19
- st.divider()
20
-
21
- # Display the dataframe from session state
22
- if "df_uci" in st.session_state:
23
- st.dataframe(st.session_state["df_uci"])
24
- else:
25
- st.write("Nenhum dado disponível. Por favor, navegue para a página UCI primeiro.")
26
-
27
- st.markdown(
28
- '''
29
-
30
- # Purpureo bracchia cognitus dedit
31
-
32
- ## Pedum ubi puer hunc
33
-
34
- Lorem markdownum oppositas. Pes est, ne `matrix_leaf`, tene sacris oraque.
35
-
36
- ## Pulsoque gravitate humum flumina
37
-
38
- Petit ademit hunc hosti cum dictis Piscique moenibus capitis, plena, et. Minores
39
- virgo. Ille iaculo ait Myrrha; artus altae nobis me ardua speque nostro.
40
-
41
- - Illo cum fuit quoque concumbere quem perdidit
42
- - Motura Semeleia conlegit
43
- - Cornua funera irae nulla
44
-
45
- ## Amor est nunc lancea
46
-
47
- Adit funera excute tempore caelum, ducit per; trementem superesse: nata. Decor
48
- **alumno**, ulla imperat, regis, erat mihi *viso grege* accepto tua quicquam
49
- levior. Sit age nam, tum mersit summa, iras corona. Fregit agros tendentemque
50
- umbras.
51
-
52
- Altissima noctis; et meritum e animo hiatu Agenorides ad statuit minimos stabat
53
- unam hanc aris temeraria una turba. Mea invidiosa fugitque, et traxere et
54
- numinis optima ego tria mea `word_menu` sanguine audent, iam dolens tamen. Ne
55
- emittere **tenera**, clademque perstant Hodites, retexitur haut, opus paratas
56
- meritorum, nisi est tertia. [Victoria stipite
57
- nascentur](#pulsoque-gravitate-humum-flumina) versata.
58
-
59
- ## Clarum genero in utilius
60
-
61
- Detrusit est *clade bos exiguo* pendeat habent sed. Vinci tua persequar, sunt
62
- manu quoque quaque adventu. Patiemur vivusque sopor **quies** quo inarata
63
- *locuta senex* nomen ignotae quis inmensi, languore quaeras, secum thalami
64
- lacertis, triplices!
65
-
66
- Ego **carpit annos** Ixion tamen *oculos*, natum etiam **non**, quod abit
67
- `tigerAssociation` ad: linguae gelidas mediis. Multa non foret, **Phoebeius**
68
- vites: agris nec cantare, Ide. Vicit fatis.
69
- '''
70
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import seaborn as sns
4
+ import matplotlib.pyplot as plt
5
+
6
+ st.set_page_config(page_title="Dashboard Educacional", layout="wide")
7
+
8
+ def leitura_oulad_data():
9
+ datasets_path = Path(__file__).parent.parents / 'datasets' / 'oulad_data'
10
+ st.write(f"Path dos datasets: {datasets_path}")
11
+
12
+ # --------------------------------------------------------------------------- #
13
+ # 1. Função que carrega os dados do banco UCI
14
+ # --------------------------------------------------------------------------- #
15
+ @st.cache_data(show_spinner=False)
16
+ def carregar_dados_uci(pickle_path: str = "uci.pkl") -> pd.DataFrame:
17
+ """
18
+ o arquivo pickle com os dados do banco UCI e devolve um DataFrame.
19
+
20
+ Parameters
21
+ ----------
22
+ pickle_path : str | Path, opcional
23
+ Caminho relativo (ou absoluto) para o arquivo 'uci.pkl'.
24
+ O padrão aponta para o arquivo que costuma ser salvo na raiz
25
+ do projeto (conforme o trecho que salva o pickle [2]).
26
+
27
+ Returns
28
+ -------
29
+ pd.DataFrame
30
+ O conjunto de dados da UCI.
31
+
32
+ Raises
33
+ ------
34
+ FileNotFoundError
35
+ Se o arquivo não existir.
36
+ ValueError
37
+ Se o conteúdo não puder ser des‑serializado como pickle.
38
+ """
39
+ p = Path(pickle_path)
40
+ if not p.is_file():
41
+ st.warning(f"Arquivo {p} não encontrado.")
42
+ return pd.DataFrame() # Retorna DataFrame vazio
43
+
44
+ try:
45
+ with p.open("rb") as f:
46
+ df = pickle.load(f)
47
+ except Exception as e:
48
+ st.error(f"Falha ao ler {p}: {e}")
49
+ return pd.DataFrame()
50
+
51
+ if not isinstance(df, pd.DataFrame):
52
+ st.error(f"O conteúdo de {p} não é um DataFrame.")
53
+ return pd.DataFrame()
54
+
55
+ return df
56
+
57
+ # --------------------------------------------------------------------------- #
58
+ # 2. Função que carrega os dados do banco OULAD
59
+ # --------------------------------------------------------------------------- #
60
+ @st.cache_data(show_spinner=False)
61
+ def carregar_dados_oulad(pickle_path: str = "oulad.pkl") -> pd.DataFrame:
62
+ """
63
+ o arquivo pickle contendo os dados do banco OULAD e devolve um DataFrame.
64
+
65
+ O padrão de caminho segue o mesmo princípio da função anterior.
66
+ """
67
+ p = Path(pickle_path)
68
+ if not p.is_file():
69
+ st.warning(f"Arquivo {p} não encontrado.")
70
+ return pd.DataFrame()
71
+
72
+ try:
73
+ with p.open("rb") as f:
74
+ df = pickle.load(f)
75
+ except Exception as e:
76
+ st.error(f"Falha ao ler {p}: {e}")
77
+ return pd.DataFrame()
78
+
79
+ if not isinstance(df, pd.DataFrame):
80
+ st.error(f"O conteúdo de {p} não é um DataFrame.")
81
+ return pd.DataFrame()
82
+
83
+ return df
84
+
85
+ if "df_uci" not in st.session_state:
86
+ st.session_state.df_uci = carregar_dados_uci("uci.pkl")
87
+
88
+ if "df_oulad" not in st.session_state:
89
+ st.session_state.df_oulad = carregar_dados_oulad("caminho/para/oulad.pkl")
90
+
91
+ st.write("Dados da UCI:")
92
+ st.dataframe(st.session_state.df_uci)
93
+
94
+ st.write("Dados do OULAD:")
95
+ st.dataframe(st.session_state.df_oulad)
96
+
97
+ # 1. Cabeçalho
98
+ st.title("Dashboard de Desempenho Educacional")
99
+ # st.image("logo.png", width=150)
100
+
101
+ # 2. Visão geral
102
+ col1, col2, col3, col4 = st.columns(4)
103
+ col1.metric("Alunos ativos", "1,200")
104
+ col2.metric("Média de notas", "78,5")
105
+ col3.metric("Taxa de abandono", "3,2 %")
106
+ col4.metric("Engajamento médio", "2,3 cliques/dia")
107
+
108
+ # 3. Contexto
109
+ st.markdown("""
110
+ Esta página mostra uma visão consolidada dos dados de duas bases públicas:
111
+ - **UCI**: informações de escolas públicas.
112
+ - **OULAD**: plataforma de aprendizado online.
113
+ Essas análises ajudam gestores e professores a identificar áreas de melhoria e a planejar intervenções.
114
+ """)
115
+
116
+ # 4. Distribuição de notas (UCI)
117
+ fig, ax = plt.subplots(figsize=(6,4))
118
+ sns.histplot(st.session_state.df_uci['G3'], bins=20, kde=True, ax=ax)
119
+ ax.set_title("Distribuição de Notas (UCI)")
120
+ st.pyplot(fig)
121
+
122
+ # 5. Engajamento (OULAD)
123
+ fig, ax = plt.subplots(figsize=(6,4))
124
+ sns.histplot(st.session_state.df_oulad['clicks'], bins=20, kde=True, ax=ax)
125
+ ax.set_title("Distribuição de Cliques (OULAD)")
126
+ st.pyplot(fig)
127
+
128
+ # 6. Filtros
129
+ periodo = st.selectbox("Período", ["2021", "2022", "2023"])
130
+ gênero = st.multiselect("Gênero", ["Masculino", "Feminino", "Outro"])
131
+
132
+ # 7. Tabela de correlação
133
+ corr = st.session_state.df_uci.corr()
134
+ st.dataframe(corr.style.background_gradient(cmap="coolwarm"))
webapp/home_old.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+
4
+ st.sidebar.markdown(
5
+ '''
6
+ Mestrado Profissional
7
+ PPGTE
8
+ IUVI
9
+
10
+ Orientador:
11
+ Prof. Leonardo Oliveira Moreira
12
+
13
+ Aluno:
14
+ [Emanoel Lopes](http://emanoel.pro.br)
15
+ '''
16
+ )
17
+
18
+ st.markdown('# Sistema de Identificação de Dificuldades de Aprendizagem ')
19
+ st.divider()
20
+
21
+ # Display the dataframe from session state
22
+ if "df_uci" in st.session_state:
23
+ st.dataframe(st.session_state["df_uci"])
24
+ else:
25
+ st.write("Nenhum dado disponível. Por favor, navegue para a página UCI primeiro.")
26
+
27
+ st.markdown(
28
+ '''
29
+
30
+ # Purpureo bracchia cognitus dedit
31
+
32
+ ## Pedum ubi puer hunc
33
+
34
+ Lorem markdownum oppositas. Pes est, ne `matrix_leaf`, tene sacris oraque.
35
+
36
+ ## Pulsoque gravitate humum flumina
37
+
38
+ Petit ademit hunc hosti cum dictis Piscique moenibus capitis, plena, et. Minores
39
+ virgo. Ille iaculo ait Myrrha; artus altae nobis me ardua speque nostro.
40
+
41
+ - Illo cum fuit quoque concumbere quem perdidit
42
+ - Motura Semeleia conlegit
43
+ - Cornua funera irae nulla
44
+
45
+ ## Amor est nunc lancea
46
+
47
+ Adit funera excute tempore caelum, ducit per; trementem superesse: nata. Decor
48
+ **alumno**, ulla imperat, regis, erat mihi *viso grege* accepto tua quicquam
49
+ levior. Sit age nam, tum mersit summa, iras corona. Fregit agros tendentemque
50
+ umbras.
51
+
52
+ Altissima noctis; et meritum e animo hiatu Agenorides ad statuit minimos stabat
53
+ unam hanc aris temeraria una turba. Mea invidiosa fugitque, et traxere et
54
+ numinis optima ego tria mea `word_menu` sanguine audent, iam dolens tamen. Ne
55
+ emittere **tenera**, clademque perstant Hodites, retexitur haut, opus paratas
56
+ meritorum, nisi est tertia. [Victoria stipite
57
+ nascentur](#pulsoque-gravitate-humum-flumina) versata.
58
+
59
+ ## Clarum genero in utilius
60
+
61
+ Detrusit est *clade bos exiguo* pendeat habent sed. Vinci tua persequar, sunt
62
+ manu quoque quaque adventu. Patiemur vivusque sopor **quies** quo inarata
63
+ *locuta senex* nomen ignotae quis inmensi, languore quaeras, secum thalami
64
+ lacertis, triplices!
65
+
66
+ Ego **carpit annos** Ixion tamen *oculos*, natum etiam **non**, quod abit
67
+ `tigerAssociation` ad: linguae gelidas mediis. Multa non foret, **Phoebeius**
68
+ vites: agris nec cantare, Ide. Vicit fatis.
69
+ '''
70
+ )
webapp/pages/1_uci.py CHANGED
@@ -5,9 +5,10 @@ import os
5
  import matplotlib.pyplot as plt
6
  import seaborn as sns
7
  import numpy as np
 
8
 
9
  st.set_page_config(
10
- page_title="Informações Básicas do Conjunto de Dados UCI",
11
  page_icon="📊",
12
  layout="wide",
13
  initial_sidebar_state="expanded",
@@ -391,10 +392,6 @@ A análise dos dados mostra que a maioria dos estudantes tem entre 15 e 19 anos,
391
  '''
392
 
393
  # Salvando os resultados no formato pickle
394
-
395
- import pickle
396
- from pathlib import Path
397
-
398
  with open('uci.pkl', 'wb') as f:
399
  pickle.dump(model, f)
400
  f.close()
 
5
  import matplotlib.pyplot as plt
6
  import seaborn as sns
7
  import numpy as np
8
+ import pickle
9
 
10
  st.set_page_config(
11
+ page_title="Análise Exploratória dos Dados - UCI",
12
  page_icon="📊",
13
  layout="wide",
14
  initial_sidebar_state="expanded",
 
392
  '''
393
 
394
  # Salvando os resultados no formato pickle
 
 
 
 
395
  with open('uci.pkl', 'wb') as f:
396
  pickle.dump(model, f)
397
  f.close()
webapp/pages/2_oulad.py CHANGED
@@ -6,9 +6,11 @@ import seaborn as sns
6
  import matplotlib.pyplot as plt
7
  import missingno as msno
8
  import numpy as np
 
 
9
 
10
  st.set_page_config(
11
- page_title="Informações Básicas dos Dados do OULAD",
12
  page_icon="📊",
13
  layout="wide",
14
  initial_sidebar_state="expanded",
@@ -221,25 +223,17 @@ st.pyplot(plt)
221
  plt.clf()
222
 
223
  '''
224
- A atividade mais realizada é a 'outcontent' com quase o dobro de execuções em relação à segunda posição que é 'forumng'.
225
  '''
226
 
227
 
228
- st.markdown('Explorando valores categóricos')
229
  ## Explorando valores categóricos
230
  st.dataframe(merged_df.select_dtypes('object').describe().T)
231
 
232
- st.warning('Por meio da análise dos dados categóricos, os estudantes são, na sua maioria, do gênero masculino, até 35 anos, que realizaram a atividade do tipo fórum na plataforma e foram aprovados.')
233
-
234
- st.write('## Contagem de Estudantes por Região')
235
- plt.figure(figsize=(10, 6))
236
- sns.countplot(data=merged_df, x='region', order=merged_df['region'].value_counts().index)
237
- plt.title('Contagem de Estudantes por Região')
238
- plt.xlabel('Região')
239
- plt.ylabel('Contagem')
240
- plt.xticks(rotation=45)
241
- st.pyplot(plt)
242
- plt.clf()
243
 
244
  st.write('## Distribuição de Estudantes por Idade')
245
  plt.figure(figsize=(10, 6))
@@ -250,6 +244,11 @@ plt.ylabel('Frequência')
250
  st.pyplot(plt)
251
  plt.clf()
252
 
 
 
 
 
 
253
  st.write('## Distribuição de Estudantes por Gênero')
254
  plt.figure(figsize=(6, 6))
255
  sns.countplot(data=merged_df['gender'])
@@ -259,6 +258,10 @@ plt.ylabel('Contagem')
259
  st.pyplot(plt)
260
  plt.clf()
261
 
 
 
 
 
262
  st.write('## Distribuição de Estudantes por Região')
263
  plt.figure(figsize=(10, 6))
264
  sns.countplot(data=merged_df, x='region', order=merged_df['region'].value_counts().index)
@@ -269,6 +272,10 @@ plt.xticks(rotation=45)
269
  st.pyplot(plt)
270
  plt.clf()
271
 
 
 
 
 
272
  st.write('## Distribuição dos Estudantes por Resultado Final')
273
  plt.figure(figsize=(6, 6))
274
  sns.countplot(data=merged_df['final_result'], order=merged_df['final_result'].value_counts().index)
@@ -278,6 +285,9 @@ plt.ylabel('Contagem')
278
  st.pyplot(plt)
279
  plt.clf()
280
 
 
 
 
281
 
282
  st.markdown("## Entendendo as relações das classes utilizando Aprendizado de Máquina")
283
 
@@ -361,4 +371,8 @@ fig.tight_layout()
361
  st.pyplot(fig)
362
 
363
  st.markdown("## Conclusão")
364
- st.markdown("Nesta análise exploratória dos dados do OULAD, conseguimos entender melhor o perfil dos estudantes, suas atividades na plataforma e os fatores que influenciam seu desempenho acadêmico. Através da visualização dos dados, identificamos padrões interessantes, como a predominância de estudantes do gênero masculino e a distribuição etária dos participantes. Além disso, o treinamento do modelo de aprendizado de máquina nos permitiu avaliar a importância das diferentes características dos dados, destacando quais fatores têm maior impacto no resultado final dos estudantes. Essas informações são valiosas para instituições educacionais que buscam melhorar a experiência de aprendizagem e o suporte oferecido aos alunos. Futuras análises podem aprofundar ainda mais esses insights, explorando outras variáveis e utilizando técnicas avançadas de modelagem preditiva.")
 
 
 
 
 
6
  import matplotlib.pyplot as plt
7
  import missingno as msno
8
  import numpy as np
9
+ import pickle
10
+
11
 
12
  st.set_page_config(
13
+ page_title="Análise Exploratória dos Dados - OULAD",
14
  page_icon="📊",
15
  layout="wide",
16
  initial_sidebar_state="expanded",
 
223
  plt.clf()
224
 
225
  '''
226
+ A atividade mais realizada é a 'outcontent' com quase o dobro de execuções em relação à segunda posição que é 'forumng'. A distribuição é acentuadamente desigual, com poucas atividades (como "forumng" e "subpage") tendo uso moderado.
227
  '''
228
 
229
 
230
+ st.markdown('## Explorando valores categóricos')
231
  ## Explorando valores categóricos
232
  st.dataframe(merged_df.select_dtypes('object').describe().T)
233
 
234
+ """
235
+ Por meio da análise dos dados categóricos, os estudantes são, na sua maioria, do gênero masculino, até 35 anos, que realizaram a atividade do tipo fórum na plataforma e foram aprovados.
236
+ """
 
 
 
 
 
 
 
 
237
 
238
  st.write('## Distribuição de Estudantes por Idade')
239
  plt.figure(figsize=(10, 6))
 
244
  st.pyplot(plt)
245
  plt.clf()
246
 
247
+ '''
248
+ Este histograma revela que a maioria dos estudantes se encontra na faixa etária de 35 a 55 anos e a faixa etária dentro do grupo 0-35 é o segundo maior contingente, enquanto estudantes com mais de 55 anos são a minoria.
249
+ '''
250
+
251
+
252
  st.write('## Distribuição de Estudantes por Gênero')
253
  plt.figure(figsize=(6, 6))
254
  sns.countplot(data=merged_df['gender'])
 
258
  st.pyplot(plt)
259
  plt.clf()
260
 
261
+ '''
262
+ A diferença na quantidade entre os gêneros masculino e feminino é algo em torno de 60%
263
+ '''
264
+
265
  st.write('## Distribuição de Estudantes por Região')
266
  plt.figure(figsize=(10, 6))
267
  sns.countplot(data=merged_df, x='region', order=merged_df['region'].value_counts().index)
 
272
  st.pyplot(plt)
273
  plt.clf()
274
 
275
+ """
276
+ As regiões "South West Region" e "South Region" detêm a maior concentração de estudantes, resultando em uma leve predominância do sul da Inglaterra. A distribuição é relativamente decrescente e sem discrepâncias abruptas.
277
+ """
278
+
279
  st.write('## Distribuição dos Estudantes por Resultado Final')
280
  plt.figure(figsize=(6, 6))
281
  sns.countplot(data=merged_df['final_result'], order=merged_df['final_result'].value_counts().index)
 
285
  st.pyplot(plt)
286
  plt.clf()
287
 
288
+ '''
289
+ a grande maioria dos estudantes obteve o resultado "Pass" (Aprovado), superando vastamente as outras categorias. Os resultados de "Distinction" (Aprovação com mérito), "Withdrawn" (Desistente) e "Fail" (Reprovado) representam uma proporção muito menor do total de alunos, indicando uma alta taxa de sucesso geral.
290
+ '''
291
 
292
  st.markdown("## Entendendo as relações das classes utilizando Aprendizado de Máquina")
293
 
 
371
  st.pyplot(fig)
372
 
373
  st.markdown("## Conclusão")
374
+ st.markdown("Nesta análise exploratória dos dados do OULAD, conseguimos entender melhor o perfil dos estudantes, suas atividades na plataforma e os fatores que influenciam seu desempenho acadêmico. Através da visualização dos dados, identificamos padrões interessantes, como a predominância de estudantes do gênero masculino e a distribuição etária dos participantes. Além disso, o treinamento do modelo de aprendizado de máquina nos permitiu avaliar a importância das diferentes características dos dados, destacando quais fatores têm maior impacto no resultado final dos estudantes. Essas informações são valiosas para instituições educacionais que buscam melhorar a experiência de aprendizagem e o suporte oferecido aos alunos. Futuras análises podem aprofundar ainda mais esses insights, explorando outras variáveis e utilizando técnicas avançadas de modelagem preditiva.")
375
+
376
+ with open('oulad.pkl', 'wb') as f:
377
+ pickle.dump(ml_model, f)
378
+ f.close()
webapp/pages/4_pygwalker.py CHANGED
@@ -3,6 +3,8 @@ import pygwalker as pyg
3
  from pygwalker.api.streamlit import StreamlitRenderer
4
  import streamlit as st
5
 
6
- df = st.session_state['df_uci']
7
- walker = pyg.walk(df)
8
-
 
 
 
3
  from pygwalker.api.streamlit import StreamlitRenderer
4
  import streamlit as st
5
 
6
+ if "df_uci" in st.session_state:
7
+ df = st.session_state['df_uci']
8
+ walker = pyg.walk(df)
9
+ else:
10
+ st.write("Nenhum dado disponível. Por favor, navegue para a página UCI primeiro.")
webapp/utilidades.py CHANGED
@@ -2,6 +2,7 @@ from pathlib import Path
2
  import streamlit as st
3
  import pandas as pd
4
  import os
 
5
 
6
  def leitura_oulad_data():
7
  datasets_path = Path(__file__).parent.parents / 'datasets' / 'oulad_data'
 
2
  import streamlit as st
3
  import pandas as pd
4
  import os
5
+ import pickle
6
 
7
  def leitura_oulad_data():
8
  datasets_path = Path(__file__).parent.parents / 'datasets' / 'oulad_data'