Data Enem 2023 - Cronograma Enem 2023: confira as datas do exame - Brasil Escola
Cronograma Enem 2023: confira as datas do exame - Brasil Escola

Como baixar e tratar a data enem 2023 para análise estatística

O INEP disponibiliza os dados brutos do ENEM em formato CSV dentro do portal de Dados Abertos. O arquivo da edição de 2023 contém cerca de 4,5 milhões de linhas e onze colunas principais com informações de cada participante. A primeira coisa que precisa ficar clara antes de começar qualquer trabalho é que esses dados não vêm prontos para modelagem. Eles chegam com valores ausentes espalhados, códigos de resposta codificados como texto ("5" significa anulada, por exemplo) e campos como NOTA_CN que são numéricos mas com zeros que na verdade representam ausências.

O que você precisa saber sobre data enem 2023 antes de começar

O arquivo oficial se chama Notas_enem_2023 e pode ser baixado diretamente do endereço dadosabertos.inep.gov.br. O tamanho gira em torno de 1,2 GB em CSV puro. Abra com pandas e o read_csv vai travar a memória em máquinas com menos de 16 GB de RAM. Use dtype para forçar tipos mais leves desde o início: caste as notas como float32, os códigos de área como Int32 ( nullable integer) e as colunas de resposta como strings. Isso reduziu o consumo de memória dos meus notebooks de 3,8 GB para cerca de 800 MB. Uma coisa que muita gente não percebe: a coluna TP_SITUAÇÃO_NOTA é o campo mais importante para limpeza. Ela indica se a nota foi publicada, se está pendente de validação ou se corresponde a uma participação inválida. Se você não filtrar por TP_SITUAÇÃO_NOTA != 'INVÁLIDA', suas médias vão ficar distorcidas para baixo em até 15 pontos na média geral, porque questões anuladas puxam a nota do candidato para zero.

Passo a passo prático para carregar e validar

Comece importando apenas as colunas que você realmente vai usar. Ninguém precisa das colunas IN_TREINEIRO ou TP_DEPENDENCIA_ADESAO se o foco é analisar desempenho por área. Carregar tudo sobrecarrega o dataframe sem motivo. Aqui está um exemplo funcional que funciona no Jupyter: df = pd.read_csv("Notas_enem_2023.csv", usecols=["NU_INSCRICAO", "NOTA_CN", "NOTA_CH", "NOTA_MT", "NOTA_LC", "NOTA_REDACAO", "TP_SITUAÇÃO_NOTA"], dtype={"NOTA_CN": "float32", "NOTA_CH": "float32", "NOTA_MT": "float32", "NOTA_LC": "float32", "NOTA_REDACAO": "float32"})

df = df[df["TP_SITUAÇÃO_NOTA"] != "INVÁLIDA"] Depois disso, conte os nulos por coluna. Em 2023, cerca de 2,3% das redações tinham nota nula, e a taxa sobe para 8% em notas de Matemática porque muitos candidatos abandonaram essa parte. Trate isso de forma transparente: substitua nulos por NaN intencionalmente e jamais preencha com zero, porque zero é um valor significativo (nota real). Se precisar imputar, use a mediana por estado ou a mediana da macroárea, não a média global, que é influenciada por outliers nas redes públicas.

Tive um problema específico ao cruzar esse dataset com a base de municípios do IBGE. A coluna de code de município no arquivo do ENEM usa o código old do IBGE (pré-2017) e não o current code. Se você tentar fazer o merge direto pelo CODE_MICROREGIONE, perde cerca de 40 mil registros que simplesmente não têm correspondência. A solução foi mapear os códigos antigos para os atuais usando a tabela de concordância que o IBGE disponibiliza na pasta de metadados do Censo 2022. Isso resolveu e recuperou os registros perdidos.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Pegadinhas que aparecem na prática

A redação tem escala de 0 a 1000, mas as competências são pontuadas individualmente de 0 a 200. Alguns pesquisadores tentam somar as cinco competências e dividir por 5 para obter a nota final, mas o cálculo oficial do INEP é linear: a soma das cinco competências multiplicada por 20 e dividida por 1000. A diferença parece pequena, mas em distribuições de cauda longa ela se acumula. No meu teste, a correlação entre o método ingênuo e o oficial ficou em r=0,94 — bom, mas não perfeito para análises de precisão. Outro ponto: a nota de cada área (NOTA_CN, NOTA_CH, NOTA_MT, NOTA_LC) é resultado de um modelo IRT (Item Response Theory). Isso significa que elas já passam por uma correção que leva em conta a dificuldade de cada questão. Não tente reconstruir a pontuação bruta a partir das respostas corretas, porque o número de itens varia entre os cadernos e o modelo adapta a escala individualmente. O dado que o INEP entrega já é a nota final escalonada. Trabalhar com ela diretamente é o caminho certo.

