Referências para leitura deste material:


Abreviação: Teste de hipóteses (TH’s).

1 TH’s para uma única população normal

1.1 TH’s para a média de uma população normal com variância conhecida

Problema. O gerente de um restaurante está interessado na distribuição do tempo de entrega de pedidos realizados pelo aplicativo do restaurante. Para tal estudo, uma amostra aleatória simples de 32 tempos de entrega (em minutos) foram registrados (veja os dados no script abaixo). Estudos prévios mostram que estes tempos formam uma amostra aleatória simples de uma distribuição normal com desvio padrão de 9 minutos.Teste a hipótese que o tempo médio de entrega de pedidos pelo aplicativo é menor que 25 minutos (\(H_{0}:\mu=25\hspace{0.2cm}\mbox{min}\) versus \(H_{1}:\mu<25\hspace{0.2cm}\mbox{min}\)). Apresente uma estimativa intervalar para o tempo médio de entrega com confiança de 95%.

library(TeachingDemos)
dados <- c(4.24,9.94,11.31,11.84,13.89,19.97,21.18,22.15,
           22.44,24.69,25.20,25.36,25.62,26.96,27.25,27.42,
           29.98,32.54,32.98,34.88,35.34,35.44,35.57,36.29,
           37.03,38.13,41.88,44.16,48.89,49.78,51.63,52.27)
summary(dados)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.24   22.37   28.70   29.88   36.48   52.27
var(dados)
## [1] 153.3435
sd(dados)
## [1] 12.38319
out <- z.test(x=dados,mu=25,stdev=9,alt="less",n=length(dados),conf.level=0.95)
out
## 
##  One Sample z-test
## 
## data:  dados
## z = 3.069, n = 32.000, Std. Dev. = 9.000, Std. Dev. of the sample mean
## = 1.591, p-value = 0.9989
## alternative hypothesis: true mean is less than 25
## 95 percent confidence interval:
##      -Inf 32.49976
## sample estimates:
## mean of dados 
##      29.88281
names(out)
## [1] "statistic"   "parameter"   "p.value"     "conf.int"    "estimate"   
## [6] "null.value"  "alternative" "method"      "data.name"
out$p.value
## [1] 0.9989263
out$conf.int
## [1]     -Inf 32.49976
## attr(,"conf.level")
## [1] 0.95
as.vector(out$conf.int)
## [1]     -Inf 32.49976

Não rejeitamos a hipótese nula \(H_{0}\) (veja que o p-valor é alto, \(0.9989\)). Portanto, não existem evidências experimentais que o tempo médio de entrega de pedidos pelo aplicativo seja menor que 25 minutos. Note que o intervalo de 95% confiança proporcionado pela função z.test() (do pacote TeachingDemos) contém a hipótese \(H_{0}\).

hist(dados,freq=FALSE,xlab="Tempos",ylab="Densidade",main="")
curve(dnorm(x,mean=mean(dados),sd=sd(dados)),-10,70,col="blue",add=TRUE)
abline(v=mean(dados),col="red")

qqnorm(dados,xlab="Quantis teóricos",ylab="Quantis amostrais",main="Q-Q Plot Normal")
qqline(dados,col="red")

1.2 TH’s para a média de uma população normal com variância desconhecida

Problema. Considere os dados e a mesma situação do problema anterior, mas não assuma conhecimento em relação à variância populacional da normal em questão. Teste \(H_{0}:\mu=20\hspace{0.2cm}\mbox{min}\) versus \(H_{1}:\mu\not=20\hspace{0.2cm}\mbox{min}\). Caso a hipótese nula seja rejeitada, apresente uma estimativa intervalar para o tempo médio de entrega com confiança de 95%.

dados <- c(4.24,9.94,11.31,11.84,13.89,19.97,21.18,22.15,
           22.44,24.69,25.20,25.36,25.62,26.96,27.25,27.42,
           29.98,32.54,32.98,34.88,35.34,35.44,35.57,36.29,
           37.03,38.13,41.88,44.16,48.89,49.78,51.63,52.27)
