Lista 2 - PEX801 - Gabriel Peixoto

Segunda lista de exercícios estatística computacional - PEX801

Gabriel Peixoto

2025-05-08

Lista de Exercícios 2: Estatística Básica no R

Questão 1) Calcule a média, mediana, moda, variância e desvio padrão usando o seguinte conjunto de dados

Podemos calcular diretamente por meio de funções nativas do R todos os requisitos com excessão da moda.

Para calcular a moda podemos implementar uma função criada por nos mesmos, que tabula os valores únicos e nos retorna o que aparece mais vezes.

data = c(20,7,5,9,6,21,24,10,12,22,21,16,13,6,6,2,19,3,10,7,2,18,4,6,18,12,4,13,9,3)

media = mean(data);media
## [1] 10.93333
mediana = median(data);mediana
## [1] 9.5
moda <- function(x) {
  tab <- table(x)
  modas <- as.numeric(names(tab)[tab == max(tab)])
  return(modas)
}

moda_data = moda(data);moda_data
## [1] 6
variancia = var(data);variancia
## [1] 45.9954
desvio = sd(data);desvio
## [1] 6.781991

Questão 2) Calcule a média e a variancia dos dados do exercicio anterior considerando as formulas da lista e faça seu implemento no R.

# Para a média

xbar = function(x){
  somaxi= sum(x)
  n = length(x)
  calc = somaxi/n
  return(calc)
}
media_funcao = xbar(data);media_funcao
## [1] 10.93333
xvar = function(x){
  xbarra = mean(x)
  n = length(x)
  calc = sum((x-xbarra)^2)/(n-1)
  return(calc)
}

var_funcao = xvar(data);var_funcao
## [1] 45.9954

Questão 3) Calcule a variância, o desvio padrão, a amplitude total, o erro padrão da média e o coeficiente de variação considerando o seguinte conjunto de dados:

df = c(33,17,39,78,29,32,54,22,38,18)

paste("Variância: ", paste(var(df)), collapse = ",")
## [1] "Variância:  339.555555555556"
paste("Desvio padrão: ", paste(sd(df)), collapse = ",")
## [1] "Desvio padrão:  18.427033281447"
paste("Amplitude total: ", paste(diff(range(df)), collapse = ","))
## [1] "Amplitude total:  61"
paste("Erro padrão da média:", paste(sd(df)/sqrt(length(df)), collapse = ","))
## [1] "Erro padrão da média: 5.82713956890991"
paste("Coeficiente de variação:", paste((sd(df)/mean(df))*100), collapse = ",")
## [1] "Coeficiente de variação: 51.186203559575"

Questão 4) Estude o comando basicStats() do pacote fBasics e use este comando considerando uma das variáveis do conjunto de dados horsecrab.txt.

df2 = read.table("dados/horsecrab.txt", header = T)
head(df2)
##   color spine width satell weight y
## 1     3     3  28.3      8   3050 1
## 2     4     3  22.5      0   1550 0
## 3     2     1  26.0      9   2300 1
## 4     4     3  24.8      0   2100 0
## 5     4     3  26.0      4   2600 1
## 6     3     3  23.8      0   2100 0
require(fBasics)
## Carregando pacotes exigidos: fBasics
round(basicStats(df2),2)
##              color  spine   width satell    weight      y
## nobs        173.00 173.00  173.00 173.00    173.00 173.00
## NAs           0.00   0.00    0.00   0.00      0.00   0.00
## Minimum       2.00   1.00   21.00   0.00   1200.00   0.00
## Maximum       5.00   3.00   33.50  15.00   5200.00   1.00
## 1. Quartile   3.00   2.00   24.90   0.00   2000.00   0.00
## 3. Quartile   4.00   3.00   27.70   5.00   2850.00   1.00
## Mean          3.44   2.49   26.30   2.92   2437.19   0.64
## Median        3.00   3.00   26.10   2.00   2350.00   1.00
## Sum         595.00 430.00 4549.70 505.00 421634.00 111.00
## SE Mean       0.06   0.06    0.16   0.24     43.87   0.04
## LCL Mean      3.32   2.36   25.98   2.45   2350.60   0.57
## UCL Mean      3.56   2.61   26.62   3.39   2523.78   0.71
## Variance      0.64   0.68    4.45   9.91 332958.10   0.23
## Stdev         0.80   0.83    2.11   3.15    577.03   0.48
## Skewness      0.53  -1.09    0.32   1.13      0.69  -0.59
## Kurtosis     -0.35  -0.64    0.13   1.14      1.83  -1.67

