a <- 13
a
[1] 13
Entenderemos agora algumas funcionalidades e características do ambiente R
O R possui diferentes tipos de objetos, que podem ser criados e armazenados com o sinal de atribuição -> (atalho Alt + -)
a <- 13
a
[1] 13
Fórmulas seguem o senso comum (parecido com os sinais usados no excel). Pode-se usar formas simples, ou mais complexas, dependendo da utilidade.
Caracteres do tipo string devem ser listados entre aspas.
c <- "Flora"
c
[1] "Flora"
Vetores são objetos unidimensionais com mais de uma unidade. Para se criar um vetor, usa-se o c() no sentido de concatenar ou combinar os elementos. Vetores podem conter apenas um tipo de objeto.
Tipo de tabela, armazenam dados em colunas. Lembrar-se da estrutura básica da organização de dados, sendo linhas correspondentes a observações e colunas correspondem às variáveis
df <- data.frame(
Nome = c("Flora", "Aurora", "Pinot Noir"),
Idade = c(7, 3, 10),
Altura = c(1.20, 1.02, 0.45)
)
df
Nome Idade Altura
1 Flora 7 1.20
2 Aurora 3 1.02
3 Pinot Noir 10 0.45
Há ainda outros tipos de objetos que não vamos ver aqui. Mas saibam que existem, matrizes (matrix), listas (lists), funções (function), modelos, etc…
Alguns comandos básicos para utilização do R
Definindo o diretório de trabalho, você pode lidar com arquivos de entrada e de saída de uma forma mais prática evitando erros de caminho.
Prefira sempre dados em .csv!
Cuidado com seu excel em português - se possível mude a configuração agora!
Além de read.csv tem a função read.table() que lê arquivos em txt.
Existem vários pacotes feitos para o ambiente R para basicamente tudo que você quiser - e, caso não exista, você pode fazer o seu!
Para utilizar um pacote você deve primeiramente instalá-lo na sua biblioteca. Isso só é necessário ser feito na primeira vez.
# install.packages("readxl")
E para utilizá-lo, você deve sempre carregar antes de chamar a função. Fazemos isso todas as vezes (uma vez por sessão)
# read_excel("brazil_loss.xlsx")
Warning: package 'readxl' was built under R version 4.4.2
read_excel("brazil_loss.xlsx")
New names:
• `` -> `...1`
# A tibble: 13 × 15
...1 entity code year commercial_crops flooding_due_to_dams
<dbl> <chr> <chr> <dbl> <chr> <dbl>
1 1 Brazil BRA 2001 280000 0
2 2 Brazil BRA 2002 415000 79000
3 3 Brazil BRA 2003 550000 0
4 4 Brazil BRA 2004 747000 26000
5 5 Brazil BRA 2005 328000 17000
6 6 Brazil BRA 2006 188000 17000
7 7 Brazil BRA 2007 79000 9000
8 8 Brazil BRA 2008 52000 0
9 9 Brazil BRA 2009 57000 9000
10 10 Brazil BRA 2010 1e+05 0
11 11 Brazil BRA 2011 52000 17000
12 12 Brazil BRA 2012 118000 17000
13 13 Brazil BRA 2013 87000 0
# ℹ 9 more variables: natural_disturbances <dbl>, pasture <dbl>,
# selective_logging <dbl>, fire <dbl>, mining <dbl>,
# other_infrastructure <dbl>, roads <dbl>,
# tree_plantations_including_palm <dbl>, small_scale_clearing <dbl>
Algumas funções são muito úteis para entendermos nossos dados, nossas variáveis e a estrutura básica daquilo que vamos trabalhar (e de como o R está interpretando isso!)
summary(dados)
X entity code year
Min. : 1 Length:13 Length:13 Min. :2001
1st Qu.: 4 Class :character Class :character 1st Qu.:2004
Median : 7 Mode :character Mode :character Median :2007
Mean : 7 Mean :2007
3rd Qu.:10 3rd Qu.:2010
Max. :13 Max. :2013
commercial_crops flooding_due_to_dams natural_disturbances pasture
Min. : 52000 Min. : 0 Min. : 0 Min. : 546000
1st Qu.: 79000 1st Qu.: 0 1st Qu.:22000 1st Qu.: 738000
Median :118000 Median : 9000 Median :26000 Median :1520000
Mean :234846 Mean :14692 Mean :31538 Mean :1561769
3rd Qu.:328000 3rd Qu.:17000 3rd Qu.:35000 3rd Qu.:2564000
Max. :747000 Max. :79000 Max. :87000 Max. :2761000
selective_logging fire mining other_infrastructure
Min. : 44000 Min. : 26000 Min. : 0 Min. : 0
1st Qu.: 87000 1st Qu.: 44000 1st Qu.: 0 1st Qu.: 9000
Median : 96000 Median : 79000 Median : 0 Median : 9000
Mean :104846 Mean :157692 Mean : 5769 Mean :10077
3rd Qu.:131000 3rd Qu.:122000 3rd Qu.: 9000 3rd Qu.:13000
Max. :166000 Max. :537000 Max. :35000 Max. :17000
roads tree_plantations_including_palm small_scale_clearing
Min. : 9000 Min. : 9000 Min. :232000
1st Qu.:13000 1st Qu.:26000 1st Qu.:271000
Median :22000 Median :35000 Median :293000
Mean :25923 Mean :36231 Mean :305769
3rd Qu.:35000 3rd Qu.:44000 3rd Qu.:310000
Max. :57000 Max. :92000 Max. :415000
head(dados)
X entity code year commercial_crops flooding_due_to_dams natural_disturbances
1 1 Brazil BRA 2001 280000 0 0
2 2 Brazil BRA 2002 415000 79000 35000
3 3 Brazil BRA 2003 550000 0 35000
4 4 Brazil BRA 2004 747000 26000 22000
5 5 Brazil BRA 2005 328000 17000 26000
6 6 Brazil BRA 2006 188000 17000 26000
pasture selective_logging fire mining other_infrastructure roads
1 1520000 96000 26000 9000 9000 13000
2 2568000 96000 114000 9000 13000 31000
3 2761000 149000 44000 0 9000 35000
4 2564000 131000 79000 0 13000 57000
5 2665000 140000 393000 0 13000 35000
6 1861000 52000 79000 0 9000 17000
tree_plantations_including_palm small_scale_clearing
1 44000 249000
2 44000 293000
3 26000 358000
4 92000 415000
5 52000 288000
6 26000 306000
tail(dados)
X entity code year commercial_crops flooding_due_to_dams
8 8 Brazil BRA 2008 52000 0
9 9 Brazil BRA 2009 57000 9000
10 10 Brazil BRA 2010 100000 0
11 11 Brazil BRA 2011 52000 17000
12 12 Brazil BRA 2012 118000 17000
13 13 Brazil BRA 2013 87000 0
natural_disturbances pasture selective_logging fire mining
8 17000 1345000 61000 70000 9000
9 31000 847000 87000 44000 0
10 44000 616000 114000 537000 4000
11 87000 738000 44000 122000 0
12 52000 546000 166000 70000 0
13 13000 695000 131000 26000 35000
other_infrastructure roads tree_plantations_including_palm
8 17000 48000 17000
9 9000 9000 35000
10 9000 22000 9000
11 0 9000 26000
12 13000 31000 26000
13 4000 17000 35000
small_scale_clearing
8 397000
9 301000
10 271000
11 271000
12 232000
13 284000
Mostra a estrutura dos dados, tipo de objetos dentro do data frame, etc! Muito útil para verificar qualquer inconsistência!
str(dados)
'data.frame': 13 obs. of 15 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ entity : chr "Brazil" "Brazil" "Brazil" "Brazil" ...
$ code : chr "BRA" "BRA" "BRA" "BRA" ...
$ year : int 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 ...
$ commercial_crops : num 280000 415000 550000 747000 328000 188000 79000 52000 57000 100000 ...
$ flooding_due_to_dams : int 0 79000 0 26000 17000 17000 9000 0 9000 0 ...
$ natural_disturbances : int 0 35000 35000 22000 26000 26000 22000 17000 31000 44000 ...
$ pasture : int 1520000 2568000 2761000 2564000 2665000 1861000 1577000 1345000 847000 616000 ...
$ selective_logging : int 96000 96000 149000 131000 140000 52000 96000 61000 87000 114000 ...
$ fire : int 26000 114000 44000 79000 393000 79000 446000 70000 44000 537000 ...
$ mining : int 9000 9000 0 0 0 0 9000 9000 0 4000 ...
$ other_infrastructure : int 9000 13000 9000 13000 13000 9000 13000 17000 9000 9000 ...
$ roads : int 13000 31000 35000 57000 35000 17000 13000 48000 9000 22000 ...
$ tree_plantations_including_palm: int 44000 44000 26000 92000 52000 26000 39000 17000 35000 9000 ...
$ small_scale_clearing : int 249000 293000 358000 415000 288000 306000 310000 397000 301000 271000 ...
Agora vamos entender, de forma prática alguns conceitos centrais de estatística básica
Carregando dados já incluídos na instalação do R, podemos verificar que:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Para os dados iris temos 4 variáveis quantitativas contínuas (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) e 1 variável qualitativa nominal (Species)
weight group
Min. :3.590 ctrl:10
1st Qu.:4.550 trt1:10
Median :5.155 trt2:10
Mean :5.073
3rd Qu.:5.530
Max. :6.310
str(PlantGrowth)
'data.frame': 30 obs. of 2 variables:
$ weight: num 4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
$ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...
Para os dados PlantGrowth temos 1 variável quantitativas contínuas (weight) e 1 variável qualitativa nominal (group)
summary(dados)
X entity code year
Min. : 1 Length:13 Length:13 Min. :2001
1st Qu.: 4 Class :character Class :character 1st Qu.:2004
Median : 7 Mode :character Mode :character Median :2007
Mean : 7 Mean :2007
3rd Qu.:10 3rd Qu.:2010
Max. :13 Max. :2013
commercial_crops flooding_due_to_dams natural_disturbances pasture
Min. : 52000 Min. : 0 Min. : 0 Min. : 546000
1st Qu.: 79000 1st Qu.: 0 1st Qu.:22000 1st Qu.: 738000
Median :118000 Median : 9000 Median :26000 Median :1520000
Mean :234846 Mean :14692 Mean :31538 Mean :1561769
3rd Qu.:328000 3rd Qu.:17000 3rd Qu.:35000 3rd Qu.:2564000
Max. :747000 Max. :79000 Max. :87000 Max. :2761000
selective_logging fire mining other_infrastructure
Min. : 44000 Min. : 26000 Min. : 0 Min. : 0
1st Qu.: 87000 1st Qu.: 44000 1st Qu.: 0 1st Qu.: 9000
Median : 96000 Median : 79000 Median : 0 Median : 9000
Mean :104846 Mean :157692 Mean : 5769 Mean :10077
3rd Qu.:131000 3rd Qu.:122000 3rd Qu.: 9000 3rd Qu.:13000
Max. :166000 Max. :537000 Max. :35000 Max. :17000
roads tree_plantations_including_palm small_scale_clearing
Min. : 9000 Min. : 9000 Min. :232000
1st Qu.:13000 1st Qu.:26000 1st Qu.:271000
Median :22000 Median :35000 Median :293000
Mean :25923 Mean :36231 Mean :305769
3rd Qu.:35000 3rd Qu.:44000 3rd Qu.:310000
Max. :57000 Max. :92000 Max. :415000
Para os dados de desmatamento, temos duas variáveis qualitativas nominais, uma variável quantitativa discreta (year) e as demais contínuas.
Variável independente pode tanto ser discreta, como contínua - de acordo com nossa hipótese.
Por exemplo, se nossa hipótese é que houve um aumento do desmatamento para cultivo comercial ao longo do tempo, temos que nossa variável independente é o ano e a dependente é o desmatamento comercial.
plot(dados$year, dados$commercial_crops)
No entanto, se hossa hipótese for que o desmatamento para rodovias causa também um aumento no desmatamento para exploração madereira, temos o dematamento para rodovia como nossa variável independente e o desmatamento para exploração madereira como a dependente.
plot(dados$roads,dados$selective_logging)
Para demostrar quanto maior o n amostral, mais próximo alcançamos a probabilidade esperada, vamos simular o lançamento de uma moeda 10 e 1000 vezes. Utilizaremos a função sample que seleciona aleatoriamente y amostras de um elemento de um tamanho específico x com ou sem reposição.
sample(x, y, replace = FALSE)
sample(1:2, 10, replace=T)
[1] 2 2 1 1 2 1 1 2 1 2
sample(1:2, 1000, replace=T)
[1] 2 1 1 2 2 2 2 2 2 2 2 1 2 2 1 1 2 1 2 2 2 2 2 1 1 1 1 1 2 1 1 1 1 2 2 2 1
[38] 1 1 1 1 2 1 2 1 1 1 1 2 1 1 2 1 2 2 1 1 2 2 2 2 2 1 1 2 1 2 1 2 1 2 1 1 1
[75] 2 1 1 1 2 2 2 2 2 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 1 2 1 1 1 2 1 1 2 2 2
[112] 2 2 1 2 1 1 1 2 2 1 2 1 1 1 2 1 1 2 2 2 2 1 1 2 2 1 1 1 2 1 1 2 2 1 1 2 1
[149] 1 2 2 2 2 2 2 1 1 1 2 1 2 2 2 1 1 2 1 1 2 1 1 2 1 2 1 1 1 1 1 1 2 1 2 1 1
[186] 2 1 2 1 2 1 1 2 1 2 2 1 1 2 1 2 1 2 1 2 1 1 2 1 2 1 1 2 1 1 2 1 1 2 1 2 2
[223] 1 2 1 1 1 1 1 1 2 1 1 2 1 1 2 1 2 2 1 2 1 1 1 2 1 1 1 1 1 2 2 1 2 1 1 2 1
[260] 2 1 2 1 2 2 1 1 2 1 1 1 1 2 1 2 1 2 1 2 2 2 1 1 1 2 2 2 2 2 1 1 2 2 2 1 2
[297] 1 2 2 2 2 2 2 1 1 1 2 1 1 2 1 2 2 1 2 2 2 2 1 1 2 1 2 1 2 2 1 1 1 2 1 1 2
[334] 1 2 1 2 2 2 1 1 1 1 2 1 2 1 2 1 1 1 2 1 1 2 2 1 2 1 2 1 1 2 1 2 1 2 1 2 2
[371] 1 1 1 1 1 2 1 2 1 1 2 1 1 1 2 1 2 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 1 2 1 2 1
[408] 1 1 2 1 2 2 2 1 2 2 2 1 2 1 1 2 2 1 2 1 1 1 2 2 1 2 2 1 1 2 2 1 2 1 1 2 2
[445] 2 1 1 1 1 2 2 2 2 1 1 1 2 1 1 2 2 2 1 1 1 1 1 1 2 1 2 2 2 1 2 1 1 2 2 2 2
[482] 1 1 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 1 2 1 2 2 1 2 1 2 1 1 2 2 2 1 2 1 2 1 1
[519] 1 2 2 2 1 1 2 2 2 1 1 2 1 1 1 2 2 1 1 2 2 1 1 2 2 1 1 1 2 1 1 2 2 1 2 1 1
[556] 2 2 1 2 1 2 2 1 1 1 1 2 1 1 2 1 1 2 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
[593] 1 2 2 1 1 2 1 1 2 2 2 2 2 1 2 1 1 1 1 2 2 1 2 1 2 1 1 1 2 1 2 1 1 2 1 2 1
[630] 1 1 1 2 2 1 2 2 1 2 2 1 1 2 2 1 1 1 1 2 1 1 1 1 2 1 2 2 1 1 1 1 1 1 2 2 2
[667] 2 2 1 2 2 2 1 2 1 2 2 1 1 1 1 1 1 2 2 1 2 1 1 2 2 2 2 1 2 1 1 2 2 1 2 2 2
[704] 1 2 1 1 1 2 1 2 2 1 1 1 1 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 1 1 2 2 2 2 2 2 1
[741] 2 1 1 1 1 2 1 2 1 2 2 1 1 2 1 2 1 1 1 2 2 2 2 1 2 2 1 2 1 1 2 2 1 1 2 2 2
[778] 2 1 2 2 1 2 1 2 1 2 1 2 1 1 1 2 2 2 2 1 1 2 1 2 1 2 1 1 2 1 1 1 1 2 2 1 1
[815] 1 1 1 1 2 2 1 1 1 1 1 1 1 1 2 2 1 2 2 1 2 1 1 2 2 1 2 1 1 1 2 1 1 1 2 1 2
[852] 2 1 1 2 1 2 1 2 1 1 2 1 2 1 1 1 1 1 1 2 2 1 1 2 2 2 1 1 2 2 2 1 1 1 2 1 2
[889] 1 2 2 2 2 1 1 2 2 1 1 1 1 2 1 2 2 2 1 2 2 2 1 1 2 1 1 2 1 1 1 1 1 2 2 2 1
[926] 2 2 1 1 1 2 2 2 2 2 2 1 1 2 1 1 2 2 1 1 2 2 1 1 1 2 2 2 1 2 1 1 1 1 2 2 1
[963] 1 2 1 1 2 1 1 1 2 1 1 1 2 1 2 1 2 2 1 1 1 1 2 1 2 2 1 1 2 2 1 1 1 2 1 1 1
[1000] 2
Agora vamos simplesmente nomear esses objetos:
E vamos fazer tabelas de proporção para saber quantas observações de cada resultado foram observadas em relação ao número de observações total. A função table() retorna uma tabela de contingência de contagens de cada combinação de cada fator. Dividimos então esse valor pelo número de eventos totais (10 e 1000, respectivamente) para temos a probabilidade observada.
Agora vamos plotar para ver a diferença visualmente. Sabemos que a probabilidade esperada é 0.5 ou 50% para cada evento, por isso tracamos uma linha vermelha que a represente.
barplot(prob10,
main = paste("Lançamentos = 10"), ylim = c(0, 0.8), col = "lightblue",
xlab = "Face da Moeda", ylab = "Probabilidade Observada")
abline(h = 1/2, col = "red")
barplot(prob1000,
main = paste("Lançamentos = 1000"), ylim = c(0, 0.8), col = "lightblue",
xlab = "Face da Moeda", ylab = "Probabilidade Observada")
abline(h = 1/2, col = "red")
Agora, vamos fazer o mesmo exercício para o lançamento de um dado 10, 100, 1000 e 10000 vezes.
Criamos as tabelas de probabilidades observadas
E plotamos para observar visualmente. Lembrando agora que a probabilidade esperada, representada pela linha vermelha é 1/6
barplot(d_prob10,col = "lightblue", ylim = c(0, 0.3),
main = paste("Lançamentos = 10"),
xlab = "Face do Dado", ylab = "Probabilidade Observada")
abline(h = 1/6, col = "red") # Linha da probabilidade teórica (1/6)
barplot(d_prob100, col = "lightblue", ylim = c(0, 0.3),
main = paste("Lançamentos = 10000"),
xlab = "Face do Dado", ylab = "Probabilidade Observada")
abline(h = 1/6, col = "red", lwd = 2, lty = 2)
barplot(d_prob1000, col = "lightblue", ylim = c(0, 0.3),
main = paste("Lançamentos = 10000"),
xlab = "Face do Dado", ylab = "Probabilidade Observada")
abline(h = 1/6, col = "red", lwd = 2, lty = 2)
barplot(d_prob10000, col = "lightblue", ylim = c(0, 0.3),
main = paste("Lançamentos = 10000"),
xlab = "Face do Dado", ylab = "Probabilidade Observada")
abline(h = 1/6, col = "red", lwd = 2, lty = 2)
Para demostrar o teoremoa do limite central que atesta que, conforme aumentamos o tamanho da amostra de uma variável contínua, sua média se aproxima cada vez mais de uma distribuição normal.
Para demostrar no R, usaremos a função replicate() que vai repetir a função que queremos (média de lançamentos de dados) por 1000 vezes.
Primeiro faremos com o lançamento de 1 dado.
[1] 3 5 2 2 4 2 4 5 3 3 2 2 3 4 5 3 6 2 4 6 5 1 4 6 4 2 1 3 6 2 6 4 4 2 4 6 5
[38] 3 6 4 1 2 5 6 6 6 3 4 2 2 6 2 1 6 1 3 3 5 3 5 6 1 3 3 5 3 1 6 2 4 5 3 1 4
[75] 3 6 3 4 1 2 5 4 6 6 1 2 6 3 1 6 3 1 6 5 4 6 2 4 5 4 4 1 1 6 1 5 3 1 3 6 6
[112] 1 4 1 6 4 2 4 4 5 6 2 2 5 6 6 6 5 5 3 2 5 1 2 3 2 5 4 1 5 5 5 3 1 6 4 2 2
[149] 5 3 3 3 6 2 3 3 5 2 3 6 4 6 4 2 1 1 2 6 4 2 5 4 2 4 3 2 1 5 4 3 4 1 3 2 3
[186] 3 3 4 6 1 5 3 4 3 6 6 6 3 5 1 1 1 4 5 2 1 4 5 3 4 6 6 4 5 6 1 4 2 4 2 1 3
[223] 2 5 2 4 6 2 5 2 4 6 3 6 2 3 2 6 2 1 6 2 3 6 6 2 3 4 6 6 2 6 3 1 6 2 5 2 3
[260] 2 4 3 2 1 6 1 6 6 3 6 5 3 1 1 2 4 2 4 2 6 4 3 3 3 1 1 2 3 1 5 5 5 4 6 4 2
[297] 2 2 4 5 4 1 6 3 2 5 1 6 2 4 2 1 4 5 2 2 3 4 3 5 6 2 1 4 6 3 4 5 4 5 4 2 4
[334] 4 3 5 2 2 6 3 3 1 3 4 1 2 6 3 3 1 1 5 2 2 5 1 3 2 4 4 2 5 1 5 3 4 2 5 6 6
[371] 6 3 2 5 5 6 2 4 5 2 2 6 4 3 3 4 5 5 4 3 2 2 3 3 5 6 4 6 6 6 3 1 2 3 4 6 5
[408] 2 1 3 2 3 5 3 6 3 5 6 6 4 4 4 4 5 3 4 6 3 1 2 1 1 3 3 5 5 6 4 1 3 2 5 4 3
[445] 3 1 1 2 2 3 1 1 1 3 6 2 4 4 4 2 1 3 1 3 4 4 4 5 2 1 3 3 5 2 5 1 6 6 2 6 5
[482] 6 4 4 6 6 3 5 1 1 6 1 5 5 5 6 5 6 2 4 6 6 6 5 2 2 2 6 2 4 6 4 1 5 1 5 2 2
[519] 5 4 5 6 2 4 3 3 4 6 3 5 2 5 3 2 2 6 3 4 3 4 5 5 1 2 2 6 6 5 6 2 4 5 6 4 4
[556] 5 2 3 5 1 1 3 6 2 2 2 4 4 2 3 3 1 6 4 4 2 2 3 5 1 3 4 4 1 5 1 1 1 2 6 1 1
[593] 2 3 3 5 1 2 5 1 4 4 3 4 2 3 4 1 1 3 6 3 3 2 6 3 4 1 3 2 5 4 6 6 5 3 1 2 3
[630] 3 6 1 2 2 1 5 1 5 3 4 3 6 3 6 1 3 4 3 6 4 1 2 5 4 4 2 5 5 3 4 5 2 1 6 1 5
[667] 6 2 4 4 1 3 3 4 6 6 4 6 6 2 2 6 6 1 4 6 5 3 3 6 2 4 6 3 3 6 6 4 4 2 4 5 1
[704] 2 2 3 2 1 5 1 1 5 5 6 6 6 1 3 3 2 6 4 3 3 4 5 3 6 1 1 6 4 4 2 5 4 6 6 6 2
[741] 6 4 2 5 2 1 5 4 3 5 5 6 2 3 4 6 1 5 3 6 3 1 1 5 6 6 5 4 2 2 5 5 2 3 5 3 2
[778] 4 6 2 1 4 1 6 3 5 2 1 5 4 5 1 1 4 5 5 6 2 5 5 3 6 4 3 4 3 6 1 6 3 4 6 6 2
[815] 5 1 5 4 2 3 3 1 4 3 1 2 3 5 3 2 2 4 2 5 2 6 3 1 5 4 6 3 1 6 1 3 3 1 1 4 2
[852] 6 6 1 1 5 5 6 1 5 6 4 3 5 5 2 1 2 6 1 4 4 6 1 1 4 4 1 2 4 6 2 4 4 4 2 5 6
[889] 4 4 3 6 1 1 2 6 6 2 1 6 3 5 1 4 6 5 2 2 4 5 1 5 4 4 1 6 2 1 1 2 6 6 5 4 5
[926] 5 6 6 2 3 1 6 1 2 2 2 4 5 3 3 2 2 4 2 6 1 3 2 3 3 6 3 1 3 5 1 5 6 6 6 5 4
[963] 2 5 2 6 5 4 4 5 4 3 3 4 3 4 1 5 5 4 1 6 2 5 5 1 5 2 6 5 3 3 3 5 6 1 2 4 1
[1000] 5
Agora com 2, 5 e 30 dados, também 1000 vezes.
[1] 1.0 3.5 6.0 2.5 6.0 4.5 4.0 4.0 4.0 5.5 4.5 1.0 2.5 2.0 3.0 3.5 6.0 4.0
[19] 4.5 4.5 2.0 4.0 3.0 2.0 3.5 2.0 4.5 5.5 3.5 4.0 3.5 2.5 3.5 3.5 1.5 4.5
[37] 2.0 5.5 3.0 4.5 5.0 2.5 2.0 2.5 3.0 2.5 2.5 5.5 2.5 4.0 2.5 5.0 3.0 2.5
[55] 2.0 5.0 2.5 4.0 2.0 1.5 3.5 3.5 3.5 2.5 2.5 5.5 3.5 5.5 2.5 3.5 3.5 5.0
[73] 3.5 2.5 2.0 1.0 4.5 3.0 2.0 3.0 4.0 3.0 2.5 4.5 4.5 3.0 3.5 4.0 3.0 3.0
[91] 1.5 2.0 4.0 2.5 1.5 5.5 5.0 1.0 3.5 4.5 2.0 5.0 3.0 2.5 2.5 4.0 3.5 3.5
[109] 2.5 3.5 3.5 1.0 4.0 2.5 6.0 2.5 6.0 3.0 5.5 1.5 4.5 5.5 5.0 2.0 5.0 2.5
[127] 4.0 2.0 2.0 3.5 2.5 5.0 3.5 4.0 4.0 4.5 4.5 3.0 4.0 1.5 3.0 2.0 3.5 2.5
[145] 2.5 4.0 4.5 2.0 4.0 2.0 1.5 3.5 2.0 4.0 4.0 3.0 2.0 4.5 4.5 5.0 5.0 3.0
[163] 4.0 6.0 3.5 3.5 4.5 3.5 5.5 5.0 1.5 2.0 3.5 2.5 4.0 3.0 3.0 6.0 3.0 4.5
[181] 3.0 3.0 4.5 4.5 3.0 3.0 3.5 5.5 6.0 6.0 3.0 5.0 2.0 6.0 4.5 4.0 5.0 5.5
[199] 3.0 3.5 4.5 1.5 4.0 5.0 1.5 3.5 3.0 1.0 1.5 3.5 3.5 3.5 4.0 3.5 5.0 3.5
[217] 6.0 1.5 2.5 3.5 3.0 1.0 4.5 3.0 2.5 2.0 3.5 4.5 2.5 3.5 3.0 4.0 5.5 5.0
[235] 5.5 4.5 3.0 5.0 2.0 2.5 4.5 5.0 5.5 3.5 5.0 5.5 5.0 2.0 5.0 4.0 1.5 3.5
[253] 6.0 1.0 2.0 5.0 3.0 4.0 2.5 3.0 5.0 4.5 3.0 2.0 3.0 4.0 5.0 3.0 4.5 3.0
[271] 4.5 5.5 2.5 3.0 2.5 4.5 4.5 4.0 4.0 2.0 2.5 1.0 3.5 3.5 4.0 3.5 3.5 6.0
[289] 4.0 3.5 3.5 2.5 4.5 3.0 3.5 4.0 3.5 3.5 2.0 3.5 3.5 2.0 3.5 3.0 2.0 2.5
[307] 5.5 2.5 3.0 3.5 2.0 4.5 3.5 5.0 5.5 4.5 3.0 3.5 4.0 4.5 2.0 4.5 2.5 1.5
[325] 4.0 3.5 5.0 1.5 5.5 4.0 5.0 3.0 2.5 1.5 2.0 2.0 5.0 3.5 2.5 5.5 2.5 4.0
[343] 3.0 2.0 4.0 4.5 3.5 2.0 4.0 3.0 3.0 2.5 4.0 3.0 2.0 4.0 4.5 3.0 4.0 3.0
[361] 3.5 3.0 5.5 4.5 4.5 4.0 5.5 3.5 2.5 3.0 3.5 3.0 3.0 2.0 4.0 4.5 5.0 4.5
[379] 4.5 3.0 5.0 3.5 5.0 5.0 3.5 3.5 6.0 2.0 2.5 4.0 2.5 2.0 4.0 4.5 3.0 3.5
[397] 3.5 1.5 3.5 4.0 2.0 3.0 3.5 2.0 5.5 2.5 3.5 5.5 2.0 2.0 6.0 2.5 2.0 4.0
[415] 3.0 2.5 5.0 4.5 4.0 2.0 4.5 3.0 4.0 4.5 3.5 1.0 3.0 5.0 5.0 2.5 3.5 1.5
[433] 3.0 1.5 5.0 3.0 3.0 5.5 2.0 5.0 2.5 3.5 2.0 2.5 3.0 4.0 2.5 3.5 2.0 4.5
[451] 2.5 5.0 5.0 1.5 2.5 2.5 3.5 6.0 1.0 1.5 2.5 6.0 4.0 4.0 4.5 3.5 3.5 4.0
[469] 3.5 3.5 2.0 4.0 3.0 3.5 4.0 3.5 4.5 1.5 5.5 4.0 3.5 4.5 3.0 4.0 3.5 2.5
[487] 5.5 3.0 3.5 3.5 4.0 1.0 3.0 5.0 3.5 3.5 3.0 4.0 3.0 3.5 4.5 4.5 4.0 3.0
[505] 5.0 5.0 3.5 3.0 2.5 3.0 3.5 6.0 3.0 2.0 3.0 5.0 3.5 2.0 3.5 5.0 5.5 3.0
[523] 3.5 1.0 5.5 4.5 5.0 3.0 2.0 1.0 5.0 2.5 4.5 1.0 3.0 4.0 5.0 6.0 5.0 4.0
[541] 2.0 3.5 3.0 4.0 3.0 3.5 3.0 2.5 3.5 3.0 3.5 6.0 5.0 2.0 2.5 6.0 5.0 5.0
[559] 2.0 6.0 3.0 6.0 3.0 2.5 2.5 3.5 2.0 4.5 1.5 3.0 4.0 3.5 4.0 5.0 5.0 6.0
[577] 4.5 2.0 3.5 4.5 4.5 4.0 4.5 4.5 5.0 3.5 1.5 5.0 2.5 2.0 5.0 3.0 3.0 2.5
[595] 2.0 2.0 2.5 1.5 3.5 2.0 3.0 2.0 4.5 3.0 5.0 3.5 4.0 2.0 3.0 2.0 2.0 5.0
[613] 3.0 4.5 4.5 5.5 4.5 3.5 5.5 2.5 5.5 6.0 2.5 3.0 2.0 3.5 6.0 4.5 4.0 4.5
[631] 3.5 4.5 5.0 4.5 2.0 3.0 3.5 2.5 5.0 3.5 3.5 2.0 3.5 2.0 3.5 3.5 5.5 4.0
[649] 2.5 3.0 2.5 4.5 4.0 1.0 3.0 3.5 3.0 5.0 4.0 4.0 2.0 2.5 5.0 2.0 1.5 3.5
[667] 4.0 2.5 5.5 1.5 4.0 4.0 3.5 4.0 4.0 2.5 2.5 1.5 2.5 2.5 3.5 2.5 3.0 3.0
[685] 2.0 2.0 4.5 6.0 5.0 2.0 2.5 3.0 3.5 4.0 5.0 4.5 6.0 3.5 1.5 4.5 2.0 4.5
[703] 6.0 2.0 4.5 4.5 2.0 4.0 5.0 3.5 6.0 5.5 3.5 4.0 5.5 3.5 3.0 2.0 2.5 5.0
[721] 4.0 1.5 4.0 3.0 4.0 1.5 5.0 2.0 2.0 5.0 3.5 3.0 1.5 5.5 4.0 5.0 5.5 2.5
[739] 2.5 3.5 3.5 1.0 3.5 3.5 3.5 4.0 5.0 3.0 3.5 4.0 5.5 4.5 5.5 2.0 3.5 6.0
[757] 3.5 2.5 3.5 3.0 1.0 4.0 4.0 4.5 6.0 3.0 5.0 3.0 4.5 3.0 4.5 4.0 1.5 3.0
[775] 3.0 3.5 4.5 3.0 2.0 1.5 5.5 2.0 3.5 5.0 4.5 5.0 1.0 4.5 3.5 5.0 2.5 3.5
[793] 4.5 5.0 4.5 5.5 5.5 5.0 3.0 4.5 1.0 3.5 4.5 4.0 2.5 1.0 4.0 1.5 6.0 1.0
[811] 5.0 2.5 2.5 3.0 3.0 5.0 4.0 3.5 3.0 5.0 3.0 2.5 2.5 2.5 3.0 4.5 5.0 2.0
[829] 3.5 4.0 2.5 3.5 1.5 4.5 4.0 4.0 1.5 3.5 4.5 1.5 4.0 2.0 3.5 2.0 2.5 3.0
[847] 2.5 4.5 4.0 2.0 2.0 2.0 4.0 4.0 4.0 1.5 2.5 5.5 2.0 5.0 2.5 1.5 3.5 2.0
[865] 1.5 3.0 2.5 4.5 2.5 4.5 2.5 2.5 3.5 3.0 2.0 3.5 5.5 2.5 6.0 2.5 4.0 3.5
[883] 4.0 5.0 2.5 5.0 4.0 4.0 2.0 3.0 3.0 5.5 4.0 2.5 4.0 3.5 6.0 4.0 5.0 2.5
[901] 5.0 2.5 3.0 2.5 4.0 3.0 4.0 1.5 3.5 3.5 5.5 6.0 2.5 3.5 2.0 3.0 3.0 3.0
[919] 3.5 4.0 5.5 3.0 3.5 4.5 4.0 4.0 4.5 3.0 2.5 4.5 1.5 3.5 3.5 3.0 2.5 1.5
[937] 2.5 3.0 3.0 2.0 3.5 3.0 1.0 1.0 2.0 2.5 4.0 4.0 2.5 2.0 4.5 3.0 4.5 2.5
[955] 5.0 2.0 4.5 3.5 2.0 1.5 3.5 4.0 4.5 3.5 4.0 5.0 5.0 3.5 5.5 4.0 5.0 3.5
[973] 2.0 1.5 4.5 5.5 2.5 2.0 4.5 4.0 2.0 4.5 2.0 2.5 2.0 1.0 4.0 2.0 4.5 3.0
[991] 4.0 3.5 3.5 4.5 4.5 4.0 4.5 2.5 4.0 4.5
Agora vamos verificar visualmente as frequências
hist(prob100_1, col = "lightblue", probability = TRUE)
hist(prob100_2, probability = TRUE, col = "lightblue")
hist(prob100_5, probability = TRUE, col = "lightblue")
hist(prob100_30, probability = TRUE, col = "lightblue")
Existe uma função no R que testa automaticamente a hipótese que os dados seguem uma distribuição normal chamada shapiro.test.
Se p < 0.05, rejeitamos a hipótese de normalidade
Se p > 0.05, a hipótese nula é rejeitada, indicando que os dados seguem distribuição normal
shapiro.test(iris$Sepal.Length)
Shapiro-Wilk normality test
data: iris$Sepal.Length
W = 0.97609, p-value = 0.01018
Também conseguimos ter uma ideia visual se os dados seguem uma distribuição normal, plotando um histograma e a curva esperada com base nos valores da média e do desvio padrão dos dados. Essa curva, usamos a função dnorm() que denomina distribuição normal.
hist(iris$Sepal.Length, breaks = 20, probability = TRUE, col = "lightblue",
main = "Histograma de Sepal.Length", xlab = "Comprimento da Sépala")
curve(dnorm(x, mean = mean(iris$Sepal.Length), sd = sd(iris$Sepal.Length)), add = TRUE, col = "red", lwd = 2)
Uma outra maneira, é o gráfico Q-Q, um gráfico de probabilidades que demostra os quantis nos eixos x e y. No caso da distribuição normal, utilizamos a função qqnorm() e adicionamos a linha teórica com a função qqline(), de forma que os dados devem se sobrepor a linha, caso sejam normais.
qqnorm(iris$Sepal.Length, main = "QQ-Plot de Sepal.Length", pch = 19, col = "blue")
qqline(iris$Sepal.Length, col = "red", lwd = 2)
O que fazer agora para usar dados paramétricos? Vamos tentar, por exemplo, logaritmizar os dados e ver se eles agora se tornam normais.
shapiro.test(log(iris$Sepal.Length)) #com log fica normal!
Shapiro-Wilk normality test
data: log(iris$Sepal.Length)
W = 0.98253, p-value = 0.05388
Uhuuuu! Funcionou! Agora poderíamos usar testes paramétricos, como correlações, regressões lineares, teste t e anovas.
Vamos fazer a mesma coisa para o banco de dados PlantGrowth.
shapiro.test(PlantGrowth$weight) ## É normal! (Se p > 0.05, aceitamos a hipótese de normalidade)
hist(PlantGrowth$weight, breaks = 20, probability = TRUE, col = "lightblue",
main = "Histograma de Weight", xlab = "Peso")
curve(dnorm(x, mean = mean(PlantGrowth$weight), sd = sd(PlantGrowth$weight)), add = TRUE, col = "red", lwd = 2)
qqnorm(PlantGrowth$weight, main = "QQ-Plot de Sepal.Length", pch = 19, col = "blue") # se aproxima da linha vermelha
qqline(PlantGrowth$weight, col = "red", lwd = 2)
Shapiro-Wilk normality test
data: PlantGrowth$weight
W = 0.98268, p-value = 0.8915
Agora você pode testar outros dados e brincar como quiser! Divirta-se!