<jupyter_start><jupyter_text>Student Performance Data Set This data approach student achievement in secondary education of two Portuguese schools. The data attributes include student grades, demographic, social and school related features) and it was collected by using school reports and questionnaires. Two datasets are provided regarding the performance in two distinct subjects: Mathematics (mat) and Portuguese language (por). In [Cortez and Silva, 2008], the two datasets were modeled under binary/five-level classification and regression tasks. Important note: the target attribute G3 has a strong correlation with attributes G2 and G1. This occurs because G3 is the final year grade (issued at the 3rd period), while G1 and G2 correspond to the 1st and 2nd period grades. It is more difficult to predict G3 without G2 and G1, but such prediction is much more useful Estes dados abordam o aproveitamento dos alunos do ensino secundário de duas escolas portuguesas. Os atributos de dados incluem notas dos alunos, características demográficas, sociais e escolares) e foram coletados por meio de relatórios e questionários escolares. São fornecidos dois conjuntos de dados relativos ao desempenho em duas disciplinas distintas: Matemática (esteira) e Língua Portuguesa (por). Em [Cortez e Silva, 2008], os dois conjuntos de dados foram modelados sob classificação binária / cinco níveis e tarefas de regressão. Nota importante: o atributo alvo G3 tem forte correlação com os atributos G2 e G1. Isso ocorre porque G3 é a nota do último ano (emitida no 3º período), enquanto G1 e G2 correspondem às notas do 1º e 2º períodos. É mais difícil prever G3 sem G2 e G1, mas essa previsão é muito mais útilMore information: https://archive.ics.uci.edu/ml/datasets/student+performance  Descrição dos dados  Attributes for both student-mat.csv (Math course) and student-por.csv (Portuguese language course) datasets:- 1 school - student's school (binary: 'GP' - <NAME> or 'MS' - Mousinho da Silveira)- 2 sex - student's sex (binary: 'F' - female or 'M' - male)- 3 age - student's age (numeric: from 15 to 22)- 4 address - student's home address type (binary: 'U' - urban or 'R' - rural)- 5 famsize - family size (binary: 'LE3' - less or equal to 3 or 'GT3' - greater than 3)- 6 Pstatus - parent's cohabitation status (binary: 'T' - living together or 'A' - apart)- 7 Medu - mother's education (numeric: 0 - none, 1 - primary education (4th grade), 2 - 5th to 9th grade, 3 - secondary education or 4 - higher education)- 8 Fedu - father's education (numeric: 0 - none, 1 - primary education (4th grade), 2 -5th to 9th grade, 3 - secondary education or 4 - higher education)- 9 Mjob - mother's job (nominal: 'teacher', 'health' care related, civil 'services' (e.g. administrative or police), 'at_home' or 'other')- 10 Fjob - father's job (nominal: 'teacher', 'health' care related, civil 'services' (e.g. administrative or police), 'at_home' or 'other')- 11 reason - reason to choose this school (nominal: close to 'home', school 'reputation', 'course' preference or 'other')- 12 guardian - student's guardian (nominal: 'mother', 'father' or 'other')- 13 traveltime - home to school travel time (numeric: 1 - 1 hour)- 14 studytime - weekly study time (numeric: 1 - 10 hours)- 15 failures - number of past class failures (numeric: n if 1<=n<3, else 4)- 16 schoolsup - extra educational support (binary: yes or no)- 17 famsup - family educational support (binary: yes or no)- 18 paid - extra paid classes within the course subject (Math or Portuguese) (binary: yes or no)- 19 activities - extra-curricular activities (binary: yes or no)- 20 nursery - attended nursery school (binary: yes or no)- 21 higher - wants to take higher education (binary: yes or no)- 22 internet - Internet access at home (binary: yes or no)- 23 romantic - with a romantic relationship (binary: yes or no)- 24 famrel - quality of family relationships (numeric: from 1 - very bad to 5 - excellent)- 25 freetime - free time after school (numeric: from 1 - very low to 5 - very high)- 26 goout - going out with friends (numeric: from 1 - very low to 5 - very high)- 27 Dalc - workday alcohol consumption (numeric: from 1 - very low to 5 - very high)- 28 Walc - weekend alcohol consumption (numeric: from 1 - very low to 5 - very high)- 29 health - current health status (numeric: from 1 - very bad to 5 - very good)- 30 absences - number of school absences (numeric: from 0 to 93)These grades are related with the course subject, Math or Portuguese:- 31 G1 - first period grade (numeric: from 0 to 20)- 31 G2 - second period grade (numeric: from 0 to 20)- 32 G3 - final grade (numeric: from 0 to 20, output target)  Leitura de dados com pandas<jupyter_code>import pandas as pd
import numpy as np
import warnings