A função basicStats nos retorna as estatísticas básicas da nossa base de dados, dando um escopo preliminar porém geral da composição dos nossos dados. É fornecido métricas como: Número de observações, minímo, máximo dentre outras.

Questão 5)

require(skimr)
## Carregando pacotes exigidos: skimr
summary(df2)
##      color           spine           width          satell           weight    
##  Min.   :2.000   Min.   :1.000   Min.   :21.0   Min.   : 0.000   Min.   :1200  
##  1st Qu.:3.000   1st Qu.:2.000   1st Qu.:24.9   1st Qu.: 0.000   1st Qu.:2000  
##  Median :3.000   Median :3.000   Median :26.1   Median : 2.000   Median :2350  
##  Mean   :3.439   Mean   :2.486   Mean   :26.3   Mean   : 2.919   Mean   :2437  
##  3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:27.7   3rd Qu.: 5.000   3rd Qu.:2850  
##  Max.   :5.000   Max.   :3.000   Max.   :33.5   Max.   :15.000   Max.   :5200  
##        y         
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :1.0000  
##  Mean   :0.6416  
##  3rd Qu.:1.0000  
##  Max.   :1.0000
skimr::skim(df2)
Data summary
Name df2
Number of rows 173
Number of columns 6
_______________________
Column type frequency:
numeric 6
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
color 0 1 3.44 0.80 2 3.0 3.0 4.0 5.0 ▁▇▁▃▂
spine 0 1 2.49 0.83 1 2.0 3.0 3.0 3.0 ▂▁▁▁▇
width 0 1 26.30 2.11 21 24.9 26.1 27.7 33.5 ▂▇▇▂▁
satell 0 1 2.92 3.15 0 0.0 2.0 5.0 15.0 ▇▃▁▁▁
weight 0 1 2437.19 577.03 1200 2000.0 2350.0 2850.0 5200.0 ▅▇▃▁▁
y 0 1 0.64 0.48 0 0.0 1.0 1.0 1.0 ▅▁▁▁▇

A função summary do R nos retorna as medidas de posição básicas do conjunto de dados análisado.

Já pelo pacote skimr, além das medidas de posição, temos as medidas de disperção, como desvio, quantis, número de variáveis ausentes, além de quê, caso tenhamos variáveis “factor” ele nos retorna a frequência dessas variáveis.

Exércicio 6) De um talhão de eucaliptos, sortearam-se 30 árvores e determinaram-se os diâmetros à altura do peito (DAP), em cm, com a finalidade de caracterizar essa amostra e o talhão. Os diâmetros obtidos foram (adaptado de Andrade e Ogliari, 2007):

Carregando os dados

DAP = c(10.2,28,29.5,15.8,30.3,28.3,18.5,26.8,34.2,22.3,28,38.5,23.5,17.2,17.8,38.5,18.9,35.5,17.8,28.9,34.2,18.7,27.9,31.8,16.7,22.5,32.5,29.1,32.9,41.8)

A) Calcule: média, mediana, moda, 1o quartil, 3o quartil, valor máximo, valor mínimo, amplitude total, variância, desvio padrão, erro padrão da média e coeficente de variação, utilizando duas maneiras diferentes.

Primeira maneira usando as funções do R