out <- t.test(x=dados,mu=20,alternative="two.sided",conf.level=0.95)
out
## 
##  One Sample t-test
## 
## data:  dados
## t = 4.5146, df = 31, p-value = 8.588e-05
## alternative hypothesis: true mean is not equal to 20
## 95 percent confidence interval:
##  25.41819 34.34743
## sample estimates:
## mean of x 
##  29.88281
names(out)
##  [1] "statistic"   "parameter"   "p.value"     "conf.int"    "estimate"   
##  [6] "null.value"  "stderr"      "alternative" "method"      "data.name"
out$p.value
## [1] 8.587632e-05
as.vector(out$conf.int)
## [1] 25.41819 34.34743

Rejeitamos a hipótese nula \(H_{0}\) (veja que o p-valor é muito pequeno, \(8.587632\times 10^{-5}\)). Portanto, existem evidências experimentais que o tempo médio de entrega de pedidos pelo aplicativo é diferente de 20 minutos. A função t.test() proporciona um intervalo de 95% confiança para o tempo médio de entrega populacional \(\mu\), que é \(\mbox{IC}(\mu;0.95)=(25.41819,34.34743)\) minutos. Note que, neste caso, o intervalo não contém \(H_{0}\).

1.3 TH’s para a variância de uma população normal

Problema. Considere os dados e a mesma situação do problema anterior, novamente sem assumir conhecimento algum em relação à variância populacional da normal em questão. Desenvolva o seguinte teste de hipóteses \(H_{0}:\sigma^{2}=81\hspace{0.2cm}\mbox{min}^{2}\) versus \(H_{1}:\sigma^{2}>81\hspace{0.2cm}\mbox{min}^{2}\). Caso a hipótese nula seja rejeitada, apresente uma estimativa intervalar para a variância do tempo de entrega de pedidos, com confiança de 95%.

library(EnvStats)
## 
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:stats':
## 
##     predict, predict.lm
## The following object is masked from 'package:base':
## 
##     print.default
dados <- c(4.24,9.94,11.31,11.84,13.89,19.97,21.18,22.15,
           22.44,24.69,25.20,25.36,25.62,26.96,27.25,27.42,
           29.98,32.54,32.98,34.88,35.34,35.44,35.57,36.29,
           37.03,38.13,41.88,44.16,48.89,49.78,51.63,52.27)
out <- varTest(dados,alternative="greater",sigma.squared=81,conf.level=0.95,data.name="dados")
out
## 
##  Chi-Squared Test on Variance
## 
## data:  dados
## Chi-Squared = 58.687, df = 31, p-value = 0.001921
## alternative hypothesis: true variance is greater than 81
## 95 percent confidence interval:
##  105.6711      Inf
## sample estimates:
## variance 
## 153.3435
names(out)
## [1] "statistic"   "parameters"  "p.value"     "estimate"    "null.value" 
## [6] "alternative" "method"      "data.name"   "conf.int"
out$p.value
## [1] 0.001921262
as.vector(out$conf.int)
## [1] 105.6711      Inf
#
#
#
sigma2.0 <- 81
n <- length(dados);n
## [1] 32
s2 <- var(dados);s2
## [1] 153.3435
Q <- ((n-1)*s2)/sigma2.0;Q
## [1] 58.68702
pvalor <- 1-pchisq(Q,df=n-1);pvalor
## [1] 0.001921262

Rejeitamos a hipótese nula \(H_{0}\) (veja que o p-valor é muito pequeno, \(0.001921\)). Portanto, existem evidências experimentais que a variância do tempo de entrega de pedidos pelo aplicativo seja maior que 81 minutos ao quadrado (ou seja, que o desvio padrão do tempo de entrega de pedidos pelo aplicativo seja maior que 9 minutos). A função var.Test() do pacote EnvStats proporciona um intervalo de 95% confiança para a variância populacional \(\sigma^{2}\) do tempo de entrega populacional de pedidos e este intervalo não contém \(H_{0}\).

