Analisando o ENEM

Nos últimos posts tenho explorado maneiras de se trabalhar com Big Data no R. Apesar de nova, a integração do R com o Apache Spark é bem razoável e a implementação do Hive funciona bem, apesar de alguns percalços ao criar grupos, travamentos aleatórios e algumas configurações pentelhas.


Como utilizei os dados do Enem para montar o post anterior, ao olhar o dicionário de dados acabei pensando em algumas perguntas que poderiam ser respondidas com dados, entre elas:

– qual a relação entre renda e a nota?
– qual a relação entre os anos de estudo dos pais e a nota do aluno?

Essas duas são bem básicas e sua resposta é esperada…

Outras perguntas tem a ver com o sexo e cor/raça dos alunos ajustadas pela renda.

Por fim é possível descobrir quais questões os alunos mais erraram/acertaram.

1 – Renda

Renda

O primeiro gráfico era esperado, quanto maior a renda da família, maior a média da nota.

2 – anos de estudo do pai

Anos_Estudo

Mesma coisa do primeiro gráfico, quanto mais anos de estudo tem o pai, maior a média da nota.

Obviamente, quanto mais anos de estudo, maior a renda, ou será que é o contrário?*

* – essa discussão vai ficar para uma próxima oportunidade

3 – sexo

Participei do Big Data week no final de outubro e somente um palestrante era mulher, que por coincidência apresentou um gráfico mostrando que 12% dos programadores Java são mulheres.

Esse número é bem baixo, mas não é muita novidade para o pessoal de exatas e até mesmo para o pessoal da Economia.

Minha hipótese era de que essa decisão é tomada na adolescência, levado talvez por uma deficiência nos cursos de matemática.

O gráfico abaixo mostra a distribuição das notas de matemática entre homens e mulheres. De fato a mediana das notas das mulheres foi menor mas nada tão alarmante que fosse capaz de desencorajar uma pessoa de fazer um curso.

sexo
4 – cor/raça

Na minha época de cursinho no Anglo Tamandaré (próximo o bairro da liberdade em São Paulo) tinha uma frase escrita em todas as cabines do banheiro masculino:

– “Enquanto você está cagando tem um Japonês estudando”

Finalmente, depois de tantos anos, vou poder colocar esse dito popular a teste!

Ao agregar os números por cor e raça não conseguimos observar nada demais, porém, quando controlamos pela renda, assumindo que são estes os alunos competindo pelas melhores vagas (ver gráfico 01) a mediana da nota dos alunos que se classificam como “amarelos” é a maior de todas, nada muito significativo, mas maior de qualquer forma.

asia
Talvez aqui seja interessante fazer um teste de hipóteses para verificar se a nota é significativamente maior.

5 – perguntas mais difíceis.

Por fim, existe um campo na base com todas as respostas de cada aluno, bem como o gabarito, cruzei um com o outro para pegar os acertos e somei isso para pegar o número de acertos por questão, a questão com menor número de acertos foi a mais difícil.

Seguem as questões mais difíceis, eu apaguei a resposta, mas se você tiver curiosidade o nome da figura é a resposta:
MT_E CN_C CL_B CH_C
Advertisements

Microdados ENEM com R / Hadoop / Spark / Hive

A definição de Big Data que acho mais interessante é algo mais ou menos assim:

  • “Big Data são os dados que não cabem na memória RAM”

Quem desenvolve em R sabe que essa definição é perfeita…

O problema é que há uns 15 anos atrás HDs de 100GB de memória eram raros e de lá para cá essa capacidade de armazenamento aumentou muito. Atualmente HDs de 1TB são bem comuns, porém a velocidade com que os dados são lidos não aumentou na mesma velocidade. Então, para ler um HD inteiro, leva-se mais tempo hoje do que a 15 anos atrás.

Mapreduce

Até que alguém teve uma ideia muito simples que é ler dados de diversos HDs ao mesmo tempo, uma analogia interessante é:

Você tem que contar os livros de uma biblioteca, uma opção seria contar um a um até chegar no total ou chamar seus amigos e dizer:

  • “Ok, temos 8 corredores (MAP), cada um de vocês conta os livros de cada corredor(REDUCE) e me fala o total”

Atualmente a aplicação mais famosa de Mapreduce é o Hadoop, que é provavelmente o projeto de Open Source de maior impacto no mundo dos negócios até hoje.