warnings.filterwarnings('ignore')
mat = pd.read_csv('student-mat.csv', sep = ';')
port = pd.read_csv('student-por.csv', sep = ';')
mat['subject'] = 'mat'
port['subject'] = 'port'
df = pd.concat([mat, port])
df
df.shape<jupyter_output><empty_output><jupyter_text>Manipulação e limpeza de dados com pandas<jupyter_code>df.isnull().sum()
df.nunique()
# Felizmente não há grande variedade nas colunas
df.dtypes
df.describe()<jupyter_output><empty_output><jupyter_text>Descritivo e exploração de dados<jupyter_code>school_sexo = df.groupby([df.school, df.sex]).mean()[['G1','G2','G3']]
school_sexo
pd.crosstab(df['school'], df['sex']).describe()<jupyter_output><empty_output><jupyter_text>Figuras que mostrem insights sobre os dados<jupyter_code>import matplotlib.pyplot as plt
import seaborn as sns 
fig, ax = plt.subplots(3,3, figsize = (10,10))

ax[0][0].tick_params(labelrotation= 25)
sns.countplot(df.school, ax = ax[0][0])

ax[0][1].tick_params(labelrotation= 25)
sns.countplot(df.sex, ax = ax[0][1])

ax[0][2].tick_params(labelrotation= 25)
sns.countplot(df.address, ax = ax[0][2])

ax[1][0].tick_params(labelrotation= 25)
sns.countplot(df.famsize, ax = ax[1][0])

ax[1][1].tick_params(labelrotation= 25)
sns.countplot(df.Pstatus, ax = ax[1][1])

ax[1][2].tick_params(labelrotation= 25)
sns.countplot(df.Mjob, ax = ax[1][2])

ax[2][0].tick_params(labelrotation= 25)
sns.countplot(df.Fjob, ax = ax[2][0])

ax[2][1].tick_params(labelrotation= 25)
sns.countplot(df.reason, ax = ax[2][1])

ax[2][2].tick_params(labelrotation= 25)
sns.countplot(df.guardian, ax = ax[2][2])
              
fig.tight_layout(pad = 1.2)<jupyter_output><empty_output><jupyter_text>Observações:- <NAME> é a escola que mais contem alunos registrados nesse conjunto de dados- De todos os alunos a maioria é do genero feminino,- A minoria mora na parte rural da cidade- Os alunos tambem possuem uma familia que obtem mais de tres pessoas em casa, e morando juntos,- Perceba que os trabalhos de ambos os pais em sua maioria está relacionado a categorias 'outros'- Veja que é declarado que a principal razao para escolher uma das escolas é a preferência pelo 'curso'- A guarda dos estudantes fica com a mae em sua maioria<jupyter_code>plt.figure(figsize=(12,6))
plt.title('Tempo de Viajem de Casa para a Escola')
plt.xlabel('Tempo de viajem')
plt.ylabel('Porcentagem (%)')

ax = (df['traveltime'].value_counts()/len(df)*100).sort_index().plot(kind="bar", rot=0)
ax.set_yticks(np.arange(0, 110, 10))

ax2 = ax.twinx()
ax2.set_yticks(np.arange(0, 110, 10)*len(df)/100)

for p in ax.patches:
    ax.annotate('{:.2f}%'.format(p.get_height()), (p.get_x()+0.15, p.get_height()+1))<jupyter_output><empty_output><jupyter_text>Podemos observar que praticamente 60% dos estudantes demoram menos de 15 minutos<jupyter_code>plt.figure(figsize=(12,6))
plt.title('Quantidade de Tempo de Estudo Semanalmente')
plt.xlabel('Tempo de Estudo')
plt.ylabel('Porcentagem (%)')

ax = (df['studytime'].value_counts()/len(df)*100).sort_index().plot(kind="bar", rot=0)
ax.set_yticks(np.arange(0, 110, 10))

ax2 = ax.twinx()
ax2.set_yticks(np.arange(0, 110, 10)*len(df)/100)

for p in ax.patches:
    ax.annotate('{:.2f}%'.format(p.get_height()), (p.get_x()+0.15, p.get_height()+1))<jupyter_output><empty_output><jupyter_text>É visto que praticamente metade dos alunos estudam cerca de 2 a 5 horas por semana<jupyter_code>plt.figure(figsize=(12,6))
