Coletando dados do Facebook

Em nossas últimas postagens mostramos duas maneiras de extrair informações de sites: através do código fonte do site, manipulando diretamente no R e através do pacote RSelenium. Nesta postagem falaremos uma terceira maneira: o uso de API, exemplificando com a API do Facebook.

O Facebook permite que certos dados sejam coletados através da Graph API, permitindo com que a análise seja feita em qualquer linguagem de programação. O uso dela é bastante simples, bem documentado e possui um ambiente de teste, que permite formular e testar as querys a serem utilizadas. Agora, vamos aos exemplos!


Primeiros contatos com o RSelenium

Mostramos em nossa última postagem que é possível baixar dados/arquivos de sites através do R - o site em questão era bastante antigo e simples, o que facilitou a extração das informações desejadas. Mas e quando o site é mais complexo e necessita que algumas ações sejam feitas no site antes de baixar os dados? Recentemente me foi dada a tarefa de baixar todas as tabelas do Observatório do Trabalho de Porto Alegre - um site um pouco mais complexo, que utiliza javascript. E agora, como fazer?

A solução encontrada foi utilizar o pacote RSelenium, um pacote que permite a interação do R com um servidor Selenium, que é quem faz toda interação com o site, baseado em comandos executados no R. Com ele, é possível localizar elementos (botões, links, textos, ...) em sites através de seu id, nome, texto (e outras características) e simular clicks - também é possível a execução direta de scripts da página. A instalação do Selenium é bastante simples e pode ser feita pelo pacote do R através do comando checkForServer() - caso o comando falhe (como aconteceu comigo) você precisará baixar manualmente a versão standalone no site oficial e executar através do prompt - não tente fazer que nem eu e 'dezipar' o arquivo .jar.

Baixando e interpretando sites (ou: como fazer backup do seu fotolog) com R.

Se você usava a internet no início dos anos 2000, muito provavelmente teve - ou quis ter - um Fotolog. Como o próprio nome diz, era um blog voltado a fotografia, onde as pessoas podiam postar 1 foto por dia (ou 6, caso pagasse). Em 01/01/2016, o Fotolog encerrou suas atividades sem aviso prévio, gerando uma comoção nos mais saudosistas, voltando ao em final de janeiro com um aviso de que o site ficaria mais um mês online, permitindo que as pessoas fizessem backup. E agora que entra a parte de R da postagem.

Como já mostramos em outras postagens, o R é uma linguagem de programação bastante poderosa e versátil, podendo ser utilizada para coisas além da estatística. Por ser a única linguagem que eu domino (e por ter mais de 500 fotos no Fotolog), resolvi fazer uma função em R para fazer um backup dele, salvando foto, descrição e comentários. Pelo site ser bastante antigo, ele não possui uma API que facilitasse a minha vida, e com isso tive que interpretar a página do Fotolog com as ferramentas que o R disponibiliza, mais especificamente, com expressão regular.

Modelagem Preditiva: Aprendendo a partir dos dados

Em 2013 foi publicada uma reportagem pela Forbes onde era afirmado que machine learning era a disciplina mais popular de Stanford com 760 alunos inscritos. E o motivo pelo qual esta disciplina se tornou popular é simples: porquê machine learning funciona bem no mundo real. Ainda que machine learning seja uma área bem ampla e com diversas aplicações, existe uma especialmente interessante: A modelagem preditiva.

Predição é um dos assuntos mais intrigantes e que despertam o interesse e curiosidade humana. Desde o início dos tempos desejamos fazer predições: a condição climática para saber se o dia será propício a caça, os oráculos prevendo o futuro e as datas em que acontecerá a cheia do Rio Nilo, são exemplos de que esta sempre acompanhou os seres humanos. E utilizando técnicas de modelagem preditiva, é possível estimar predições de forma eficiente.

É possível aumentar as chances na loteria?

