Bem Vindo!

Que bom que você decidiu dar uma chance para o R! Este documento vai te acompanhar nos seus primeiros passos na programação em R, desde a instalação até a modelagem de dados. Durante o texto você encontrará links para outros tutoriais e sites úteis nessa jornada de programação estatística.

Por que o R?

O R é uma linguagem de programação criada e mantida por estatísticos. Esse fator faz toda a diferença na hora de fazer suas análises, já que toda a linguagem é preparada para a análise de dados com rigor e flexibilidade.

O R também é uma linguagem de programação gratuita e de livre uso. Podemos usar sem preocupar com licenças caras e restrições. Além disso, ela é continuamente atualizada e recebe contribuições de pesquisadores de todo o mundo. Há infinitas possibilidades de análises dentro do R.

E o RStudio?

O RStudio é um ambiente de programação, não a linguagem em si. Imagine ele como um facilitador entre você e o computador. Ele foi desenvolvido por um grupo de cientistas de dados pensando na otimização da programação em R e na análise de dados. Durante esse documento nós iremos utilizar o RStudio mas há a possibilidade de utilizá-lo em outros ambientes.

Ciclo de trabalho

Para realizar as nossas análises vamos pensar no seguinte ciclo de trabalho. Esse é um ciclo contínuo, onde sempre estaremos repetindo as etapas em busca de melhores resultados.

Captar dados

Aqui é a parte inicial da sua pesquisa. Como você vai conseguir estes dados? Como serão feitas as medições? Quem vai ser responsável por isso?
Neste documento, vamos usar alguns bancos de dados disponíveis na internet. Eles estarão disponíveis nesta página aqui. Tentei reunir dados de diferentes áreas do conhecimento para que mostrar como todos podem se beneficiar da ánalise de dados.
Na sua pesquisa você pode ser tanto o responsável por coletar as informações quanto receber o banco pronto. Contudo, é sempre importante checar a origem das suas informações e entender como elas foram adquiridas.

Manipulação das variáveis

Com o banco de dados em mãos, iremos trabalhar estes dados para que eles estejam passíveis de analisar. Isso significa recodificar variáveis, organizar colunas e filtrar as informações.

Exploração das informações

O primeiro passo é entender a informação em mãos. Qual a distribuição dos dados? Como ele se comporta? Qual a correlação das informações? Essas são perguntas essenciais para decidir os passos seguintes.

Modelagem

Chegou a hora de modelar os dados. Uma vez escolhidas suas variáveis de interesse e com o conhecimento sobre essas variáveis em mãos, podemos escolher qual o método de modelagem mais adequado.
Precisamos enteder o que o método espera como entrada, quais as operações realizadas e qual a saída desse método.
É perfeitamente comum que o modelo simplesmente não dê certo. Não se desespere! Volte alguns passos para trás e procure outra forma de chegar nas respostas desejadas.

Visualização dos resultados

Essa é uma etapa crucial: mostrar seu trabalho. Seja qual for o seu resultado, respostas são respostas. Mesmo que encontre respostas diferentes do esperado é importante divulgá-las para contribuir com a construção do conhecimento. Utilizando tabelas e gráficos você expõe o seu trabalho e defende o ponto de vista encontrado.

Como resolver erros

Antes de exemplos práticos vamos primeiro entender como resolver erros, porque eles vão aparecer. Alguns passos simples vão facilitar a programação de scripts e te empoderar em tentar coisas novas.

Primeiro passo: leia a mensagem de erro

No R, quando algo não está certo, aparece uma mensagem de erro. Leia essa mensagem com atençào porque muitas vezes a solução do seu problema está lá.
Por exemplo, a mensagem:
Error in 1 + "abc" : argumento não-numérico para operador binário
Temos uma dica sobre o motivo da linha de código 1 + "abc" não funcionar.

Segundo passo: tente identificar a fonte do erro

Uma função complexa pode não funcionar por causa de uma vírgula fora de lugar. Reduza a sua linha de código para uma versão mais simples. Por exemplo, aplique a função à um objeto teste para tentar entender como ela funciona e qual pode ser o problema. É o objeto que está inadequado? É a função que não é adequada?

Terceiro passo: use o help

Pesquise a função desejada com help(funcao) ou ?funcao. A página de ajuda trará informações valiosas para entender qual o problema que está acontecendo. Preste atenção nos argumentos da função e no exemplo que está localizado no final da página.

Quarto passo: pesquise a mensagem de erro

Muitas vezes não sabemos interpretar a mensagem de erro e o help não ajuda muito. Nesse caso copie e pesquise a mensagem de erro que está recebendo. Provavelmente outras pessoas já tiveram o mesmo problema e a solução está em sites como stackoverflow.

