Estatistica R
Estatistica R
Departamento de Estatística
Instituto de Matemática e Estatística
Universidade Federal da Bahia
Preparando o ambiente
Durante o curso
• Usaremos nas aulas: posit.cloud.
• Recomendamos instalar e usar R com versão pelo menos 4.1:
cran.r-project.org.
• usaremos o framework tidyverse:
• Instalação: install.packages("tidyverse")
Na sua casa
• IDE recomendadas: RStudio e VSCode.
• Caso você queira usar o VSCode, instale a extensão da linguagem R:
REditorSupport.
• Outras linguagens interessantes: python e julia.
• python: linguagem interpretada de próposito geral, contemporânea do
R, simples e fácil de aprender.
• julia: linguagem interpretada para análise de dados, lançada em
2012, promete simplicidade e velocidade.
A linguagem R
A linguagem R
A precursora da linguagem R: S.
• R é uma linguagem derivada do S.
• S foi desenvolvido em fortran por John Chambers em 1976 no
Bell Labs.
• S foi desenvolvido para ser um ambiente de análise estatística.
• Filosofia do S: permitir que usuários possam analisar dados usando
estatística com pouco conhecimento de programação.
História da linguagem R
• Em 1991, Ross Ihaka e Robert Gentleman criaram o R na Nova
Zelândia.
• Em 1996, Ross e Robert liberam o R sob a licença “GNU General
License”, o que tornou o R um software livre.
• Em 1997, The Core Group é criado para melhorar e controlar o
código fonte do R.
Motivos para usar R
Livros
• Nível cheguei agora aqui: zen do R.
• Nível Iniciante: R Tutorial na W3Schools.
• Nível Iniciante: Hands-On Programming with R.
• Nível Intermediário: R for Data Science.
• Nível Avançado: Advanced R.
Em pt-br
• Curso R: material.curso-r.com.
• ecoR: ecor.ib.usp.br.
O que você pode fazer quando estiver em
apuros?
• consultar a documentação do R:
help(mean)
?mean
• Peça ajuda a um programador mais experiente.
• Consulte o pt.stackoverflow.com.
• Use ferramentas de busca como o google e duckduckgo.com.
log("G")
Soma Divisão
1 + 1 3 / 2
## [1] 2 ## [1] 1.5
Substração Potenciação
2 - 1 2ˆ3
## [1] 1 ## [1] 8
Multiplicação
3 * 3
## [1] 9
Operações básicas
Exercício
instalação:
install.packages(pacman)
carregando pacotes
Pacotes precisam estar instalados
library(pacman)
Carregando pacotes com pacman
example:
read_xlsx('dados/brutos/casas.xlsx', sheet=1)
Funções na linguagem R
Exercício
Vetor
• Agrupamento de valores de mesmo tipo em um único objeto.
• Criação de vetor:
• c(...)
• vector('<tipo de dados>', <comprimento do vetor>)
• seq(from = a, to = b, by = c).
Vetor de caracteres
vetor_nomes <- c("Gilberto", "Sassi")
vetor_nomes
## [1] 0 0 0
vetor_seq <- seq(from = 1, to = 3.5, by = 0.5)
vetor_seq
## [1] 1 2
vetor_inteiros_vazio <- vector("integer", 3)
vetor_inteiros_vazio
## [1] 0 0 0
Vetores
Vetor lógico
vetor_logico <- c(TRUE, FALSE)
vetor_logico
Matriz
• Agrupamento de valores de mesmo tipo em um único objeto de
dimensão 2.
• Criação de matriz:
• matrix(..., nrow = <integer>, ncol = <integer>)
• cbind e rbind
• diag(<vector>)
Matriz de caracteres
matriz_texto <- matrix(c("a", "b", "c", "d"), nrow = 2)
matriz_texto
## [,1] [,2]
## [1,] "a" "c"
## [2,] "b" "d"
Matriz
## nrow
## [1,] 1 3 2
## [2,] 2 4 2
Matriz de valores lógicos
matriz_logica <- rbind(
c(TRUE, FALSE),
c(TRUE, TRUE)
)
matriz_logica
## [,1] [,2]
## [1,] TRUE FALSE
## [2,] TRUE TRUE
Matriz
Exercício
Slicing
Selecionando todos os elementos entre o primeiro e o quinto.
letras <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")
letras[1:5]
## [1] -5 -5 -5 -5 -5
Substração (vetores numéricos)
vetor_1 <- 1:5
vetor_2 <- 6:10
vetor_1 - vetor_2
## [1] -5 -5 -5 -5 -5
Operadores com vetores
## [1] 6 14 24 36 50
Divisão (vetores numéricos)
vetor_1 <- 1:5
vetor_2 <- 6:10
vetor_1 / vetor_2
Exemplo
Cada pessoa de uma equipe de quatro pessoas divide a administração de
duas regiões (A e B) conforme as matrizes abaixo:
Postos de venda da região A
postos_regiao_a <- rbind(
c(2, 4), # primeira linha
c(1, 5) # segunda linha
)
## [,1] [,2]
## [1,] 25 23
## [2,] 45 17
Operações com matrizes
Subtração de matrizes
Número de postos de venda da região A, conhecendo o total de número de
postos e o número de postos de venda região B.
# postos de venda da região A
postos_regiao_a <- postos - postos_regiao_b
postos_regiao_a
## [,1] [,2]
## [1,] 2 4
## [2,] 1 5
Operações com matrizes
## [,1] [,2]
## [1,] 8 8
## [2,] 1 15
Operações com matrizes
## [,1] [,2]
## [1,] 4 2
## [2,] 1 3
Outras operações importantes com
matrizes
## Rows: 4
## Columns: 2
## $ nome <chr> "João", "Josué", "Joaquim", "José"
## $ idade <dbl> 20, 21, 23, 32
Operações em data frame
Operações em um tibble
Algumas funções úteis depois de aprender a carregar os dados no R.
Código em R Descrição
head() Mostra as primeiras linhas de um tibble
tail() Mostra as últimas linhas de um tibble
glimpse() Impressão de informações básicas dos dados
add_case() ou add_row() Adiciona uma nova observação
head(df, n = 2)
## # A tibble: 2 x 2
## nome idade
## <chr> <dbl>
## 1 João 20
## 2 Josué 21
df <- add_case(df, nome = "Josefina", idade = 31)
tail(df, n = 2)
## # A tibble: 2 x 2
## nome idade
## <chr> <dbl>
## 1 José 32
## 2 Josefina 31
data frame
Exercício
Realize as seguintes operações no dataset iris (disponível no R):
• imprima um resumo sobre o dataset iris
• pegue as 5 primeiras linhas de iris
• pegue as 5 últimas linhas de iris
• adicione Fulano de 30 anos ao tibble df para obter o seguinte
dataset:
nome idade
João 20
Josué 21
Joaquim 23
José 32
Josefina 31
Fulano 30
Operações com listas
Concatenação de listas
lista_1 <- list("a", "b")
lista_2 <- list(1, 2)
lista_final <- c(lista_1, lista_2)
lista_final
## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b"
##
## [[3]]
## [1] 1
##
## [[4]]
## [1] 2
Operações com listas
Slicing a lista
lista_final[1:2]
## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b"
Acessando elemento pela ordem
# Acessando o segundo elemento da lista d.
lista_final[[2]]
## [1] "b"
Acessando elemento usando $
lista <- list(elemento_1 = 1, elemento_2 = "docente")
lista$elemento_2
## [1] "docente"
Operações com listas
## $elemento_3
## $elemento_3[[1]]
## [1] "olá"
Obtendo os nomes dos elementos em um lista
lista <- list(c(1, 2, 3), elemento_1 = 1, elemento_2 = "docente",
elemento_3 = list("olá"))
names(lista)
Função para
Valor Descrição O que é identificar
NA Not Available Valor faltante. is.na()
NaN Not a Number Resultado do is.nan()
cálculo indefinido.
Inf Infinito Valor que excede is.inf()
o valor máximo
que sua máquina
aguenta.
NULL Nulo Valor indefinido is.null()
de expressões e
funções (diferente
de NaN e NA)
Parênteses 1: guia de estilo no R
glimpse(dados_iris)
## Rows: 150
## Columns: 5
## $ comprimento_sepala <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4
## $ largura_sepala <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2
## $ comprimento_petala <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1
## $ largura_petala <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0
## $ especies <chr> "setosa", "setosa", "setosa", "setosa", "
Carregando dados no R
• No sistema métrico:
• As casas decimais são separadas por ,
• O agrupamento de milhar é marcada por .
• As colunas dos arquivos de texto são separadas por ;
• No sistema imperial inglês (UK e USA):
• As casas decimais são separadas por .
• O agrupamento de milhar é marcada por ,
• As colunas dos arquivos de texto são separadas por ,
## Rows: 32
## Columns: 11
## $ milhas_por_galao <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1,
## $ cilindros <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8,
## $ cilindrada <dbl> 160.0, 160.0, 108.0, 258.0, 360.0,
## $ cavalos_forca <dbl> 110, 110, 93, 110, 175, 105, 245, 6
## $ eixo <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76,
## $ peso <dbl> 2.620, 2.875, 2.320, 3.215, 3.440,
## $ velocidade <dbl> 16.46, 17.02, 18.61, 19.44, 17.02,
## $ forma <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0,
## $ transmissao <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
## $ marchas <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3,
## $ carburadores <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3,
Carregandos dados no R
glimpse(dados_dentes)
## Rows: 60
## Columns: 3
## $ comprimento <dbl> 4.2, 11.5, 7.3, 5.8, 6.4, 10.0, 11.2, 11
## $ suplemento <chr> "Vitamina C", "Vitamina C", "Vitamina C"
## $ dose <dbl> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
Carregando dados no R
Exercício
Executar
f(x, y)
• Passo2:
acrescente(
acrescente(
"tigela vazia",
"farinha"
),
"ovos"
)
• Passo3:
acrescente(
acrescente(
acrescente(
"tigela vazia",
"farinha"
),
"ovos"
),
"leite"
)
• Passo4:
acrescente(
acrescente(
acrescente(
acrescente(
"tigela vazia",
"farinha"
),
"ovos"
),
"leite"
),
"fermento"
)
• Passo 5:
misture(
acrescente(
acrescente(
acrescente(
acrescente(
"tigela vazia",
"farinha"
),
"ovos"
),
"leite"
),
"fermento"
)
)
• Passo 6:
asse(
misture(
acrescente(
acrescente(
acrescente(
acrescente(
"tigela vazia",
"farinha"
),
"ovos"
),
"leite"
),
"fermento"
)
)
)
Usando o operador |>.
Variável
Quantitativa Quantitativa
Valores categóricos (texto) Valores numéricos
Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade) ,
construa a tabela de frequências para as seguintes variáveis:
• tp_sexo: gênero que a pessoa se identifica (segundo classificação
usada pelo IBGE)
• tp_cor_raca: raça (segundo classificação usada pelo IBGE)
Tabela de frequências
Variável quantitativa discreta
Para os dados do ENEM 2022 (cada pessoa tem sua cidade), construa a
tabela de frequências para a variável q005: número de pessoas que moram
na casa da(o) candidata(o).
Tabela de frequências
Variável quantitativa contínua
Frequência
X Frequência relativa Porcentagem
n1
[l0 , l1 ) n1 f1 = n1 +···+nk p1 = f1 · 100
n2
[l1 , l2 ) n2 f2 = n1 +···+nk p2 = f2 · 100
.. .. .. ..
. . . .
nk
[lk−1 , lk ] nk fk = n1 +···+nk pk = fk · 100
• menor valor de X = l0 ≤ l1 ≤ · · · ≤ lk−1 ≤ lk = maior valor de X
• ni é número de valores de X entre li−1 e li
• l0 , l1 , . . . , lk quebram o suporte da variável X (breakpoints).
• l0 , l1 , · · · , lk são escolhidos de acordo com a teoria por trás da análise
de dados
Recomendações:
• use l0 , l1 , · · · , lk igualmente espaçados
• e use a regra de Sturges para determinar o valor de k:
• k = 1 + log 2(n) onde n é tamanho da amostra
• Se 1 + log 2(n) não é um número inteiro, usamos k = ⌈1 + log 2(n)⌉.
Tabela de frequências
Variável quantitativa contínua
• Pacote: ggplot2
• Permite gráficos personalizados com uma sintaxe simples e rápida, e
iterativa por camadas.
• Começamos com um camada com os dados ggplot(dados), e
vamos adicionando as camadas de anotações, e sumários estatísticos.
• Usa a gramática de gráficos proposta por Leland Wilkinson: Grammar
of Graphics.
• Ideia desta gramática: delinear os atributos estéticos das figuras
geométricas (incluindo transformações nos dados e mudança no
sistema de coordenadas).
Para mais detalhes, você pode consultar ggplot2: elegant graphics for
data analysis e documentação do ggplot2
Gráficos no R
Você pode usar diversos temas e extensões que a comunidade cria e criou
para melhorar a aparência e facilitar a construção de ggplot2.
Lista com extensões do ggplot2: extensões do ggplot2.
Indicação de extensões:
• Temas adicionais para o pacote ggplot2: ggthemes.
• Gráfico de matriz de correlação: ggcorrplot.
• Gráfico quantil-quantil: qqplotr.
Gráficos no R
40
30
Frequência
20
10
Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade),
construa o gráfico de barras para as seguintes variáveis:
• tp_sexo: gênero que a pessoa se identifica (segundo classificação do
IBGE)
• tp_cor_raca: raça autodeclarada (segundo classificação do IBGE)
Tabela de frequências
Variável quantitativa discreta
ggplot(dados_mtcarros) +
geom_bar(
mapping = aes(carburadores, after_stat(100 * prop)),
fill = "#002f81"
) +
labs(x = "Número de carburadores", y = "Porcentagem") +
theme_minimal()
30
20
Porcentagem
10
2 4 6 8
Número de carburadores
Gráfico de barras
Variável quantitativa discreta
Exercício
Denside de frequência
fi
· li − li−1
fi
li −li−1 li −li−1
Variável contínua
li − li−1
Histograma
ggplot(dados_iris) +
geom_histogram(
aes(x = comprimento_sepala, y = after_stat(density)),
bins = k,
fill = "#002f81"
) +
theme_minimal() +
labs(
x = "Comprimento de Sépala",
y = "Densidade de Frequência"
)
0.4
0.3
Densidade de Frequência
0.2
0.1
0.0
4 5 6 7 8
Comprimento de Sépala
Histograma
Exercício
Medidas de dispersão
(x1 − X )2 + · · · + (xn − X )2
• Variância: s 2 = .
√ n−1
• Desvio padrão: s = s 2 (mesma unidade dos dados).
s
• Coeficiente de variação cv = · 100% (adimensional, ou seja, “sem unidade”).
x
Medidas resumo: exemplo
## # A tibble: 1 x 4
## media mediana dp cv
## <dbl> <dbl> <dbl> <dbl>
## 1 5.84 5.8 0.828 0.142
Medidas resumo: exemplo
Podemos usar a função group_by para calcular medidas resumo por
categorias de uma variável qualitativa.
tabela <- dados_iris |>
group_by(especies) |>
summarise(
media = mean(comprimento_sepala),
mediana = median(comprimento_sepala),
dp = sd(comprimento_sepala),
cv = dp / media
)
tabela
## # A tibble: 3 x 5
## especies media mediana dp cv
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 setosa 5.01 5 0.352 0.0704
## 2 versicolor 5.94 5.9 0.516 0.0870
## 3 virginica 6.59 6.5 0.636 0.0965
Medidas de resumo
Exercício
Ideia
q(p) é um valor que satisfaz;
• 100 · p% das observações é no máximo q(p)
• 100 · (1 − p)% das observações é no mínimo q(1 − p)
## # A tibble: 3 x 5
## especies q1 q2 q3 frequencia
## <chr> <dbl> <dbl> <dbl> <int>
## 1 setosa 4.8 5 5.2 50
## 2 versicolor 5.6 5.9 6.3 50
## 3 virginica 6.22 6.5 6.9 50
n() calcula a frequência de cada valor de uma variável qualitativa.
Quantis
Exercício
• Calcule o primeiro quartil, segundo quartil e o terceiro quartil para a
variável nu_nota_mt do conjunto de dados ENEM 2022 (cada pessoa
tem sua cidade) por gênero (tp_sexo). Inclua uma coluna com a
frequência da variável tp_sexo.
• Calcule o primeiro quartil, segundo quartil e o terceiro quartil para a
variável nu_nota_cn do conjunto de dados ENEM 2022 (cada pessoa
tem sua cidade) por gênero (tp_sexo). Inclua uma coluna com a
frequência da variável tp_sexo.
• Calcule o primeiro quartil, segundo quartil e o terceiro quartil para a
variável nu_nota_mt do conjunto de dados ENEM 2022 (cada pessoa
tem sua cidade) por raça (tp_cor_raca). Inclua uma coluna com a
frequência da variável tp_cor_raca.
• Calcule o primeiro quartil, segundo quartil e o terceiro quartil para a
variável nu_nota_cn do conjunto de dados ENEM 2022 (cada pessoa
tem sua cidade) por raça (tp_cor_raca). Inclua uma coluna com a
frequência da variável tp_cor_raca.
Diagrama de caixa
Diagrama de caixa (ou boxplot)
Medida de dispersão: distância entre q3 e q1
Diferença de quartis: dq = q3 − q1
Diagrama de caixa (ou boxplot)
X
X
X
X
Simetria Simetria
Densidade de
frequência
X
Diagrama de caixa (ou boxplot)
Diagrama de caixa (ou boxplot)
ggplot(dados_iris) +
geom_boxplot(aes(x = "", y = comprimento_sepala)) +
labs(x = "", y = "Comprimento de Sépala") +
theme_minimal()
Comprimento de Sépala
5
6
7
8
Gráficos lado a lado com patchwork
0.0
2.5
5.0
7.5
10.0
Comprimento de Pétala
0.0
2.5
5.0
7.5
10.0
Diagrama de caixa
Exercício
Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade),
construa o diagrama de caixa para as variáveis nu_nota_mt e
nu_nota_cn e os coloque lado a lado usando o pacote patchwork.
Associação entre duas variáveis
Gráficos
Duas variáveis
Ideia: estudar a associação entre duas variáveis quantitativas.
Associação positiva Associação negativa Associação nula
y
x x x
Gráfico de dispersão
ggplot(dados_iris) +
geom_point(aes(comprimento_petala, comprimento_sepala)) +
labs(
x = "Comprimento de pétala",
y = "Comprimento de sépala"
) +
theme_minimal()
8
7
Comprimento de sépala
2 4 6
Comprimento de pétala
Gráfico de dispersão
Exercício
Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade),
construa o gráfico de dispersão entre as variáveis nu_nota_mt e
nu_nota_cn.
Inclua o argumento nomeado alpha = 0.1 na função geom_point para
incluir opacidade no gráfico de dispersão. Isso ajuda quando temos
amostra de tamanho médio e grande.
Associação entre duas variáveis qualitativas
Ideia
Sejam X e Y duas variáveis qualitativas com os seguintes valores possíveis:
• X : A1 , · · · , Ar
• Y : B1 , · · · , Bs
Desejamos estudar a associação entre X e Y .
Associação entre X e Y
Suponha que Ai tenha porcentagem 100 · fi · %. Então, X e Y são:
• não associados: se ao conhecermos o valor de Y para um elemento
da população, continuamos com a porcentagem 100 · fi % deste
elemento ter valor de X igual a Ai
• associados: se ao conhecermos o valor de Y para um elemento da
população, alteramos a porcentagem 100 · fi% deste elemento ter
valor de X igual a Ai
Associação entre duas variáveis qualitativas
Gráfico de barras
75%
Condição geral
abaixo da média
acima da média
Porcentagem
boa
excelente
50%
média
muito boa
muito ruim
regular
ruim
25%
0%
Condição geral
abaixo da média
acima da média
boa
Frequência
600
excelente
média
muito boa
muito ruim
regular
ruim
300
7
Comprimento de Sépala
• Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade),
compare a variável nu_nota_mt por raça (tp_cor_raca).
• Para o conjunto de dados ENEM 2022 (cada pessoa tem sua cidade),
compare a variável nu_nota_cn por raça (tp_cor_raca).
• Coloque os dois gráficos acima lado a lado usando o pacote
patchwork.
Tabelas usando o pacote gt
Salvando tabelas com o pacote gt
Dispersão Quantis
especies m_petala dp_petala cv_petala q1_petala q2_petala q3_petala
Espécies principais
setosa 1.462 0.1736640 11.878522 1.4 1.50 1.575
virginica 5.552 0.5518947 9.940466 5.1 5.55 5.875
versicolor 4.260 0.4699110 11.030774 4.0 4.35 4.600
Dispersão Quantis
especies dp_petala cv_petala q1_petala q2_petala q3_petala m_petala
Espécies principais
setosa 0.1736640 11.878522 1.4 1.50 1.575 1.462
virginica 0.5518947 9.940466 5.1 5.55 5.875 5.552
versicolor 0.4699110 11.030774 4.0 4.35 4.600 4.260
Dispersão Quantis
Espécies Desvio padrão CV Q1 Q2 Q3 Média
Espécies principais
setosa 0.1736640 11.878522 1.4 1.50 1.575 1.462
virginica 0.5518947 9.940466 5.1 5.55 5.875 5.552
versicolor 0.4699110 11.030774 4.0 4.35 4.600 4.260
Fonte: Elboração própria.
Atualizando as colunas
Exercício
Dispersão Quantis
Espécies Desvio padrão CV Q1 Q2 Q3 Média
Espécies principais
setosa 0, 17 11, 88 1, 40 1, 50 1, 58 1, 46
virginica 0, 55 9, 94 5, 10 5, 55 5, 88 5, 55
versicolor 0, 47 11, 03 4, 00 4, 35 4, 60 4, 26
Fonte: Elboração própria.
Formatação de valores
Exercício