Junho de 2019

Volume 34 – Número 6

[Inteligência Artificial]

Explorando dados com R

Por Frank La La | Junho de 2019 | Obtenha o código

Frank La VigneDesde a primeira coluna sobre Inteligência Artificial, todos os exemplos de código que forneci foram em Python. Isso ocorre porque, atualmente, Python é a linguagem dominante em ciência de dados e IA. Mas ela não está sozinha. Linguagens como Scala e R têm um lugar de destaque nessa área. Para os desenvolvedores que se perguntam por que devem aprender outra linguagem de programação, R tem aspectos exclusivos que não encontrei em outro lugar durante uma carreira que se estende por Java, C#, Visual Basic, Python e Perl. Como R é uma linguagem que os leitores provavelmente encontrarão na área de ciência de dados, eu acho que vale a pena explorá-la.

R em si é uma implementação da linguagem de programação S, que foi criada na década de 1970 para processamento estatístico na Bell Labs. S foi projetada para fornecer uma experiência interativa aos desenvolvedores que, na época, trabalhavam com Fortran para processamento estatístico. Hoje em dia, os ambientes de programação interativos são naturais, mas eram revolucionários na época.

R foi concebida em 1992 por Ross Ihaka e Robert Gentleman, na Universidade de Auckland, Nova Zelândia, e seu nome deriva da primeira inicial dos seus criadores, e também de uma brincadeira com o nome da S. A versão 1.0.0 da R foi lançada em 2000 e, desde então, ela tem sido amplamente adotada pelos departamentos de pesquisa, graças, em parte, à sua ampla matriz de algoritmos estatísticos internos. Ela também pode ser expandida facilmente, utilizando funções e pacotes de extensão.

Uma comunidade robusta de desenvolvedores surgiu em torno da linguagem R e o repositório mais popular de pacotes R é a CRAN (rede abrangente de arquivamento do R). A CRAN tem vários pacotes que abrangem de tudo, desde a previsão de acumulação Bayesiana até o processamento espectral de espectrometria de massa de infusão de fluxo de alta resolução. Uma lista completa dos pacotes R contidos na CRAN pode ser encontrada online, em bit.ly/2DGjuEJ. Basta dizer que R e CRAN fornecem ferramentas robustas para qualquer projeto de ciência de dados ou de pesquisa científica.

Introdução à linguagem R

Talvez a maneira mais rápida de executar código R seja por meio de um Jupyter Notebook, no serviço Azure Notebook. Para obter detalhes sobre Jupyter Notebooks, consulte meu artigo de fevereiro de 2018 sobre o assunto, em msdn.com/magazine/mt829269. Mas, desta vez, procure escolher R como linguagem ao criar um novo notebook. O logotipo do R deve aparecer no canto superior direito da janela do navegador. Em uma célula em branco, insira o código a seguir e execute-o:

# My first R code
print("hello world")
x <- 3.14
y = 1.21
x
y

A saída deve conter a tradicional saudação "Olá, Mundo", bem como os valores 3.14 e 1.21. Nada disso é novo ou excepcional para qualquer desenvolvedor de software. Observe que o operador de atribuição também pode ser “<-” e não apenas o sinal de igual usado normalmente. Ambos são sintaticamente iguais. Observe também que o caractere # apresenta um comentário e aplica-se ao restante da linha.

Vetores são matrizes unidimensionais que podem conter dados numéricos, dados de caractere ou dados lógicos. Eles são criados com a função c. O c significa "combinar". Em uma nova célula, insira o código a seguir e execute-o:

num_vec <- c(1,2,3.14) # numeric vector
char_vec <- c("blog","podcast","livestream") # character vector
bool_vec <- c(TRUE,TRUE,FALSE) #logical vector
#print out values
num_vec
char_vec
bool_vec

Os valores exibidos devem corresponder aos valores definidos no código. Agora você deve estar se perguntando se os vetores podem conter tipos mistos. Insira o seguinte código em uma nova célula:

mix_vec <- c(1,"lorem ispum",FALSE)
mix_vec

Embora o código seja executado, leitores mais atentos notarão que cada elemento do vetor está entre aspas simples. Isso indica que os valores foram convertidos em valores de caractere. R possui a função typeof para verificar o tipo de qualquer variável. Insira o código a seguir para inspecionar os vetores já criados:

typeof(num_vec)
typeof(char_vec)
typeof(bool_vec)
typeof(mix_vec)

Outra função útil que se deve saber é ls, que exibe todos os objetos do ambiente de trabalho atual. Insira "ls ()" em uma nova célula e execute. Observe que a saída contém os quatro vetores que acabou de definir, bem como as variáveis x e y definidas na primeira célula.

Trabalhando com dados