require(plotrix)
## Carregando pacotes exigidos: plotrix
require(goeveg)
## Carregando pacotes exigidos: goeveg
## This is GoeVeg 0.7.5 - build: 2024-05-17
paste("Média: ",mean(DAP) )
## [1] "Média:  26.5533333333333"
paste("Mediana: ", median(DAP))
## [1] "Mediana:  28"
paste("Moda: ", moda(DAP))
## [1] "Moda:  17.8" "Moda:  28"   "Moda:  34.2" "Moda:  38.5"
c(paste("1° Quantil: ",quantile(DAP, prob = 0)),
  paste("3° Quantil: ",quantile(DAP, prob = 0.75)))
## [1] "1° Quantil:  10.2"   "3° Quantil:  32.325"
paste("Valor Máximo: " ,max(DAP))
## [1] "Valor Máximo:  41.8"
paste("Valor mínimo: ",min(DAP))
## [1] "Valor mínimo:  10.2"
paste("Amplitude total: ", diff(range(DAP)))
## [1] "Amplitude total:  31.6"
paste("Variância :" ,var(DAP))
## [1] "Variância : 62.4729195402299"
paste("Desvio Padrão: " , sd(DAP))
## [1] "Desvio Padrão:  7.90398124619675"
paste("Erro padrão da média:" ,std.error(DAP))
## [1] "Erro padrão da média: 1.44306294087992"
paste("Coeficiente de variação: ", goeveg::cv(DAP, na.rm = FALSE))
## [1] "Coeficiente de variação:  0.297664370306179"

Pela segunda maneira construindo nossas formulas

paste("Média", sum(DAP)/length(DAP))
## [1] "Média 26.5533333333333"
# Criando a função para mediana 

mediana_GP = function(x){
  n = length(x)
  xord = sort(x)
  ifelse(n%%2 == 1,xord[(n+1)/2], mean(xord[n/2+0:1]) )
}
paste("Mediana: ", mediana_GP(DAP))
## [1] "Mediana:  28"
# Criando a função para moda que corrige o problema anterior 

moda_new <- function(x) {
  tab <- table(x)
  modas <- as.numeric(names(tab)[tab == max(tab)])
  return(modas)
}

paste("Valores modais:", paste(moda_new(DAP), collapse = ", "))
## [1] "Valores modais: 17.8, 28, 34.2, 38.5"
# Calculando a 1° médiana 
quant_1 = function(x){
  ordenados = sort(x)
  posicao = ceiling(length(x)*0.25)
  return(ordenados[posicao])
}
paste("1° Quantil: ", quant_1(DAP))
## [1] "1° Quantil:  18.7"
# Calculando a 3° Mediana
quant_3 = function(x){
  ordenados = sort(x)
  posicao = ceiling(length(x)*0.75)
  return(ordenados[posicao])
}
paste("3° Quantil: ", quant_3(DAP))
## [1] "3° Quantil:  32.5"
# Valores Minimos e máximos

posicao = function(x){
  xord = sort(x)
  primeirovalor = xord[1]
  ultimovalor = xord[length(xord)]
  return(c(primeirovalor,ultimovalor))
}

paste("Valores mínimo e máximo: ", posicao(DAP))
## [1] "Valores mínimo e máximo:  10.2" "Valores mínimo e máximo:  41.8"
# Amplitude

Amplitude = function(x){
    xord = sort(x)
    ultimovalor = xord[length(xord)]
    primeirovalor = xord[1]
    return(ultimovalor-primeirovalor)
    }
paste("Amplitude total:", paste(Amplitude(DAP), collapse = ","))
## [1] "Amplitude total: 31.6"
# Variancia

paste("Variância: " , sum((DAP-mean(DAP))^2/(length(DAP)-1)))
## [1] "Variância:  62.4729195402299"
# Desvio Padrão

paste("Desvio Padrão:", sqrt(sum((DAP-mean(DAP))^2/(length(DAP)-1))))
## [1] "Desvio Padrão: 7.90398124619675"
# Erro padrão da Média 

EPM = function(x){
  desvio = sd(x)
  n = length(x)
  return(desvio/sqrt(n))
  }

paste("Erro padrão da Média: ", EPM(DAP))
## [1] "Erro padrão da Média:  1.44306294087992"
# Coefiiciente de variação

