GET00130 - Métodos Computacionais para Estatística II
Jony Arrais Pinto JuniorConteúdo da aula
- Revisando o R e RStudio;
- Pedindo ajuda no R;
- Criando/manipulando objetos básicos;
- Tipos de dados.
Revisando o R e o RStudio
1 - Introdução
R é uma linguagem de programação, dinâmica, voltada à manipulação, análise e visualização de dados. Foi criada originalmente por Ross Ihaka e por Robert Gentleman no departamento de Estatística da Universidade de Auckland, Nova Zelândia.
Vamos ressaltar que a linguagem R é muito intuitiva. A grande maioria dos usuários utiliza o método da tentativa e erro. Sim! Outro ponto de destaque, é que quando aprendemos a utilizar um certo tipo de função, como por exemplo a função plot, o aprendizado pode ser replicado para funções similares, como a função boxplot.
Ao realizarmos esse modus operandi, podemos acabar precisando de uma ajuda. Felizmente, a comunidade R é bem ativa, e existem muitas formas de obtermos a mesma.
2 - Pedindo Ajuda
Existem quatro principais fontes para se pedir ajuda:
- Help/documentação do R (comandos
help(nome_da_funcao)ou?nome_da_funcao); - Google;
- Stack Overflow;
- Amiguinho.
2.1 - Documentação do R
A documentação do R traz tudo o que nós precisamos saber para usarmos uma determinada função.
?mean
help(mean)2.2 - Google
A comunidade de usuários do R é grande e produtiva, gerando conteúdos e discussões constantes na rede. Pesquisas em inglês aumentam consideravelmente a chance de encontrarmos uma resposta, como acontece com outras linguagens. Outra dica que pode ser bastante útil é a inclusão de um ‘r’ na busca.
2.3 - Stack Overflow
O Stack Overflow e o Stack Overflow em Português são sites de Pergunta e Resposta amplamente utilizados por muitas linguagens de programação, incluindo o R.
Caso não encontre um problema (e a solução do mesmo) similar ao seu no site, o Stack Overflow lhe dará o espaço para criar sua própria pergunta.
3 - RStudio
Funções dos principais painéis:
- Editor/Scripts: é onde escrevemos nossos códigos.
- Console: é onde rodamos os códigos e recebemos as saídas. O R vive aqui!
- Environment: painel com todos os objetos criados na sessão.
- History: painel com um histórico dos comandos rodados.
- Files: mostra os arquivos no diretório de trabalho. É possível navegar entre diretórios.
- Plots: painel onde os gráficos serão apresentados.
- Help: janela onde a documentação das funções serão apresentadas.
4 - Instalar pacotes
O grande diferencial do R são seus pacotes. Perceberemos que trata-se de uma atividade rotineira na vivência com o R. Sendo assim, fique bastante à vontade para instalar e atualizar muitos e muitos pacotes ao usar o R.
Existem três maneiras principais de instalarmos pacotes no R. Em ordem de frequência, são:
- Via CRAN (Comprehensive R Archive Network):
install.packages("nome-do-pacote"). - Via Github:
devtools::install_github("nome-do-repo/nome-do-pacote"). - Via arquivo .zip/.tar.gz:
install.packages("C:/caminho/nome-do-pacote.zip", repos = NULL).
4.1 - Via CRAN
Instalem pacotes que não estão na sua biblioteca usando a função install.packages("nome_do_pacote"). Por exemplo:
install.packages("maptools")4.2 - Via Github
Muitos desenvolvedores costumam disponibilizar a última versão de seus pacotes no Github, incluindo pacotes que não estão no CRAN. Para instalar um pacote do GITHUB é preciso ter o pacote devtools. O comando é igualmente simples:
devtools::install_github("qspatialR/qspatial")observação - Quando usamos a sintaxe PacoteA::funçãoZ estamos garantindo que a função funçãoZ usada pertence necessariamente ao pacote PacoteA.
Observação: pacote::função garante que a função utilizada pertence ao pacote especificado.
Apenas será necessário o username e o nome do repositório (que geralmente tem o mesmo nome do pacote). No exemplo, o username foi qspatialR e o repositório foi qspatial.
Se você não é familiar com o github, não se preocupe! Os pacotes disponibilizados na plataforma geralmente têm um README cuja primeira instrução é sobre a instalação. Se não tiver, provavelmente este pacote não te merece! =)
4.3 - Via arquivo .zip/.tar.gz
Se você precisar instalar um pacote que está zipado no seu computador (ou em algum servidor), utilize o seguinte comando
install.packages("C:/caminho/para/o/arquivo/zipapo/nome-do-pacote.zip", repos = NULL)5 - Objetos
A seguir, vamos revisar/discutir a criação e manipulação de objetos básicos no R.
5.1 - Vetor
Conjunto de elementos de uma mesma natureza.
#Criando o vetor idade
idade = c(20,30,40,23,22,19,32,42)
#Visualizando o vetor idade
idade[1] 20 30 40 23 22 19 32 42
#Criando o vetor gasto
gasto = c(2,3,4,4,2,3,4,5)
#Visualizando o vetor gasto
gasto[1] 2 3 4 4 2 3 4 5
#Criando o vetor cidade
cidade = c("Rio de Janeiro","Santos","Fortaleza")
#Visualizando o vetor cidade
cidade[1] "Rio de Janeiro" "Santos" "Fortaleza"
#Checando a classe de um vetor
class(idade)[1] "numeric"
#Realizando uma operação entre um vetor e um escalar
idade / 5[1] 4.0 6.0 8.0 4.6 4.4 3.8 6.4 8.4
#Realizando operações entre dois vetores
idade + gasto[1] 22 33 44 27 24 22 36 47
#Acessando elemento(s) de um vetor
idade[2][1] 30
idade[-2][1] 20 40 23 22 19 32 42
idade[c(1,3)][1] 20 40
#realizando operações com um vetor
max(idade)[1] 42
min(gasto)[1] 2
which.max(idade)[1] 8
which.min(gasto)[1] 1
length(idade)[1] 8
sort(idade)[1] 19 20 22 23 30 32 40 42
Algumas funções que nos ajudam a criar vetores especiais
#Dividindo o intervalo 0 a 1 em 10 partes iguais (length.out=11)
seq(0, 1, length.out=11) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
#Sequência de números inteiros começando no 1 e terminando no 9 de 2 em 2 (by = 2)
seq(1, 9, by = 2)[1] 1 3 5 7 9
#Sequência dos 10 primeiros números inteiros
seq(10) [1] 1 2 3 4 5 6 7 8 9 10
#Sequência dos 10 primeiros números inteiros
1:10 [1] 1 2 3 4 5 6 7 8 9 10
#Repetindo o vetor (1, 2, 3, 4) duas vezes
rep(1:4, 2)[1] 1 2 3 4 1 2 3 4
#Repetindo cada elemento do vetor (1, 2, 3, 4) duas vezes (each = 2)
rep(1:4, each = 2)[1] 1 1 2 2 3 3 4 4
#Repetindo cada elemento do vetor (1, 2, 3, 4) duas vezes
rep(1:4, c(2,2,2,2))[1] 1 1 2 2 3 3 4 4
#Repetindo o elemento do vetor (1, 2, 3, 4) - (2,1,2,1) vezes, respectivamente
rep(1:4, c(2,1,2,1))[1] 1 1 2 3 3 4
#Repetindo cada elemento do vetor (1, 2, 3, 4) duas vezes (each = 2), mas apresentando somenteos 4 primeiros elementos (len = 4)
rep(1:4, each = 2, len = 4) [1] 1 1 2 2
rep(1:4, each = 2, len = 10) [1] 1 1 2 2 3 3 4 4 1 1
#Repetindo cada elemento do vetor (1, 2, 3, 4) duas vezes (each = 2), esta ação será repetida por três vezes (times = 3)
rep(1:4, each = 2, times = 3) [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
5.2 - Matrizes
Conjunto de elementos de uma mesma natureza organizado em linhas e colunas.
Principais argumentos da função matrix:
- data - os elementos que irão compor a matriz;
- nrow - número de linhas;
- ncol - número de colunas.
#Criando um matriz com 3 linhas (nrow = 3) e 3 colunas (ncol = 3), sendo alimentada por coluna
A = matrix(data = c(1,3,4,2,3,4,6,3,9),
nrow = 3,
ncol= 3)
A [,1] [,2] [,3]
[1,] 1 2 6
[2,] 3 3 3
[3,] 4 4 9
#Criando um matriz com 3 linhas (nrow = 3) e 3 colunas (ncol = 3), sendo alimentada por linha (byrow = TRUE)
B = matrix(data = c(1,3,4,2,3,4,6,3,9),
nrow = 3,
ncol= 3,
byrow = TRUE)
B [,1] [,2] [,3]
[1,] 1 3 4
[2,] 2 3 4
[3,] 6 3 9
#Somando matrizes
A + B [,1] [,2] [,3]
[1,] 2 5 10
[2,] 5 6 7
[3,] 10 7 18
#Realizando uma operação entre um escalar e uma matriz
3 * A [,1] [,2] [,3]
[1,] 3 6 18
[2,] 9 9 9
[3,] 12 12 27
#Invertendo uma matriz
solve(A) [,1] [,2] [,3]
[1,] -1 -0.4000000 0.8
[2,] 1 1.0000000 -1.0
[3,] 0 -0.2666667 0.2
#Acessando elementos de uma matriz
A[,2][1] 2 3 4
A[1,][1] 1 2 6
A[1,2][1] 2
#Empilhando matrizes
rbind(A,B) [,1] [,2] [,3]
[1,] 1 2 6
[2,] 3 3 3
[3,] 4 4 9
[4,] 1 3 4
[5,] 2 3 4
[6,] 6 3 9
cbind(A,B) [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 6 1 3 4
[2,] 3 3 3 2 3 4
[3,] 4 4 9 6 3 9
5.3 - Array
Generaliza a ideia de matriz. Enquanto em uma matriz os elementos são organizados em duas dimensões (linhas e colunas), em um array os elementos podem ser organizados em um número arbitrário de dimensões.
Principais argumentos da função array:
- data - os elementos que irão compor o array;
- dim - dimensão do array (número de linhas, número de colunas, número de matrizes).
#Criando um array com 2 matrizes com 4 colunas e 3 linhas
D = array(data = c(1,3,4,2,3,4,6,3,9,1,0,2,1,4,6,2,6,9,1,3,2,4,1,3),
dim = c(3,4,2))
#Visualizando D
D, , 1
[,1] [,2] [,3] [,4]
[1,] 1 2 6 1
[2,] 3 3 3 0
[3,] 4 4 9 2
, , 2
[,1] [,2] [,3] [,4]
[1,] 1 2 1 4
[2,] 4 6 3 1
[3,] 6 9 2 3
#Acessando a 1a linha de cada matriz que compõe o array
D[1,,] [,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 6 1
[4,] 1 4
#Acessando a 2a coluna de cada matriz que compõe o array
D[,2,] [,1] [,2]
[1,] 2 2
[2,] 3 6
[3,] 4 9
#Acessando a 2a matriz que compõe o array
D[,,2] [,1] [,2] [,3] [,4]
[1,] 1 2 1 4
[2,] 4 6 3 1
[3,] 6 9 2 3
#Acessando a 2a coluna da 2a matriz que compõe o array
D[,2,2][1] 2 6 9
5.4 - Lista
Generalizações de vetores, representa uma coleção de objetos.
#Criando uma lista com 3 objetos
x = list(v=1:5,
h="Z",
p=c("a", "b"))
#Visualizando a lista
x$v
[1] 1 2 3 4 5
$h
[1] "Z"
$p
[1] "a" "b"
#Acessando somente v na lista
x$v[1] 1 2 3 4 5
x[[1]][1] 1 2 3 4 5
#Verificando o número de objetos na ista
length(x)[1] 3
5.5 - Data.frame
Um data.frame é o mesmo que uma tabela do SQL ou um spreadsheet do Excel, por isso são objetos muito importantes. Usualmente, seus dados serão importados para um objeto data.frame.
Os data.frame’s são listas especiais em que todos os elementos possuem o mesmo comprimento. Cada elemento dessa lista pode ser pensado como uma coluna da tabela. Seu comprimento representa o número de linhas.
#Criando o data.frame nomeado de dados
dados = data.frame(Mat = c(10,12,34,23,21,65,76,13,22),
turno = c(1,2,2,1,2,1,1,2,2),
escolaridade=c(1,1,2,3,2,3,4,1,2),
Sexo=c("M","F","M","F","M","F","F","M","F"),
Nota=c(4,5,2,6,4,8,7,7,7))
#Visualizando o data.frame dados
dados Mat turno escolaridade Sexo Nota
1 10 1 1 M 4
2 12 2 1 F 5
3 34 2 2 M 2
4 23 1 3 F 6
5 21 2 2 M 4
6 65 1 3 F 8
7 76 1 4 F 7
8 13 2 1 M 7
9 22 2 2 F 7
#Verificando a classe de dados
class(dados)[1] "data.frame"
#Acessando a variável Nota de dados
dados$Nota[1] 4 5 2 6 4 8 7 7 7
#Acrescentando uma nova variável
dados$Resultado = c("Rep","Rep","Rep","Aprov","Rep","Aprov","Aprov","Aprov","Aprov")
dados Mat turno escolaridade Sexo Nota Resultado
1 10 1 1 M 4 Rep
2 12 2 1 F 5 Rep
3 34 2 2 M 2 Rep
4 23 1 3 F 6 Aprov
5 21 2 2 M 4 Rep
6 65 1 3 F 8 Aprov
7 76 1 4 F 7 Aprov
8 13 2 1 M 7 Aprov
9 22 2 2 F 7 Aprov
#Visualizando somente as linhas iniciais de dados
head(dados) Mat turno escolaridade Sexo Nota Resultado
1 10 1 1 M 4 Rep
2 12 2 1 F 5 Rep
3 34 2 2 M 2 Rep
4 23 1 3 F 6 Aprov
5 21 2 2 M 4 Rep
6 65 1 3 F 8 Aprov
#Acessando somente os nomes das variáveis existentes em dados
names(dados)[1] "Mat" "turno" "escolaridade" "Sexo" "Nota"
[6] "Resultado"
5.6 - Tibble
São uma tomada moderna do data.frame (sempre prefiram esta classe para trabalhar com bases de dados). Em grande parte do curso, ele será o principal objeto de estudo.
#Ativando o pacote tibble
library(tibble)
#Criando um tibble chamado dados2
dados2 = tibble(Mat = c(10,12,34,23,21,65,76,13,22),
turno = c(1,2,2,1,2,1,1,2,2),
escolaridade=c(1,1,2,3,2,3,4,1,2),
Sexo=c("M","F","M","F","M","F","F","M","F"),
Nota=c(4,5,2,6,4,8,7,7,7))
#Visualiasando dados2
dados2# A tibble: 9 x 5
Mat turno escolaridade Sexo Nota
<dbl> <dbl> <dbl> <chr> <dbl>
1 10 1 1 M 4
2 12 2 1 F 5
3 34 2 2 M 2
4 23 1 3 F 6
5 21 2 2 M 4
6 65 1 3 F 8
7 76 1 4 F 7
8 13 2 1 M 7
9 22 2 2 F 7
#Verificando a classe de dados2
class(dados2)[1] "tbl_df" "tbl" "data.frame"
#Acessando a variável Nota de dados2
dados2$Nota[1] 4 5 2 6 4 8 7 7 7
#Acrescentando variáveis em dados2
dados2$Nota2 = c(3,2,5,4,6,7,7,4,6)
dados2$Resultado = c("Rep","Rep","Rep","Aprov","Rep","Aprov","Aprov","Aprov","Aprov")
#Visualisando dados2
dados2# A tibble: 9 x 7
Mat turno escolaridade Sexo Nota Nota2 Resultado
<dbl> <dbl> <dbl> <chr> <dbl> <dbl> <chr>
1 10 1 1 M 4 3 Rep
2 12 2 1 F 5 2 Rep
3 34 2 2 M 2 5 Rep
4 23 1 3 F 6 4 Aprov
5 21 2 2 M 4 6 Rep
6 65 1 3 F 8 7 Aprov
7 76 1 4 F 7 7 Aprov
8 13 2 1 M 7 4 Aprov
9 22 2 2 F 7 6 Aprov
#Acessando os nomes das variáveis em dados2
names(dados2)[1] "Mat" "turno" "escolaridade" "Sexo" "Nota"
[6] "Nota2" "Resultado"
6 - Tipos de dados
A seguir apresentamos os tipos de dados usados com frequência no R para representar variáveis quantitativas e qualitativas.
R tem 5 classes básicas:
- logical (ex.., TRUE, FALSE)
- integer (ex.,, 2L, as.integer(3))
- numeric (real or decimal) (ex., 2, 2.0, pi)
- complex (ex., 1 + 0i, 1 + 4i)
- character (ex., “a”, “swc”)
Quando trabalharemos com um objeto composto por elementos lógicos?
# Criando os vetores Idade e Nome e checando a classe do objeto Idade (os vetores foram criados na mesma ordem, a idade do Jony corresponde a 20 anos)
Idade = c(20,39,25,28,27,19,45,23,22)
Nome <- c("Jony", "Felipe", "Paulo", "Estevão", "Mayra","Helena","Priscila","Roberto","Daniel")
class(Idade)[1] "numeric"
class(Nome)[1] "character"
# Verificando quais componentes de Idade são maiores do que 25
Idade>25[1] FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE
Expressões lógicas são implementadas com os operadores lógicos:
- \(<\) menor que;
- \(<=\) menor que ou igual a;
- \(>\) maior que;
- \(>=\) maior que ou igual a;
- \(==\) igual a;
- \(!=\) diferente de.
Operações importantes utilizando um dado do tipo lógico
#Consultando quais elementos são maiores do que 25 anos no vetor Idade
Idade>25[1] FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE
6.1 - Factor
O tipo de dados factor é usado para representar dados qualitativos. Por exemplo, a variável sexo:
Como transformar a variável sexo dentro da base em um factor?
Principais argumentos da função factor:
- x - o vetor de dados;
- labels - um vetor com os rótulos das categorias respeitando a ordenação dos seus códigos;
- exclude - o valor a ser transformado em NA.
#Transformando a variável turno em um factor e indicando os rótulos de cada categoria
dados2$turno = factor(x = dados2$turno,
labels = c("Manha","Tarde"))
#Visualizando dados2
dados2# A tibble: 9 x 7
Mat turno escolaridade Sexo Nota Nota2 Resultado
<dbl> <fct> <dbl> <chr> <dbl> <dbl> <chr>
1 10 Manha 1 M 4 3 Rep
2 12 Tarde 1 F 5 2 Rep
3 34 Tarde 2 M 2 5 Rep
4 23 Manha 3 F 6 4 Aprov
5 21 Tarde 2 M 4 6 Rep
6 65 Manha 3 F 8 7 Aprov
7 76 Manha 4 F 7 7 Aprov
8 13 Tarde 1 M 7 4 Aprov
9 22 Tarde 2 F 7 6 Aprov
#Visualizando a variável turno
dados2$turno[1] Manha Tarde Tarde Manha Tarde Manha Manha Tarde Tarde
Levels: Manha Tarde
6.2 - Ordered
Caso a ordem da variável seja importante (qualitativa ordinal), será necessário usar fatores ordenados:
Como transformar a variável escolaridade dentro da base em um ordered?
Principais argumentos da função ordered:
- x - o vetor de dados;
- labels - um vetor com os rótulos das categorias respeitando a ordenação dos seus códigos;
- exclude - o valor a ser transformado em NA.
#Transformando a variável escolaridade em um ordered e indicando os rótulos de cada categoria e as suas relações de grandeza
dados2$escolaridade = ordered(x = dados$escolaridade,
levels=c(2,3,4,1),
labels=c("Analfabeto","Fundamental","Medio","Superior"))
#Visualizando as linhas iniciais da base
dados2# A tibble: 9 × 7
Mat turno escolaridade Sexo Nota Nota2 Resultado
<dbl> <fct> <ord> <chr> <dbl> <dbl> <chr>
1 10 Manha Superior M 4 3 Rep
2 12 Tarde Superior F 5 2 Rep
3 34 Tarde Analfabeto M 2 5 Rep
4 23 Manha Fundamental F 6 4 Aprov
5 21 Tarde Analfabeto M 4 6 Rep
6 65 Manha Fundamental F 8 7 Aprov
7 76 Manha Medio F 7 7 Aprov
8 13 Tarde Superior M 7 4 Aprov
9 22 Tarde Analfabeto F 7 6 Aprov
#Visualizando a variável escolaridade
dados2$escolaridade[1] Superior Superior Analfabeto Fundamental Analfabeto Fundamental
[7] Medio Superior Analfabeto
Levels: Analfabeto < Fundamental < Medio < Superior
7 - Valores especiais
Existem valores reservados para representar dados faltantes, infinitos, e indefinições matemáticas.
NA (Not Available) significa dado faltante/indisponível. O NA tem uma classe, ou seja, podemos ter NA numeric, NA character etc.
NaN (Not a Number) representa indefinições matemáticas, como 0/0 e log(-1). Um NaN é um NA, mas a recíproca não é verdadeira.
Inf (Infinito) é um número muito grande ou o limite matemático, por exemplo, 1/0 e 10^310. Aceita sinal negativo -Inf.
NULL representa a ausência de informação. Conceitualmente, a diferença entre NA e NULL é sutil, mas, no R, o NA está mais alinhado com os conceitos de estatística (ou como gostaríamos que os dados faltantes se comportassem em análise de dados) e o NULL está em sintonia com comportamentos de lógica de programação.
Use as funções is.na(), is.nan(), is.infinite() e is.null() para testar se um objeto é um desses valores.