2 TH’s para uma única população não necessariamente normal

2.1 TH’s para a proporção de uma população de Bernoulli: o teste binomial exato

Problema. Uma amostra de 500 habitantes de uma cidade com idade igual ou superior a 16 anos foi selecionada para participar de uma pesquisa de opinião. Cada pessoa na amostra respondeu se concordava ou não com a solução proposta pela prefeitura da cidade para resolver um problema municipal que está prejudicando seriamente a população. As opções de resposta para a pergunta são: sim (se a pessoa é favorável a solução proposta) ou não (se a pessoa não é favorável a solução proposta). Das 500 pessoas ouvidas, 300 responderam sim e 200 responderam não. Com base nos dados, deseja-se testar se a proporção da população em questão (habitantes da cidade com idade igual ou superior a 16 anos) que é favorável a solução proposta pela prefeitura é igual a 1/2 ou é diferente de 1/2.

respostas <- c(rep("nao",200),rep("sim",300))
respostas <- factor(respostas,levels=c("nao","sim"))
df <- data.frame(Indivíduos=1:500,Resposta=respostas)
str(df)
## 'data.frame':    500 obs. of  2 variables:
##  $ Indivíduos: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Resposta  : Factor w/ 2 levels "nao","sim": 1 1 1 1 1 1 1 1 1 1 ...
freq <- as.vector(table(df$Resposta))
prop <- as.vector(prop.table(table(df$Resposta)))
tabela <- data.frame(Classe=c("Não","Sim"),Frequencia=freq,Proporções=prop)
tabela
##   Classe Frequencia Proporções
## 1    Não        200        0.4
## 2    Sim        300        0.6
#
# Teste binomial exato para a proporção de uma população de Bernoulli
#
out <- binom.test(x=300,n=500,p=0.5,alternative="two.sided",conf.level=0.95)
out
## 
##  Exact binomial test
## 
## data:  300 and 500
## number of successes = 300, number of trials = 500, p-value = 8.94e-06
## alternative hypothesis: true probability of success is not equal to 0.5
## 95 percent confidence interval:
##  0.5555718 0.6432386
## sample estimates:
## probability of success 
##                    0.6
names(out)
## [1] "statistic"   "parameter"   "p.value"     "conf.int"    "estimate"   
## [6] "null.value"  "alternative" "method"      "data.name"
out$p.value
## [1] 8.940067e-06
as.vector(out$conf.int)
## [1] 0.5555718 0.6432386
#
#
#
pvalor <- 2*(1-pbinom(299,size=500,prob=0.5));pvalor
## [1] 8.940067e-06

Rejeitamos a hipótese nula \(H_{0}\) (veja que o p-valor é muito pequeno, \(8.94\times 10^{-6}\)). Portanto, existem evidências experimentais que a proporção da população em questão (habitantes da cidade com idade igual ou superior a 16 anos) que é favorável a solução proposta pela prefeitura é diferente de 1/2. A função binom.test() proporciona um intervalo de 95% confiança exato para \(p\), que é dado por \(\mbox{IC}(p;0.95)=(0.5555718,0.6432386)\). Note que, neste caso, o intervalo não contém \(H_{0}\).

2.2 TH’s para a proporção de uma população de Bernoulli: o caso de grandes amostras

Problema. Considere novamente os dados e a mesma situação do problema anterior.

