Previsoes nota de Matematica do ENEM 2016

8 minuto(s) de leitura

Dados

Descubra as melhores notas de matemática do ENEM 2016

Você deverá criar um modelo para prever a nota da prova de matemática de quem participou do ENEM 2016.

Tópicos

Neste desafio você aprenderá:

  • Lógica
  • Análise de dados
  • Estatística
  • Regression

Detalhes

O contexto do desafio gira em torno dos resultados do ENEM 2016 (disponíveis no arquivo train.csv). Este arquivo, e apenas ele, deve ser utilizado para todos os desafios. Qualquer dúvida a respeito das colunas, consulte o Dicionário dos Microdados do Enem 2016.

Muitas universidades brasileiras utilizam o ENEM para selecionar seus futuros alunos e alunas. Isto é feito com uma média ponderada das notas das provas de matemática, ciências da natureza, linguagens e códigos, ciências humanas e redação. Determine os 20 melhores colocados, por ordem, para os pesos abaixo:

  • matemática: 3
  • ciências da natureza: 2
  • linguagens e códigos: 1.5
  • ciências humanas: 1
  • redação: 3

No arquivo test.csv crie um modelo para prever nota da prova de matemática (coluna NU_NOTA_MT) de quem participou do ENEM 2016.

Salve sua resposta em um arquivo chamado answer.csv com duas colunas: NU_INSCRICAO e NU_NOTA_MT.

Faça o upload do arquivo answer.csv usando o botão “Submeter resposta”.

Observações

O objetivo do desafio é avaliar a sua capacidade de resolver problemas, então ele pode ser resolvido em qualquer linguagem de programação ou ferramenta que você tenha facilidade. Mas recomendamos o uso de linguagens com maior ferramental de matemática e estatística como Python, R, Scala ou Julia.

# Notebook