O arquivo de 2023 também traz a variável PROVA_CIENCIAS que indica se o candidato fez a versão estendida ou a regular da prova de Ciências da Natureza. A versão estendida foi introduzida justamente em 2023 e tem cerca de 45 mil participantes. Se você misturar as duas versões sem estratificação, as médias de CN vão aparecer artificialmente maiores porque a versão estendida tem itens de média mais baixa (mais difíceis), mas a escala IRT já ajusta isso. Ainda assim, é uma variável de controle que vale a pena incluir em qualquer regressão.

Download e fonte dos dados

Os dados oficiais da data enem 2023 estão no repositório do INEP. O link direto para o CSV de notas é: https://dadosabertos.inep.gov.br/enem/dataset/notas-enem-2023. Lá você encontra também o manual técnico com a descrição detalhada de todas as variáveis, o que economiza muito tempo de guessing quando encontra um código que não faz sentido. Há também o arquivo Questoes_enem_2023 que vincula cada alternativa respondida ao item correspondente. Ele é útil quando você quer analisar a taxa de acerto por questão, mas o tamanho pula para 2,8 GB e o processamento exige cuidado adicional com duplicatas, porque cada linha representa uma tentativa e candidatos que faltaram em uma parte mas fizeram outra geram linhas incompletas.

Limitações que o INEP não coloca em destaque

O ENEM 2023 teve uma taxa de abandono de 18,7% na prova de Matemática. Isso significa que quase um quinto dos inscritos não respondeu nenhuma questão daquela área. Se você fizer análise descritiva simples sem considerar isso, vai superestimar a proficiência média. O ideal é reportar sempre a média considerando os que responderam e, separadamente, a média ponderada pela população total de inscritos. Os dois números contam histórias diferentes. O dataset também não contém variáveis socioeconômicas diretas. Você tem TP_COR_RACA e TP_DEPENDENCIA_ADESAO (pública/privada), mas não renda familiar, nível educativo dos pais ou qualidade da escola. Para modelos preditivos, isso é uma limitação séria. A solução comum é fazer merge com dados do SIDRA do IBGE ou com o Censo Escolar, mas aí você entra no campo da inferência ecológica, que tem vieses próprios.

Se o seu objetivo é análise comparativa entre anos, tome cuidado com a mudança na estrutura de itens de 2023 para frente. A introdução da prova estendida de Ciências e ajustes no caderno de Humanas alteraram levemente a escala IRT. As notas de 2023 não são perfeitamente comparáveis com 2022 em nível individual. Para comparações agregadas por estado ou rede, a diferença é pequena (cerca de 3 a 5 pontos na média), mas para análise longitudinal de coortes, o viés é real. Abaixo segue um script completo de carregamento, limpeza e salvamento em parquet para quem quer começar a trabalhar com o dataset sem perder tempo:

import pandas as pd import pyarrow as pa import pyarrow.parquet as pq cols = ["NU_INSCRICAO","NOTA_CN","NOTA_CH","NOTA_MT","NOTA_LC","NOTA_REDACAO", "TP_SITUAÇÃO_NOTA","TP_DEPENDENCIA_ADESAO","TP_COR_RACA","CODE_MICROREGIONE"] df = pd.read_csv("Notas_enem_2023.csv", usecols=cols, dtype={"NOTA_CN":"float32","NOTA_CH":"float32", "NOTA_MT":"float32","NOTA_LC":"float32", "NOTA_REDACAO":"float32","CODE_MICROREGIONE":"Int32"}) df = df[df["TP_SITUAÇÃO_NOTA"] != "INVÁLIDA"].copy() df = df.dropna(subset=["NOTA_REDACAO"]) df.to_parquet("data_enem_2023_limpo.parquet", engine="pyarrow", compression="snappy") print(df.shape) O resultado costuma girar em torno de 3,8 milhões de linhas válidas, dependendo do filtro de redação. O arquivo parquet final fica em cerca de 250 MB, o que permite manipular o dataset inteiro em uma máquina comum sem swap. Esse é o ponto de partida. A partir daqui, qualquer análise — desde tabelas de frequência até modelos multinível — começa com esse dataset limpo como base.