tabela
##   Classe Frequencia Proporções
## 1    Não        200        0.4
## 2    Sim        300        0.6
#
# Teste para a proporção de uma população de Bernoulli
# sem correção de continuidade (grandes amostras)
#
out <- prop.test(x=300,n=500,p=0.5,alternative="two.sided",conf.level=0.95,correct=FALSE)
out
## 
##  1-sample proportions test without continuity correction
## 
## data:  300 out of 500, null probability 0.5
## X-squared = 20, df = 1, p-value = 7.744e-06
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5564541 0.6420210
## sample estimates:
##   p 
## 0.6
#
# Teste para a proporção de uma população de Bernoulli
# com correção de continuidade (grandes amostras)
#
out <- prop.test(x=300,n=500,p=0.5,alternative="two.sided",conf.level=0.95,correct=TRUE)
out
## 
##  1-sample proportions test with continuity correction
## 
## data:  300 out of 500, null probability 0.5
## X-squared = 19.602, df = 1, p-value = 9.537e-06
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5554442 0.6429956
## sample estimates:
##   p 
## 0.6
#
# Alternativamente, podemos utilizar também neste problema 
# o teste qui-quadrado
#
out <- chisq.test(x=c(200,300),p=c(0.5,0.5),correct=FALSE)
out
## 
##  Chi-squared test for given probabilities
## 
## data:  c(200, 300)
## X-squared = 20, df = 1, p-value = 7.744e-06
names(out)
## [1] "statistic" "parameter" "p.value"   "method"    "data.name" "observed" 
## [7] "expected"  "residuals" "stdres"
out$statistic
## X-squared 
##        20
out$parameter
## df 
##  1
pvalor <- 1-pchisq(out$statistic,df=out$parameter);pvalor
##    X-squared 
## 7.744216e-06

Os resultados obtidos com as funções prop.test() e chisq.test() estão em concordância com os resultados exatos obtidos com a função binom.test().

Teste Decisão P.valor limite.inf.IC95 limite.sup.IC95
Teste binomial exato Rejeita H0 8.94e-06 0.5555718 0.6432386
Teste-z sem correção (grandes amostras) Rejeita H0 7.74e-06 0.5564541 0.6420210
Teste-z com correção (grandes amostras) Rejeita H0 9.54e-06 0.5554442 0.6429956

2.3 TH’s para a média populacional: o caso de grandes amostras

Problema. Um material radioativo emite partículas alfa ao longo do tempo. Deseja-se entender a distribuição dos tempos entre duas emissões sucessivas de partículas alfa deste material. Para tal estudo, uma amostra aleatória simples de 36 tempos entre duas emissões sucessivas foram registrados (veja os dados no script abaixo). Teste a hipótese que o tempo médio entre duas emissões sucessivas é igual a 1. Se a hipótese nula for rejeitada, apresente uma estimativa intervalar para o tempo médio entre duas emissões sucessivas com confiança de 95%.

library(TeachingDemos)
dados <- c(0.02,0.04,0.05,0.07,0.07,0.09,0.09,0.10,0.12,
           0.22,0.28,0.34,0.34,0.35,0.36,0.43,0.43,0.46,
           0.61,0.62,0.74,0.80,0.81,0.85,0.90,0.93,1.02,
           1.09,1.17,1.18,1.40,1.53,1.54,1.81,2.02,2.10)
summary(dados)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0200  0.1950  0.5350  0.6939  1.0375  2.1000
var(dados)
## [1] 0.3525559
sd(dados)
## [1] 0.5937642
out <- z.test(x=dados,mu=1,stdev=sd(dados),alt="two.sided",n=length(dados),conf.level=0.95)
out
## 
##  One Sample z-test
## 
## data:  dados
## z = -3.0933, n = 36.000000, Std. Dev. = 0.593764, Std. Dev. of the
## sample mean = 0.098961, p-value = 0.00198
## alternative hypothesis: true mean is not equal to 1
## 95 percent confidence interval:
##  0.4999295 0.8878483
## sample estimates:
## mean of dados 
##     0.6938889
names(out)
## [1] "statistic"   "parameter"   "p.value"     "conf.int"    "estimate"   
## [6] "null.value"  "alternative" "method"      "data.name"
out$p.value
## [1] 0.001979709
as.vector(out$conf.int)
## [1] 0.4999295 0.8878483