Quinto passo: procure um caminho alternativo

Quando nada mais funciona, não tenha medo de mudar sua abordagem e tentar outras funções e caminhos. Novamente, a pesquisa na internet será valiosa. Tente usar poucas palavras e pesquisar preferencialmente em inglês.

Introdução

Neste documento suponho que você já está com o R e o RStudio baixados e funcionando no seu computador. Vamos passar de forma acelerada pelos principais tópicos da programação em R.

Objetos

O R trabalha com objetos para criar seus resultados. Criamos objetos com os operadores = e <-. Para chamar o objeto criado basta escrever o nome dado a ele. Para aplicar funções no objeto basta passa o nome do objeto como argumento da função. Preste atenção no tipo de objeto trabalhado porque cada função requer um tipo específico de objetos. Por exemplo não podemos tirar média de palavras.

a <- 23
b <- 45
c <- 67

mean(a, b, c)
## [1] 23

No exemplo acima criamos três objetos numéricos e depois tiramos a média entre eles.

Tipos de objetos

É muito importante perceber qual o tipo de cada objeto.

Podem ser numeric, que são números.
Podem ser string que representam textos.
Podem ser booleana que são Verdadeiro ou Falso, ou também, 0 ou 1.

Ainda, objetos podem ter mais de um valor armazenado de diversas formas.
Podem ser vector, que é um conjunto de variáveis do mesmo tipo.
Podem ser factor, que é um vetor organizado em categorias.
Podem ser list. que é um conjunto de variáveis de qualquer tipo.
Podem ser matrix, que é um conjunto de vetores do mesmo tipo.
Podem ser Data Frame, que é um conjunto de vetores de qualquer tipo.

Funções

Função é um comando que recebe determinados valores, realiza operações e devolve um resultado. Nem todas operações podem ser realizadas em todo tipo de objeto.

Pacotes

Um conjunto de funções já vem com o R, que chamamos de base. Para outras operações existe uma infinidade de bibliotecas de funções disponíveis para serem baixadas e carregadas. Precisamos baixar o pacote apenas uma vez, mas precisamos carregá-lo toda vez que abrirmos uma nova sessão no R

Importando arquivos

Podemos carregar arquivos de diversos tipos para o ambiente do R para que possamos trabalhar com eles. Para cada tipo de arquivo existe uma função diferente. Contudo existe uma função “canivete-suíço” que resolve a maior parte dos casos usuais.
library(rio)
dados = import(“pasta/seuarquivo.exemplo”)

Exportando arquivos

Podemos ainda exportar os arquivos gerados no R. Primeiro decidimos qual tipo de arquivo queremos gerar, existem muitos tipos como:

.txt Arquivo de texto com os valores da tabela separados por tab
.csv Arquivo de texto com os valores da tabela separados por vírgula
.xlsx Arquivo próprio do Excel

write_tsv(dados, “dados.txt”)
write_csv(dados, “dados.csv”)
write_csv2(dados, “dados.csv”) Escreve um .csv onde a casa decimal é separada por vírgula

library(xlsx)
write.xlsx(dados, “dados.xlsx”)

Mãos na massa

Vamos ao trabalho! Faça o download do banco de dados e siga os passos mostrados aqui. Acredito sempre que a melhor forma de aprender é fazendo.

Expectativa de vida por país

O primeiro banco de dados abordado vai ser um dataset composto de indicadores de saúde pública de 193 países no período de 2000 a 2015. Essas informações foram coletadas pela OMS e estão disponíveis publicamente.

Importando os dados

Para trazer os dados para dentro do nosso ambiente de trabalho vamos utilizar a seguinte função:

#install.packages("rio")
library(rio)
dados = import("C:/Users/sofia/Projetos/R/ic/aula/Life Expectancy Data.csv")

Revisando o que foi feito:

  • Primeiro passo: instalamos a biblioteca rio que contém a função que queremos usar. Esse passo só precisa ser feito uma vez pois a biblioteca (também chamada de pacote) continuará instalada no computador.
  • Segundo passo: carregamos a biblioteca para que ela seja utilizada. Enquanto precisamos instalar apenas uma vez, para utilizar o pacote precisamos carregar ele em cada sessão.
  • Terceiro passo: criamos o objeto dados que recebe o conteúdo do arquivo indicado. A função import comporta a maior parte dos formatos de arquivo. Contudo caso queira importar arquivos de um tipo que a função não aceita, existem outras bibliotecas e funções disponíveis.

Manipulação das variáveis

Para essa sessão e as seguintes iremos utilizar o pacote tidyverse, que é um pacote de pacotes que traz funções preciosas para a análise de dados.

#install.packages("tidyverse")
library(tidyverse)