A melhor maneira de experimentar o verdadeiro poder e a elegância da linguagem R é utilizando-a para explorar e manipular dados. R facilita o carregamento de conjuntos de dados e reconhece rapidamente suas dimensões, estrutura e propriedades estatísticas. Nos próximos exemplos, usarei um conjunto de dados precioso para mim: as estatísticas básicas da atividade no meu blog. Desde 2004, tenho um blog de tecnologia e tenho mantido estatísticas básicas sobre a frequência mensal das minhas postagens. Além disso, adicionei o número de dias de cada mês e a média de postagem por dia (PPD). PPD é o número de postagens em um determinado mês dividido pelo número de dias naquele mês. Coloquei o arquivo CSV na biblioteca de projeto do serviço Azure Notebook, em bit.ly/2V76d2G.

Insira o código a seguir em uma nova célula para carregar os dados em um quadro de dados de R, uma estrutura de dados de tabela com colunas para variáveis e linhas para observações, e exiba os seis primeiros e os três últimos registros usando as funções head e tail, respectivamente, da seguinte maneira:

postData <- read.csv(file="franksworldposts.csv", header=TRUE, sep=",")
head(postData)
tail(postData, 3)

Usando a função str, posso exibir a estrutura básica e os tipos de dados do DataFrame. Insira o seguinte código em uma nova célula:

str(postData)

A saída deve revelar que o DataFrame tem 183 observações, ou linhas, e consiste em quatro variáveis, ou colunas. As variáveis Posts e Days.in.Month são inteiros, enquanto a PPD é um tipo numérico. A variável Month é um fator com 183 níveis, em que o fator é um tipo de dados que corresponde às variáveis categóricas nas estatísticas. Fatores são o equivalente funcional ao categórico nas Pandas da Python e podem ser cadeias de caracteres ou inteiros. Eles são ideais para variáveis com um número limitado de valores exclusivos ou, em termos de R, níveis. Nesse DataFrame, o campo Month representa um mês entre fevereiro de 2004 e abril de 2019. Como as datas não se repetem, não existem valores categóricos duplicados.

Agora que meus dados estão carregados, posso classificá-los e consultá-los para explorar ainda mais. Talvez eu consiga coletar alguns insights. Por exemplo, se quisesse exibir os 10 meses em que fui mais produtivo em meu blog, eu poderia executar uma classificação decrescente na coluna Posts. Para isso, insira o código a seguir em uma nova célula e execute:

sortedPostData <- postData[order(-postData$Posts),]
head(sortedPostData, 10)

Os 10 meses mais ativos foram nos últimos três anos. Para explorar o conjunto de dados ainda mais, eu posso executar uma operação de filtragem para determinar quais meses tiveram 100 ou mais postagens. Em R, a função subset faz exatamente isso. Insira o código a seguir para aplicar esse filtro e atribuir a saída a um novo DataFrame chamado over100, da seguinte maneira:

over100 <- subset(postData, subset = Posts >= 100)
over100

Os resultados são semelhantes aos da saída anterior, dos 10 meses mais produtivos. Para verificar a contagem de linhas, use a função nrow para contar o número de linhas no DataFrame, assim:

nrow(over100)

A saída indica que há 11 linhas em que houve 100 ou mais postagens no blog em um determinado mês. Com 100 postagens, maio de 2005 não ficou entre os 10 meses mais ativos, ocupando o 11º lugar. Tirar o limite de 100 postagens por mês foi um marco que só alcançaria novamente 11 anos depois. Há um padrão de iniciar o blog com intensidade, diminuir gradualmente e, em seguida, acelerar novamente? Vamos examinar os dados mais a fundo.

Este é um bom momento para explorar como exibir linhas e colunas individuais em um DataFrame. Por exemplo, para exibir a primeira linha no DataFrame, insira o código a seguir para exibir o conteúdo de toda a linha:

postData[1,]

Observe que o índice do DataFrame começa em 1 e não em 0, como na maioria das outras linguagens de programação. Para exibir apenas a primeira linha do campo Posts, insira o código a seguir:

postData[1,2]

Para exibir todos os valores do campo Posts, use a seguinte linha de código:

postData[,2]

Como alternativa, você também pode usar a sintaxe a seguir para exibir as colunas com base no respectivo nome. Insira a seguinte linha de código e confirme se a saída corresponde à saída da linha anterior:

postData$Posts

Como R tem suas raízes no processamento estatístico, há várias funções internas para exibir a forma básica e as propriedades dos dados. Use o código a seguir para reconhecer melhor os dados da coluna Post:

mean(postData$Posts)
max(postData$Posts)
min(postData$Posts)
summary(postData$Posts)

Agora, compare com a coluna PPD, assim:

mean(postData$PPD)
max(postData$PPD)
min(postData$PPD)
summary(postData$PPD)

Pelos dados, podemos ver que o número de postagens varia de uma por mês até 225 ao longo de 15 anos. E se eu quisesse explorar somente o primeiro ano? Insira o código a seguir para exibir apenas os registros do primeiro ano de atividades no blog, juntamente com resumos estatísticos dos campos Post e PPD:

postData[1:12,]
summary(postData[1:12,2]) # Posts
summary(postData[1:12,4]) # PPD

Embora os números aqui falem por si, normalmente um gráfico revela mais sobre tendências e padrões. Felizmente, a linguagem R tem recursos internos avançados de plotagem de gráficos. Vamos explorá-los.

Visualização de dados

Criar plotagens em R é muito simples e pode ser feito com uma única linha de código. Vamos começar usando as contagens de Post e os valores de PPD do primeiro ano. Eis o código usado para isso:

plot(postData[1:12,2], xlab="Month Index", ylab="Posts",
  main="Posts in the 1st Year")
plot(postData[1:12,4], xlab="Month Index", ylab="PPD",
  main="PPD in the 1st Year")

A saída deve ser semelhante à Figura 1.

Plotagem das colunas Posts e PPD
Figura 1 - Plotagem das colunas Posts e PPD

No primeiro ano de atividade do blog, o gráfico mostra que a atividade de postagem cresceu constantemente no primeiro ano, com uma curva de crescimento acentuada entre o terceiro e o sexto mês. Após uma queda no final do verão, 2004 terminou forte. Além disso, os gráficos revelam que não há uma correlação alta entre o número de postagens em um mês e o número de postagens por dia. Embora isso possa ser intuitivo, é interessante ver esses dados exibidos em formato de gráfico.

Agora, eu gostaria ver um gráfico de postagens no blog durante todo o período de 15 anos e verificar se surge um padrão em um período de tempo mais longo. Insira o seguinte código para criar o gráfico do período de tempo completo:

plot(postData[,2], xlab="Month Index", ylab="Posts",
  main="All Posts")

Os resultados, mostrados na Figura 2, exibem uma tendência clara ou até mesmo um padrão bem definido. A atividade no blog começou razoavelmente intensa, mas caiu gradualmente, voltando a aumentar cerca de 30 meses atrás. A tendência recente é decididamente ascendente. Também é a uma exceção significativa.

Postagens ao longo de 15 anos
Figura 2 - Postagens ao longo de 15 anos

Matriz de correlação

Anteriormente, observei uma correlação entre as colunas Posts e PPD. R tem uma função interna para exibir uma matriz de correlação, que é uma tabela que mostra os coeficientes de correlação entre variáveis. Cada célula da tabela mostra a correlação entre duas variáveis.

Uma matriz de correlação resume os dados e revela relações entre as variáveis rapidamente. Valores mais próximos a 1 têm uma correlação alta, enquanto os mais próximos a 0 têm pouca correlação. Valores negativos indicam uma correlação negativa. Para exibir a matriz de correlação do DataFrame postData, primeiro é necessário isolar os campos numéricos no próprio DataFrame e, em seguida, chamar a função cor. Insira o código a seguir em uma nova célula e execute-o:

postsCor <- postData[, c(2, 3 ,4)]
cor(postsCor)

A saída revela uma correlação quase perfeita entre Posts e PPD, enquanto Days.In.Month tem uma ligeira correlação negativa com PPD.

Conclusão

Embora a sintaxe e a abordagem de R possam diferir das linguagens de programação tradicionais, considero-a uma solução elegante para estruturação de dados e processamento matemático. Para engenheiros de software que levam a sério a construção de uma carreira em ciência de dados, R é uma habilidade importante a ser desenvolvida.

Neste artigo, explorei alguns dos fundamentos da linguagem de programação R. Mostrei como usar funções internas para carregar e explorar dados em DataFrames, ganhar insights através de estatísticas e plotar gráficos. Na verdade, tudo neste artigo foi escrito no que poderia ser chamado de R "base", pois não depende de pacotes de terceiros. No entanto, alguns usuários de R preferem o conjunto de pacotes "tidyverse", que usa um estilo diferente. Vou explorar isso em uma coluna futura.


Frank La Vigne trabalha na Microsoft como profissional de Soluções de Tecnologia de Inteligência Artificial, ajudando as empresas a alcançar mais, aproveitando ao máximo os próprios dados com análise e IA. Ele também co-hospeda o podcast DataDriven. Ele escreve regularmente em seu blog FranksWorld.com, e você pode assisti-lo em seu canal no YouTube “Frank’s World TV” (FranksWorld.TV).

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Andy Leonard, David Smith
David Smith é consultor em nuvem da Microsoft, especializado nos tópicos de inteligência artificial e aprendizado de máquina. Desde 2009, é editor do blog Revolutions (blog.revolutionanalytics.com), no qual escreve regularmente sobre aplicativos de ciência de dados com um foco na linguagem de programação R. Ele também é membro fundador do R Consortium. Siga David no Twitter: @revodavid.


Discuta esse artigo no fórum do MSDN Magazine