Sempre que o final do ano se aproxima boa parte dos brasileiros começa a pensar em uma coisa: a mega da virada. E não é a toa que isso acontece: o prêmio do ano passado chegou a R$ 264 milhões - e foi dividido entre 4 apostas. E sempre que se fala em megasena vem a pergunta: será que tem como aumentar as chances de ganhar? Existem diversos sites que dão dicas de como aumentar as chances de ganhar. Mas será que essas dicas realmente funcionam?

Boa parte das 'dicas' são baseadas nos sorteios que aconteceram anteriormente. Isto é, elas se baseio nos princípios (falhos, como vamos mostrar mais adiante) de que os sorteios não são independentes entre si ou que as bolas não possuem a mesma probabilidade de serem sorteadas (ou ambos). Os mais bizarro é que alguns locais sugerem apostar nos números que mais saíram - como se eles tivessem uma probabilidade maior de serem sorteados novamente - e outros nos números que menos saíram - como se eles tivessem que sair agora, já que todos deveriam ser sorteados em quantidades iguais. Mas será que isso funcionaria? Do sorteio 1 (11/3/96) ao 1761 (14/11/2015), as 6 dezenas mais e menos sorteadas (e a quantidade de vezes sorteadas) foram:

  • Menos sorteadas:  26 (141), 22 (142), 55 (150), 21 (152), 39 (154) e 09 (155)
  • Mais sorteadas: 33 (196), 42 (196), 04 (197), 53 (201), 51 (202) e 05 (206)
Se alguém tivesse apostado nesses números desde o início da loteria, nunca  teria ganho nada. Nada mesmo, nem a quadra - os menos sorteadores acertaram 3 números 10 vezes, enquanto os mais sorteados 31. Essa diferença é facilmente explicada: afinal de contas, estou comparando no passado os números mais e menos sorteados no passado. Como disse anteriormente, esses palpites se baseiam em:
  1. As bolas não possuem a mesma probabilidade de serem sorteadas: Essa hipótese pode facilmente ser testada pelo teste Qui-Quadrado (H0: As bolas possuem mesma probabilidade de serem sorteadas; H1: Pelo menos 1 bola possui probabilidade diferente de ser sorteada que as demais). O valor-p encontra foi 0,1174 e, portanto, não é possível rejeitar H0.
  2. Os sorteios não são independentes entre si: Essa hipótese é mais difícil de ser testada por não ter um teste específico para tal. A opção que eu utilizei foi verificar se a quantidade de sorteios entre 2 aparições do mesmo número seguia distribuição geométrica (H0: Os dados seguem distribuição geométrica com probabilidade de sucesso igual a 0,1; H1: Os dados não seguem distribuição geométrica com probabilidade de sucesso igual a 0,1). Novamente, não foi possível rejeitar a H0 (valor-p igual a 0,2432) 

Uma nova maneira de ler dados externos

Há cerca de 2 anos atrás postei uma pergunta no StackOverflow (caso não conheça, leia esta postagem nossa) perguntando como podia fazer para ler grandes bancos de dados, de cerca de 600mb - esse era meu primeiro contato com bancos grandes, provenientes do Censo Escolar. Das duas respostas dadas na época, a que mais me agradou usava o pacote sqldf, que utiliza SQL para fazer a leitura e manipulação de fontes externas de dados.

Há pouco mais de 1 mês um usuário postou uma nova resposta à pergunta, utilizando o pacote readr. O pacote é um dos muitos pacotes criados/mantidos por Hadley Wickham - que criou, além desse e do ggplot2, mais de 50 pacotes para o R - o que significa que vale a pena dedicarmos um tempo para estudarmos o pacote.

O pacote possui sua própria versão dos comandos read.delim() (e, de quebra, read.table(), read.csv() e read.csv2()) e read.fwf() - para arquivos de largura fixa (fixed width formated), com sintaxes e nomes praticamente idênticas aos do pacote base - basta trocar o . por _ na função. Além do ganho de velocidade frente à outros pacotes disponíveis (link - note que há referência a mais um pacote do Hadley, o stringi), vale a pena destacar dois pontos : 1) ele possui uma progressbar (não funciona muito bem no Windows, mas está la!); 2) nos arquivos de largura fixa é possível ler somente as variáveis de interesse, e não todo o banco.

