R básico e estatística

Author

Marina Scalon

R básico

Entenderemos agora algumas funcionalidades e características do ambiente R

Tipos de Objeto no R

O R possui diferentes tipos de objetos, que podem ser criados e armazenados com o sinal de atribuição -> (atalho Alt + -)

Numeric (numérico)

a <- 13
a
[1] 13

Formulae (fórmula)

Fórmulas seguem o senso comum (parecido com os sinais usados no excel). Pode-se usar formas simples, ou mais complexas, dependendo da utilidade.

b <- 2+2
b
[1] 4
b <- 2+(4*60)-(80/4)
b
[1] 222
b <- 2+(3*pi)-(cos(80)/sin(40))
b
[1] 11.57293

Character (caractere)

Caracteres do tipo string devem ser listados entre aspas.

c <- "Flora"
c
[1] "Flora"

Vetores

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.

numeros <- c(1, 2, 3, 4, 5) # Vetor numérico
numeros
[1] 1 2 3 4 5
nomes <- c("Flora", "Aurora", "Pinot Noir") # Vetor de caracteres
nomes
[1] "Flora"      "Aurora"     "Pinot Noir"

Dataframe

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

Outros

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…

Funcionalidades básicas

Alguns comandos básicos para utilização do R

Definindo diretório de trabalho e imporanto dados

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.

setwd("G:/Other computers/My Laptop/Marina/Pos-doutorado/PDS/Nivelamento_2025")

dados <- read.csv("brazil_loss.csv")


# sem diretório

dados2 <- read.csv("G:/Other computers/My Laptop/Marina/Pos-doutorado/PDS/Nivelamento_2025/brazil_loss.csv")

Importando dados

Prefira sempre dados em .csv!

Atenção - MUITO IMPORTANTE

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.

Instalando Pacotes

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>

Entendendo os dados

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
Função str()

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 ...

Estatística básica

Agora vamos entender, de forma prática alguns conceitos centrais de estatística básica

Variáveis quantitativas e qualitativas

Carregando dados já incluídos na instalação do R, podemos verificar que:

data(iris)
summary(iris)
  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)

data(PlantGrowth)
summary(PlantGrowth)
     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áveis dependentes e independentes

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)

Probabilidades

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:

s_10 <- sample(1:2, 10, replace=T)
s_1000 <- sample(1:2, 1000, replace=T)

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.

table(s_10)
s_10
1 2 
8 2 
table(s_1000)
s_1000
  1   2 
481 519 
prob10 <- table(s_10)/10
prob1000 <- table(s_1000)/1000

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.

d_10 <- sample(1:6, 10, replace=T)
d_100 <- sample(1:6, 100, replace=T)
d_1000 <- sample(1:6, 1000, replace=T)
d_10000 <- sample(1:6, 10000, replace=T)

Criamos as tabelas de probabilidades observadas

d_prob10 <- table(d_10)/10
d_prob100 <- table(d_100)/100
d_prob1000 <- table(d_1000)/1000
d_prob10000 <- table(d_10000)/10000

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)

Teorema do Limite Central

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.

replicate(1000, mean(sample(1:6,1, replace=T)))
   [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
prob100_1 <- replicate(1000, mean(sample(1:6,1, replace=T)))

Agora com 2, 5 e 30 dados, também 1000 vezes.

prob100_2 <- replicate(1000, mean(sample(1:6,2, replace=T)))
prob100_2
   [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
prob100_5 <- replicate(1000, mean(sample(1:6,5, replace=T)))

prob100_30 <- replicate(1000, mean(sample(1:6,30, replace=T)))

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")

Testando a normalidade dos dados

Existe uma função no R que testa automaticamente a hipótese que os dados seguem uma distribuição normal chamada shapiro.test.

Lembrar!

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!