#Importando as bibliotecas

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
pd.set_option('display.max_columns', 200)
#Leitura dos datasets

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
resposta = pd.DataFrame()
train.head()
Unnamed: 0 NU_INSCRICAO NU_ANO CO_MUNICIPIO_RESIDENCIA NO_MUNICIPIO_RESIDENCIA CO_UF_RESIDENCIA SG_UF_RESIDENCIA NU_IDADE TP_SEXO TP_ESTADO_CIVIL TP_COR_RACA TP_NACIONALIDADE CO_MUNICIPIO_NASCIMENTO NO_MUNICIPIO_NASCIMENTO CO_UF_NASCIMENTO SG_UF_NASCIMENTO TP_ST_CONCLUSAO TP_ANO_CONCLUIU TP_ESCOLA TP_ENSINO IN_TREINEIRO CO_ESCOLA CO_MUNICIPIO_ESC NO_MUNICIPIO_ESC CO_UF_ESC SG_UF_ESC TP_DEPENDENCIA_ADM_ESC TP_LOCALIZACAO_ESC TP_SIT_FUNC_ESC IN_BAIXA_VISAO IN_CEGUEIRA IN_SURDEZ IN_DEFICIENCIA_AUDITIVA IN_SURDO_CEGUEIRA IN_DEFICIENCIA_FISICA IN_DEFICIENCIA_MENTAL IN_DEFICIT_ATENCAO IN_DISLEXIA IN_DISCALCULIA IN_AUTISMO IN_VISAO_MONOCULAR IN_OUTRA_DEF IN_SABATISTA IN_GESTANTE IN_LACTANTE IN_IDOSO IN_ESTUDA_CLASSE_HOSPITALAR IN_SEM_RECURSO IN_BRAILLE IN_AMPLIADA_24 IN_AMPLIADA_18 IN_LEDOR IN_ACESSO IN_TRANSCRICAO IN_LIBRAS IN_LEITURA_LABIAL IN_MESA_CADEIRA_RODAS IN_MESA_CADEIRA_SEPARADA IN_APOIO_PERNA IN_GUIA_INTERPRETE IN_MACA IN_COMPUTADOR IN_CADEIRA_ESPECIAL IN_CADEIRA_CANHOTO IN_CADEIRA_ACOLCHOADA IN_PROVA_DEITADO IN_MOBILIARIO_OBESO IN_LAMINA_OVERLAY IN_PROTETOR_AURICULAR IN_MEDIDOR_GLICOSE IN_MAQUINA_BRAILE IN_SOROBAN IN_MARCA_PASSO IN_SONDA IN_MEDICAMENTOS IN_SALA_INDIVIDUAL IN_SALA_ESPECIAL IN_SALA_ACOMPANHANTE IN_MOBILIARIO_ESPECIFICO IN_MATERIAL_ESPECIFICO IN_NOME_SOCIAL IN_CERTIFICADO NO_ENTIDADE_CERTIFICACAO CO_UF_ENTIDADE_CERTIFICACAO SG_UF_ENTIDADE_CERTIFICACAO CO_MUNICIPIO_PROVA NO_MUNICIPIO_PROVA CO_UF_PROVA SG_UF_PROVA TP_PRESENCA_CN TP_PRESENCA_CH TP_PRESENCA_LC TP_PRESENCA_MT CO_PROVA_CN CO_PROVA_CH CO_PROVA_LC CO_PROVA_MT NU_NOTA_CN NU_NOTA_CH NU_NOTA_LC NU_NOTA_MT TX_RESPOSTAS_CN TX_RESPOSTAS_CH TX_RESPOSTAS_LC TX_RESPOSTAS_MT TP_LINGUA TX_GABARITO_CN TX_GABARITO_CH TX_GABARITO_LC TX_GABARITO_MT TP_STATUS_REDACAO NU_NOTA_COMP1 NU_NOTA_COMP2 NU_NOTA_COMP3 NU_NOTA_COMP4 NU_NOTA_COMP5 NU_NOTA_REDACAO Q001 Q002 Q003 Q004 Q005 Q006 Q007 Q008 Q009 Q010 Q011 Q012 Q013 Q014 Q015 Q016 Q017 Q018 Q019 Q020 Q021 Q022 Q023 Q024 Q025 Q026 Q027 Q028 Q029 Q030 Q031 Q032 Q033 Q034 Q035 Q036 Q037 Q038 Q039 Q040 Q041 Q042 Q043 Q044 Q045 Q046 Q047 Q048 Q049 Q050
0 1 ed50e8aaa58e7a806c337585efee9ca41f1eb1ad 2016 4314902 Porto Alegre 43 RS 24 M 0.0 1 1 4314902.0 Porto Alegre 43.0 RS 1 4 1 NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN 4314902 Porto Alegre 43 RS 1 1 1 1 16f84b7b3d2aeaff7d2f01297e6b3d0e25c77bb2 9cd70f1b922e02bd33453b3f607f5a644fb9b1b8 01af53cd161a420fff1767129c10de560cc264dd 97caab1e1533dba217deb7ef41490f52e459ab01 436.3 495.4 581.2 399.4 ABACCABDBEDEDEEDDDBBBDAABABECDCCCAAABCBEEABCA BBEBCAEBCEDBDDEBCACDBCBDABDDCDBEDCEAEABCAADAC 99999DCABCABCBBCADBCBBABAEADBEEBEDAAABAEAECCBB... AECCCBABDCADDBCBCCADADBBAADEBCEEBABCDDEAABCAA 1 BCADBCEDCCBADBDCADBEBDBEADCCAEACDBEDBCACAEBEE BCBCCADCCBEDDBEEADBDCECCBBECAEEDDADCDDACAADBA CEDEACCBEBDBABECABDADEADCEDCBEBBCEBAAEBAAECBBC... DADCCECBDECADCBACDBCEEABDDAABDBCEADDBECEBAEBC 1.0 120.0 120.0 120.0 80.0 80.0 520.0 D D B B 3 C A B B B A B A A A A A A B A A C A A A C H E 5.0 5.0 1.0 0.0 0.0 5 5 0 5 5 5 5 5.0 A A A A A A A B D
1 2 2c3acac4b33ec2b195d77e7c04a2d75727fad723 2016 2304707 Granja 23 CE 17 F 0.0 3 1 2304707.0 Granja 23.0 CE 2 0 2 1.0 0 23005157.0 2304707.0 Granja 23.0 CE 2.0 1.0 1.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN 2304707 Granja 23 CE 1 1 1 1 b9b06ce8c319a3df2158ea3d0aef0f7d3eecaed7 909237ab0d84688e10c0470e2997348aff585273 01af53cd161a420fff1767129c10de560cc264dd 97caab1e1533dba217deb7ef41490f52e459ab01 474.5 544.1 599.0 459.8 EDAAABDABADBCCAEDCDDECABADBEECBBAEEDCABCAABBC ADCAABAADCEDAACDACEEDACBDCBACEDEDBACAADADABDC 99999ACBACDBDBCEADDAEEADCCEACEEDBECAAAACBECDAC... AEDACBDECEDAEEAEDDEBDECDCECACADCACACAABDACEAB 1 EBEECADBCABECDDBEADCCABDEABEBCADBADDCCCEDBBCA DCECBAAADCBBECAEDCEDDACCBDDACEDDBADBCADBCBCEE CEDEACCBEBDBABECABDADEADCEDCBEBBCEBAAEBAAECBBC... DADCCECBDECADCBACDBCEEABDDAABDBCEADDBECEBAEBC 1.0 140.0 120.0 120.0 120.0 80.0 580.0 A A A A 5 B A B B A A B A A A A A A B A A A A A A A NaN NaN NaN NaN NaN NaN NaN 5 5 1 1 1 1 1 NaN A A C A B A A C A
2 3 f4545f8ccb9ff5c8aad7d32951b3f251a26e6568 2016 2304400 Fortaleza 23 CE 21 F 0.0 3 1 2304400.0 Fortaleza 23.0 CE 3 0 1 NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN 2304400 Fortaleza 23 CE 0 0 0 0 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN D D B B 4 C A B C A A B A A A A A A B A A B A A A A NaN NaN NaN NaN NaN NaN NaN 5 5 5 5 5 5 5 NaN A A A A C A A B A
3 4 3d6ec248fef899c414e77f82d5c6d2bffbeaf7fe 2016 3304557 Rio de Janeiro 33 RJ 25 F 0.0 0 1 3304557.0 Rio de Janeiro 33.0 RJ 1 9 1 NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN 3304557 Rio de Janeiro 33 RJ 0 0 0 0 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf NaN NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN H E D B 4 E A C C C A B B B A B A B C A B D B C B C F C 2.0 0.0 5.0 5.0 5.0 5 5 5 5 2 5 5 5.0 C A A A A D A A A
4 5 bf896ac8d3ecadd6dba1dfbf50110afcbf5d3268 2016 1302603 Manaus 13 AM 28 M 0.0 2 1 1505304.0 Oriximiná 15.0 PA 1 4 1 NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN 1302603 Manaus 13 AM 0 0 0 0 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf 2d22ac1d42e6187f09ee6c578df187a760123ccf NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN E D C C 4 C A B C A A B A B A A A A B A A B A A A B F D 5.0 4.0 3.0 5.0 4.0 5 5 4 3 1 4 5 NaN A A A A A A A A A
#Criando dataframe com as colunas de interesse

