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