A primeira ferramenta onde aprendemos a trabalhar com números costuma ser o Excel.
Um dos recursos mais incríveis do Excel é, de fato, sua simplicidade e sua forma intuitiva de apresentar a ferramenta. Todos os dias, em todo o mundo, pessoas abrem uma planilha para fazer alguma entrada de dados e, pouco a pouco, aprendem a fazer tarefas analíticas cada vez mais complexas. Excel é um mestre no ensino do próprio Excel.
R não é assim. A curva de aprendizado para R costuma ser mais íngreme no começo. Isso pode ser especialmente frustrante quando você não consegue fazer tarefas simples no R como importar arquivos ou plotar um gráfico, e no Excel são coisas tão intuitivas. Essa é a dificuldade de aprender a programar. Linguagens de programação são projetadas para serem gerais em sua aplicação e para permitir que você realize uma enorme variedade de tarefas complexas com o mesmo conjunto básico de ferramentas. O custo desta generalidade é uma curva de aprendizagem íngreme.
No início, quando você está tentando realizar coisas simples como equilibrar um orçamento ou inserir alguns dados à mão, R é definitivamente mais difícil de aprender do que o Excel. No entanto, quando tarefas ficam mais complexas, tornam-se mais fáceis de realizar em R do que no Excel, porque as estruturas de núcleo do Excel são projetadas para casos de uso relativamente simples e não são as melhores para problemas mais complexos. Isto não quer dizer que você não pode resolver uma variedade de problemas complexos com o Excel, mas a ferramenta não vai facilitar sua vida.
Para muitos de nós, a dor de aprender a programar é a dor do fracasso. Quando o programa lhe dá uma mensagem de erro incompreensível, parece que está dizendo que você é estúpido e lhe falta aptidão para programação. Mas depois de programar por um tempo, você aprende que ninguém realmente entende esses erros, e todo mundo se sente como um impostor quando seu programa falha. A dor que você sente não é a dor do fracasso, é apenas a dor da aprendizagem.
Por que aprender coisas novas é tão difícil?
A dificuldade de aprender uma nova ferramenta é causada por dois obstáculos:
Obstáculo # 1:
A ferramenta é diferente do que você conhece. Quando você conhece intimamente uma ferramenta, você desenvolve um vocabulário nessa ferramenta, você lembra dos atalhos, fórmulas e de onde tudo está visualmente. Mesmo depois de muito tempo sem usar Excel, é muito fácil voltar a usá-lo, quase como andar de bicicleta. Quando você está aprendendo uma nova ferramenta, você não conhece nenhuma dessas coisas, e isso torna o aprendizado mais difícil. Além disso, você sabe onde procurar ajuda em ferramentas conhecidas ou como fazer perguntas do Google de tal forma que encontre respostas úteis. Nessa nova ferramenta, você não conhece nenhuma dessas coisas.
Obstáculo # 2:
A maneira como a nova ferramenta quer que você pense sobre o problema é diferente da maneira como você está acostumado a pensar sobre o problema. Por exemplo, se você está acostumado a colocar sua análise em uma grade retangular, passar para uma ferramenta que é projetada em torno de comandos vai ser difícil.
Esse obstáculo costuma ser de longe a maior barreira para os usuários de Excel. A maioria das pessoas que aprendem R tem alguma base em programação. Os modelos mentais subjacentes às linguagens como Matlab ou Python, bem como pacotes estatísticos como SPSS e SAS, têm muito em comum com R. Excel, por outro lado, faz você pensar sobre problemas analíticos de uma maneira muito diferente, e não há muitos recursos para traduzir um para o outro.
Quatro diferenças fundamentais entre R e Excel
1) Análise baseada em texto
O Excel é baseado na planilha física ou planilha de contador. Este é um grande pedaço de papel com linhas e colunas. Os registros são armazenados na primeira coluna à esquerda, os cálculos sobre esses registros foram armazenados nas caixas à direita, e a soma desses cálculos foi totalizada na parte inferior. Isso seria um modelo referencial de computação, que tem algumas qualidades:
- Os dados e computação são geralmente armazenados no mesmo local;
- Os dados são identificados pela sua localização na planilha. Geralmente, você não nomeia um intervalo de dados no Excel, mas em vez disso se refere a ele por sua localização, por exemplo:$A1:C$36;
- Os cálculos geralmente têm a mesma forma que os dados. Em outras palavras, se você quiser multiplicar 20 números armazenados nas células A1:An por 2, você precisará de 20 cálculos: =A1 * 2, =A2 * 2, …., =An * 2.
A análise de dados baseada em texto é diferente:
- Dados e computação são separados. Você tem um arquivo que armazena os dados e outro arquivo que armazena os comandos que dizem ao programa como manipular esses dados. Isso leva a um tipo de modelo processual no qual os dados brutos são alimentados através de um conjunto de instruções e aparecem do outro lado, manipulados;
- Bases de dados são geralmente referenciadas pelo nome. Em vez de ter um conjunto de dados que mora no intervalo de $A1:C$36, você nomeia o conjunto de dados quando quiser lê-lo, e referir-se-á a ele por esse nome sempre que você quiser fazer algo com ele. Você pode fazer isso com o Excel nomeando intervalos de células, mas não é comum de ser feito.
2) Estruturas de dados
Excel tem apenas uma estrutura de dados básicos: a célula. As células são extremamente flexíveis, pois podem armazenar informações numéricas, de caracteres, lógicas ou de fórmulas. O custo dessa flexibilidade é a imprevisibilidade. Por exemplo, você pode armazenar o caractere “6” em uma célula quando você quer armazenar o número 6.
A estrutura de dados R básica é um vetor. Você pode pensar em um vetor como uma coluna em uma planilha do Excel com a limitação de que todos os dados nesse vetor devem ser do mesmo tipo. Se for um vetor de caracteres, cada elemento deve ser um caractere, se for um vetor lógico, cada elemento deve ser VERDADEIRO ou FALSO; Se é numérico você pode confiar que cada elemento é um número. Não há tal restrição no Excel: você pode ter uma coluna de números juntamente com um texto explicativo. Isso não é permitido em R.
3) Iteração
Iteração é um dos recursos mais poderosos das linguagens de programação e é uma grande novidade para os usuários do Excel. Iteração é apenas pedir para o computador fazer a mesma coisa várias vezes seguidas por um determinado período. Talvez você queira desenhar o mesmo gráfico com base em cinquenta conjuntos de dados diferentes, ou ler e filtrar várias bases de dados. Em uma linguagem de programação como R você escreve um script que funciona para todos os casos em que você deseja aplicá-lo e então diz ao computador para aplicá-lo.
Os analistas do Excel costumam fazer muito dessa iteração. Por exemplo, se um analista do Excel quiser combinar dez arquivos .xls diferentes em um arquivo grande, eles provavelmente abrirá cada um individualmente, copiará os dados e colará-los em uma planilha principal. O analista está efetivamente tomando o lugar de um for loop fazendo uma coisa repetidamente até que uma condição seja atendida.
4) Simplificação através da abstração
Outra grande diferença é que a programação incentiva você a simplificar sua análise, abstraindo funções comuns a partir dessa análise. No exemplo abaixo você pode achar que tem que ler o mesmo tipo de arquivos repetidamente e verificar se eles têm o número certo de linhas. R permite que você escreva uma função que faz isso:
read_and_check <- function(file){
out <- read.csv(file)
if(nrow(out) == 0) {
stop(“Essa planilha está vazia!”)
} else {
out
}
}
Tudo que essa função faz é ler um arquivo .csv e verificar se ele tem mais de zero linhas. Se não, ele retorna um erro. Caso contrário, retorna o arquivo (que é chamado de “out”). Esta é uma abordagem poderosa porque ajuda a poupar tempo e a reduzir erros. Por exemplo, se você quiser verificar se o arquivo tem mais de 23 linhas, você só precisa alterar a condição em um lugar e não em várias planilhas.
Não há realmente nenhum análogo para esses tipos de funções em um fluxo de trabalho baseado em Excel, e quando a maioria dos analistas chegar a este ponto começarão a escrever código VBA para fazer parte desse trabalho.
Exemplo: Juntar duas tabelas
Para exemplificar, vamos juntar duas tabelas no Excel e no R. Vamos dizer que temos duas tabelas de dados, uma com algumas informações sobre carros e outra com a cor desses carros, e queremos juntar os dois juntos. Para o propósito deste exercício, vamos supor que o número de cilindros em um carro determina a sua cor.
library(dplyr)
library(knitr)
cars <- mtcars
colours <- data_frame(
cyl = unique(cars$cyl),
colour = c(“Blue”, “Green”, “Eggplant”)
)
kable(cars[1:10, ]) #kable is just for displaying the table
kable(colours)
No Excel você provavelmente faria isso usando a função VLOOKUP(), que leva uma chave e um intervalo e, em seguida, procuraria o valor dessa chave dentro desse intervalo. Um exemplo de planilha dessa abordagem pode ser visto aqui. Observe que em cada célula de pesquisa existe alguma versão de =vlookup(C4,$H$2:$I$5, 2, FALSE).
Isso ilustra algumas coisas. Primeiro, o cálculo tem a mesma forma que os dados, e acontece no mesmo arquivo que os dados. Temos tantas fórmulas quanto temos coisas que queremos pesquisar, e elas são colocadas ao lado do conjunto de dados. Se você usou esta aproximação você pode provavelmente recordar de erros no processo de escrever e de encher esta fórmula.
Em segundo lugar, os dados são referidos pela sua localização na folha. Se movimentarmos a tabela de consulta para outra folha, ou para outro lugar nessa folha, isso vai estragar a análise. Em terceiro lugar, observe que a primeira entrada da coluna cyl no armazenamento de planilha em C2 é armazenada como texto, o que causa erro na função de pesquisa. Em R, você teria que armazenar todos os valores de calendário como um vetor numérico ou de caracteres. Para fazer a mesma coisa em R, nós usaríamos este código:
left_join(cars, colours, by = “cyl”) %>%
filter(row_number() %in% 1:10) %>% # to display only a subset of the data
kable()
Aqui nós nos referimos aos dados pelo seu nome, usamos uma função para operar em toda a tabela ao invés de linha a linha. Como a consistência é imposta para cada vetor, não podemos armazenar acidentalmente uma entrada de caractere em um vetor numérico.
Iteração
Se quisessemos obter o deslocamento médio para cada cor de carro, a maioria dos usuários de Excel provavelmente faria essa iteração manualmente, primeiro selecionando a tabela, classificando-a por cor e, em seguida, escolhendo os intervalos que eles queriam média analisar. Um analista mais sofisticado provavelmente usaria a função averageif() para escolher os critérios que eles queriam média, e assim evitaria alguns erros. Ambas as abordagens são implementadas na guia iteração da planilha.
Em R você faria algo como isto:
left_join(cars, colours, by = “cyl”) %>%
group_by(colour) %>%
summarize(mean_displacement = mean(disp)) %>%
kable()
O que isto faz é pegar o conjunto de dados, dividi-lo pela variável de agrupamento, neste caso, a cor, e, em seguida, aplicar a função na função summarize de cada grupo. A diferença é que nós estamos nos referindo às coisas pelo nome em vez da posição – há uma linha de código que aplica a função ao conjunto de dados inteiro, e todas as ações interativas são armazenadas no script.
Generalização através de funções são um dos aspectos mais difíceis no aprendizado de uma linguagem de programação. É importante falar sobre elas pois são comuns e podem ser bastante desanimadoras para os usuários do Excel, porque elas são totalmente estranhas ao seu fluxo de trabalho. Uma função é uma maneira de usar código existente em novos objetos. Uma função que se encaixa no caso descrito acima pode parecer assim:
join_and_summarize <- function(df, colour_df){
left_join(df, colour_df, by = “cyl”) %>%
group_by(colour) %>%
summarize(mean_displacement = mean(disp))
}
O que está entre as chaves function() (dfe colour_df) são chamados de “argumentos”, e quando você utiliza a função tudo o que faz é pegar os objetos reais que você fornece à função e os conecta para onde quer que esse argumento apareça dentro das chaves. Neste caso, nós ligaríamos cars para o argumento dfe, e colours para o argumento colour_df. A função, em seguida, basicamente substitui todos os df com carros e colour_df com cores e, em seguida, avalia o código.
join_and_summarize(cars, colours) %>%
kable()
Conclusão
Usuários de Excel têm uma maneira de pensar a análise de dados muito rígida, e isso torna o aprendizado do de R mais difícil. No entanto, aprender a programar permitirá que você faça coisas que você não pode fazer no Excel, e realmente vale a pena a dor de aprender uma nova linguagem.
* Publicação de Gordon Shotwell, traduzida pelo IBPAD