train = train[['NU_NOTA_CN', 'NU_NOTA_CH', 'NU_NOTA_LC','NU_NOTA_MT', 'NU_NOTA_REDACAO']]
train.head()
NU_NOTA_CN NU_NOTA_CH NU_NOTA_LC NU_NOTA_MT NU_NOTA_REDACAO
0 436.3 495.4 581.2 399.4 520.0
1 474.5 544.1 599.0 459.8 580.0
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN
#Verificando quantos NaN existem no dataset de treino

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13730 entries, 0 to 13729
Data columns (total 5 columns):
NU_NOTA_CN         10341 non-null float64
NU_NOTA_CH         10341 non-null float64
NU_NOTA_LC         10133 non-null float64
NU_NOTA_MT         10133 non-null float64
NU_NOTA_REDACAO    10133 non-null float64
dtypes: float64(5)
memory usage: 536.5 KB
#Substituindo todos os valores NaN por 0

train = train.fillna({'NU_NOTA_CN':0 , 'NU_NOTA_CH':0, 'NU_NOTA_LC':0, 'NU_NOTA_MT':0, 'NU_NOTA_REDACAO':0})
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13730 entries, 0 to 13729
Data columns (total 5 columns):
NU_NOTA_CN         13730 non-null float64
NU_NOTA_CH         13730 non-null float64
NU_NOTA_LC         13730 non-null float64
NU_NOTA_MT         13730 non-null float64
NU_NOTA_REDACAO    13730 non-null float64
dtypes: float64(5)
memory usage: 536.5 KB
train.head()
NU_NOTA_CN NU_NOTA_CH NU_NOTA_LC NU_NOTA_MT NU_NOTA_REDACAO
0 436.3 495.4 581.2 399.4 520.0
1 474.5 544.1 599.0 459.8 580.0
2 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0
#Separação das variáveis para o modelo