plt.title('')
plt.xlabel('')
plt.ylabel('Porcentagem (%)')

ax = (df['failures'].value_counts()/len(df)*100).sort_index().plot(kind="bar", rot=0)
ax.set_yticks(np.arange(0, 110, 10))

ax2 = ax.twinx()
ax2.set_yticks(np.arange(0, 110, 10)*len(df)/100)

for p in ax.patches:
    ax.annotate('{:.2f}%'.format(p.get_height()), (p.get_x()+0.15, p.get_height()+1))<jupyter_output><empty_output><jupyter_text>E sem surpresa, vemos que muitos alunos nunca reprovaram, mas 18% reprovaram ao menos uma vez, o que é um número impressionante<jupyter_code>df.dtypes
fig, ax = plt.subplots(2,4, figsize = (12,6))

ax[0][0].tick_params(labelrotation= 25)
sns.countplot(df.schoolsup, ax = ax[0][0])

ax[0][1].tick_params(labelrotation= 25)
sns.countplot(df.famsup, ax = ax[0][1])

ax[0][2].tick_params(labelrotation= 25)
sns.countplot(df.paid, ax = ax[0][2])

ax[0][3].tick_params(labelrotation= 25)
sns.countplot(df.activities, ax = ax[0][3])

ax[1][0].tick_params(labelrotation= 25)
sns.countplot(df.nursery, ax = ax[1][0])

ax[1][2].tick_params(labelrotation= 25)
sns.countplot(df.higher, ax = ax[1][1])

ax[1][3].tick_params(labelrotation= 25)
sns.countplot(df.internet, ax = ax[1][2])

ax[1][1].tick_params(labelrotation= 25)
sns.countplot(df.romantic, ax = ax[1][3])
              
fig.tight_layout(pad = 1.2)<jupyter_output><empty_output><jupyter_text>Observações- Mais de 70% dos alunos não tem apoio educacional extra- Cerca de 60% dos estudantes possuem algum apoio educacional familiar- Pouquissimos alunos pagam por aulas extra no curso- Das atividades extra-curriculares, praticamente metade fazem e a outra metade não faz- Uma quantidade considerável não foi a creche quando mais jovem- Meno de 20% dos alunos não tem intenção de fazer o ensino superior- Felizmente a maioria tem acesso a internet- Como era de se esperar, a minoria tem alguma relação romantica<jupyter_code>fig, ax = plt.subplots(2,3, figsize = (12,6))

ax[0][0].tick_params(labelrotation= 25)
sns.countplot(df.famrel, ax = ax[0][0])

ax[0][1].tick_params(labelrotation= 25)
sns.countplot(df.freetime, ax = ax[0][1])

ax[0][2].tick_params(labelrotation= 25)
sns.countplot(df.goout, ax = ax[0][2])

ax[1][0].tick_params(labelrotation= 25)
sns.countplot(df.Dalc, ax = ax[1][0])

ax[1][1].tick_params(labelrotation= 25)
sns.countplot(df.Walc, ax = ax[1][1])

ax[1][2].tick_params(labelrotation= 25)
sns.countplot(df.health, ax = ax[1][2])

fig.tight_layout(pad = 1.2)<jupyter_output><empty_output><jupyter_text>- Felizmente a enorme maioria dos alunos tem uma relação boa ou excelente com seus familiares- O tempo livre após a escola é moderado pra cima - Sair com os amigos é moderado também - O consumo de alcool nos dias de semana é muito baixo e nos finais de semana, idem- A maioria dos alunos consideram sua saúde muito boa mas uma quantidade considerável a consideram muito ruim, é bom investigar<jupyter_code>f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14, rotation=45)
plt.yticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);<jupyter_output><empty_output><jupyter_text>Quebrar os dados em conjunto de treino e conjunto de teste<jupyter_code>from sklearn.model_selection import train_test_split
# Definindo X e y
X
y
X_train, X_test, y_train, y_test = train_test_split(X, y)<jupyter_output><empty_output><jupyter_text>Treinar um estimador<jupyter_code>from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1260942760942761, 'fraction_numerical': 0.036026936026936025, 'mean_word_length': 5.31632110579479, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 51, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '458816', 'license': 'MIT', 'n_tokens_mistral': 4461, 'n_tokens_neox': 4142, 'n_words': 1336, 'path': 'Student_Performance.ipynb', 'repo_name': 'opablodantas/student_performance', 'size': '11898'}