Com essa biblioteca baixada iremos visualizar os dados em mãos.

glimpse(dados)
## Rows: 2,938
## Columns: 22
## $ Country                           <chr> "Afghanistan", "Afghanistan", "Afgha…
## $ Year                              <int> 2015, 2014, 2013, 2012, 2011, 2010, …
## $ Status                            <chr> "Developing", "Developing", "Develop…
## $ `Life expectancy`                 <dbl> 65.0, 59.9, 59.9, 59.5, 59.2, 58.8, …
## $ `Adult Mortality`                 <int> 263, 271, 268, 272, 275, 279, 281, 2…
## $ `infant deaths`                   <int> 62, 64, 66, 69, 71, 74, 77, 80, 82, …
## $ Alcohol                           <dbl> 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, …
## $ `percentage expenditure`          <dbl> 71.279624, 73.523582, 73.219243, 78.…
## $ `Hepatitis B`                     <int> 65, 62, 64, 67, 68, 66, 63, 64, 63, …
## $ Measles                           <int> 1154, 492, 430, 2787, 3013, 1989, 28…
## $ BMI                               <dbl> 19.1, 18.6, 18.1, 17.6, 17.2, 16.7, …
## $ `under-five deaths`               <int> 83, 86, 89, 93, 97, 102, 106, 110, 1…
## $ Polio                             <int> 6, 58, 62, 67, 68, 66, 63, 64, 63, 5…
## $ `Total expenditure`               <dbl> 8.16, 8.18, 8.13, 8.52, 7.87, 9.20, …
## $ Diphtheria                        <int> 65, 62, 64, 67, 68, 66, 63, 64, 63, …
## $ `HIV/AIDS`                        <dbl> 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0…
## $ GDP                               <dbl> 584.25921, 612.69651, 631.74498, 669…
## $ Population                        <dbl> 33736494, 327582, 31731688, 3696958,…
## $ `thinness  1-19 years`            <dbl> 17.2, 17.5, 17.7, 17.9, 18.2, 18.4, …
## $ `thinness 5-9 years`              <dbl> 17.3, 17.5, 17.7, 18.0, 18.2, 18.4, …
## $ `Income composition of resources` <dbl> 0.479, 0.476, 0.470, 0.463, 0.454, 0…
## $ Schooling                         <dbl> 10.1, 10.0, 9.9, 9.8, 9.5, 9.2, 8.9,…

Para uma análise acertada também é preciso ter o dicionário de variáveis em mãos. Este dicionário pode ser encontrado aqui.

Para nossa análise inicial vamos utilizar apenas o ano de 2015.

dados15 = dados %>% 
  filter(Year == 2015) %>% 
  select(!Year) %>% 
  rename(exp_vida = "Life expectancy")

Utilizei aqui o operador %>%, que significa dentro de e depois filtrei as observações para apenas aquelas que o ano é igual a 1025, usando o operador ==. Também foi retirada a coluna Year, já que ela passou a ser redundante com a função select e o operador de negação !.

Exploração das informações

Vamos visualizar nossa variável de interesse: Expectativa de Vida.