var = ['NU_NOTA_CN', 'NU_NOTA_CH', 'NU_NOTA_LC', 'NU_NOTA_REDACAO']
x = train[var]
y = train['NU_NOTA_MT']
#Validação do Modelo

SEED = 20

treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, random_state = SEED)

print('Treino com %d elementos e teste com %d elementos' % (len(treino_x), len(teste_x)))

modelo = RandomForestRegressor(n_estimators=100)
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)

r2 = r2_score(previsoes, teste_y) *100
print("O coeficiente de determinação foi de %.2f%%" % r2)
Treino com 10297 elementos e teste com 3433 elementos
O coeficiente de determinação foi de 90.77%

Aplicando modelo no dataset test.csv

teste = test[['NU_NOTA_CN', 'NU_NOTA_CH', 'NU_NOTA_LC', 'NU_NOTA_REDACAO']]
teste.head()
NU_NOTA_CN NU_NOTA_CH NU_NOTA_LC NU_NOTA_REDACAO
0 464.8 443.5 431.8 420.0
1 391.1 491.1 548.0 580.0
2 595.9 622.7 613.6 320.0
3 NaN NaN NaN NaN
4 592.9 492.6 571.4 320.0
teste.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4576 entries, 0 to 4575
Data columns (total 4 columns):
NU_NOTA_CN         3442 non-null float64
NU_NOTA_CH         3442 non-null float64
NU_NOTA_LC         3377 non-null float64
NU_NOTA_REDACAO    3377 non-null float64
dtypes: float64(4)
memory usage: 143.1 KB
teste = teste.fillna({'NU_NOTA_CN':0 , 'NU_NOTA_CH':0, 'NU_NOTA_LC':0, 'NU_NOTA_REDACAO':0})
teste.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4576 entries, 0 to 4575
Data columns (total 4 columns):
NU_NOTA_CN         4576 non-null float64
NU_NOTA_CH         4576 non-null float64
NU_NOTA_LC         4576 non-null float64
NU_NOTA_REDACAO    4576 non-null float64
dtypes: float64(4)
memory usage: 143.1 KB
teste.head()
NU_NOTA_CN NU_NOTA_CH NU_NOTA_LC NU_NOTA_REDACAO
0 464.8 443.5 431.8 420.0
1 391.1 491.1 548.0 580.0
2 595.9 622.7 613.6 320.0
3 0.0 0.0 0.0 0.0
4 592.9 492.6 571.4 320.0
previsoes2 = modelo.predict(teste)
previsoes2
array([423.55 , 458.407, 587.684, ..., 677.185, 471.13 ,   0.   ])
#Salvando no dataframe vazio

resposta['NU_INSCRICAO'] = test['NU_INSCRICAO']
resposta['NU_NOTA_MT'] = np.around(previsoes2, 2)
resposta.head()
NU_INSCRICAO NU_NOTA_MT
0 73ff9fcc02f0a99919906c942c2e1a1042cdcf98 423.55
1 71a95f9f1b91a82c65ad94abbdf9f54e6066f968 458.41
2 b38a03232f43b11c9d0788abaf060f7366053b6d 587.68
3 70b682d9a3636be23f6120fa9d6b164eb3c6002d 0.00
4 715494628a50142ce8cb17191cfe6d0f3cae0934 500.15
resposta.to_csv('answer.csv', index=False)
final = pd.read_csv('answer.csv')
final.head()
NU_INSCRICAO NU_NOTA_MT
0 73ff9fcc02f0a99919906c942c2e1a1042cdcf98 423.55
1 71a95f9f1b91a82c65ad94abbdf9f54e6066f968 458.41
2 b38a03232f43b11c9d0788abaf060f7366053b6d 587.68
3 70b682d9a3636be23f6120fa9d6b164eb3c6002d 0.00
4 715494628a50142ce8cb17191cfe6d0f3cae0934 500.15