E você, utiliza outro pacote do Hadley, ou conhece algum pacote que valha a pena 'perder tempo' estudando? Tem sugestão de outros pacotes que merecem uma postagem? Deixe seu comentário!

R também pode ser diversão!

O R, assim como toda linguagem de programação, permite que seja feita uma grande gama de coisas, mesmo quando elas não possuem nada a ver com estatística. Dois exemplos disso podem ser encontrados no próprio site do R: os pacotes fun e sudoku, que possuem algumas funções para passar o tempo, inclusive jogos. Sim, você leu certo: jogos no R.

Para passar o tempo livre que eu tinha na época de graduação (que meus professores não vejam isso...) e inspirado nos pacotes citados anteriormente, me desafiava a fazer alguns jogos no R também. Na época eu enviei eles para a lista de e-mails R-br, e recentemente ressuscitaram o assunto, o que me motivou a divulga-los novamente. Ao total foram 6 jogos (ou 5, dependendo da definição de jogo), e todos estão disponibilizados no meu Github (falamos um pouco sobre o Github nessa postagem).

Curso de Data Science

Venho aqui apresentar a Elixir Data Science, uma empresa com um modelo de Data Science As a Service que possibilita, oferecendo um custo acessível, tanto empresas grandes quanto pequenas de tomar melhores decisões baseadas em dados. A empresa atua em todo o workflow de análise de dados, desde aquisição e manutenção dos dados até a disponibilização de modelos preditivos em ambiente de produção.

Os cursos oferecidos pela Elixir Data Science focam em utilizar cases reais para estimular o pensamento crítico e analítico, sem deixar de lado a metodologia necessária para o entendimento sólido dos conceitos apresentados. E não podemos esquecer que tudo isso vem com muita prática utilizando as ferramentas mais modernas do mercado. No momento estão com inscrições abertas para os seguintes cursos/treinamentos:


Para quem quiser mais informações sobre a empresa e seus seviços ou se inscrever nos cursos oferecidos, segue o link:


Esta é uma opção para os que gostam de curso presencial, e é claro que não podemos esquecer das plataformas de cursos online, como Coursera, Edx e Udacity que oferecem um ótimo conteúdo e certificados a um preço acessível.

Dados públicos

Recentemente foi enviado um e-mail a lista de R perguntando por dados públicos (link). Mesmo trabalhando há mais de 1 ano com alguns desses dados, algumas das respostas eu não conhecia e por isso resolvi fazer um agregado das respostas e postar aqui no blog. Junto com as fontes, postarei links de postagens que fazem alguma análise nos bancos informados e algumas ressalvas sobre os bancos.

Instituto Brasileiro de Geografia e Estatística (IBGE)

Impossível começar uma lista com fontes de dados estatísticos sem ser pelo IBGE. Por ser uma das fontes que apresenta mais dados, muitas vezes o acesso a esses dados se torna difícil. Uma das maneiras disponibilizadas por eles é o SIDRA (Sistema IBGE de Recuperação Automática), que permite um rápido acesso a informações das diversas pesquisas realizadas pelo IBGE. É o jeito mais fácil (e ideal, mas já explico o porque) de se obter dados para o país, regiões, estados e municípios (a abrangência territorial varia de pesquisa para pesquisa).

Outras possibilidades de obter indicadores provenientes de pesquisas do IBGE são os microdados e agregados por setores censitários. Resumidamente, os microdados são as respostas caso a caso (pessoa ou residência) da pesquisa em questão, enquanto os agregados são contagens (de pessoas ou residência) com uma determinada característica, por setor censitário. A única pesquisa que os dados são disponibilizados  de forma agregada é o Censo Demográfico; os dados das demais pesquisas (PNAD, PME, entre outras) são disponibilizados no formato de microdados.