CV = function(x){
  desvio = sd(x)
  xbar = mean(x)
  return((desvio/xbar)*100)
}


paste("Coeficiente de variação (%):",CV(DAP))
## [1] "Coeficiente de variação (%): 29.7664370306179"

B) Obtenha o histograma e o box-plot.

Histograma

require(ggplot2)
## Carregando pacotes exigidos: ggplot2
DAP_data = as.data.frame(DAP)
ggplot(DAP_data, aes(x = DAP)) +
  geom_histogram(binwidth = 4, fill = "green", color = "black") +
  labs(title = "Histograma do DAP",subtitle = "Diâmetro das árvores para altura do peito", x = "Diâmetro para altura do peito (cm)", y = "Frequência (n)") +
  theme_light()

boxplot(DAP)

ggplot(DAP_data, aes(x = DAP, y = NULL)) + 
  geom_boxplot(fill = "green", color = "black") +
  labs(title = "Histograma do DAP",subtitle = "Diâmetro das árvores para altura do peito", x = "Diâmetro para altura do peito (cm)") +
  theme_light()

## C) Obtenha os intervalos de 95% de confiança para a média, variância, desvio padrão e coeficiente de variação.

Criando as funções

Para a média

icm= function(x, confidence = 0.95){
  xbar = mean(x)
  n=length(x)
  sd = sd(x)
  qt = c(qt((1-confidence)/2,n-1),qt(1-(1-confidence)/2,n-1))
  return(xbar+qt*(sd/sqrt(n)))
  }

paste("Intervalo de confiança para média: ", paste(icm(DAP), collapse = ", "))
## [1] "Intervalo de confiança para média:  23.6019382311825, 29.5047284354841"

Para a variancia

icv <- function(x, confidence = 0.95){
  n <- length(x)
  s2 <- var(x)
  alpha <- 1 - confidence
  chi <- qchisq(c(1 - alpha/2, alpha/2), df = n - 1)
  return((n - 1) * s2 / chi)
}
paste("Intervalo de confiança para Variância: ", paste(icv(DAP), collapse = ", "))
## [1] "Intervalo de confiança para Variância:  39.6243239987195, 112.900016966334"

Para o Desvio Padrão

icdp <- function(x, confidence = 0.95){
  n <- length(x)
  s2 <- var(x)
  alpha <- 1 - confidence
  chi <- qchisq(c(1 - alpha/2, alpha/2), df = n - 1)
  return(sqrt((n - 1) * s2 / chi))
}
paste("Intervalo de confiança para o desvio padrão: ", paste(icdp(DAP), collapse = ", "))
## [1] "Intervalo de confiança para o desvio padrão:  6.29478546089694, 10.6254419656941"

Para o coeficiente de variação

iccv <- function(x, confidence = 0.95){
  n <- length(x)
  xbar <- mean(x)
  s <- sd(x)
  cv <- s / xbar
  alpha <- 1 - confidence
  z <- qnorm(1 - alpha/2)
  se_cv <- cv * sqrt((1 + (cv^2)/2) / n)
  return(cv + c(-1, 1) * z * se_cv)
}

paste("Intervalo de confiança para o coeficiente de variação:", paste(iccv(DAP), collapse = ",") )
## [1] "Intervalo de confiança para o coeficiente de variação: 0.188814634232699,0.406514106379659"

Questão 7) Em um lote de 1000 sacos de sementes de trigo, foi retirada uma amostra aleatória de 50 sacos, dos quais 10 apresentaram teor de umidade acima do limite permitido para armazenamento. Com base nesses dados, determine o intervalo de 95% de confiança para a verdadeira proporção de sacos fora do padrão, utilizando os métodos normal aproximado e exato, conforme apresentados na apostila de Recursos Computacionais do Prof. Daniel Furtado Ferreira (adaptado de Andrade e Ogliari, 2007).

Para o aproximado

