A PNAD, os DVDS e as Florestas (Aleatórias)

Motivação

Em jun/15, em uma conversa de ‘boteco’ alguém sugeriu que eu comprasse um DVD da Galinha pintadinha para minha filha recém-nascida e a primeira coisa que pensei era: – ‘Ótimo, aí eu penduro o DVD no móbile dela’, pois não tenho onde reproduzir esse troço…

Isso me lembrou a época de ouro das locadoras de vídeo, onde era praticamente um passeio de família ir a locadora pegar um ou dois filmes para assistir no fim de semana e gigantes como a Blockbuster quando chegaram ao Brasil mudaram a cara deste mercado para sempre, da locadora de porta de garagem para algo grandioso, cheio de opções e principalmente sem filas de espera…

Porém no final de 2013 foi oficialmente declarada a morte da Blockbuster link, uma morte mais do que esperada, mas ainda assim o fim de uma era…

…Com isso, vamos fazer uma viagem no tempo, pegar os dados da PNAD 2013 e tentar responder a seguinte pergunta:

“Com tantas maneiras de assistir filmes, e as ruínas das locadoras espalhadas pelo país, o que leva uma família a ter um aparelho de DVD (em 2013)?”

Vamos tentar montar um modelo para explicar isso…

A PNAD

Para quem gosta de trabalhar com dados, o IBGE é um prato cheio. A PNAD é uma pesquisa divertidíssima onde temos uma bela amostra de dados (longe de ser perfeita, mas boa para algumas análises) e perguntas o suficiente para a realização das mais variadas análises.

Estávamos passando pelos dicionários da pesquisa de 2013 recentemente e encontramos a seguinte questão:

  • ‘Tem aparelho de DVD’?

Os dados

Não vamos nos preocupar em explicar como extraímos os dados da PNAD, as instruções estão no site do IBGE neste link e como isso por si só já dá um belo trabalho, talvez um dia no futuro escreveremos um post sobre como fazer isso.

A última PNAD anual foi realizada em 2013, então é essa pesquisa que vamos utilizar. Atualmente existe a PNAD contínua, mas para o efeito que queremos capturar nesse exercício a de 2013 está mais do que ótima.

Factor engineering

Essa parte é relativamente trabalhosa, pois temos que:

  1. Transformar variáveis numéricas em fatores. Olhar para o dicionário da PNAD é um exercício de paciência. Por exemplo:

‘Tem televisão em cores?’

2 = SIM
4 = NÃO

‘Tem aparelho de DVD?’

1 = SIM
3 = NÃO

PORQUEEEEEEEEEEEE?????

É muito difícil normalizar isso? Que tal 1=sim e 0=não? Ou, para facilitar, 2 = sim, 4 = não….sempre!

  1. Criar algumas variáveis que vão ajudar na nossa modelagem, como por exemplo ‘Acesso_INTERNET’ que combina as questões de banda larga e discada em uma variável
  2. Vamos usar os dados do questionário dos domicílios, mas no dicionário das pessoas vamos criar variáveis como EH_FILHO que é igual ao número de filhos de uma família, EH_FILHO_6 que é igual a quantidade de filhos menores do que 6 anos e FAIXA_IDADE_FILHO que é a média de idade dos filhos de um domicílio

Os datasets

A primeira coisa a fazer é criar os datasets de treino e teste, só que temos um problema, considerando que a amostra da PNAD domicílios é de mais de 148.000 observações onde 116.000 são válidas e cada um tem seu peso, na teoria teríamos que repetir cada domicílio um número de vezes igual ao seu peso, ou seja, se o peso médio é 560, temos mais de 64.000.000 domicílios.

O dataset do nosso modelo vai consistir em 100.000 observações selecionadas aleatoriamente do universo de 64.000.000

DICA DO DIA: Nunca tente criar um vetor de 64.000.000 de observações no R e selecionar 100.000 linhas aleatoriamente!!!

Depois de travar o PC mudamos de estratégia…

Como?