dados15 %>% 
  ggplot(aes(x = `exp_vida`)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Aqui, criamos o gráfico de histograma utilizando a seguinte lógica:
- Primeiro chamamos o banco de dados dados15
- Dentro de dados15, chamamos a função ggplot e avisamos em aes que o eixo x será a nossa variável escolhida
- E por fim, avisamos qual tipo de gráfico será utilizado com geom_histogram

Vamos também visualizar como a nossa variável de interesse se relaciona com as nossas covariáveis.

dados15 %>% 
  ggplot(aes(x = `exp_vida`, y = BMI)) +
  geom_point()
## Warning: Removed 2 rows containing missing values (`geom_point()`).

Vemos uma tendência de correlação positiva. Podemos ainda realizar um teste de correlação entre essas variáveis.

#install.packages("stats")
library(stats)
cor.test(dados15$`exp_vida`, dados15$BMI, use = "complete.obs")
## 
##  Pearson's product-moment correlation
## 
## data:  dados15$exp_vida and dados15$BMI
## t = 8.0735, df = 179, p-value = 9.667e-14
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4010264 0.6160925
## sample estimates:
##       cor 
## 0.5166631

As operações acima foram realizadas da seguinte forma: - Instalamos (caso não tenha instalado ainda o pacote stats) e o carregamos
- Usamos a função cor.test que realiza a o teste de correlação de Pearson
- Passamos as colunas utilizando a forma banco_de_dados$nome_da_variavel
- Utilizamos apenas as observações sem NA, com o argumento use

Podemos repetir essa operação mais vezes para escolhermos quais variáveis usar.

dados15 %>% 
  ggplot(aes(x = `exp_vida`, y = Polio)) +
  geom_point()

cor.test(dados15$`exp_vida`, dados15$Polio, use = "complete.obs")
## 
##  Pearson's product-moment correlation
## 
## data:  dados15$exp_vida and dados15$Polio
## t = 8.0958, df = 181, p-value = 8.084e-14
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4004991 0.6146852
## sample estimates:
##       cor 
## 0.5156018
dados15 %>% 
  ggplot(aes(x = `exp_vida`, y = Status)) +
  geom_boxplot()

Para analisar variáveis categóricas como Status, devemos utilizar boxplots para visualizar a diferença nas médias.

t.test(`exp_vida`~ Status, data = dados15)
## 
##  Welch Two Sample t-test
## 
## data:  exp_vida by Status
## t = 12.753, df = 102.42, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Developed and group Developing is not equal to 0
## 95 percent confidence interval:
##   9.305573 12.733045
## sample estimates:
##  mean in group Developed mean in group Developing 
##                 80.70937                 69.69007

Utilizando a função t.test, realizamos o teste de Welch para duas amostras com variâncias diferentes (que foi identificado automaticamente pelo software) e vemos que a diferença é significativa.

Modelagem

Decididas as variáveis que explicarão a variável de interesse partimos para a modelagem.
Não é o lugar desta apostila explicar cada um dos métodos estatísticos aplicados, e sim a sua codificação no software.

Regressão Linear

Para realizar a regressão linear devemos seguir os seguintes passos:

mod1 = lm(`exp_vida` ~ Status + Polio + BMI, data = dados15)

par(mfrow=c(2,2))

plot(mod1)

par(mfrow=c(1,1))

#Normalidade dos residuos
shapiro.test(mod1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod1$residuals
## W = 0.99142, p-value = 0.357
#Outliers nos residuos:
summary(rstandard(mod1))
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -3.140257 -0.603192  0.098942  0.002514  0.542248  2.868899
#Independencia dos residuos
#install.packages("car")
library(car)
durbinWatsonTest(mod1)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.05661102      2.102878    0.52
##  Alternative hypothesis: rho != 0
#Homocedasticidade (Breusch-Pagan):
#install.packages("lmtest")
library(lmtest)
bptest(mod1)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod1
## BP = 31.524, df = 3, p-value = 6.593e-07
### Multicolinearidade: vif >10
vif(mod1)
##   Status    Polio      BMI 
## 1.127906 1.079855 1.121667

O modelo não passou pela hipótese nula do teste de Breusch-Pagan, indicando que há possíveis clusters dentro dos dados. Contudo pela análise gráfica não representa uma transgressão grave dos pressuspostos. O modelo é válido mas não é o mais adequado.

summary(mod1)
## 
## Call:
## lm(formula = exp_vida ~ Status + Polio + BMI, data = dados15)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -17.358  -3.328   0.545   2.923  15.397 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      61.72756    2.14530  28.773  < 2e-16 ***
## StatusDeveloping -7.06416    1.15001  -6.143 5.21e-09 ***
## Polio             0.12140    0.01781   6.815 1.43e-10 ***
## BMI               0.13337    0.02121   6.289 2.43e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.558 on 177 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.5346, Adjusted R-squared:  0.5267 
## F-statistic: 67.77 on 3 and 177 DF,  p-value: < 2.2e-16

Visualização dos resultados

Com o modelo em mãos queremos agora mostrar os resultados. Para tal, lançaremos mão de gráficos e tabelas.

dados15 %>% 
  ggplot(aes(x = exp_vida))+
  geom_histogram(fill = "lightblue", bins = 20) +
  labs(title = "Histograma para a expectativa de vida em 2015",
       x = "Expectativa em anos", y = "Frequência")

Podemos criar gráficos bonitos e customizáveis com a função ggplot. Aqui melhoramos o gráfico já feito anteriormente, em que mudamos a cor e adicionamos um título. É fácil criar gráficos e mudar sua aparência utilizando essas ferramentas.

#install.packages("jtools")
library(jtools)
#install.packages("kableExtra")
library(kableExtra)

summ(mod1)
Observations 181 (2 missing obs. deleted)
Dependent variable exp_vida
Type OLS linear regression
F(3,177) 67.77
0.53
Adj. R² 0.53
Est. S.E. t val. p
(Intercept) 61.73 2.15 28.77 0.00
StatusDeveloping -7.06 1.15 -6.14 0.00
Polio 0.12 0.02 6.81 0.00
BMI 0.13 0.02 6.29 0.00
Standard errors: OLS

Com o pacote jtools podemos fazer tabelas bonitas e fáceis de exportar com os resultados do modelo criado.


  1. Estudante de estatística, UFMG ↩︎