icp_AP = function(p,n, confidence = 0.95){
  prop = p/n
  z = c(qnorm((1-confidence)/2),qnorm(1-(1-confidence)/2))
  return(prop+z*(sqrt(prop*(1-prop)/n)))
}

paste("Intervalo de confiança para proporção aproximado: ", paste(icp_AP(10,50,0.95),collapse = " , "))
## [1] "Intervalo de confiança para proporção aproximado:  0.0891276940520258 , 0.310872305947974"

Para o exato

icp_EX <- function(p, n, confidence = 0.95) {
  y = p         # número de sucessos
  alpha = 1 - confidence
  
  # Cálculo dos valores críticos da F
  fcalc1 = qf(alpha/2, df1 = 2 * (n - y + 1), df2 = 2 * y, lower.tail = F)
  fcalc2 = qf(1 - alpha/2, df1 = 2 * (y + 1), df2 = 2 * (n - y))
  
  # Limites inferior e superior do IC exato 
  lower = 1 / (1 + ((n - y + 1) * fcalc1)/y)
  
  upper = (y + 1) * fcalc2 / ((n - y) + (y + 1) * fcalc2)
  
  return(c(lower, upper))
}
paste("Intervalo de confiança para proporção exato: ", paste(icp_EX(10,50,0.95),collapse = " , "))
## [1] "Intervalo de confiança para proporção exato:  0.100302237472571 , 0.337183108383488"

Questão 8)

Para o Aproximado sem correção e o exato iremos utilizar as formulas anteriores.

icp_AP(10,50,0.95)
## [1] 0.08912769 0.31087231
icp_EX(10,50,0.95)
## [1] 0.1003022 0.3371831

Para a Aproximação normal com correção de continuidade:

icp_AP_corr = function(p,n,confidence = 0.95){
  y = p
  alpha = 1- confidence
  z_crit = qnorm(alpha/2, lower.tail = F)
  
  # Criando os limites 
  LIC = ((y-0.5)/n) - (z_crit/sqrt(n)) * sqrt(((y-0.5)/n) * (1 - ((y - 0.5)/n)))
  LAC = ((y+0.5)/n) + (z_crit/sqrt(n)) * sqrt(((y+0.5)/n) * (1 - ((y + 0.5)/n)))
  return(c(LIC,LAC))
}

icp_AP_corr(10,50,0.95)
## [1] 0.08126174 0.32289801

Para a Aproximação devido a pratt:

icp_AP_pratt = function(p,n,confidence = 0.95){
  y = p
  n = n
  alpha = 1- confidence
  z_crit = qnorm(alpha/2, lower.tail = F)
  
  # Calculando os limites 
  
  LIC = (1 + (y / (n - y + 1))^2 * ((  (81 * y) * (n - y + 1) - (9*n) - 8 + (3*z_crit) *sqrt((9*y) * (n - y + 1) * ((9*n)+5-(z_crit)^2) + n + 1)  ) / ((81 * (y)^2) - (9* y) *(2 + (z_crit)^2) + 1))^3)^-1
  
  parte_1 = ((y+1)/(n-y))^2
  parte_2 = (81*(y+1)*(n-y)) - (9*n) - 8 - (3*z_crit)*sqrt(9*(y+1)*(n-y)*((9*n) + 5 - (z_crit)^2) + n + 1 )
  parte_3 = (81*(y+1)^2) - 9*(y+1)*(2 + (z_crit)^2) + 1
  
  LAC = (1 + (((y+1)/(n-y))^2) * ((81*(y+1)*(n-y) - 9*n - 8 - 3*z_crit * sqrt(9*(y+1)*(n - y)*(9*n+5-(z_crit)^2)+n+1))/(81*((y + 1)^2) - 9 *(y+1)*(2+(z_crit)^2)+1))^3)^(-1)
    
    
  return(c(LIC,LAC))
  
}
paste("Intervalo de confiança para proporção por Pratt", paste(icp_AP_pratt(10,50,0.95), collapse = ","))
## [1] "Intervalo de confiança para proporção por Pratt 0.100173830366947,0.337188123149737"