O problema agora, como comentei no meu post anterior (https://dadosdadosdados.wordpress.com/2015/11/09/o-varian-pirou/ ), é que existe um gigantesco ecossistema de ‘coisas’ para estudar, aprender, usar e manter o que torna impraticável na ‘vida real’, ou vai demandar uma gigantesca dedicação.

Spark

SPARK

A partir de meados de 2015 o R foi integrado ao Spark, que é uma plataforma de computação em cluster que foi desenhada para ser rápida e genérica. Sua diferença básica com o Hadoop é que ele faz suas computações na memória (ram) ao invés de usar os discos (hd), isso permite a ele realizar cálculos que antes eram bem complicados de serem feitos em uma operação de Mapreduce comum.

Outro ponto importante é que ao invés de termos que focar em diversas tecnologias ao mesmo tempo, a filosofia do Spark é de prover um pacote completo para os analistas não terem que gastar tempo mantendo 15 sistemas ao mesmo tempo, o que diminui drasticamente os custos.

No final das contas, com o Spark conseguimos nos aproximar muito do modelo proposto pelo Varian para análise de dados, com um overhead menor, seja em custos de se manter sistemas, em horas de aprendizado.

Simulando um ambiente

Para efeitos de treino/testes, é possível simular um ambiente de Spark em apenas 01 cluster, ou seja, ao invés de distribuir os cálculos em várias máquinas, usamos somente nosso computador. Não é a coisa mais eficiente do mundo (computação distribuída em 01 computador não é distribuída), mas é possível desenvolver seu código nesse cluster único e depois subir para a nuvem quando ele estiver pronto.

Pré requisitos:

1 – Virtualbox
https://www.virtualbox.org/wiki/Downloads

Eu costumo configurar essas máquinas virtuais com 50GB de HD, 8GB de RAM e 64MB de memória de vídeo, essas configurações devem variar dependendo da máquina que você vai rodar isso.

No meu notebook eu uso 2GB de RAM e 12MB de vídeo somente.

2 – Linux no virtualbox – A versão que uso é o Mint (Rafaela)
http://linuxmint.com/

3 – Extension pack do Virtual box
https://www.virtualbox.org/wiki/Downloads

No linux:
4 – Java
$ sudo apt-get install openjdk-7-jdk
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

5 – Hadoop

https://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/SingleCluster.html

6 – Hive
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Installation#AdminManualInstallation-InstallingHive

7 – Spark – prestar atenção na versão do Hadoop, a versão pre-built serve
http://spark.apache.org/downloads.html

8 – R – Note que para o R, Trusty é a versão do Linux que estou usando, se você estiver usando uma versão diferente, é possível que você tenha que mudar o final do endereço

Adicionar em: /etc/apt/sources.list
deb https://cran.rstudio.com/bin/linux/ubuntu trusty/

Atualizar e instalar:
$ sudo apt-get update
$ sudo apt-get install r-base

$ R para checar a versão

9 – R-Studio
https://www.rstudio.com/products/rstudio/download/

Um caso real – Microdados ENEM

A pior coisa de usar tutoriais e demos é que tudo sempre dá certo, é uma beleza! O próprio tutorial do Spark usa um data.frame de umas 600 linhas, que meigo…

Eu encorajo a todos a tentarem algo diferente, para ver os problemas e dificuldades e o exemplo que vou mostrar aqui é dos microdados do ENEM.

É realmente uma pena a demora do INEP a divulgar os dados, pois os dados mais novos disponíveis são de 2013, mas é o que tem para hoje…

http://portal.inep.gov.br/basica-levantamentos-acessar

O legal dessa base de dados é que ela tem 5.1GB de dados, com 7.173.564 linhas e 166 colunas, o suficiente para travar minha máquina virtual, mesmo que ela possua 8GB de RAM, então ‘tecnicamente’ podemos considera-la como ‘BIG Data’.

Para essa análise quero comparar as notas das provas entre os estados do Brasil.

Rodando

O sparkR é realmente bacana, você basicamente precisa de dois comandos para começar a usar:

sc <- sparkR.init(master = 'local')
hiveContext <- sparkRHive.init(sc)

O primeiro comando inicia um contexto Spark e o segundo cria um contexto HIVE desse primeiro.

Depois, e é aí que as coisas começam a ficar diferentes de um exemplo comum, na hora de montar uma query no HIVE, você tem que declarar as colunas, o que é lindo quando você tem duas ou três, mas quando você tem 166 no caso do ENEM, você apela…

st <- rep('string', length(colnames(sample)))

st[match('NOTA_CN' ,colnames(sample))] <- 'int'
st[match('NOTA_CH' ,colnames(sample))] <- 'int'
st[match('NOTA_LC' ,colnames(sample))] <- 'int'
st[match('NOTA_MT' ,colnames(sample))] <- 'int'

Como queremos analisar somente as notas médias, vou forçar todos os campos a serem strings e somente a notas como números inteiros.

c1 <- paste(colnames(sample), st)
campos <- paste(c1, sep=',',  collapse = ', ')
cTable <- paste("Create external table src1 (", campos, ") row format delimited fields terminated by ';' SET skip.header.line.count = 1 ")

sql(sqlContext, "DROP TABLE src1")
sql(sqlContext, cTable)
sql(sqlContext, "LOAD DATA LOCAL INPATH '/home/sandor/Enem/2013/DADOS/MICRODADOS_ENEM_2013.csv' OVERWRITE INTO TABLE src1")

Agora é só agrupar os dados em um select comum

results1 <- sql(sqlContext, "SELECT UF_RESIDENCIA,
                avg(NOTA_MT) as AVG_MT,
                avg(NOTA_CN) as AVG_CN,
                avg(NOTA_CH) as AVG_CH,
                avg(NOTA_LC) as AVG_LC
                FROM src1 GROUP BY UF_RESIDENCIA")

Para transformar em data.frame do R usamos o comando ‘collect()’

tabela <- collect(results1)

Temos que pro fim ‘stopar’ o Spark

sparkR.stop()

O resultado

Agora, pegamos a nota média por estado por prova e subtraímos da média total para comparar as notas entre provas e estados.

Note que:

MT = Nota da prova de Matemática

LC = Nota da prova de Linguagens e Códigos

CH = Nota da prova de Ciências Humanas

CN = Nota da prova de Ciências da Natureza

plot of chunk unnamed-chunk-8