Obter os dados é bastante simples e pode ser feito de três maneiras:
  1. Pelo próprio site da pesquisa: No menu da esquerda aparece um link "Microdados", mas só para algumas pesquisas (Por exemplo, para o Censo Demográfico não aparece uma opção de baixar os dados agregados e os microdados [da amostra])
  2. Pelo site da loja: O IBGE possui uma loja virtual onde é possível comprar as publicações assinadas pelo IBGE e os CDs com os dados desejados. Felizmente, praticamente todos produtos oferecem também a opção de download gratuito ao lado do botão comprar.
  3. Pelo FTP: Para mim, essa é a maneira mais fácil e direta de baixar os dados. O IBGE disponibiliza dois FTPs, que são:
    1. FTP para dados: Nesse FTP (ftp://ftp.ibge.gov.br/) é possível encontrar todos arquivos disponibilizados pelo IBGE para download. Eles estão bem organizados, separados por pasta. Por exemplo: para baixar os dados do Censo 2010, basta entrar na pasta Censos e em seguida em Censo_Demografico_2010.
    2. FTP para mapas: Nesse segundo FTP (ftp://geoftp.ibge.gov.br/) é possível baixar os mapas e malhas digitais (shapefiles) criados pelo IBGE. De maneira similar ao FTP de dados, ele está bem organizado.
O uso dos dados (sejam eles microdados ou agregados) podem facilitar e muito a vida de um estatístico, principalmente se ele souber programar, mas deve ser feito com cuidado. Chamo a atenção pois alguns arquivos podem apresentar problemas (o banco Pessoa02_RS.csv, por exemplo, não há identificação dos setores censitários, apenas da cidade; problema que não ocorre no Pessoa02_RS.xls). Outro ponto que chamo a atenção - e que não é um problema - é que as informações dos setores censitários com poucos domicílios particulares permanentes são censuradas na hora da publicação - e por isso o SIDRA é o ideal para obter dados para a cidade, pois o mesmo não sofre com essa censura.

Além de disponibilizar dados primários (ou seja, levantado pelo próprio IBGE), eles também divulgam dados de outros orgãos na ferramentas Cidades.  Na postagem Trabalhando com amostras complexas no R: usando o pacote survey utilizamos os microdados da amostra do censo de 2010 como exemplo!

Carregando automaticamente funções e outras variáveis no R

Quem trabalha com R sabe que é necessário, sempre que se abre o R, recarregar todos pacotes e funções que se deseja. E isso pode se tornar trabalhoso e repetitivo, especialmente quando se utiliza sempre os mesmos. Mas existe uma maneira de automatizar isso - e bem simples até!

Sempre que o R é iniciado ele irá executar o arquivo Rprofile.site (ele fica na pasta R\x.x.x\etc, e pode ser aberto com o bloco de notas). Se você for ver, você possui esse arquivo, já com algumas sugestões de comandos. Após executar o Rprofile.site, o R irá procurar o comando .Rprofile em duas pastas: a pasta de trabalho do R (getwd()) e a pasta do usuário (na falta de uma definição em português, sugiro a Wikipedia). Assim como o Rprofile.site, .Rprofile nada mais é do que um arquivo de texto com a extensão alterada. 

Esses arquivos permitem que você crie funções que serão chamadas assim que o R for completamente carregado ou for encerrado. São elas: .First() e .Last() (com o . antes, que faz com que a função não seja listada pela função ls()), respectivamente. Portanto, basta criar essas funções com os comandos que vocês querem que sejam executados sempre. Segue uma lista de sugestões:


  • setwd(diretório) - Para mudar a pasta padrão de o R irá ler e salvar arquivos externos;
  • library(pacote) - Para carregar o pacote desejado;
  • source(arquivo) - Para executar um código externo (equivalente a copiar e colar o conteúdo no R);
  • load(arquivo) - Para carregar uma área de trabalho;
  • setInternet2() - Para quem precisa usar proxy para acessar a internet


Existem ainda outras maneiras, como criar as funções .First() e .Last() numa seção normal do R e fechar ele salvando a área de trabalho. Assim que o R for iniciado ele irá carregar a área de trabalho anterior e, por consequência, a função .First() (mas esse método gerará a mensagem [Área de trabalho anterior carregada] assim que o R for aberto, algo que o .Rprofile e Rprofile.site não gera). Dúvidas? Sugestões? Deixe o seu comentário!