Rejeitamos a hipótese nula \(H_{0}\) (veja que o p-valor é pequeno, \(0.00198\)). Portanto, existem evidências experimentais que o tempo médio entre duas emissões sucessivas de partículas é diferente de 1. O intervalo de 95% confiança proporcionado pela função z.test() não contém a hipótese \(H_{0}\) e é dado por \(\mbox{IC}(\mu;0.95)\approx(0.4999295,0.8878483)\).

hist(dados,freq=FALSE,xlab="Tempos",ylab="Densidade",main="")
curve(dexp(x,rate=1/mean(dados)),0,3,col="blue",add=TRUE)
abline(v=mean(dados),col="red")

2.4 O teste do sinal para a mediana populacional: teste não-paramétrico

Problema. Um motor de foguete é fabricado ligando-se dois tipos de propelentes, um iniciador e um mantenedor, que estão juntos dentro de um cilíndro metálico. A tensão cisalhante da ligação entre os dois tipos de propelentes é um atributo importante. Os resultados de testes envolvendo 20 motores aleatoriamente selecionados estão mostrados no seguinte script. Teste a hipótese de que a mediana da tensão cisalhante é 2000 psi (se desejar, utilize um nível de significância \(\alpha=5\%\)).

dados <- c(2158.70,1678.15,2316.00,2061.30,2207.50,
           1708.30,1784.70,2575.10,2357.90,2256.70,
           2165.20,2399.55,1779.80,2336.75,1765.30,
           2053.50,2414.40,2200.50,2654.20,1753.70)
m0 <- 2000
d <- dados-m0
df <- subset(data.frame(Dados=dados,d=d),subset=(d!=0))
sinal <- NULL;n <- nrow(df)[1]
for(i in 1:n){if(df$d[i]>0){sinal[i] <- 1}else{sinal[i] <- -1}}
df$Sinal <- sinal
df
##      Dados       d Sinal
## 1  2158.70  158.70     1
## 2  1678.15 -321.85    -1
## 3  2316.00  316.00     1
## 4  2061.30   61.30     1
## 5  2207.50  207.50     1
## 6  1708.30 -291.70    -1
## 7  1784.70 -215.30    -1
## 8  2575.10  575.10     1
## 9  2357.90  357.90     1
## 10 2256.70  256.70     1
## 11 2165.20  165.20     1
## 12 2399.55  399.55     1
## 13 1779.80 -220.20    -1
## 14 2336.75  336.75     1
## 15 1765.30 -234.70    -1
## 16 2053.50   53.50     1
## 17 2414.40  414.40     1
## 18 2200.50  200.50     1
## 19 2654.20  654.20     1
## 20 1753.70 -246.30    -1
rp <- sum(subset(df,subset=Sinal>0,select=Sinal))
rn <- sum(subset(df,subset=Sinal<0,select=Sinal))
c(rp,rn)
## [1] 14 -6
z <- (rp-(n/2))/sqrt(n/4);z
## [1] 1.788854

Para realizar o teste do sinal, basta usar a função binom.test().

rp
## [1] 14
n
## [1] 20
out <- binom.test(x=rp,n=n,p=0.5,alternative="two.sided",conf.level=0.95)
out
## 
##  Exact binomial test
## 
## data:  rp and n
## number of successes = 14, number of trials = 20, p-value = 0.1153
## alternative hypothesis: true probability of success is not equal to 0.5
## 95 percent confidence interval:
##  0.4572108 0.8810684
## sample estimates:
## probability of success 
##                    0.7

Não rejeitamos a hipótese nula \(H_{0}\) (veja o p-valor igual a \(0.1153\)). Portanto, não existem evidências experimentais que a mediana da tensão cisalhante é diferente de 2000 psi.

2.5 O teste dos postos sinalizados de Wilcoxon para a mediana populacional: teste não-paramétrico