Vamos assumir um universo de 3 domicílios com pesos 1.000.000, 50.000.000 e 13.000.000, criamos um vetor de pesos acumulados, 1.000.000, 51.000.000 e 64.000.000, fazemos 100.000 sorteios aleatórios de 1 a 64.000.000 e simplesmente contamos o número de itens no vetor de pesos acumulados menores do que o sorteio mais 1, por exemplo:

Sorteio: 10; número < 0; posição = 1
Sorteio: 1.100.000; numero < 1; posição = 2
Sorteio: 64.000.000; numero < 2; posição = 3

Isso faz com que a probabilidade se selecionarmos um domicílio seja igual seu peso no total.

Treino e teste

Agora que temos as 100.000 observações aleatórias, vamos dividir em dois datasets, um para treinar o nosso modelo e outro para testar seus resultados, faremos isso com a razão de 70% treino e 30% teste

 

O modelo

Para o modelo temos um problema de classificação, ou seja, para um certo grupo de inputs queremos uma resposta 0 ou 1 para classificar um domicílio como ‘Tem DVD’ ou ‘Não tem DVD’, esses inputs são algumas variáveis socioeconômicas dos domicílios e dos seus habitantes.

library(randomForest)
modelFit <- randomForest(Tem_DVD ~.,
                         data=train,
                         do.trace=T, 
                         ntree=200,
                         importance=TRUE,
                         mtry=10)
plot(modelFit,main='randomForest error rate')

plot of chunk unnamed-chunk-4

O pessoal costuma ir para o Overkill rodando milhares de árvores, mas a verdade é que não precisamos de tantas para estabilizar o erro, além disso demora uma eternidade! É possível ver pelo gráfico acima que depois de 100 árvores o erro já está mais do que controlado e o ganho é marginal.

Mostrando o pau

Agora que matamos a cobra, vamos aplicar nosso modelo no dataset de testes e ver se o mesmo ficou aceitável ou se somente capturou o ruído do dataset de treino.

pred <- predict(modelFit,newdata=test)
CM <- confusionMatrix(test$Tem_DVD, pred)
CM
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction     0     1
##          0  5573  2835
##          1  1578 20013
##                                           
##                Accuracy : 0.8529          
##                  95% CI : (0.8488, 0.8569)
##     No Information Rate : 0.7616          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6179          
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.7793          
##             Specificity : 0.8759          
##          Pos Pred Value : 0.6628          
##          Neg Pred Value : 0.9269          
##              Prevalence : 0.2384          
##          Detection Rate : 0.1858          
##    Detection Prevalence : 0.2803          
##       Balanced Accuracy : 0.8276          
##                                           
##        'Positive' Class : 0               
## 

TMI [Too much information] – Mais para frente faremos um post explicando detalhes do que é cada um desses resultados, por enquanto vamos focar em duas coisas:

Accuracy : 0.8529

O modelo tem uma precisão de 85%, ou seja, com base em variáveis socioeconômicas é possível prever com 85% de precisão se um domicílio tem ou não DVD. O intervalo de confiança é bem pequeno (95% CI : (0.8488, 0.8569)), o que é bom.

CM$table
##           Reference
## Prediction     0     1
##          0  5573  2835
##          1  1578 20013

Temos dois tipos de erro, quando a referência diz que um domicilio tem um DVD e o modelo diz que não e quando a referência = não e o modelo = sim. Como diria um colega, se o modelo diz algo e a realidade diz outro é a realidade que tem um problema…

Importância das variáveis

plot of chunk unnamed-chunk-7

Um negócio bacana das florestas é poder observar a importância das variáveis e para esse modelo Renda vence de longe como sendo a mais importante, depois a UF (afinal estamos no Brasil e Renda+UF explicam praticamente tudo!) e só depois a média de idade dos filhos.

Uma coisa interessante é que as variáveis de filhos que criamos para este modelo (EH_FILHO = número de filhos no domicílio e EH_FILHO_6 = Número de filhos com 6 anos ou menos) não fazem muita diferença no modelo…

Pelo visto ninguém vai comprar um aparelho de DVD só pela Galinha Pintadinha…

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s