Problema. Considere o mesmo problema da seção anterior.

dados <- c(2158.70,1678.15,2316.00,2061.30,2207.50,
           1708.30,1784.70,2575.10,2357.90,2256.70,
           2165.20,2399.55,1779.80,2336.75,1765.30,
           2053.50,2414.40,2200.50,2654.20,1753.70)
m0 <- 2000
d <- dados-m0
D <- abs(d)
df <- subset(data.frame(Dados=dados,d=d,D=D),subset=(d!=0))
R <- rank(df$D,ties.method="average")
sinal <- NULL;n <- nrow(df)[1]
for(i in 1:n){if(df$d[i]>0){sinal[i] <- 1}else{sinal[i] <- -1}}
df$Sinal <- sinal
df$R <- R
df$PostoSinalizado <- sinal*R
df
##      Dados       d      D Sinal  R PostoSinalizado
## 1  2158.70  158.70 158.70     1  3               3
## 2  1678.15 -321.85 321.85    -1 14             -14
## 3  2316.00  316.00 316.00     1 13              13
## 4  2061.30   61.30  61.30     1  2               2
## 5  2207.50  207.50 207.50     1  6               6
## 6  1708.30 -291.70 291.70    -1 12             -12
## 7  1784.70 -215.30 215.30    -1  7              -7
## 8  2575.10  575.10 575.10     1 19              19
## 9  2357.90  357.90 357.90     1 16              16
## 10 2256.70  256.70 256.70     1 11              11
## 11 2165.20  165.20 165.20     1  4               4
## 12 2399.55  399.55 399.55     1 17              17
## 13 1779.80 -220.20 220.20    -1  8              -8
## 14 2336.75  336.75 336.75     1 15              15
## 15 1765.30 -234.70 234.70    -1  9              -9
## 16 2053.50   53.50  53.50     1  1               1
## 17 2414.40  414.40 414.40     1 18              18
## 18 2200.50  200.50 200.50     1  5               5
## 19 2654.20  654.20 654.20     1 20              20
## 20 1753.70 -246.30 246.30    -1 10             -10
wp <- sum(subset(df,subset=PostoSinalizado>0,select=PostoSinalizado))
wn <- abs(sum(subset(df,subset=PostoSinalizado<0,select=PostoSinalizado)))
c(wp,wn)
## [1] 150  60
z <- (wp-(n*(n+1)/4))/sqrt(n*(n+1)*(2*n+1)/24);z
## [1] 1.67997

Para realizar o teste dos postos sinalizados de Wilcoxon, basta usar a função wilcox.test().

wilcox.test(dados,alternative="two.sided",mu=2000,exact=TRUE,conf.int=TRUE,conf.level=0.95)
## 
##  Wilcoxon signed rank exact test
## 
## data:  dados
## V = 150, p-value = 0.09731
## alternative hypothesis: true location is not equal to 2000
## 95 percent confidence interval:
##  1982.50 2286.35
## sample estimates:
## (pseudo)median 
##        2138.05
wilcox.test(dados,alternative="two.sided",mu=2000,exact=FALSE,correct=FALSE,conf.int=TRUE,conf.level=0.95)
## 
##  Wilcoxon signed rank test
## 
## data:  dados
## V = 150, p-value = 0.09296
## alternative hypothesis: true location is not equal to 2000
## 95 percent confidence interval:
##  1982.50 2286.35
## sample estimates:
## (pseudo)median 
##       2138.277
wilcox.test(dados,alternative="two.sided",mu=2000,exact=FALSE,correct=TRUE,conf.int=TRUE,conf.level=0.95)
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  dados
## V = 150, p-value = 0.09665
## alternative hypothesis: true location is not equal to 2000
## 95 percent confidence interval:
##  1982.50 2286.35
## sample estimates:
## (pseudo)median 
##       2138.277

Os resultados do teste dos postos sinalizados de Wilcoxon estão em concordância com os resultados do teste do sinal.