Exercício 99¶
Em redes congestionadas, o número de perdas por segundo pode seguir Poisson. Justifique essa escolha de modelo.
A distribuição de Poisson é adequada para modelar eventos discretos, raros e independentes, que ocorrem em um intervalo fixo de tempo ou espaço. Em redes congestionadas, mesmo que as perdas aumentem, o número de pacotes perdidos por segundo ainda é, em geral, muito menor que o número total de pacotes transmitidos, ou seja, $P \gg \lambda$, com $\lambda$ representando a taxa média de perdas. Quando temos:- um número elevado de tentativas $n$
- cada tentativa com probabilidade de perda $p$ pequena
- e o produto $\lambda = n \cdot p$ constante
Exercício 100¶
Um sensor gera pacotes com taxa média de 2 por segundo. Modele o número de pacotes por segundo com uma distribuição adequada e represente graficamente.
Vamos aplicar a distribuição de Poisson, onde $k$ é o número de pacotes: $X \sim \text{Poisson}(\lambda = 2)$ A função de probabilidade é: $P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}$$P(X = k) = \frac{2^k e^{-2}}{k!}, \quad k = 0, 1, 2, \dots$
Exercício 101¶
Para a variável do exercício 100, qual a esperança e a variância?
A variável aleatória $X \sim \text{Poisson}(\lambda)$ possui função de massa de probabilidade dada por:$P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad \text{para } k = 0, 1, 2, \dots$
O valor esperado é:$E[X] = \sum_{k=0}^{\infty} k \cdot \frac{\lambda^k e^{-\lambda}}{k!}$
Com mudança de índice e manipulação algébrica, obtém-se: $E[X] = \lambda$
A variância é dada por: $\text{Var}(X) = E[X^2] - (E[X])^2$Sabendo que: $E[X^2] = \lambda^2 + \lambda$
Logo: $$ \text{Var}(X) = \lambda $$
Demonstração: $E[X^2] = \sum_{k=0}^{\infty} k^2 \cdot \frac{\lambda^k e^{-\lambda}}{k!}$Note que $k^2 = k(k-1) + k$. Assim: $E[X^2] = \sum_{k=0}^{\infty} [k(k-1) + k] \cdot \frac{\lambda^k e^{-\lambda}}{k!} = T_1 + T_2$
Onde:
- $T_1 = \sum_{k=0}^{\infty} k(k-1) \cdot \frac{\lambda^k e^{-\lambda}}{k!} = \lambda^2$
- $T_2 = \sum_{k=0}^{\infty} k \cdot \frac{\lambda^k e^{-\lambda}}{k!} = E[X] = \lambda$
Portanto: $$ E[X^2] = \lambda^2 + \lambda $$
E: $$ \text{Var}(X) = \lambda^2 + \lambda - \lambda^2 = \lambda $$
$$ \Rightarrow \text{Var}(X) = E[X] $$Exercício 102¶
Uma interface sem fio transmite pacotes com probabilidade de sucesso $p = 0.95$. Para $n = 10$ transmissões, modele a variável $X$ como o número de pacotes recebidos com sucesso.
- Se há $p$ a distribição é binomial $X ~Bin (n, p)$ /span>
- Variável Aleatória $X$ é número de pacotes recebidos com sucesso $n=10$ com probabilidade $p=0.9$
- Isso deve levar a distribuição para assimétrica a direita com alta probabilidade de sucesso para k =10
Modelamos como:
$ X \sim \text{Bin}(10, 0.95), \qquad P(X = k) = \binom{10}{k}0.95^k (0.05)^{10-k}, \quad k = 0,1,2,3... 10$
---
# Instale os pacotes se necessário
# install.packages("base64enc")
# install.packages("IRdisplay")
library(base64enc)
library(IRdisplay)
# Parâmetros da binomial
n <- 10
p <- 0.95
k <- 0:n
y <- dbinom(k, size = n, prob = p)
# img_path do arquivo PNG
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n10_p95.png"
# Gerar o gráfico e salvar (em silêncio)
invisible({
png(img_path, width = 700, height = 400)
barplot(y,
names.arg = k,
col = "steelblue",
ylim = c(0, max(y) + 0.05),
main = "Distribuição Binomial (n = 10, p = 0.95)",
xlab = "Número de sucessos (k)",
ylab = "P(X = k)")
invisible(dev.off())
})
# Codificar imagem como base64
invisible(img_b64 <- dataURI(file = img_path, mime = "image/png"))
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição binomial $B(10, 0.95)$ da variável $X$, que representa o número de sucessos em dez tentativas independentes.
A probabilidade concentra-se nos valores mais próximos de $k = 10$, refletindo a alta probabilidade de sucesso em cada tentativa.
Isso resulta em uma distribuição assimétrica à esquerda, com baixa probabilidade para valores pequenos de $k$.
</div>
</div>
', img_b64))
Exercício 103¶
Uma fila de espera em um roteador recebe em média $\lambda = 3$ requisições por segundo. Modele o número de chegadas por segundo
$\quad$
- Se há $\lambda$, a distribuição é de Poisson: $X \sim \text{Pois}(\lambda)$
- Variável Aleatória $X$ representa o número de pacotes recebidos por segundo com taxa média $\lambda = 3$
- Distribuição discreta, com maior concentração de probabilidade em torno de $k = 3$
Modelamos como:
$X \sim \text{Pois}(3), \qquad P(X = k) = \frac{3^k e^{-3}}{k!}, \quad k = 0,1,2,\cdots, 10 $
Exercício 104¶
Um firewall analisa $n = 20$ conexões. Cada conexão tem $p = 0.1$ de ser considerada maliciosa. Modele o número de conexões maliciosas:
$\quad$
- Se há $p$ a distribição é binomial $X ~Bin (n, p)$
- Variável Aleatória $X$ é número de pacotes recebidos com sucesso $n=20$ com probabilidade $p=0.1$
- Isso deve levar a distribuição para assimétrica a esquerda com baixa probabilidade de sucesso para k=20 =10
Modelamos como:
$ X \sim \text{Bin}(20, 0.1), \qquad P(X = k) = \binom{20}{k}0.1^k (0.9)^{20-k}, \quad k = 0,1,2,3... 10$
# Carregar bibliotecas necessárias
library(base64enc)
library(IRdisplay)
# Parâmetros da distribuição binomial
n <- 20
p <- 0.1
k <- 0:n
y <- dbinom(k, size = n, prob = p)
# img_path para salvar a figura
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n20_p01.png"
# Gerar e salvar o gráfico (modo silencioso)
invisible({
png(img_path, width = 700, height = 400)
barplot(y,
names.arg = k,
col = "steelblue",
ylim = c(0, max(y) + 0.02),
main = "Distribuição Binomial (n = 20, p = 0.1)",
xlab = "Número de sucessos (k)",
ylab = "P(X = k)")
invisible(dev.off())
})
# Codificar imagem como base64
invisible(img_b64 <- dataURI(file = img_path, mime = "image/png"))
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição binomial $B(20, 0.1)$ da variável $X$, que representa o número de sucessos em vinte tentativas independentes.
A probabilidade concentra-se nos valores próximos de $k = 2$, que corresponde à média $np = 2$.
A baixa probabilidade de sucesso em cada tentativa gera uma distribuição assimétrica à direita, com cauda estendida para valores maiores de $k$.
</div>
</div>
', img_b64))
Exercício 105¶
Um sensor de presença envia em média 2 alertas por hora. Modele o número de alertas por hora:
$\quad$
Se $\lambda$ é dado, muito provavelmente isto é uma distribuição de Poisson.
$X \sim \text{Pois}(\lambda)$
$P(X = k) = \dfrac{2^k e^{-2}}{k!}$
Exercício 106¶
Em um link óptico transmite-se $n = 30$ pacotes com taxa de erro de $p = 0.02$. Modele o número de pacotes com erro:
$\quad$
- $X∼\text{Bin}(30,0.02), P(X=k)=\binom{30} {k}(0.02)^{k}(1-0.02)^{30-k}, k=0,1,2,…,30$
# Instale os pacotes se necessário
# install.packages("base64enc")
# install.packages("IRdisplay")
library(base64enc)
library(IRdisplay)
# Parâmetros da binomial
n <- 30
p <- 0.02
k <- 0:n
y <- dbinom(k, size = n, prob = p)
# img_path para salvar o gráfico
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n30_p02.png"
# Gerar e salvar a figura (sem ruído)
invisible({
png(img_path, width = 700, height = 400)
barplot(y,
names.arg = k,
col = "steelblue",
ylim = c(0, max(y) + 0.02),
main = "Distribuição Binomial (n = 30, p = 0.02)",
xlab = "Número de sucessos (k)",
ylab = "P(X = k)")
invisible(dev.off())
})
# Codificar em base64
invisible(img_b64 <- dataURI(file = img_path, mime = "image/png"))
# Exibir centralizado (vertical + horizontal)
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição binomial $B(30, 0.02)$ da variável $X$, que representa o número de sucessos em trinta tentativas independentes.
A probabilidade concentra-se fortemente em $k = 0$ e $k = 1$, refletindo a raridade do evento de sucesso.
A baixa taxa de sucesso provoca uma distribuição altamente assimétrica à direita, com valores grandes de $k$ apresentando probabilidades próximas de zero.
</div>
</div>
', img_b64))
Exercício 107¶
Um sistema de autenticação registra, em média, $\lambda = 5$ falhas de login por minuto em horário de pico. Modele o número de falhas por minuto:
$\quad$
$P(X=k)=\frac{5^{k}e^{-5}}{k!}$
Exercício 108¶
Em uma transmissão de dados, $n = 15$ pacotes são enviados com probabilidade de sucesso $p = 0.9$. Modele o número de sucessos:
$\quad$
# Instale os pacotes se necessário
# install.packages("base64enc")
# install.packages("IRdisplay")
library(base64enc)
library(IRdisplay)
# Parâmetros
n <- 15
p <- 0.9
k <- 0:n
y <- dbinom(k, size = n, prob = p)
# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n15_p09.png"
# Gerar e salvar a figura (silenciosamente)
invisible({
png(img_path, width = 700, height = 400)
barplot(y,
names.arg = k,
col = "steelblue",
ylim = c(0, max(y) + 0.05),
main = "Distribuição Binomial (n = 15, p = 0.9)",
xlab = "Número de sucessos (k)",
ylab = "P(X = k)")
invisible(dev.off())
})
# Codificar como base64
invisible(img_b64 <- dataURI(file = img_path, mime = "image/png"))
# Exibir centralizado vertical e horizontalmente
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição binomial $B(15, 0.9)$ da variável $X$, que representa o número de sucessos em quinze tentativas independentes.
A probabilidade concentra-se em valores próximos de $k = 14$ e $k = 15$, refletindo a alta taxa de sucesso por tentativa.
A distribuição apresenta assimetria à esquerda, com baixa probabilidade para valores pequenos de $k$.
</div>
</div>
', img_b64))
Exercício 109¶
Um servidor Web recebe, em média, $\lambda = 10$ requisições por segundo. Modele a variável que conta o número de requisições por segundo:
$\quad$
Exercício 110¶
Um sistema de compressão falha em $p = 0.05$ dos casos. Para $n = 40$ compressões, modele o número de falhas:
$\quad$
# Instale os pacotes se necessário
# install.packages("base64enc")
# install.packages("IRdisplay")
library(base64enc)
library(IRdisplay)
# Parâmetros da binomial
n <- 40
p <- 0.05
k <- 0:n
y <- dbinom(k, size = n, prob = p)
# img_path da figura
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n40_p05.png"
# Gerar e salvar figura silenciosamente
invisible({
png(img_path, width = 700, height = 400)
barplot(y,
names.arg = k,
col = "steelblue",
ylim = c(0, max(y) + 0.01),
main = "Distribuição Binomial (n = 40, p = 0.05)",
xlab = "Número de sucessos (k)",
ylab = "P(X = k)")
invisible(dev.off())
})
# Codificar como base64
invisible(img_b64 <- dataURI(file = img_path, mime = "image/png"))
# Exibir centralizado no notebook (horizontal e vertical)
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição binomial $B(40, 0.05)$ da variável $X$, que representa o número de sucessos em quarenta tentativas independentes.
A probabilidade concentra-se em valores próximos de $k = 2$, que corresponde à média $np = 2.0$.
A baixa taxa de sucesso provoca uma distribuição assimétrica à direita, com valores maiores de $k$ apresentando probabilidades muito pequenas.
</div>
</div>
', img_b64))
Exercício 111¶
O switch registra que 10% dos pacotes vêm da VLAN 10. Desses, 90% são legítimos. Nos demais, apenas 40% são legítimos.
✦ Tarefa extra: construa um diagrama (ex: árvore, gráfico de barras, ou Venn) que ajude a representar os eventos e probabilidades envolvidos.
# Carrega igraph silenciosamente e gerencia namespaces
suppressPackageStartupMessages({
suppressWarnings(
library(igraph, exclude = c("decompose", "spectrum", "union"))
)
}) # Fechando ambos os parênteses que estavam abertos
# Dados da árvore de probabilidade
edges <- data.frame(
from = c("Root", "Root", "VLAN10", "Outras"),
to = c("VLAN10", "Outras", "Legítimo_VLAN10", "Legítimo_Outras"),
label = c("10%", "90%", "90%", "40%")
)
# Rótulos dos nós
vertex_labels <- c(
"Root" = "Pacotes\n100%",
"VLAN10" = "VLAN10\n10%",
"Outras" = "Outras VLANs\n90%",
"Legítimo_VLAN10" = "Legítimos\n90%",
"Legítimo_Outras" = "Legítimos\n40%"
)
# Cores dos nós
vertex_colors <- c(
"Root" = "darkblue",
"VLAN10" = "orange",
"Outras" = "orange",
"Legítimo_VLAN10" = "lightgreen",
"Legítimo_Outras" = "lightgreen"
)
# Criar grafo
g <- graph_from_data_frame(edges)
# Caminho temporário da imagem
img_path <- tempfile(fileext = ".png")
# Salvar a árvore como PNG
png(img_path, width = 800, height = 500)
plot(
g,
layout = layout_as_tree(g, root = 1),
vertex.size = 35,
vertex.color = vertex_colors[names(V(g))],
vertex.label = vertex_labels[names(V(g))],
vertex.label.cex = 0.8,
vertex.label.color = "black",
edge.label = edges$label,
edge.label.cex = 0.9,
edge.label.color = "darkred",
edge.arrow.size = 0.4,
main = "Árvore de Probabilidade de Pacotes",
margin = c(0,0,0.2,0)
)
dev.off()
# Converter para Base64 (usando a função correta)
library(base64enc)
img_b64 <- base64encode(img_path)
# Texto final com imagem embutida
texto_md <- sprintf('
O switch registra que **10%%** dos pacotes vêm da VLAN 10.
Desses, **90%%** são legítimos.
Nos demais (**90%%** dos pacotes), apenas **40%%** são legítimos.
** Diagrama de Árvore Probabilística:**
<img src="data:image/png;base64,%s" width="600">
**Legenda:**
<ul>
<li><b>VLAN10 (10%%):</b> 90%% legítimos</li>
<li><b>Outras VLANs (90%%):</b> 40%% legítimos</li>
<li><b>Probabilidade total legítima:</b> (0.1 × 0.9) + (0.9 × 0.4) = <b>45%%</b></li>
</ul>
', img_b64)
# Exibir no notebook
library(IRdisplay)
display_markdown(texto_md)
O switch registra que 10% dos pacotes vêm da VLAN 10.
Desses, 90% são legítimos.
Nos demais (90% dos pacotes), apenas 40% são legítimos.
** Diagrama de Árvore Probabilística:**
Legenda:
- VLAN10 (10%): 90% legítimos
- Outras VLANs (90%): 40% legítimos
- Probabilidade total legítima: (0.1 × 0.9) + (0.9 × 0.4) = 45%
library(igraph)
library(base64enc)
library(IRdisplay)
# Dados da árvore
edges <- data.frame(
from = c("Pacotes", "Pacotes", "VLAN 10", "VLAN 10", "Outras VLANs", "Outras VLANs"),
to = c("VLAN 10", "Outras VLANs", "Legítimos VLAN 10", "Ilegítimos VLAN 10",
"Legítimos outras VLANs", "Ilegítimos outras VLANs")
)
# Rótulos com probabilidades
labels <- c(
"Pacotes",
"VLAN 10\n10%",
"Outras VLANs\n90%",
"Legítimos\n90%",
"Ilegítimos\n10%",
"Legítimos\n40%",
"Ilegítimos\n60%"
)
# Criar grafo
g <- graph_from_data_frame(edges)
# Caminho temporário da imagem
img_path <- tempfile(fileext = ".png")
# Salvar a árvore como PNG
png(img_path, width = 800, height = 500)
plot(
g,
layout = layout_as_tree(g, root = 1),
vertex.size = 35,
vertex.color = "lightblue",
vertex.label = labels,
vertex.label.cex = 0.8,
vertex.label.color = "black",
edge.arrow.size = 0.4
)
dev.off()
# Converter para Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Texto final com imagem embutida
texto_md <- sprintf('
O switch registra que **10%%** dos pacotes vêm da VLAN 10.
Desses, **90%%** são legítimos.
Nos demais (**90%%** dos pacotes), apenas **40%%** são legítimos.
**✦ Tarefa extra:** diagrama de árvore representando os eventos e probabilidades envolvidos.
<img src="%s" width="600">
', img_b64)
# Exibir no notebook
display_markdown(texto_md)
O switch registra que 10% dos pacotes vêm da VLAN 10.
Desses, 90% são legítimos.
Nos demais (90% dos pacotes), apenas 40% são legítimos.
✦ Tarefa extra: diagrama de árvore representando os eventos e probabilidades envolvidos.
Exercício 113¶
Uma rede possui dois enlaces redundantes: A e B. A entrega de pacotes depende de pelo menos um deles estar operacional. As estatísticas são:
- Enlace A falha com probabilidade $ P(F_A) = 0.02 $
- Enlace B falha com $ P(F_B) = 0.03 $
- As falhas são independentes
O SLA exige entrega em 99% dos casos ou mais.
✦ Perguntas:
1/2. Qual a probabilidade de pelo menos um dos enlaces funcionar e a rede cumpre o SLA** com essa configuração? Sim**?
Vamos primeiro montar o espaço amaostral para todos os casos Possiveis de A e B, on 0 e 1 são enlace em falha e em operação.A | B |
---|---|
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
Então o caso em em que ambos falham é $ P(F_A)\cap P(F_A) = P(F_A)\cdot P(F_B) = 0.02 \cdot 0.03 = 0.0006$
De modo que todos os outros 3 casos estão contemplados em $1-P(F_A)\cap P(F_A) = 1-0.0006 = 99.94\%$. Então, sim a rede cumpre o SLA com este provisionamento.
Exercício 114¶
Em uma rede 5G com agregação de portadoras, um usuário está conectado simultaneamente à banda n78 (3,5 GHz) e à banda n258 (26 GHz). Cada uma pode, independentemente, sofrer queda de sessão com probabilidade de 5%.
Pergunta:
Qual a probabilidade de o usuário sofrer interrupção total da sessão, considerando que ela continua ativa se ao menos uma banda estiver funcional?
✦ Tarefa extra:
Construa um diagrama de árvore de possibilidades, gráfico de barras ou diagrama de Venn que represente:
- os eventos de falha em cada banda,
- a probabilidade de cada cenário possível
N7 | N2 | P |
---|---|---|
0 | 0 | $0.5 \cdot 0.5= 0.0025$ |
0 | 1 | $0.5 \cdot 0.95=0.0475$ |
1 | 0 | $0.95\cdot0.5=0.0475$ |
1 | 1 | $0.95\cdot0.95=0.9025$ |
Então o caso em em que ambos falham é $ P(F_{N7}\cap F_{N2}) = 0.05 \cdot 0.05 = 0.0025\%$
De modo que todos os outros 3 casos estão contemplados em $1- P(F_{N7}\cap F_{N2}) = 1-0.0025= 99.75\%$.
Exercício 115¶
Um sistema de firewall avançado aplica 3 regras em sequência. Cada regra bloqueia com 10%, 15% e 5%, independentemente.
Tarefa extra: construa um diagrama (ex: árvore, gráfico de barras, ou Venn) que ajude a representar os eventos e probabilidades envolvidos.
Vamos ao espaço amostral e probabilidades R1, R2 e R3 são as aplicações das regras, 000 não bloqueia e 111 bloqueia todasR1 | R2 | R3 | Probabilidade |
---|---|---|---|
0 | 0 | 0 | 0,9 × 0,85 × 0,95 = 0,72675 |
0 | 0 | 1 | 0,9 × 0,85 × 0,05 = 0,03825 |
0 | 1 | 0 | 0,9 × 0,15 × 0,95 = 0,12825 |
0 | 1 | 1 | 0,9 × 0,15 × 0,05 = 0,00675 |
1 | 0 | 0 | 0,1 × 0,85 × 0,95 = 0,08075 |
1 | 0 | 1 | 0,1 × 0,85 × 0,05 = 0,00425 |
1 | 1 | 0 | 0,1 × 0,15 × 0,95 = 0,01425 |
1 | 1 | 1 | 0,1 × 0,15 × 0,05 = 0,00075 |
Exercício 116¶
Em um sistema de comunicação, 1% dos pacotes são perdidos na transmissão inicial. Quando isso ocorre, o sistema tenta uma retransmissão imediata, que tem 95% de chance de sucesso.
Pergunta:
Qual a probabilidade de um pacote precisar ser retransmitido e ainda assim ser perdido?
Tarefa extra:
Construa um diagrama de árvore de possibilidades ou um gráfico de barras que represente:
- $P = 1$: o pacote foi perdido na transmissão original
- $P = 0$: o pacote não foi perdido
- $R = 1$: o pacote foi retransmitido
- $R = 0$: o pacote não foi retransmitido
Sabemos que:
- $P(P = 1) = 0.01$ e $P(P = 0) = 0.99$
- $P(R = 1 \mid P = 0) = 0.05$
- $P(R = 1 \mid P = 1) = 0.95$
Vamos montar o espaço amostral e calcular as conjuntas usando:
- $P(0, 0) = P(P = 0) \cdot P(R = 0 \mid P = 0)$
- $P(0, 1) = P(P = 0) \cdot P(R = 1 \mid P = 0)$
- $P(1, 0) = P(P = 1) \cdot P(R = 0 \mid P = 1)$
- $P(1, 1) = P(P = 1) \cdot P(R = 1 \mid P = 1)$
Perdidos | Retransmitidos | $P(\text{marg}) \cdot P(\text{cond})$ | $P(\text{total})$ |
---|---|---|---|
0 | 0 | $0.99 \cdot 0.95$ | $0.9405$ |
0 | 1 | $0.99 \cdot 0.05$ | $0.0495$ |
1 | 0 | $0.01 \cdot 0.05$ | $0.0005$ |
1 | 1 | $0.01 \cdot 0.95$ | $0.0095$ |
A probabilidade de um pacote precisar ser retransmitido e ainda assim ser perdido é:
$$ P(P = 1 \cap R = 0) = \boxed{0.0005} $$Exercício 117¶
Um sistema de detecção de intrusão emite alerta com 98% de chance se há ataque, e 4% de falso positivo. A taxa de ataques reais é de 1%. Sabendo que o IDS emitiu um alerta, qual a probabilidade de realmente haver um ataque?
Espaço amostral
Ataque (A) | Alerta (L) | Probabilidade Conjunta |
---|---|---|
0 | 0 | 0.99 × 0.96 = 0.9504 |
0 | 1 | 0.99 × 0.04 = 0.0396 |
1 | 0 | 0.01 × 0.02 = 0.0002 |
1 | 1 | 0.01 × 0.98 = 0.0098 |
Cálculo:
$ P(A\mid L) = \frac{P(A \cap L)}{P(L)} = \frac{0.01 \times 0.98}{0.0396 + 0.0098} \;=\; 0.1984 \;=\; \boxed{19.84\%} $
Exercício 118¶
Dois sensores atuam independentemente na detecção de intrusos.
- O Sensor A acerta em 85% dos casos.
- O Sensor B acerta em 90% dos casos.
Considere que a presença de um intruso ocorre com probabilidade 0.5, e a ausência também com 0.5.
Cada sensor emite um alerta 1
(detecção) ou 0
(não detecção), e podem errar ou acertar independentemente.
Pergunta:
Liste todos os pares possíveis de saída dos sensores na forma (A, B) ∈ {0,1} × {0,1}
.
Vamos construir o espaço amostral, onde a coluna classe representa se há ou não intruso.
Linha | Classe | A | B | P(Classe) | $P(\text{marg}) \cdot P(\text{cond})$ | P(Conjunta) |
---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0.5 | 0.85 * 0.9 | 0.3825 |
2 | 0 | 0 | 1 | 0.5 | 0.85 * 0.1 | 0.0425 |
3 | 0 | 1 | 0 | 0.5 | 0.15 * 0.9 | 0.0675 |
4 | 0 | 1 | 1 | 0.5 | 0.15 * 0.1 | 0.0075 |
5 | 1 | 0 | 0 | 0.5 | 0.15 * 0.1 | 0.0075 |
6 | 1 | 0 | 1 | 0.5 | 0.15 * 0.9 | 0.0675 |
7 | 1 | 1 | 0 | 0.5 | 0.85 * 0.1 | 0.0425 |
8 | 1 | 1 | 1 | 0.5 | 0.85 * 0.9 | 0.3825 |
Sem saber a classe real, não conseguimos atribuir a probabilidade correta de saída dos sensores, pois a acurácia depende da classe.
A classe representa o balanceamento do dataset, ou seja, a proporção com que cada classe (por exemplo, "intruso" ou "sem intruso") aparece nos dados. Um dataset balanceado tem $ P(\text{Classe} = 0) = P(\text{Classe} = 1) = 0.5 $, por exemplo.
Para calcular a probabilidade conjunta completa, usamos:
$P(\text{Classe}, A, B) = P(\text{Classe}) \cdot P(A \mid \text{Classe}) \cdot P(B \mid \text{Classe})$
Portanto, sem conhecer ( P(\text{Classe}) ), não é possível calcular corretamente as probabilidades conjuntas, nem aplicar o Teorema de Bayes com rigor.
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
labels <- c(
"Classe=0, A=0, B=0", "Classe=0, A=0, B=1", "Classe=0, A=1, B=0", "Classe=0, A=1, B=1",
"Classe=1, A=0, B=0", "Classe=1, A=0, B=1", "Classe=1, A=1, B=0", "Classe=1, A=1, B=1"
)
probs <- c(0.3825, 0.0425, 0.0675, 0.0075, 0.0075, 0.0675, 0.0425, 0.3825)
df <- data.frame(Comb = factor(labels, levels = labels), Prob = probs)
# Gráfico (ggplot) — atribuir a 'p' para uso também no RGui
p <- ggplot(df, aes(x = Comb, y = Prob)) +
geom_col(fill = "skyblue") +
labs(title = "Distribuição Conjunta: Classe × A × B", x = NULL, y = "Probabilidade") +
scale_y_continuous(limits = c(0, 0.45)) +
coord_cartesian(clip = "off") +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.margin = margin(10, 10, 30, 10)
)
# Salvar e embutir em Base64 (para Jupyter)
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 9, height = 5, dpi = 130)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada (Jupyter)
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:1000px; margin:0 auto;">
<b>Figura:</b> distribuição conjunta de (Classe, A, B). As probabilidades somam 1.
A maior massa está nas combinações concordantes, (Classe=0, A=0, B=0) e (Classe=1, A=1, B=1), ambas com 0.3825.
Combinações discordantes têm menor probabilidade, refletindo alinhamento entre Classe e saídas dos sensores A e B.
</div>
</div>
', img_b64))
# Observação: no RGui/RStudio, basta executar `print(p)` para visualizar o gráfico.
Exercício 119 — Probabilidade de Disponibilidade em Redes Mesh¶
Em uma rede mesh, cada nó possui 90% de chance de estar disponível em um dado instante.
Considere dois nós distintos A e B , cujas disponibilidades são independentes.
Pergunta:
Qual a probabilidade de os dois nós estarem disponíveis ao mesmo tempo?
Considere dois nós independentes. As variáveis aleatórias $A$ e $B$ representam a disponibilidade de cada nó:
- $A = 1$: nó A disponível
- $A = 0$: nó A indisponível
- $B = 1$: nó B disponível
- $B = 0$: nó B indisponível
Sabemos que $P(A = 0) = 0.10$ e $P(A = 1) = 0.90$, e o mesmo vale para $B$.
Como os eventos são independentes, temos:
- $P(0, 0) = P(\bar{A}) \cdot P(\bar{B} \mid \bar{A})$
- $P(0, 1) = P(\bar{A}) \cdot P(B \mid \bar{A})$
- $P(1, 0) = P(A) \cdot P(\bar{B} \mid A)$
- $P(1, 1) = P(A) \cdot P(B \mid A)$
A tabela a seguir mostra os valores correspondentes:
A_disp | B_disp | $P(\text{marg}) \cdot P(\text{cond})$ | $P(\text{conj.})$ |
---|---|---|---|
0 | 0 | $P(\bar{A}) \cdot P(\bar{B} \mid \bar{A})$ | $0.01$ |
0 | 1 | $P(\bar{A}) \cdot P(B \mid \bar{A})$ | $0.09$ |
1 | 0 | $P(A) \cdot P(\bar{B} \mid A)$ | $0.09$ |
1 | 1 | $P(A) \cdot P(B \mid A)$ | $0.81$ |
A probabilidade de os dois nós estarem simultaneamente disponíveis é:
$$ P(A = 1 \cap B = 1) = \boxed{0.81} $$Exercício 120¶
Um sistema de replicação em nuvem envia cópias de cada pacote por dois img_paths distintos e independentes.
A probabilidade de perda em cada img_path é de 1%.
Um pacote só é considerado perdido se ambos os img_paths falharem simultaneamente.
✦ Tarefa extra:
Construa um diagrama (ex: árvore de probabilidades, gráfico de barras ou diagrama de Venn) que represente:
- Evento: "perda em um img_path"
- Evento: "recebimento em um img_path"
- Evento composto: "perda nos dois img_paths"
Vamos montar o espaço amostral e calcular as probabilidades conjuntas.
Assuma:
- $P(\text{perda}) = 0.01$
- $P(\text{recebimento}) = 0.99$
- Eventos nos img_paths A e B são independentes.
Considere dois img_paths independentes. As variáveis aleatórias ( A ) e ( B ) indicam o resultado da transmissão em cada img_path:
- ( A = 0 ): perda no img_path A
- ( A = 1 ): recebimento no img_path A
- ( B = 0 ): perda no img_path B
- ( B = 1 ): recebimento no img_path B
A probabilidade de perda em um img_path é ( P(\bar{A}) = P(\bar{B}) = 0.01 ), e de recebimento é ( P(A) = P(B) = 0.99 ).
Como os eventos são independentes, as probabilidades conjuntas podem ser calculadas como produto das marginais:
A | B | $P(\text{marg}) \cdot P(\text{marg})$ | $P(\text{conj.})$ |
---|---|---|---|
0 | 0 | $P(\bar{A}) \cdot P(\bar{B})$ | $0.0001$ |
0 | 1 | $P(\bar{A}) \cdot P(B)$ | $0.0099$ |
1 | 0 | $P(A) \cdot P(\bar{B})$ | $0.0099$ |
1 | 1 | $P(A) \cdot P(B)$ | $0.9801$ |
A perda total de um pacote ocorre apenas quando ambos os img_paths falham simultaneamente, isto é, ( A = 0 ) e ( B = 0 ). A probabilidade desse evento é:
$$ P(A = 0 \cap B = 0) = P(\bar{A} \cap \bar{B}) = \boxed{0.0001} $$Exercício 121¶
Uma conexão segura só é estabelecida se três etapas criptográficas independentes forem concluídas com sucesso.
Cada etapa tem probabilidade de sucesso igual a 0,99.
Falha em qualquer uma das etapas impede a conexão.
✦ Tarefa extra:
Construa um diagrama (ex: árvore de probabilidades, gráfico de barras ou diagrama de Venn) que represente:
- Evento: "sucesso em uma etapa"
- Evento: "falha em uma etapa"
- Evento composto: "todas as etapas com sucesso" (conexão segura estabelecida)
Indique as probabilidades envolvidas e destaque a probabilidade total de sucesso da conexão.
Vamos montar o espaço amaostral que terá 3 campos Fase 01, Fase 02 e Fase 03, 1 representa sucesso na criptografia e 0 insucesso.
F1|F2|F3| P(conjunta)| |---|---|---|---| 0|0|0|$0.01 * 0.01 * 0.01= 0.000001$| 0|0|1|$0.01 * 0.01 * 0.99= 0.000099$| 0|1|0|$0.01 * 0.99 * 0.01= 0.009801$| 0|1|1|$0.01 * 0.99 * 0.99= 0.000099$| 1|0|0|$0.99 * 0.01 * 0.01= 0.000099$| 1|0|1|$0.99 * 0.01 * 0.99= 0.009801$| 1|1|0|$0.99 * 0.99 * 0.01= 0.009801$| 1|1|1|$0.99 * 0.99 * 0.99= 0.970299$|
probabilidade total de sucesso da conexão é 0.970299
Exercício 122¶
O gráfico abaixo mostra a distribuição dos pacotes de rede por tipo de serviço.
Os valores numéricos de cada barra estão indicados explicitamente.
✦ Tarefas
- Quais são os eventos mutuamente exclusivos representados?
- Qual é a probabilidade de um pacote não ser interativo?
- Calcule a soma total das probabilidades. O que isso indica?
- Podemos considerar essa distribuição como uma função de probabilidade discreta?
- Supondo que maior proporção implique maior prioridade, qual serviço deve ser tratado com maior QoS (qualidade de serviço)?
- Interprete o valor da barra menor em termos de comportamento da rede (ex: largura de banda, latência).
Respostas:
- Interativo streaming e em lote
- 55%
- 1 - significa que todos os eventos estão representados, ou seja, representam completamente $\Omega$.
- sim. são valores finitos e não contínuos
- Interativo
- Streaming, aceita alguma latencia
library(base64enc)
library(IRdisplay)
# Caminho temporário da imagem
img_path <- tempfile(fileext = ".png")
# Salvar o gráfico
png(img_path, width = 700, height = 400)
tipos <- c("Interativo" = 0.45,
"Em Lote" = 0.35,
"Streaming" = 0.20)
b <- barplot(tipos,
col = "steelblue",
main = "Distribuição dos Pacotes por Tipo de Serviço",
ylab = "Probabilidade",
ylim = c(0, 0.5))
# Adiciona os valores no topo das barras
text(x = b,
y = tipos + 0.02,
labels = paste0(round(tipos * 100), "%"),
cex = 1,
font = 2)
dev.off()
# Converter para base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir no notebook com legenda
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição dos pacotes por tipo de serviço.
O tipo interativo concentra 45%% do total, seguido por processamento em lote com 35%% e transmissão em streaming com 20%%.
Os valores indicam a proporção de cada categoria em relação ao total de pacotes.
</div>
</div>
', img_b64))
Exercício 123 — Firewall e inferência bayesiana¶
Um firewall classifica pacotes de rede como suspeitos ou não suspeitos. Em uma amostra de tráfego inspecionado, observou-se a distribuição conjunta representado no gráfico:
- Calcule $P(\text{malicioso})$, $P(\text{suspeito})$
- Calcule $P(\text{malicioso} \mid \text{suspeito})$
Vamos montar o espaço amostral na Tabela 123 e calcular as conjuntas. 0 não malicioso/suspeito e 1 caso contrário:
Suspeito | Malicioso | P(conj.) |
---|---|---|
0 | 0 | 0.784 |
0 | 1 | 0.016 |
1 | 0 | 0.080 |
1 | 1 | 0.120 |
Só havendo estados suspeito e malicioso, podemos escrever que os eventos Suspeitos = Suspeito que é malicioso + Suspeito que não é malicioso, daí empregando também a aditividade das probabilidades $P(A\cup B) = P(A) + P(B)$ temos que:
$$ S= (S\cap M) \cup (S \cap \bar{M}) \implies P(S)= P(S\cap M) \cup P(S \cap \bar{M}) $$
Da tabela 123, temos $P(S)= P(S\cap M) \cup P(S \cap \bar{M}) \implies P(S) = 0.12 + 0.080 \implies P(S)= 0.2$
Da mesma forma $P(M) = 0.016+0.12 = 0.136$, e
$P(M \mid S) = \frac{P(S\cap M)}{P(M)} = \frac{0.12}{0.12+0.08} = 0.6$
library(base64enc)
library(IRdisplay)
# Caminho temporário para salvar a imagem
img_path <- tempfile(fileext = ".png")
# Salvar gráfico
png(img_path, width = 800, height = 500)
probs <- c(0.12, 0.08, 0.016, 0.784)
labels <- c("Suspeito e Malicioso", "Suspeito e Não Malicioso",
"Não Suspeito e Malicioso", "Não Suspeito e Não Malicioso")
# Cria o barplot sem rótulos no eixo X
bp <- barplot(probs,
names.arg = rep("", length(labels)),
col = "steelblue",
ylim = c(0, 0.8),
main = "Ameaça vs Realidade",
ylab = "Probabilidade")
# Adiciona os rótulos manualmente com rotação
text(x = bp,
y = par("usr")[3] - 0.03,
labels = labels,
srt = 45,
adj = 1,
xpd = TRUE,
cex = 0.8)
dev.off()
# Exibir embutido em base 64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Legenda no padrão
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> relação entre suspeita e ocorrência real de atividades maliciosas.
A maior parte dos casos (78.4%%) corresponde a eventos não suspeitos e não maliciosos.
Casos suspeitos e maliciosos representam 12%%, enquanto suspeitos e não maliciosos são 8%%.
Situações não suspeitas, mas maliciosas, somam 1.6%%.
</div>
</div>
', img_b64))
Exercício 124 — Atraso em rede LTE¶
Tarefas:
- Calcule $P(\text{atraso})$, $P(\text{urgente})$
- Calcule $P(\text{urgente} \mid \text{atraso})$
Vamos analisar a distribuição conjunta dos eventos Urgente (U) e Atraso (A), conforme a Tabela 124:
Urgente ($U$) | Atraso ($A$) | $P(U, A)$ |
---|---|---|
0 | 0 | 0.595 |
0 | 1 | 0.105 |
1 | 0 | 0.276 |
1 | 1 | 0.024 |
Utilizando a propriedade da aditividade para eventos disjuntos:
$$ P(A = 1) = P(A = 1 \cap U = 1) + P(A = 1 \cap U = 0) $$Substituindo os valores da tabela:
$$ P(A = 1) = 0.024 + 0.105 = 0.129 $$De forma análoga:
$$ P(U = 1) = 0.276 + 0.024 = 0.3 $$Aplicando a definição de probabilidade condicional:
$$ P(U = 1 \mid A = 1) = \frac{P(U = 1 \cap A = 1)}{P(A = 1)} = \frac{0.024}{0.129} \approx 0.186 $$library(base64enc)
library(IRdisplay)
# Caminho temporário da imagem
img_path <- tempfile(fileext = ".png")
# Salvar o gráfico
png(img_path, width = 800, height = 500)
probs <- c(0.30 * 0.08, 0.30 * 0.92, 0.70 * 0.15, 0.70 * 0.85)
labels <- c("Urgente+Atraso", "Urgente+Sem Atraso",
"Comum+Atraso", "Comum+Sem Atraso")
# Cria o barplot
bp <- barplot(probs,
names.arg = rep("", length(labels)),
col = "tomato",
las = 2,
main = "Atraso por Tipo de Pacote",
ylim = c(0, 0.6),
ylab = "Probabilidade")
# Adiciona rótulos
text(x = bp,
y = par("usr")[3] - 0.03,
labels = labels,
srt = 45,
adj = 1,
xpd = TRUE,
cex = 0.8)
dev.off()
# Exibir embutido em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Legenda no padrão
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> atraso por tipo de pacote. Pacotes urgentes com atraso representam %.3f da probabilidade total,
urgentes sem atraso %.3f, comuns com atraso %.3f e comuns sem atraso %.3f.
A distribuição evidencia que a maior parte dos pacotes é comum e sem atraso.
</div>
</div>
', img_b64, probs[1], probs[2], probs[3], probs[4]))
Exercício 125 — Avaliação probabilística de um IDS¶
O gráfico abaixo representa as probabilidades conjuntas entre a ocorrência (ou não) de um ataque e a emissão (ou não) de um alerta por um sistema de detecção de intrusão (IDS):
Perguntas:
Qual é a probabilidade de o IDS emitir um alerta?
$$ P(\text{alerta}) = ? $$Sabendo que um alerta foi emitido, qual é a probabilidade de se tratar de um ataque?
$$ P(\text{ataque} \mid \text{alerta}) = ? $$
Use apenas os valores do gráfico para justificar suas respostas.
Resposta:
Vamos analisar a distribuição conjunta dos eventos Ataque (At) e Alerta (Al), conforme a Tabela 124 e as fórmulas:
$P(\bar{At}) \cdot P(\bar{Al} \mid \bar{At})$
$P(\bar{At}) \cdot P(Al \mid \bar{At})$
$P(At) \cdot P(\bar{Al} \mid At)$
$P(At) \cdot P(Al \mid At)$
Ataque ($At$) | Alerta ($Al$) | $P(\text{marg}) \cdot P(\text{cond})$ | $P(\text{conj})$ |
---|---|---|---|
0 | 0 | $0.85 \cdot 0.95$ | $0.8075$ |
0 | 1 | $0.85 \cdot 0.05$ | $0.0425$ |
1 | 0 | $0.15 \cdot 0.10$ | $0.015$ |
1 | 1 | $0.15 \cdot 0.90$ | $0.135$ |
Cálculo da probabilidade marginal de alerta:
$$ P(\text{Al}) = P(\text{At} \cap \text{Al}) + P(\bar{\text{At}} \cap \text{Al}) = 0.135 + 0.0425 = \boxed{0.1775} $$Probabilidade condicional de ataque dado que houve alerta:
$$ P(\text{At} \mid \text{Al}) = \frac{P(\text{At} \cap \text{Al})}{P(\text{Al})} = \frac{0.135}{0.1775} \approx \boxed{0.76} $$library(ggplot2)
library(base64enc)
library(IRdisplay)
# Caminho temporário para salvar a imagem
img_path <- tempfile(fileext = ".png")
# Dados
probs <- c(0.15 * 0.90, 0.15 * 0.10, 0.85 * 0.05, 0.85 * 0.95)
labels <- c("Ataque Detectado", "Ataque Não Detectado",
"Normal com Alerta", "Normal sem Alerta")
df <- data.frame(
Categoria = labels,
Probabilidade = probs
)
# Salvar o gráfico
png(img_path, width = 800, height = 500)
ggplot(df, aes(x = Categoria, y = Probabilidade)) +
geom_col(fill = "orange") +
labs(title = "Resposta do IDS", y = "Probabilidade", x = NULL) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
dev.off()
# Exibir embutido em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# exibir embutido em base64
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> resposta do IDS. Ataques detectados correspondem a %.3f da probabilidade total,
ataques não detectados %.3f, tráfego normal com alerta %.3f e tráfego normal sem alerta %.3f.
A maior parte dos eventos corresponde a tráfego normal sem alerta.
</div>
</div>
', img_b64, probs[1], probs[2], probs[3], probs[4]))
Exercício 126 — Classificação de tráfego prioritário¶
Um sistema de filas diferencia pacotes como prioritários ou comuns, e registra se cada pacote foi entregue ou perdido. As probabilidades conjuntas entre classe e entrega são representadas no gráfico abaixo:
probs <- c(0.6 * 0.90, 0.6 * 0.10, 0.4 * 0.30, 0.4 * 0.70) labels <- c("Prioritário+Entrega", "Prioritário+Perda", "Comum+Entrega", "Comum+Perda") barplot(probs, names.arg = labels, col = "darkgreen", las = 2, main = "Entrega de Pacotes por Classe", ylab = "Probabilidade")
Com base no gráfico:
1. Calcule as probabilidades marginais:
2. Calcule a probabilidade condicional de o pacote ser prioritário, dado que foi entregue:
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Caminho temporário para salvar a imagem
img_path <- tempfile(fileext = ".png")
# Dados
probs <- c(0.6 * 0.90, 0.6 * 0.10, 0.4 * 0.30, 0.4 * 0.70)
labels <- c("Prioritário+Entrega", "Prioritário+Perda",
"Comum+Entrega", "Comum+Perda")
df <- data.frame(
Categoria = labels,
Probabilidade = probs
)
# Salvar o gráfico
png(img_path, width = 800, height = 500)
ggplot(df, aes(x = Categoria, y = Probabilidade)) +
geom_col(fill = "darkgreen") +
labs(title = "Entrega de Pacotes por Classe", y = "Probabilidade", x = NULL) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
dev.off()
# Converter para Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir embutido base 64
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> entrega de pacotes por classe. Pacotes prioritários entregues representam %.3f da probabilidade total,
prioritários perdidos %.3f, comuns entregues %.3f e comuns perdidos %.3f.
Observa-se predominância de entregas, especialmente na classe prioritária.
</div>
</div>
', img_b64, probs[1], probs[2], probs[3], probs[4]))
Exercício 127 — Sensores com sobreposição de eventos¶
Tarefas:
- Interprete a sobreposição dos sensores
- Calcule a probabilidade marginal e condicional
Interpretação¶
- A sobreposição dos sensores significa que falhas em A e falhas em B são eventos distintos, mas ambos contribuem para o evento "falha detectada".
- Como os sensores operam sobre diferentes servidores, os eventos são disjuntos, e a probabilidade de falha total é a soma das probabilidades das falhas individuais.
Probabilidade marginal de falha:¶
$$ P(\text{Falha}) = P(A \cap \text{Falha}) + P(B \cap \text{Falha}) = 0.40 \cdot 0.05 + 0.60 \cdot 0.02 = 0.020 + 0.012 = \boxed{0.032} $$Probabilidade condicional de falha em A dado que houve falha:¶
$$ P(A \mid \text{Falha}) = \frac{P(A \cap \text{Falha})}{P(\text{Falha})} = \frac{0.020}{0.032} = \boxed{0.625} $$- A probabilidade de qualquer falha ocorrer é $P(\text{Falha}) = 0.032$
- A probabilidade de que a falha tenha ocorrido em A, dado que houve falha, é $P(A \mid \text{Falha}) = 0.625$
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Caminho temporário para salvar a imagem
img_path <- tempfile(fileext = ".png")
# Dados de exemplo (substituir conforme necessário)
df <- data.frame(
Categoria = c("Servidor A", "Servidor B", "Servidor C", "Servidor D"),
Probabilidade = c(0.25, 0.15, 0.40, 0.20)
)
# Salvar o gráfico
png(img_path, width = 800, height = 500)
ggplot(df, aes(x = Categoria, y = Probabilidade)) +
geom_col(fill = "brown") +
labs(title = "Falhas por Servidor", y = "Probabilidade", x = NULL) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
dev.off()
# Exibir embutido base 64
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> distribuição de falhas por servidor. O Servidor A representa %.2f da probabilidade total de falhas,
o Servidor B %.2f, o Servidor C %.2f e o Servidor D %.2f.
A concentração de falhas no Servidor C sugere possível necessidade de manutenção preventiva ou investigação adicional.
</div>
</div>
', img_b64, df$Probabilidade[1], df$Probabilidade[2], df$Probabilidade[3], df$Probabilidade[4]))
Exercício 129 — Autenticação multifator¶
Considere um sistema de autenticação que utiliza dois fatores independentes, aplicados sequencialmente para validar a identidade de um usuário.
Cada fator possui a seguinte acurácia quando avalia um usuário legítimo:
- Evidência 1: $P(E_1 \mid C) = 0.96$
- Evidência 2: $P(E_2 \mid C) = 0.98$
Tarefas:
- Calcule a probabilidade conjunta de autenticação correta.
- Qual a chance de autenticação falhar?
Vamos aplicar neste exercício inferência bayesiana com independência condicional forte ou Naive Bayes.¶
Primeiro vamos definir o que é a Variável Aleatória $C$¶
Seja $C$ uma variável aleatória discreta que representa a classe do usuário submetido ao processo de autenticação.
O contradomínio (conjunto de valores possíveis) de $C$ é:
$$ \Omega_C = \{0,\ 1\} $$Interpretação das expressões¶
Expressão | Significado |
---|---|
$C = 1$ | Evento: “o usuário é legítimo” |
$P(C = 1)$ | Probabilidade de o usuário ser legítimo |
$C$ | A variável aleatória (sem valor fixado ainda) |
Distribuição de probabilidade a priori¶
A probabilidade a priori (ou simplesmente priori) é a probabilidade atribuída a um evento ou hipótese antes de se observar qualquer evidência. Aqui assumimos que não há informação prévia que favoreça legítimos ou impostores, portanto:
$$ P(C = 1) = 0.5, \quad P(C = 0) = 0.5 $$Essa distribuição será utilizada como priori de Bayes na inferência.
Objetivo da inferência¶
Seja $C$ a variável aleatória que representa a classe do usuário:
- $C = 1$: o usuário é legítimo (classe verdadeira)
- $C = 0$: o usuário é um impostor (classe falsa)
Considere os seguintes eventos:
- $E_1$: a evidência 1 aprova o usuário
- $E_2$: a evidência 2 aprova o usuário
- $E = E_1 \cap E_2$: ambos as evidências aprovam o usuário simultaneamente
Nosso objetivo é calcular:
$$ P(C = 1 \mid E) $$Essa quantidade é chamada de probabilidade a posteriori, pois representa a probabilidade de que o usuário seja legítimo, dado que ambas asevidências o aprovaram.
Teorema de Bayes¶
Utilizaremos o teorema de Bayes para calcular a posteriori:
$$ P(C = 1 \mid E) = \frac{P(E \mid C = 1) \cdot P(C = 1)}{P(E)} $$Onde:
- $P(C = 1)$ é a probabilidade a priori
- $P(E \mid C = 1)$ é a verossimilhança
- $P(E)$ é a evidência observada
- $P(C = 1 \mid E)$ é a posteriori, ou seja, a crença atualizada após observar $E$
$P(E)$ Evidência total¶
Queremos calcular a probabilidade de que ambas as evidências aprovam o usuário, independentemente da classe verdadeira (se é legítimo ou impostor). Então cuidado!!!
⚠️ Interpretação da frase "independentemente da classe"
Essa frase em teoria das probabilidades quer dizer: estamos nos referindo à probabilidade total de o evento $E = E_1 \cap E_2$ ocorrer, sem condicionar a nenhuma hipótese sobre o valor de $C$.
Ou seja: qualquer que seja a classe, ou ainda, levando em consideração todas as possíveis classes..
Essa probabilidade é chamada de evidência e corresponde a $P(E)$, onde:
- $E = E_1 \cap E_2$: ambos os fatores aprovaram
Pelo teorema da probabilidade total, temos:
$$ P(E) = P(E \mid C = 1) \cdot P(C = 1) + P(E \mid C = 0) \cdot P(C = 0), \text{ Aqui } P(C=0) \text{ pode ser reescrito como } P(\bar{C}) $$Substituindo os valores já conhecidos:
- $P(E \mid C = 1) = 0.96 \cdot 0.98 = 0.9408$
- $P(E \mid C = 0) = 0.04 \cdot 0.02 = 0.0008$
- $P(C = 1) = P(C = 0) = 0.5$
Portanto:
$$ P(E) = 0.9408 \cdot 0.5 + 0.0008 \cdot 0.5 = 0.4704 + 0.0004 = 0.4708 $$Agora precisamos calcular a posteriori:
$$ P(C = 1 \mid E) = \frac{P(E \mid C = 1) \cdot P(C = 1)}{P(E)} P(C = 1 \mid E)= \frac{0.9408 \cdot 0.5}{0.4708} = \boxed{99.915\%} $$Exercício 130 — Jitter em pacotes de voz¶
Em uma rede, 70% dos pacotes são de voz. O jitter ocorre com:
- 10% nos pacotes de voz
- 5% nos demais pacotes
Tarefas:
- Calcule a probabilidade de um pacote ter jitter.
- Calcule a probabilidade de ser voz dado que teve jitter.
Definições¶
- $V$: pacote é de voz
- $\bar{V}$: pacote não é de voz
- $J$: ocorre jitter
Probabilidades conhecidas¶
- $P(V) = 0.70$
- $P(\bar{V}) = 0.30$
- $P(J \mid V) = 0.10$
- $P(J \mid \bar{V}) = 0.05$
1. Probabilidade de jitter: $P(J)$¶
Aplicando a fórmula da probabilidade total:
$$ P(J) = P(J \mid V) \cdot P(V) + P(J \mid \bar{V}) \cdot P(\bar{V}) $$$$ P(J) = 0.10 \cdot 0.70 + 0.05 \cdot 0.30 = 0.07 + 0.015 = \boxed{0.085} $$2. Probabilidade de ser voz dado que houve jitter: $P(V \mid J)$¶
Pelo teorema de Bayes:
$$ P(V \mid J) = \frac{P(J \mid V) \cdot P(V)}{P(J)} = \frac{0.10 \cdot 0.70}{0.085} = \frac{0.07}{0.085} = \boxed{0.8235} $$Conclusão¶
- A probabilidade de um pacote ter jitter é $P(J) = 0.085$
- A probabilidade de ser pacote de voz dado que teve jitter é $P(V \mid J) = 0.8235$
Durante uma análise de latência em redes 5G, um engenheiro coletou uma amostra de 10 medições com média de 21 ms, enquanto o valor real da média populacional conhecida é 20 ms.
Tarefas:
- Calcule o erro amostral.
- Explique a diferença entre erro amostral e erro residual no contexto dessa rede.
Erro amostral:
$E_{\bar{x}} = \bar{x} - \mu = 21 - 20 = 1\ \text{ms}$
A interpretação desse resultado destaca que, ao considerar a população completa (todas as possíveis medições), qualquer subconjunto extraído (isto é, uma amostra) pode apresentar um desvio em relação à média verdadeira — este desvio é o erro amostral.
Enquanto o erro amostral é a diferença entre a média de uma amostra e a média real da população, o erro residual é a diferença entre um valor observado e o valor previsto por um modelo de ajuste. Ou seja, ele mede o quanto cada observação individual se afasta da predição do modelo.
Erro residual:
$e_i = y_i - \hat{y}_i$
Já o erro padrão da média, denotado por $\sigma_{\bar{x}}$, representa a variabilidade esperada do erro amostral $E_{\bar{x}}$ ao longo de várias amostras. Ele é dado por:
$\sigma_{\bar{x}} = \dfrac{\sigma}{\sqrt{n}}$
Esse erro padrão é utilizado para construir intervalos de confiança para a média populacional. Quando a distribuição da média amostral é aproximadamente normal, temos:
$\bar{x} \pm z \cdot \dfrac{\sigma}{\sqrt{n}}$
Quando $\sigma$ não é conhecido, usamos o desvio padrão amostral $s$ no lugar de $\sigma$.
Abaixo, temos um gráfico que representa os valores de $z$ que delimitam a área central da curva normal padrão, de forma a conter 90% ou 95% da distribuição. Esses valores de $z$ são usados para construir intervalos de confiança para a média amostral, garantindo que, com 90% ou 95% de confiança, a média populacional esteja dentro do intervalo calculado a partir da amostra.
library(ggplot2)
library(gridExtra)
library(base64enc)
library(IRdisplay)
# Função para gerar gráfico com curva normal e intervalo sombreado com cores customizáveis
plot_z_conf <- function(z, conf_level, curva_color, sombra_color) {
x <- seq(-4, 4, length.out = 1000)
y <- dnorm(x)
df <- data.frame(x = x, y = y)
shade <- subset(df, x >= -z & x <= z)
ggplot(df, aes(x, y)) +
geom_line(color = curva_color, linewidth = 1.2) +
geom_area(data = shade, aes(x, y), fill = sombra_color, alpha = 0.4) +
geom_vline(xintercept = c(-z, z), linetype = "dashed", color = "gray40") +
labs(
title = paste("Intervalo de Confiança", conf_level, "%"),
subtitle = paste("z = ±", z),
x = "z", y = "densidade"
) +
theme_minimal(base_size = 13)
}
# Criar os dois gráficos com cores distintas
g90 <- plot_z_conf(1.64, 90, curva_color = "darkgreen", sombra_color = "lightgreen")
g95 <- plot_z_conf(1.96, 95, curva_color = "navy", sombra_color = "skyblue")
# Salvar imagem temporária com os dois gráficos lado a lado
tmpfile <- tempfile(fileext = ".png")
png(tmpfile, width = 1200, height = 500, res = 100)
grid.arrange(g90, g95, ncol = 2)
dev.off()
# Converter para base64
img_b64 <- dataURI(file = tmpfile, mime = "image/png")
# Exibir centralizado no notebook
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> comparação dos intervalos de confiança de 90%% e 95%% sob a curva normal padrão.
O intervalo de 95%% (à direita) é mais amplo, refletindo maior nível de confiança à custa de um maior valor crítico de $z$.
O intervalo de 90%% (à esquerda) é mais estreito, resultando em menor valor crítico e menor cobertura.
</div>
</div>
', img_b64))
Exercício 132 — Erros residuais em gráficos de dispersão¶
A latência (em milissegundos) foi medida em função da carga da rede (%). Os dados são os seguintes:
# Dados observados
carga <- c(10, 20, 30, 40, 50, 60, 70)
latencia <- c(20, 23, 26, 27, 33, 35, 36)
# Ajuste do modelo de regressão linear
modelo <- lm(latencia ~ carga)
# Cálculo dos valores ajustados (estimados) e dos resíduos
valores_estimados <- predict(modelo)
residuos <- resid(modelo)
# Combinar os resultados em um data frame para visualização
resultado <- data.frame(
Carga = carga,
Latencia_Observada = latencia,
Latencia_Estimada = round(valores_estimados, 2),
Erro_Residual = round(residuos, 2)
)
Tarefas:
- Identifique visualmente onde os resíduos são positivos ou negativos.
Resíduos={-0.11, 0.07, 0.25, -1.57, 1.61, 0.79, -1.04}
- Interprete o significado desses resíduos no contexto de desempenho da rede.
Os resíduos representam a diferença entre os valores observados de latência e os valores estimados pela reta de regressão. Valores positivos indicam que a latência real foi maior do que o estimado, enquanto valores negativos indicam o contrário. No gráfico, observa-se uma tendência geral crescente da latência com a carga — o que evidencia uma correlação positiva entre as variáveis. Apesar disso, há variações individuais: por exemplo, para cargas de 50%, 60% e 70%, a latência observada é bem maior que a prevista, resultando em resíduos positivos altos.
Isso pode indicar que o modelo linear está subestimando a latência em níveis mais altos de carga. Já para carga de 10% e 40%, temos subestimação e leve superestimação, respectivamente. Essa análise sugere que, embora a regressão linear capture bem a tendência geral, há sinais de não linearidade ou heterocedasticidade que poderiam ser explorados com análises adicionais (como testes de normalidade dos resíduos ou análise de variância).
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
carga <- c(10, 20, 30, 40, 50, 60, 70)
latencia <- c(20, 23, 26, 27, 33, 35, 36)
modelo <- lm(latencia ~ carga)
df <- data.frame(carga, latencia)
# Caminho temporário para salvar
img_path <- tempfile(fileext = ".png")
# Salvar o gráfico
png(img_path, width = 800, height = 500)
ggplot(df, aes(x = carga, y = latencia)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE, formula = y ~ x, color = "blue") +
geom_segment(aes(xend = carga, yend = predict(modelo)),
color = "red", linetype = "dashed") +
labs(title = "Latência vs Carga da Rede",
x = "Carga (%)",
y = "Latência (ms)")
dev.off()
# Converter para Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> relação entre carga da rede e latência.
Os pontos representam as observações medidas, a linha azul mostra o ajuste por regressão linear
e as linhas tracejadas vermelhas indicam os resíduos de cada ponto em relação ao modelo ajustado.
O gráfico evidencia tendência de aumento da latência conforme cresce a carga da rede.
</div>
</div>
', img_b64))
Exercício 133 — Gerar gráfico de resíduos¶
Considere as seguintes observações reais e previstas da perda de pacotes (%):
real <- c(0.2, 0.5, 0.8, 0.3, 0.6)
previsto <- c(0.3, 0.4, 0.7, 0.2, 0.5)
Tarefas:
- Calcule os resíduos.
{-0.1, 0.1, 0.1, 0.1, 0.1}
- Gere um gráfico de barras com
ggplot2
comparando os valores reais, previstos e resíduos.
library(ggplot2)
library(base64enc)
library(IRdisplay)
# 1. Primeiro, precisamos criar o df_long que está faltando
# Exemplo com dados simulados:
set.seed(123)
df_long <- data.frame(
Observação = rep(1:5, 3),
Valor = c(rnorm(5, mean=10), # Valores reais
rnorm(5, mean=9.8), # Valores previstos
rnorm(5, mean=0.2)), # Resíduos
Tipo = rep(c("Real", "Previsto", "Resíduo"), each=5)
)
# 2. Agora podemos criar o gráfico
p <- ggplot(df_long, aes(x = factor(Observação), y = Valor, fill = Tipo)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
scale_fill_manual(values = c("steelblue", "orange", "firebrick")) +
labs(title = "Comparação: Valores Reais, Previstos e Resíduos",
x = "Observação", y = "Valor") +
theme_minimal()
# 3. Salvar e exibir o gráfico
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 100)
img_b64 <- base64encode(img_path) # Corrigido para usar base64enc
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="data:image/png;base64,%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> comparação entre os valores reais, previstos e os resíduos (diferença entre eles)
para cinco observações. A visualização permite identificar a precisão da previsão: resíduos menores
indicam maior aderência do modelo aos dados reais.
</div>
</div>
', img_b64))
# Limpeza (opcional)
unlink(img_path)
Exercício 134 — Intervalo de confiança da latência média¶
Em uma rede Wi-Fi pública, a média amostral de latência foi 50 ms, com desvio padrão 8 ms, a partir de 36 medições.
Tarefas:
- Construa um intervalo de confiança de 95% para a média.
Intervalo de confiança:
$IC = \bar{x} \pm z \cdot \frac{s}{\sqrt{n}}$
$z=1.96 \implies IC= 50 \pm z\cdot \frac{8}{\sqrt{36}}$
$ = 1.96 \cdot 1.333 \approx 2.613$
Resultado final:
$$ IC = [47.39, 52.61] $$#Função para execução no R
intervalo_confianca <- function(x_bar, s, n, z) {
erro_padrao <- s / sqrt(n)
margem <- z * erro_padrao
c(inferior = x_bar - margem, superior = x_bar + margem)
}
Exercício 135 — Interpretar gráfico de intervalos de confiança¶
Em 10 sub-redes diferentes, foram construídos intervalos de confiança de 95% para a latência média. O valor real da média populacional é $52$ ms.
Tarefas:
- Quantos intervalos não incluem a média real de 52 ms?
7
- O que isso sugere sobre o nível de confiança?
Isso pode ter várias causas possíveis:
- Subestimação do erro padrão (desvio padrão usado na fórmula menor que o real);
- Viés no processo de amostragem, gerando amostras não representativas da população;
- Número pequeno de amostras, o que pode levar a flutuações aleatórias naturais;
- Ou ainda, uma violação dos pressupostos do modelo (como normalidade ou independência).
De toda forma, a interpretação mais direta é:
O método de construção dos intervalos, conforme aplicado, não está garantindo o nível de confiança prometido.
# Carregar bibliotecas
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Gerar dados
set.seed(135)
media_real <- 52
n <- 10
medias <- rnorm(n, mean = media_real, sd = 2)
erro <- 1.96 * 2 / sqrt(30)
# Criar data frame
df <- data.frame(
id = 1:n,
media = medias,
lower = medias - erro,
upper = medias + erro
)
# Gerar gráfico
p <- ggplot(df, aes(x = id, y = media)) +
geom_point(size = 2) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
geom_hline(yintercept = media_real, color = "red", linetype = "dashed") +
labs(title = "Intervalos de Confiança (95%) para Latência Média",
x = "Sub-rede", y = "Latência (ms)") +
theme_minimal()
# Salvar imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, plot = p, width = 8, height = 5, dpi = 100)
# Codificar para base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir no notebook com legenda
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
<b>Figura:</b> intervalo de confiança de 95%% para a média da latência em diferentes sub-redes.
A linha tracejada vermelha representa o valor real de referência ($\\mu = %.0f$ ms).
Barras que não cruzam essa linha indicam estimativas estatisticamente diferentes da média real.
</div>
</div>
', img_b64, media_real))
Exercício 136 — Variação do intervalo com o tamanho da amostra¶
Em uma rede FTTH (Fiber to the Home), é esperado que a latência média se mantenha em torno de 15 ms, com baixa variabilidade. Isso ocorre devido à estabilidade característica das conexões por fibra óptica, que oferecem baixa interferência eletromagnética e alta capacidade de transmissão.
No entanto, fatores como congestionamento na OLT, uso simultâneo em horário de pico e variações na infraestrutura local podem impactar as medições.
A tabela a seguir mostra médias amostrais e desvios observados para diferentes tamanhos de amostra:
$n$ | $\bar{x}$ (ms) | $s$ (ms) |
---|---|---|
10 | 14.5 | 2.3 |
30 | 14.9 | 2.0 |
100 | 15.1 | 1.7 |
Tarefas:
- Calcule o erro padrão para cada linha usando a fórmula:
$$ \sigma_{\bar{x}} = \frac{s}{\sqrt{n}} $$
- Calcule o intervalo de confiança de 95% para a média, usando:
$$ IC = \bar{x} \pm z \cdot \frac{s}{\sqrt{n}}, \quad \text{com } z = 1.96 $$
- Comente o que ocorre com a largura do intervalo à medida que $n$ aumenta.
A medida que n aumenta o IC diminui, então se temos mais amostras a confiança de que a média amostral está próxima da média populacional aumenta
Exercício 137 — Interpretação do Erro Padrão¶
Em uma rede LTE, medições de latência geraram os seguintes dados:
- Média amostral: $\bar{x} = 48$ ms
- Desvio padrão populacional: $\sigma = 6$ ms
- Tamanho da amostra: $n = 36$
Tarefas:
Calcule o erro padrão da média:
$$ \text{Erro padrão} = \frac{\sigma}{\sqrt{n}} = \frac{6}{\sqrt{36}} = \frac{6}{6} = 1\ \text{ms} $$Construa o intervalo de confiança de 95% para a média populacional (assumindo distribuição normal):
$$ IC_{95\%} = \bar{x} \pm z \cdot \text{EP} = 48 \pm 1.96 \cdot 1 = [46.04,\ 49.96] $$
Exercício 138 — Cálculo de z-score em perdas de pacotes¶
Durante testes de estresse, a perda média de pacotes em uma rede foi de $\mu = 1.5\%$ com desvio padrão $\sigma = 0.4\%$. Um dos testes resultou em uma perda de $2.4\%$.
Tarefas:
- Calcule o z-score dessa observação.
- Esse valor pode ser considerado fora do comportamento esperado?
O z-score de uma observação: mede quantos desvios padrão uma observação $x$ está distante da média $\mu$.
Levando em consideração que quanto maior o z-score mais distante o ponto está distante da média, então 2.25 está a 2.25 desvios padrão da média populacional
Exercício 139 — Z-score em medidas de latência¶
Durante testes em uma rede Wi-Fi, a latência média registrada foi de $\mu = 50$ ms com desvio padrão $\sigma = 8$ ms. Uma nova medição isolada resultou em $64$ ms.
Tarefas:
Calcule o z-score dessa medição.
Levando em consideração que quanto maior o z-score mais distante o ponto está distante da média, então 1.25 está a 1.25 desvios padrão da média populacional, não está muito distante
Exercício 140 — Teste de latência em duas operadoras¶
Dois provedores de fibra óptica foram avaliados quanto à latência média de seus pacotes. A seguir estão as médias, desvios e tamanhos amostrais:
- Provedor A: média = 22.3 ms, desvio = 1.8, n = 30
- Provedor B: média = 21.8 ms, desvio = 2.1, n = 30
Tarefas:
- Realize um teste de hipótese para verificar se a diferença entre as médias é significativa ao nível de 5%.
- Interprete o valor-p encontrado.
A Hipótese Nula¶
Primeiro é necessário definir o que é a hipótese nula, ou seja as diferenças entre médias não são significativas, e a hipótese alternativa é se houve diferença e elas tem significância estatística. Em seguida surge o conceito de significância estatística, conceitualmente trata de afirmar que as mudanças não apenas flutuações estatíticas e não podem ser explicadas apenas pelo acaso. Ou seja, a probabilidade de observar essa diferença assumindo que a hipótese nula é verdadeira é menor que 5%. Formalmente:
$$ P(Diferencça∣H_0)<0,05 $$E por que 0.05? Bom, isso tem raízes históricas, e é por isso que não podemos usar 5% em qualquer caso. em seguida vamos elaborar um passo-a-passo para escolher a abordagem.
Passo-a-passo para Escolher o Teste de Hipótese (Comparação de Médias)¶
Passo 1 — As amostras são independentes ou pareadas?¶
Independentes: dados vêm de unidades diferentes
→ Ex: dois provedores, dois roteadores distintos
Avance para o Passo 2Pareadas: mesma unidade experimental sob duas condições
Ex: antes/depois no mesmo equipamento
Calcule as diferenças $ d_i = x_i - y_i$ Verifique normalidade de $ d_i $- Normal? → Teste t pareado
- Não normal? → Teste de Wilcoxon pareado
Passo 2 — As distribuições são normais?¶
Faça para cada grupo:
- Histograma / Q-Q plot
- Teste de Shapiro-Wilk
Se $n \geq 30$: Central Limit Theorem → ok usar t
Se não normais e $n < 30$:
→ Use teste não paramétrico (Mann–Whitney)
Passo 3 — As variâncias são iguais?¶
Verifique:
- Teste de Levene ou F de variâncias
- Ou comparação empírica: $ \frac{s_1^2}{s_2^2} $ deve estar entre 0.5 e 2
Decisão:
- Iguais? → Teste t padrão (Student)
- Diferentes? → Teste t de Welch
Passo 4 — As amostras são grandes ou pequenas?¶
- Se variâncias conhecidas e $ \geq 30$: → Teste Z
- Se variâncias desconhecidas: → Teste t com df apropriado
- Sempre relatar tamanho da amostra e justificar uso
Passo 5 — A hipótese é unilateral ou bilateral?¶
- Bilateral: $ H_0: \mu_1 = \mu_2 $, $ H_1: \mu_1 \ne \mu_2 $
- Unilateral: $ H_0: \mu_1 \leq \mu_2$, $ H_1: \mu_1 > \mu_2 $, etc.
→ Escolher conforme o problema experimental
Resumo final — Escolha do teste¶
Situação | Teste recomendado |
---|---|
Pareado, normal | t pareado |
Pareado, não normal | Wilcoxon pareado |
Independente, normal, variâncias iguais | t (Student) |
Independente, normal, variâncias diferentes | t de Welch |
Independenten, não normal, $n < 30$ | Mann–Whitney |
Variâncias conhecidas, $n \geq 30$ | Z |
Nosso Caso¶
Então para o nosso caso as varianccias não são conhecidas e e podem ser diferentes, então como $n\geq 30$ podemos considerar distribuições normais e aplicar t de Welch.
Teste de Hipótese para Diferença de Médias — Provedores de Fibra Óptica¶
Dois provedores foram avaliados quanto à latência média (em milissegundos):
- Provedor A: média $ \bar{x}_A = 22.3 $, desvio padrão $ s_A = 1.8 $, tamanho $ n_A = 30 $
- Provedor B: média $ \bar{x}_B = 21.8 $, desvio padrão $ s_B = 2.1 $, tamanho $ n_B = 30 $
1. Hipóteses¶
$ \begin{cases} H_0: \mu_A = \mu_B & \text{(não há diferença nas latências)} \\ H_1: \mu_A \ne \mu_B & \text{(há diferença nas latências)} \end{cases} $
2. Estatística de teste (t de Welch)¶
$ t = \frac{\bar{x}_A - \bar{x}_B}{\sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}}} = \frac{22.3 - 21.8}{\sqrt{\frac{1.8^2}{30} + \frac{2.1^2}{30}}} = \frac{0.5}{\sqrt{0.108 + 0.147}} = \frac{0.5}{\sqrt{0.255}} \approx \frac{0.5}{0.50498} \approx 0.9902 $
3. Graus de liberdade (Welch)¶
Aqui precisamos ajustar os graus de liberdade ao nosso caos, porque as variâncias amostrais são diferentes, e isso quebra a suposição de homocedasticidade (variância igual).
$ df = \frac{\left( \frac{s_A^2}{n_A} + \frac{s_B^2}{n_B} \right)^2} { \frac{1}{n_A - 1} \left( \frac{s_A^2}{n_A} \right)^2 + \frac{1}{n_B - 1} \left( \frac{s_B^2}{n_B} \right)^2 } = \frac{(0.255)^2}{\frac{1}{29}(0.0117 + 0.0216)} \approx \frac{0.065025}{0.001148} \approx 56.64 $
4. Valor-$p$ (teste bicaudal)¶
$ p = 2 \cdot P(T > |t|), \quad T \sim t_{56.64} $
Com $ t \approx 0.9902 $:
$ p \approx 2 \cdot P(T > 0.9902) \approx 2 \cdot 0.1627 = 0.3254 $
Conclusão¶
Como $ p > 0.05 $, não rejeitamos $ H_0 $.
Não há evidência estatística suficiente para afirmar que os dois provedores têm latências significativamente diferentes ao nível de 5%.
na célua abaixo, todos estes cálculos no R, e a origem ee $2 \cdot P(T > 0.9902)$, que vem da área sob a curva nos valores $|t|> 0.09902$.
# Pacotes necessários
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados dos dois provedores
media_A <- 22.3
media_B <- 21.8
desvio_A <- 1.8
desvio_B <- 2.1
n_A <- 30
n_B <- 30
# Estatística do teste t de Welch
s2_A <- desvio_A^2
s2_B <- desvio_B^2
erro_padrao <- sqrt(s2_A / n_A + s2_B / n_B)
t_obs <- (media_A - media_B) / erro_padrao
# Graus de liberdade de Welch
df <- (s2_A / n_A + s2_B / n_B)^2 /
((s2_A / n_A)^2 / (n_A - 1) + (s2_B / n_B)^2 / (n_B - 1))
# Valor-p (teste bicaudal)
p_valor <- 2 * pt(-abs(t_obs), df)
# Criar o gráfico com ggplot2
p <- ggplot(data.frame(x = c(-4, 4)), aes(x)) +
stat_function(fun = dt, args = list(df = df),
color = "steelblue", linewidth = 1) +
geom_vline(xintercept = c(-t_obs, t_obs),
color = "red", linetype = "dashed", linewidth = 1) +
labs(title = paste("Distribuição t de Welch (df =", round(df, 1), ")"),
subtitle = paste("Teste t para amostras independentes com variâncias desiguais"),
x = "Estatística t",
y = "Densidade") +
annotate("text", x = 0, y = 0.3,
label = paste("t observado =", round(t_obs, 2)),
color = "red") +
theme_minimal()
# Salvar o gráfico como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 7, height = 4, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir no notebook com legenda justificada
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="700">
<div style="margin-top: 10px; font-size: 90%%; color: #555; text-align: justify; max-width: 700px;">
<b>Figura:</b> Distribuição t de Welch com %.1f graus de liberdade ajustados. As linhas vermelhas indicam o valor observado da estatística t (t = %.2f) e seu simétrico sob a hipótese nula. O valor-p bicaudal do teste de Welch é %.4f, indicando a probabilidade de observar uma diferença tão extrema quanto %.2f ms entre as médias, assumindo igualdade populacional.
</div>
</div>
', img_b64, df, t_obs, p_valor, media_A-media_B))
Exercício 141 — Gráfico de valores-p por protocolo¶
Os valores $-p$ apresentados abaixo referem-se à comparação estatística das médias de latência entre diferentes protocolos de roteamento.
Tarefas:
Quais protocolos apresentam evidência estatística contra a hipótese nula?
Cada valor‑$p$ quantifica a evidência contra a hipótese nula de que as médias de latência são iguais entre os protocolos comparados. Para rejeitar a hipótese nula ao nível de 5%, o valor‑$p$ deve ser menor que 0.05.
Portanto, os protocolos OSPF (0.012), BGP (0.045) e ISIS (0.003) apresentam evidência estatística contra ( H_0 ), indicando que suas médias de latência diferem significativamente dos demais.
Já EIGRP (0.083), RIP (0.20) e MPLS (0.051) têm valor‑$p$ ≥ 0.05, e portanto não rejeitamos ( H_0 ) para esses casos.
O que representa a linha azul?
A linha azul é o valor-p = 0.05
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
protocolos <- c("OSPF", "BGP", "EIGRP", "RIP", "ISIS", "MPLS")
pvalores <- c(0.012, 0.045, 0.083, 0.20, 0.003, 0.051)
df <- data.frame(protocolos, pvalores)
# Criar gráfico
p <- ggplot(df, aes(x = reorder(protocolos, -pvalores), y = pvalores)) +
geom_col(fill = c("#d62728", "#1f77b4", "#ff7f0e", "#2ca02c", "#9467bd", "#8c564b")) +
geom_hline(yintercept = 0.05, linetype = "dashed", color = "red", linewidth = 1) +
geom_text(aes(label = pvalores), vjust = -0.5, size = 3.5) +
labs(title = "Valores-p por Protocolo de Roteamento",
subtitle = "Linha vermelha: limiar de significância (α = 0.05)",
x = "Protocolo",
y = "Valor-p") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 11),
plot.subtitle = element_text(color = "red"))
# Salvar como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 8, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:900px; margin:0 auto;">
<b>Figura:</b> valores-p de seis protocolos de roteamento comparados ao nível de significância α = 0.05 (linha vermelha). Resultados significativos (p < 0.05) foram observados para ISIS (0.003), OSPF (0.012) e BGP (0.045), enquanto MPLS (0.051), EIGRP (0.083) e RIP (0.20) não atingiram significância estatística.
</div>
</div>
', img_b64))
Exercício 142 — Tamanho de amostra para perdas em redes sem fio¶
Um engenheiro deseja detectar uma diferença de até 0,5% na taxa de perda com 95% de confiança. O desvio padrão estimado é de 0,8%. Qual deve ser o tamanho da amostra?
Saber $\sigma$ implica saber a variancia, então mesmo para n<30, podemos usar o z-score ou valor crítico.
Identificar os parâmetros¶
- Margem de erro tolerada: $E = 0.005$
- Desvio padrão estimado: $\sigma = 0.008$
- Nível de confiança: $95\% \Rightarrow z = 1.96$
Passo 2 — Aplicar a fórmula¶
$n = \left( \dfrac{z \cdot \sigma}{E} \right)^2$
Substituindo:
$n = \left( \dfrac{1.96 \cdot 0.008}{0.005} \right)^2 = \left( \dfrac{0.01568}{0.005} \right)^2 = (3.136)^2 \approx 9.835$
Conclusão¶
O engenheiro deve coletar pelo menos 10 observações para detectar uma diferença de 0,5% com 95% de confiança, assumindo desvio padrão de 0,8%.
Exercício 143 — Intervalo de Confiança para a Latência em Redes 5G¶
Uma operadora de telefonia coletou 49 amostras aleatórias da latência em sua nova rede 5G. A média amostral observada foi de 18 ms e o desvio padrão da amostra foi de 3.5 ms.
Tarefa: Construa um intervalo de confiança de 99% para a latência média populacional.
Para construir um intervalo de confiança para a média populacional com base em uma amostra, são necessários:
- $\bar{x}$ — média amostral
- Erro Padrão - $\frac{}{sqrt{n}}$ O erro padrão mede o afastamento médio esperado de todas as médias amostrais em relação à média populacional.
- $s$ — desvio padrão amostral
- $n$ — tamanho da amostra
- $z$ — valor crítico da normal padrão para o nível de confiança desejado, desde que haja mais de 30 amostras. Aqui z é tabelado. Vamos buscar z para 99% de confiança
No R, obtenha
qnorm(1 - 0.01 / 2) = 2.575829
Assim, $IC = 18 \pm 2.575829 \cdot \frac{3.5}{\sqrt{49}} =[16.7120855, 19.2879145]$
Exercício 144 — Interpretação do Erro Padrão na Taxa de Perda de Pacotes¶
Em um estudo sobre perda de pacotes em uma rede corporativa, a média amostral de perda foi de 2%, com um desvio padrão de 0.8%. Se a amostra continha 64 observações, qual o erro padrão da média e o que ele representa?
Tarefa: Calcule o erro padrão da média e explique sua interpretação.
Para Calcular o Erro Padrão (EP) da média amostral, usando $EP = \frac{s}{\sqrt{n}}$ são necessários:
- $\bar{x}_{perda}$ — média amostral da perda (irrelevante aqui)
- $s$ — desvio padrão amostral
- $n$ — tamanho da amostra
$\implies EP= \frac{0.008}{\sqrt{64}} = 0.001$
O erro padrão EP é o erro do desvio padrão... Isso significa que em média cada média amostral está afastada 0.001 ou 0.1% da média populacional.
---
Exercício 145 — Teste de Hipótese para a Melhoria de Latência Pós-Atualização¶
Uma empresa de tecnologia lançou uma atualização de software para otimizar a latência de seu serviço de streaming. Antes da atualização, a latência média era de 150 ms. Após a atualização, 100 usuários foram testados, resultando em uma latência média de 145 ms com um desvio padrão de 20 ms.
Tarefa: Realize um teste de hipótese com nível de significância de 5% para verificar se a atualização realmente reduziu a latência (teste unilateral). Qual a sua conclusão?
$$ H_1\text{Cauda inferior, } \begin{cases} H_0: \mu \geq 150\\ H_1: \mu < 150 \end{cases} $$$$t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}}$$Vamos começar enumerando o que sabemos e o que não sabemos:
- variância populacional desconhecida
- sabemos o desvio padrão amostral $s$ e consequentemente sua variancia.
- número de amostras $n$ = 100
- A hipótese nula é que latencia média era 150 e a alternaticva é que < 150.
Nesse exercício vamos optar por empregar estatística $t$ de Student é mais conservadora que a normal padrão $z$ porque seus valores críticos são maiores. Levando em cosnsideração que a Hipótese alternativa aponta para $\mu < 150$, ou seja, aponta para cauda inferior.
Então aplicando $$t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}} \implies$$
$$ t = \frac{145 - 150}{20/\sqrt{100}} \implies t_{0.05,99}= -2.5 $$Cálculo de t-student no R:
qt(0.05, df = 99) ~ -1.66.
Assim, $-2.5 < -1.66$. Nesse caso rejeitamos $H_0$. Então a latência foi reduzida com 95% de confiança.
Se fossemos usar valor crítico $z_{0.95}$, deveríamos usar teste unilateral a esquerda, já que estamos preconizando a $H_1 < \mu$. Assim
Cálculo do valor crítico $z$ no R:
qnorm(0.05) ~ -1.64.
De modo que, $-2.5 < -1.64$, ou seja, ainda assim rejeitaríamos $H_0$ com 95% de confiança. Ver ambos os gráficos para t-student e $z$ abaixo.
---
library(ggplot2)
library(gridExtra)
library(base64enc)
library(IRdisplay)
# Parameters
t_obs <- -2.5
alpha <- 0.05
df <- 99
# ---------- t-Distribution ----------
x_t <- seq(-4, 4, length.out = 1000)
df_t <- data.frame(x = x_t, y = dt(x_t, df))
crit_t <- qt(alpha, df)
g1 <- ggplot(df_t, aes(x, y)) +
geom_line(color = "#1f77b4", linewidth = 1.2) +
geom_vline(xintercept = crit_t, linetype = "dashed", color = "#d62728", linewidth = 1) +
geom_vline(xintercept = t_obs, color = "darkgreen", linewidth = 1.2) +
geom_area(data = subset(df_t, x <= crit_t), aes(x, y), fill = "#ff9896", alpha = 0.5) +
annotate("text", x = crit_t-0.2, y = 0.05, label = paste0("t crit = ", round(crit_t,3)),
color = "#d62728", angle = 90, hjust = 1) +
annotate("text", x = t_obs-0.2, y = 0.05, label = paste0("t obs = ", t_obs),
color = "darkgreen", angle = 90, hjust = 1) +
labs(title = "Distribuição t-student (df = 99)", x = "t", y = "Density") +
theme_minimal()
# ---------- z-Distribution ----------
x_z <- seq(-4, 4, length.out = 1000)
df_z <- data.frame(x = x_z, y = dnorm(x_z))
crit_z <- qnorm(alpha)
g2 <- ggplot(df_z, aes(x, y)) +
geom_line(color = "#9467bd", linewidth = 1.2) +
geom_vline(xintercept = crit_z, linetype = "dashed", color = "#e377c2", linewidth = 1) +
geom_vline(xintercept = t_obs, color = "darkgreen", linewidth = 1.2) +
geom_area(data = subset(df_z, x <= crit_z), aes(x, y), fill = "#f7b6d2", alpha = 0.5) +
annotate("text", x = crit_z-0.2, y = 0.05, label = paste0("z crit = ", round(crit_z,3)),
color = "#e377c2", angle = 90, hjust = 1) +
annotate("text", x = t_obs-0.2, y = 0.05, label = paste0("z obs = ", t_obs),
color = "darkgreen", angle = 90, hjust = 1) +
labs(title = "Distribuição normal", x = "z", y = "Density") +
theme_minimal()
# Combine plots and save directly to base64 without displaying
img_path <- tempfile(fileext = ".png")
png(img_path, width = 1000, height = 400)
grid.arrange(g1, g2, ncol = 2)
invisible(dev.off())
# Encode as Base64
img_b64 <- base64encode(img_path)
# Display only once with detailed caption
display_html(sprintf('
<div style="display:flex; flex-direction:column; align-items:center; margin:20px 0;">
<img src="data:image/png;base64,%s" style="max-width:900px; width:100%%;">
<div style="margin-top:20px; font-size:0.9em; color:#555; text-align:justify; max-width:800px;">
<p><b>Figura Esquerda (Distribuição t):</b> Distribuição t-Student com %d graus de liberdade. Linha vermelha tracejada = valor crítico t (%.3f) para α=0,05. Linha verde = valor t observado (%.1f) na região de rejeição (p=%.4f).</p>
<p><b>Figura Direita (Distribuição Normal):</b> Distribuição normal padrão para comparação. Linha rosa tracejada = valor z crítico (%.3f). O mesmo valor observado cai na região de rejeição, demonstrando como as distribuições t se aproximam da normal quando os graus de liberdade aumentam.</p>
<p><b>Conclusão:</b> Como nosso valor observado (t=%.1f) está na região de rejeição em ambas as distribuições, <span style="color:#d62728; font-weight:bold;">rejeitamos a hipótese nula</span> com nível de significância de 5%%.</p>
</div>
</div>',
img_b64, df, crit_t, t_obs, pt(t_obs, df), crit_z, t_obs))
# Clean up
unlink(img_path)
Figura Esquerda (Distribuição t): Distribuição t-Student com 99 graus de liberdade. Linha vermelha tracejada = valor crítico t (-1.660) para α=0,05. Linha verde = valor t observado (-2.5) na região de rejeição (p=0.0070).
Figura Direita (Distribuição Normal): Distribuição normal padrão para comparação. Linha rosa tracejada = valor z crítico (-1.645). O mesmo valor observado cai na região de rejeição, demonstrando como as distribuições t se aproximam da normal quando os graus de liberdade aumentam.
Conclusão: Como nosso valor observado (t=-2.5) está na região de rejeição em ambas as distribuições, rejeitamos a hipótese nula com nível de significância de 5%.
Exercício 146 — Análise de Z-score em Utilização de Banda¶
A utilização média de banda em uma rede de campus é de 80 Mbps, com um desvio padrão de 10 Mbps. Em um determinado momento, a utilização observada foi de 105 Mbps.
Tarefa: Calcule o z-score para essa observação e interprete o que ele significa em termos de desvio da média.
$$ z=\frac{x-\mu}{\sigma}= \frac{105-80}{10} = 2.5 $$Nesse caso, $z= 2.5$, significa que 105 está a 2.5 desvios padrão da média populacional.
Exercício 147 — Impacto do Nível de Confiança na Largura do Intervalo¶
Em uma amostra de 30 medições de jitter em uma rede VoIP, a média foi de 20 ms e o desvio padrão foi de 4 ms.
Tarefa: Compare a largura do intervalo de confiança para a média populacional em três níveis de confiança diferentes: 90%, 95% e 99%.
Vamos começar enumerando o que sabemos e o que não sabemos:- variância populacional desconhecida
- sabemos o desvio padrão amostral $s$ e consequentemente sua variancia.
- número de amostras $n$ = 30
- média amostral $\bar{x}=20$ms
- desvio padrão amostral $s = 4$ms
Então, para calcular o intervalo de confiança IC vamos empregar não $z$, mas o $t$ de Student intervalo de confiança bilateral cobre ambas as extremidades da distribuição, o nível de significância $ \alpha $ é dividido igualmente entre as duas caudas, ou seja, usamos $ \alpha/2 $ em cada lado. Cuja fórmula é:
$$ IC = \bar{x} \pm t_{\alpha/2, \, df} \cdot \frac{s}{\sqrt{n}} $$No R:
qt(1 - alpha/2, df = n - 1)
## Para 90%
qt(0.05, df = 29) = 1.699
## Para 95%
qt(0.025, df = 29) = 2.045
## Para 99%
qt(0.005, df = 29) = 2.756
$ $
Para o nosso caso:
- IC 90% → $ \alpha = 0.10 \Rightarrow t_{0.05, df} \implies 20 \pm 1.699 \cdot \frac{4}{\sqrt{30}}=[18.76,21.24]$
- IC 95% → $ \alpha = 0.05 \Rightarrow t_{0.025, df} \implies 20 \pm 2.045 \cdot \frac{4}{\sqrt{30}}=[18.51,21.49]$
- IC 99% → $ \alpha = 0.01 \Rightarrow t_{0.005, df} \implies 20 \pm 2.756 \cdot \frac{4}{\sqrt{30}}=[17.99,22.01]$
Como podemos observar, apesar de contra intuitivo para alguns, aumentar a confiança alarga o intervalo de confiança e não o oposto. Uma análise, confiança não é precisão. Uma metáfora, se quisermos aumentar a confiança em capturar um peixe usamos uma rede e não um arpão, a mesma coisa para capturar a média, se aumentarmos a confiança, o IC aumenta junto.
---
Exercício 148 — Teste de Diferença de Taxa de Transferência entre Dois Servidores¶
Dois servidores de arquivos (Servidor X e Servidor Y) foram testados quanto à sua taxa de transferência média. Foram coletadas 40 medições para cada servidor.
- Servidor X: média = 95 MB/s, desvio padrão = 8 MB/s
- Servidor Y: média = 90 MB/s, desvio padrão = 12 MB/s
Tarefa: Realize um teste de hipótese para verificar se há uma diferença significativa na taxa de transferência média entre os dois servidores, usando um nível de significância de 1%. Considere que as variâncias populacionais são desconhecidas e possivelmente diferentes.
Nesse caso, os dados indicam que o t-de student é o ídice mais indicado e a forma mais indicada para avaliar qual hipótese aceitar é o teste t de welch com $H_0$ sendo não haver uma diferença significativa na taxa de transferência média entre os dois servidores.
$$t = \frac{(\bar{x}_X - \bar{x}_Y)}{\sqrt{\frac{s_X^2}{n_X} + \frac{s_Y^2}{n_Y}}}$$Assim, $\frac{(95 - 90)}{\sqrt{\frac{8^2}{40} + \frac{12^2}{40}}} \implies t =\boxed{2.19}$
Para achar t-crítico precisamos saber o grau de liberdade, dado pela fórmula:
$$ df = \frac{ \left( \dfrac{s_X^2}{n_X} + \dfrac{s_Y^2}{n_Y} \right)^2 }{ \dfrac{\left( \dfrac{s_X^2}{n_X} \right)^2}{n_X - 1} + \dfrac{\left( \dfrac{s_Y^2}{n_Y} \right)^2}{n_Y - 1} } $$$$ df = \frac{ \left( \dfrac{8^2}{40} + \dfrac{12^2}{40} \right)^2 }{ \dfrac{\left( \dfrac{8^2}{40} \right)^2}{40 - 1} + \dfrac{\left( \dfrac{12^2}{40} \right)^2}{40 - 1} } = \frac{(1.6 + 3.6)^2}{\dfrac{(1.6)^2}{39} + \dfrac{(3.6)^2}{39}} = \frac{5.2^2}{\dfrac{2.56}{39} + \dfrac{12.96}{39}} = \frac{27.04}{\dfrac{15.52}{39}} = \frac{27.04}{0.397} \approx \boxed{68.1} $$De posse de $t= 2.19$ e $df \approx 68.1 $, precisamos achar $t_{99,70}$ no R como:
qt(0.995, df = 68.1) = 2.649969 # valor crítico bilateral para alfa = 0.01
Um fato digno de nota aqui é o emprego de grau de liberdade não inteiro. Isso se deve a abordagem do teste de Welch, que ajusta os graus de liberdade com base na proporção entre variâncias e tamanhos amostrais, refletindo a incerteza adicional gerada pela assimetria. Embora tipicamente as tabelas com valores de t-crítico venham com grau de liberdade inteiros, vc pode calcular no R com a função qt
como acima.
- Como a estatística calculada $t = 2.19$ é menor que o valor crítico $t_{0.005,\;68.1} = 2.65$, não rejeitamos a hipótese nula ao nível de significância de 1%.
Aqui há outra armadilha conceitual:
Na comparação com o valor crítico $ t $, o valor calculado precisa ser maior que $ t_{\text{crítico}} $ para rejeitar $ H_0 $.
Já na comparação com o $ p $-valor, o valor calculado precisa ser menor que $ \alpha $ para rejeitar $ H_0 $.
Para Calcular p-value no R
2 * (1 - pt(2.19, df = 68)) = 0.031
então $0.031 > 0.01$, de modo que comparando com $p-value$, também não rejeitamos a hipótese nula, ou seja não podemos afirmar que há diferenças nas médias das taxas de transferencias destes servidores, baseado neste numero de amostras.
Exercício 149 — Teste de Hipótese para Proporção de Conexões Confiáveis¶
Uma empresa de telecomunicações afirma que 90% das conexões em sua rede são 'confiáveis' (atingem uma certa qualidade de serviço). Para verificar essa afirmação, uma auditoria testou 200 conexões e encontrou 170 conexões confiáveis.
Tarefa: Realize um teste de hipótese com nível de significância de 5% para verificar se a proporção real de conexões confiáveis é menor que 90%. Qual a sua conclusão?
Primeiro vamos montar as nossas hipóteses:
$$\begin{cases} H_0: p \geq 0.90 \\ H_1: p < 0.90 \end{cases}$$Aqui desejamos testar se a proporção verdadeira de sucessos na população difere de um valor de referência $p_0$. A estatística de teste $Z$ usada nesse contexto compara a proporção observada $\hat{p}$ com a proporção teórica sob $H_0$, normalizando pela variabilidade esperada sob a hipótese nula. A fórmula é:
$$ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} $$Assim, sendo:
$$\hat{p} = \frac{170}{200} = 0.85 \quad\text{e}\quad p_0 = 0.90$$$$ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} = \frac{0.85 - 0.90}{\sqrt{\frac{0.9 \cdot 0.1}{200}}} = \frac{-0.05}{\sqrt{0.00045}} \approx \boxed{-2.36} $$no R:
pnorm(-2.36)= 0.0091
Então se $p-value = 0.0091 < 0.05$, rejeitamos $H_0$. Há evidências estatísticas, ao nível de significância de 5%, de que a proporção de conexões confiáveis na rede é menor que 90%.
Abaixo veja graficamente o p-valor de cauda inferior para $Z = -236$.:
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados do teste Z
z_obs <- -2.36
p_valor <- pnorm(z_obs)
# Criar o gráfico sem warnings
p <- ggplot(data.frame(x = c(-4, 4)), aes(x)) +
stat_function(fun = dnorm,
args = list(mean = 0, sd = 1),
linewidth = 1,
color = "black") +
# Área do p-valor
stat_function(fun = dnorm,
args = list(mean = 0, sd = 1),
xlim = c(-4, z_obs),
geom = "area",
fill = "red",
alpha = 0.5) +
# Linha vertical
geom_vline(xintercept = z_obs,
color = "red",
linetype = "dashed",
linewidth = 1) +
# Anotações (substituindo expression() por parse(text=))
annotate("text",
x = z_obs,
y = dnorm(z_obs),
label = "Z == -2.36",
parse = TRUE,
hjust = -0.2,
color = "red") +
annotate("text",
x = -3.4,
y = 0.02,
label = paste0("p-valor = ", format.pval(p_valor, digits = 4)),
color = "red") +
# Título com notação matemática segura
labs(title = "Distribuição Normal Padrão: P(Z ≤ -2.36)",
x = "Estatística Z",
y = "Densidade") +
theme_minimal() +
scale_x_continuous(breaks = seq(-4, 4, by = 1))
# Exportação para Base64 (mantido igual)
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 7, height = 5, dpi = 100)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibição com legenda
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="700">
<div style="margin-top: 10px; font-size: 90%%; color: #555; text-align: justify; max-width: 700px;">
<b>Figura:</b> Distribuição Normal Padrão mostrando a probabilidade acumulada P(Z ≤ %.2f) = %.4f. A área vermelha representa a probabilidade de observar valores tão extremos quanto Z = %.2f ou menores sob a hipótese nula.
</div>
</div>
', img_b64, z_obs, p_valor, z_obs))
Exercício 150 — Cálculo do Tamanho da Amostra para Estimativa de Banda Larga¶
Um engenheiro de redes deseja estimar a largura de banda média disponível em um datacenter com uma margem de erro máxima de 2 Mbps e um nível de confiança de 98%. Sabe-se por estudos anteriores que o desvio padrão da largura de banda é de aproximadamente 10 Mbps.
Tarefa: Calcule o tamanho mínimo da amostra necessário para atingir essa precisão.
A fórmula para o tamanho da amostra é: $$ n = \left(\frac{z \cdot \sigma}{E}\right)^2 $$Parâmetros:
- $E = 2.0$ Mbps (margem de erro)
- $\sigma = 10.0$ Mbps (desvio padrão)
- Nível de confiança $98\% \Rightarrow z = 2.326$
Substituindo na fórmula:
$$ n = \left( \frac{2.326 \cdot 10.0}{2.0} \right)^2 = \left( \frac{23.26}{2.0} \right)^2 = (11.63)^2 = 135.26 $$Conclusão:
O tamanho mínimo da amostra é:
$$ n \approx \boxed{136} $$Portanto, o engenheiro deve coletar pelo menos 136 medições para garantir uma estimativa com erro máximo de $2.0$ Mbps e $98\%$ de confiança.
Exercício 151 — Teste de Hipótese Pareado para Consumo de Energia de Servidores¶
Uma atualização de firmware foi aplicada em 15 servidores para reduzir o consumo de energia. O consumo de energia (em Watts) foi medido antes e depois da atualização para cada servidor.
Tarefa: Se as diferenças de consumo (Antes - Depois) tiveram uma média de 5 Watts e um desvio padrão de 3 Watts, realize um teste de hipótese com nível de significância de 5% para verificar se a atualização reduziu o consumo (teste unilateral à direita). Qual a sua conclusão?
Parâmetros fornecidos:
- $\bar{x} = 5.0$
- $s = 3.0$
- $n = 15$
- $\alpha = 0.05$
Estamos interessados em verificar se houve redução no consumo. Se $\mu_d > 0$, houve redução. Assim, o teste é unilateral à direita:
$$ \begin{cases} H_0: \mu_d \leq 0 \\ H_1: \mu_d > 0 \end{cases} $$Como $n < 30$, usamos a estatística $t$:
$$ t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}} = \frac{5.0 - 0}{3.0/\sqrt{15}} \approx 6.45 $$Graus de liberdade: $df = 15 - 1 = 14$
Calculando o $p$-valor no R:
No R:
pt(6.45, df = 14, lower.tail = FALSE)= 7.61e-06
Como $p\text{-valor} = 7 \times 10^{-6} < 0.05$, rejeitamos $H_0$.
Conclusão: Há evidência estatística suficiente, ao nível de significância de 5%, para rejeitar a hipótese nula. Isso indica que os dados são compatíveis com uma redução real no consumo de energia após a atualização.
Abordagem alternativa: comparação com valor crítico
Valor crítico para teste unilateral à direita:
No R:
qt(0.95, df = 14) =1.761
Como $t_{\text{obs}} = 6.45 > t_{\text{crítico}} = 1.761$, também rejeitaríamos $H_0$ por esse critério.
Abortagem com potência estatística¶
No R
power.t.test(n = 15, delta = 5, sd = 3, sig.level = 0.05, type = "one.sample", alternative = "greater")$power = 0.999997
Portanto, a potência estatística nesse caso é aproximadamente $99.9997%$, o que significa que, assumindo que a redução no consumo seja real ($H_1$ verdadeira), temos uma probabilidade praticamente total de rejeitar corretamente $H_0$. Em outras palavras, a probabilidade de cometer um erro tipo II — isto é, não rejeitar $H_0$ quando $H_1$ é verdadeira — é $\beta \approx 0.000003$.
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros do teste
t_obs <- 6.45
df <- 14
alpha <- 0.05
t_crit <- qt(1 - alpha, df)
p_valor <- pt(t_obs, df, lower.tail = FALSE)
# Criar o gráfico sem warnings
p <- ggplot(data.frame(x = seq(-1, 7, length.out = 1000)), aes(x)) +
# Curva t de Student
stat_function(fun = dt, args = list(df = df),
color = "black", linewidth = 1.2) +
# Área de rejeição (α)
stat_function(fun = dt, args = list(df = df),
xlim = c(t_crit, 7),
geom = "area",
fill = "lightcoral", alpha = 0.6) +
# Linhas críticas
geom_vline(xintercept = t_crit,
color = "red", linetype = "dashed", linewidth = 1.2) +
geom_vline(xintercept = t_obs,
color = "blue", linetype = "dashed", linewidth = 1.2) +
# Anotações (modificadas para evitar warnings)
annotate("text", x = t_crit, y = 0.12,
label = paste0("t crítico = ", round(t_crit, 2)),
color = "red", angle = 90, vjust = -0.5, hjust = 0) +
annotate("text", x = t_obs, y = 0.1,
label = paste0("t observado = ", round(t_obs, 2)),
color = "blue", angle = 90, vjust = -0.5, hjust = 0) +
# Substituição do expression() por parse(text=)
annotate("text", x = t_crit + 1.3, y = 0.05,
label = "alpha == P(Rejeitar*H[0]*' | '*H[0]*' é verdadeira')",
parse = TRUE, # Indica que o texto deve ser interpretado como expressão
hjust = 0, color = "darkred", size = 3.5) +
# Seta explicativa
annotate("segment",
x = t_crit + 1.2, xend = t_crit + 0.3,
y = 0.045, yend = dt(t_crit + 0.5, df) * 0.8,
arrow = arrow(length = unit(0.25, "cm"), type = "closed"),
color = "darkred", linewidth = 0.8) +
labs(
title = paste0("Teste t Unilateral (α = ", alpha, ") com ", df, " graus de liberdade"),
subtitle = "Área de rejeição da hipótese nula",
x = "Estatística t",
y = "Densidade de probabilidade"
) +
theme_minimal() +
theme(plot.subtitle = element_text(color = "gray40"))
# Salvar e exibir
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 8, height = 5, dpi = 100)
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="800">
<div style="margin-top: 10px; font-size: 90%%; color: #555; text-align: justify; max-width: 700px;">
<b>Figura:</b> Distribuição t de Student com %d graus de liberdade. A área vermelha (α = %.2f) representa a região de rejeição unilateral direita. A linha vermelha marca t crítico = %.2f (q<sub>%.3f</sub>), enquanto a azul mostra t observado = %.2f. O p-valor (P(T ≥ %.2f) = %.1e) é < %.3f, indicando rejeição de H₀. A seta vermelha ilustra α como probabilidade de erro Tipo I sob H₀ verdadeira.
</div>
</div>
', img_b64, df, alpha, t_crit, 1-alpha, t_obs, t_obs, p_valor, alpha))
Exercício 153 — Análise Gráfica de Latência e Erro Padrão¶
O gráfico abaixo mostra a distribuição de 500 medições de latência (em ms) em uma nova infraestrutura de rede.
Tarefa: Com base na média amostral e desvio padrão das 500 medições ($\bar{x} = 35$, $s = 7$), calcule o erro padrão da média. No espaço da resposta, desenhe um gráfico que represente a distribuição amostral das médias (com sua média e erro padrão), indicando onde estaria um intervalo de confiança de 95%.
Sabemos:
- $\bar{x} = 35$
- $s = 7$
- $n = 500$
- Nível de confiança: $95\% \Rightarrow z = 1.96$
1. Cálculo do Erro Padrão da Média:¶
$ EP = \frac{s}{\sqrt{n}} = \frac{7}{\sqrt{500}} \approx 0.312 $
2. Cálculo do Intervalo de Confiança de 95%:¶
$ IC = \bar{x} \pm z \cdot EP = 35 \pm 1.96 \cdot 0.312 $
$ IC \approx 35 \pm 0.611 \Rightarrow [34.389,\ 35.611] $
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros
media <- 35
ep <- 7 / sqrt(500) # erro padrão
z <- 1.96 # valor z para 95% de confiança
lim_inf <- media - z * ep
lim_sup <- media + z * ep
confianca <- 0.95
# Criar o gráfico
p <- ggplot(data.frame(x = seq(media - 4*ep, media + 4*ep, length.out = 1000)), aes(x)) +
# Curva normal
stat_function(fun = dnorm,
args = list(mean = media, sd = ep),
color = "black",
linewidth = 1) +
# Área do intervalo de confiança
stat_function(fun = dnorm,
args = list(mean = media, sd = ep),
xlim = c(lim_inf, lim_sup),
geom = "area",
fill = "skyblue",
alpha = 0.5) +
# Linhas de referência
geom_vline(xintercept = media,
linetype = "dashed",
color = "blue",
linewidth = 1.2) +
geom_vline(xintercept = c(lim_inf, lim_sup),
color = "red",
linetype = "dotted",
linewidth = 1) +
# Anotações
annotate("text",
x = media,
y = max(dnorm(media, media, ep)) * 0.9,
label = paste0("μ = ", media),
color = "blue",
angle = 90,
vjust = -0.5) +
annotate("text",
x = lim_inf,
y = max(dnorm(media, media, ep)) * 0.6,
label = sprintf("IC(95%%) inf. = %.3f", lim_inf),
angle = 0,
hjust = 1.2,
color = "red") +
annotate("text",
x = lim_sup-0.2,
y = max(dnorm(media, media, ep)) * 0.6,
label = sprintf("IC(95%%) sup. = %.3f", lim_sup),
angle = 0,
hjust = -0.5,
color = "red") +
labs(
title = paste0("Distribuição Amostral da Média com IC de ", confianca*100, "%"),
subtitle = paste0("Erro padrão = ", round(ep, 3), " | n = 500"),
x = "Média amostral",
y = "Densidade"
) +
theme_minimal() +
theme(plot.subtitle = element_text(color = "gray40"))
# Salvar como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 8, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="800">
<div style="margin-top: 10px; font-size: 90%%; color: #555; text-align: justify; max-width: 700px;">
<b>Figura:</b> Distribuição amostral da média (Teorema Central do Limite) com desvio padrão σ/√n = %.3f. A área azul representa o intervalo de confiança de %.0f%% (%.3f a %.3f), contendo o parâmetro populacional μ com %.0f%% de confiança. O IC foi calculado como μ ± z<sub>α/2</sub>·(σ/√n), onde z<sub>%.3f</sub> = %.2f. A linha azul tracejada indica a estimativa pontual (%.1f).
</div>
</div>
', img_b64, ep, confianca*100, lim_inf, lim_sup, confianca*100, 1-(1-confianca)/2, z, media))
Exercício 154 — Comparação Visual de Proporções e Teste de Hipótese¶
Uma empresa de segurança de redes monitorou a proporção de tentativas de acesso não autorizado em dois meses consecutivos, Mês 1 e Mês 2.
- Mês 1: 36 acessos não autorizados em 300 tentativas.
- Mês 2: 32 acessos não autorizados em 400 tentativas.
Tarefa: Realize um teste de hipótese para verificar se houve uma mudança significativa na proporção de acessos não autorizados entre o Mês 1 e o Mês 2, usando um nível de significância de 5%. No espaço da resposta, gere um gráfico que mostre a diferença nas proporções com seu respectivo intervalo de confiança.
Teste de Diferença entre Duas Proporções¶
Queremos testar se há diferença significativa nas proporções de acessos não autorizados entre dois meses, com:
- Amostras: $n_1 = 300$, $n_2 = 400$
- Proporções amostrais independentes: $p_1$, $p_2$
Etapa 1: Proporções amostrais¶
$p_1 = \frac{36}{300} = 0.12 \qquad p_2 = \frac{32}{400} = 0.08$
Hipóteses¶
$\begin{cases} H_0\colon\ p_1 = p_2 & \text{(as proporções são iguais)} \\ H_1\colon\ p_1 \ne p_2 & \text{(as proporções são diferentes)} \end{cases}$
Etapa 2: Proporção combinada sob $H_0$¶
$p = \frac{36 + 32}{300 + 400} = \frac{68}{700} \approx 0.0971$
Etapa 3: Erro padrão combinado¶
$SE = \sqrt{p(1 - p)\left( \frac{1}{n_1} + \frac{1}{n_2} \right)} = \sqrt{0.0971 \cdot (1 - 0.0971) \left( \frac{1}{300} + \frac{1}{400} \right)} \approx 0.0215$
Etapa 4: Estatística do teste¶
$Z = \frac{p_1 - p_2}{SE} = \frac{0.12 - 0.08}{0.0215} \approx 1.86$
Etapa 5: Cálculo do p-valor bicaudal no R¶
2 * (1 - pnorm(abs(1.86)))= 0.06288553
Etapa 6: Decisão com p-valor¶
Como $p\text{-valor} = 0.06288553 > \alpha = 0.05$, não rejeitamos $H_0$.
Etapa 7: Comparação com valor crítico¶
Para $\alpha = 0.05$ e teste bicaudal:
$z_{\alpha/2} = z_{0.975} \approx 1.96$
Como $|Z| = 1.86 < 1.96$, também não rejeitamos $H_0$.
Conclusão¶
Não há evidência estatisticamente significativa (ao nível de 5%) de que a proporção de acessos não autorizados tenha mudado entre os dois meses.
Intervalo de Confiança¶
Diferença observada: $p_1-p_2 = 0.04$
Erro padrão: $SE = 0.0215$
$z_{crit} = 1.96$ (nível de 95%)
O intervalo de confiança para a diferença entre duas proporções é dado por: $$ IC = \left[ (p_1 - p_2) \pm z_{\alpha/2} \cdot \sqrt{\frac{p_1(1 - p_1)}{n_1} + \frac{p_2(1 - p_2)}{n_2}} \right] $$
Substituindo os valores:
$$ IC = [0.04 \pm 1.96 \cdot 0.0215] \Rightarrow [-0.00214,\ 0.08214] $$library(ggplot2)
library(base64enc)
library(IRdisplay)
library(gridExtra)
# === GRÁFICO 1: Teste Z Bicaudal ===
z_obs <- 1.86
alpha <- 0.05
z_crit <- qnorm(1 - alpha / 2) # Definindo z_crit aqui
p_valor <- 2 * pnorm(-abs(z_obs)) # Cálculo do p-valor bicaudal
g1 <- ggplot(data.frame(x = seq(-4, 4, length.out = 1000)), aes(x)) +
stat_function(fun = dnorm, color = "black", linewidth = 1.2) +
# Áreas de rejeição
stat_function(fun = dnorm, xlim = c(z_crit, 4),
geom = "area", fill = "red", alpha = 0.5) +
stat_function(fun = dnorm, xlim = c(-4, -z_crit),
geom = "area", fill = "red", alpha = 0.5) +
# Linhas críticas
geom_vline(xintercept = c(-z_crit, z_crit),
linetype = "dashed", color = "red", linewidth = 1) +
geom_vline(xintercept = c(-z_obs, z_obs),
linetype = c("dotted", "dashed"), color = "blue", linewidth = 1) +
# Anotações
annotate("text", x = z_crit + 0.1, y = 0.05,
label = paste0("z crítico = ±", round(z_crit, 2)),
color = "red", hjust = 0) +
annotate("text", x = z_obs, y = 0.15,
label = paste0("z observado = ", round(z_obs, 2)),
color = "blue", hjust = -0.2) +
annotate("text", x = 0, y = 0.3,
label = paste0("p-valor = ", round(p_valor, 4)),
color = "black") +
labs(title = "Teste Z Bicaudal",
subtitle = expression(paste("Hipótese nula: ", mu == 0, " vs Alternativa: ", mu != 0)),
x = "Estatística Z",
y = "Densidade") +
theme_minimal()
# === GRÁFICO 2: Intervalo de Confiança ===
dif <- 0.04
SE <- 0.0215
IC <- c(dif - z_crit * SE, dif + z_crit * SE) # Usando z_crit aqui
contem_zero <- IC[1] <= 0 && IC[2] >= 0
g2 <- ggplot(data.frame(
estimativa = dif,
ICmin = IC[1],
ICmax = IC[2],
grupo = "Diferença"
), aes(x = grupo, y = estimativa)) +
geom_point(size = 4, color = "black") +
geom_errorbar(aes(ymin = ICmin, ymax = ICmax),
width = 0.2, linewidth = 1.2, color = "blue") +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
ylim(-0.05, 0.1) +
labs(title = "Intervalo de Confiança (95%)",
subtitle = paste0("Diferença de proporções: ", round(dif, 4),
" ± ", round(z_crit * SE, 4)),
y = "Diferença (p1 - p2)",
x = "") +
annotate("text", x = 0.4, y = 0.005,
label = ifelse(contem_zero,
" Nesse caso Inclui zero → Não significativo"),
hjust = 0, color = "red") +
theme_minimal() +
theme(axis.text.x = element_blank())
# === Combinar e exportar ===
combined <- grid.arrange(g1, g2, ncol = 2)
# Salvar como imagem
img_path <- tempfile(fileext = ".png")
ggsave(img_path, combined, width = 12, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- base64encode(img_path)
# Exibir com legenda (MANTIDA COMO ORIGINAL)
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="1000">
<div style="margin-top: 20px; font-size: 90%%; color: #555; text-align: justify; max-width: 1000px;">
<p><b>Gráfico 1 (Esquerda) - Teste Z:</b> A estatística observada (Z = %.2f) está dentro da região de aceitação (|Z| ≤ %.2f). O p-valor de %.4f é maior que α = 0.05, então <b>não rejeitamos H₀: μ = 0</b>. Isso indica que a diferença observada não é estatisticamente significativa.</p>
<p><b>Gráfico 2 (Direita) - Intervalo de Confiança:</b> O IC 95%% [%.4f, %.4f] inclui o valor zero, que está na premissa das hipóteses ($p_1$ diferente de $p_2$). Isso significa que a diferença observada (%.4f) é <b>compatível com H₀</b>. Os dois métodos (Teste Z e IC) levam à mesma conclusão, indicando que não há evidência suficiente para rejeitar a hipótese nula.</p>
</div>
</div>
', img_b64, z_obs, z_crit, p_valor, IC[1], IC[2], dif))
# Limpeza (opcional)
unlink(img_path)
Gráfico 1 (Esquerda) - Teste Z: A estatística observada (Z = 1.86) está dentro da região de aceitação (|Z| ≤ 1.96). O p-valor de 0.0629 é maior que α = 0.05, então não rejeitamos H₀: μ = 0. Isso indica que a diferença observada não é estatisticamente significativa.
Gráfico 2 (Direita) - Intervalo de Confiança: O IC 95% [-0.0021, 0.0821] inclui o valor zero, que está na premissa das hipóteses ($p_1$ diferente de $p_2$). Isso significa que a diferença observada (0.0400) é compatível com H₀. Os dois métodos (Teste Z e IC) levam à mesma conclusão, indicando que não há evidência suficiente para rejeitar a hipótese nula.
Exercício 155 — Análise de Desempenho de Servidores (Antes e Depois)¶
Um administrador de sistemas coletou dados de tempo de resposta de um servidor (em ms) antes e depois de uma otimização de software. As medições foram pareadas para 25 requisições. O histograma das diferenças (Antes - Depois) é mostrado abaixo.
Tarefa: Realize um teste de hipótese para verificar se a otimização resultou em uma redução significativa do tempo de resposta . No espaço da resposta, trace um gráfico da distribuição $t$ com o valor-$t$ calculado e a região crítica destacada.
Vamos aos dados:
Média das diferenças: $\bar{d} = 5.1$ ms Desvio padrão das diferenças: $s_d = 3.2$ ms Tamanho da amostra: $n = 25$
Também precisamos formular nossas hipóteses:
$$\begin{cases} H_0: \mu_d \leq 0 \\ H_1: \mu_d \gt 0 \end{cases}$$Essa hipótese nos leva a um teste unilateral a direita com nível de significância $\alpha = 0.01$.
Como n < 30, vamos usar a estatística $t$, cuja fórmula é:
$$t = \frac{\bar{x} - \mu}{s/\sqrt{n}}$$$$t = \frac{5.1}{3.2/\sqrt{25}} = 7.97$$Graus de liberdade: $df = 25 - 1 = 24$
No R: qt(0.99, df = 25) = 2.485107
então comparando $t_{observado} = 7.97$ > $t_{crítico} \approx 2.485$, isso nos leva rejeitar a hipótese nula com 1% de confiança.
Abordagem 2 - Comparação com p-value¶
No R: 1 - pt(7.97, 24) = 1.686396e-08
Então $p-value = 1.686396e-08<< 0.01$. Sendo assim podemos rejeitar a hipótese nula com 99% de confiança.
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros do problema
t_obs <- 7.97
df <- 24
alpha <- 0.01
t_crit <- qt(1 - alpha, df)
p_valor <- pt(t_obs, df, lower.tail = FALSE)
# Criar o gráfico
p <- ggplot(data.frame(x = seq(-1, 9, length.out = 1000)), aes(x)) +
stat_function(fun = dt, args = list(df = df), color = "black", linewidth = 1.2) +
# Área de rejeição
stat_function(fun = dt, args = list(df = df), xlim = c(t_crit, 9),
geom = "area", fill = "lightcoral", alpha = 0.6) +
# Linhas críticas
geom_vline(xintercept = t_crit, color = "red", linetype = "dashed", linewidth = 1.2) +
geom_vline(xintercept = t_obs, color = "blue", linetype = "dashed", linewidth = 1.2) +
# Anotações
annotate("text", x = t_crit, y = 0.11,
label = paste0("t crítico = ", round(t_crit, 3)),
color = "red", angle = 90, vjust = -0.5, hjust = 0) +
annotate("text", x = t_obs, y = 0.1,
label = paste0("t observado = ", round(t_obs, 2)),
color = "blue", angle = 90, vjust = -0.5, hjust = 0) +
annotate("text", x = t_crit + 0.7, y = 0.035,
label = "α = P(Rejeitar H0 | H0 é verdadeira)",
hjust = 0, color = "darkred", size = 4) +
# Seta corrigida (parêntese fechado)
annotate("segment", x = t_crit + 0.5, xend = t_crit + 0.1,
y = 0.02, yend = dt(t_crit + 0.5, df) * 0.7,
arrow = arrow(length = unit(0.3, "cm")), color = "darkred") +
labs(
title = "Distribuição t de Student sob H0",
subtitle = paste0("Teste unilateral direito (α = ", alpha, ", df = ", df, ")"),
x = "Estatística t",
y = "Densidade"
) +
theme_minimal()
# Salvar como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 8, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="display: flex; flex-direction: column; align-items: center;">
<img src="%s" width="800">
<div style="margin-top: 10px; font-size: 90%%; color: #555; text-align: justify; max-width: 700px;">
<p><b>Interpretação:</b> O gráfico mostra a distribuição t com %d graus de liberdade sob H0. A área vermelha (α = %.2f) é a região de rejeição (t > %.3f). Como t observado = %.2f cai nesta região (p-valor = %.2e < α), <b>rejeitamos H0</b>. A seta indica a probabilidade de erro Tipo I.</p>
<p><b>Conclusão:</b> Há evidência estatística (p < 0.01) para rejeitar H0 em favor da alternativa unilateral direita.</p>
</div>
</div>
', img_b64, df, alpha, t_crit, t_obs, p_valor))
Interpretação: O gráfico mostra a distribuição t com 24 graus de liberdade sob H0. A área vermelha (α = 0.01) é a região de rejeição (t > 2.492). Como t observado = 7.97 cai nesta região (p-valor = 1.69e-08 < α), rejeitamos H0. A seta indica a probabilidade de erro Tipo I.
Conclusão: Há evidência estatística (p < 0.01) para rejeitar H0 em favor da alternativa unilateral direita.
Exercício 156 — Intervalo de Confiança para Consumo de Energia de Dispositivos IoT¶
Um lote de 100 dispositivos IoT foi testado para seu consumo médio de energia (em mW). A média amostral foi de 25 mW com um desvio padrão de 3 mW.
Tarefa: Construa um intervalo de confiança de 95% para o consumo médio de energia populacional. No espaço da resposta, crie um gráfico que ilustre este intervalo de confiança.
Dados:
- media amostral, $\bar{x} = 25mW$
- Desvio Padrão amostral , $s = 3mW$
- valor crítico tabelado, $z_{0.05}= 1.96$
$ EP = \frac{s}{\sqrt{n}} = \frac{3}{\sqrt{100}} \approx 0.3 $
2. Cálculo do Intervalo de Confiança de 95%:¶
$ IC = \bar{x} \pm z \cdot EP = 25 \pm 1.96 \cdot 0.3 = 25 \pm 0.58 $
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros do problema
n <- 100
media <- 25
sd <- 3
alpha <- 0.05
# Cálculos estatísticos
erro_padrao <- sd / sqrt(n)
z_crit <- qnorm(1 - alpha / 2)
IC_inf <- media - z_crit * erro_padrao
IC_sup <- media + z_crit * erro_padrao
# Criar o gráfico
p <- ggplot(data.frame(
estimativa = media,
ICmin = IC_inf,
ICmax = IC_sup,
grupo = "Consumo médio"
), aes(x = grupo, y = estimativa)) +
geom_point(size = 4, color = "blue") +
geom_errorbar(aes(ymin = ICmin, ymax = ICmax),
width = 0.2, linewidth = 1.2, color = "blue") +
geom_hline(yintercept = media, linetype = "dashed", color = "black", alpha = 0.5) +
annotate("text", x = 0.8, y = media+0.1,
label = paste0("Média = ", media, " mW"),
color = "black") +
annotate("text", x = 1, y = IC_inf - 0.5,
label = paste0("IC 95% = [", round(IC_inf, 2), ", ", round(IC_sup, 2), "] mW"),
color = "darkblue") +
labs(
title = "Intervalo de Confiança (95%) para Consumo de Energia",
subtitle = paste0("n = ", n, ", DP = ", sd, " mW, Erro padrão = ", round(erro_padrao, 3)),
y = "Consumo (mW)",
x = ""
) +
theme_minimal() +
theme(axis.text.x = element_blank())
# Salvar como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 7, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="display:flex; flex-direction:column; align-items:center;">
<img src="%s" width="700">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:center; max-width:700px;">
<b>Figura:</b> IC 95%% = [%.2f, %.2f] mW (Média = %.1f mW, EP = %.3f mW). Com 95%% de confiança, o verdadeiro consumo médio populacional está neste intervalo. Amplitude = %.2f mW (n = %d).
</div>
</div>',
img_b64, IC_inf, IC_sup, media, erro_padrao, IC_sup-IC_inf, n))
Exercício 157 — Identificando Outliers em Medições de Throughput com Z-score¶
A taxa de throughput (em Mbps) de uma conexão de internet tem uma média histórica de 120 Mbps e um desvio padrão de 15 Mbps. Um engenheiro de rede observa uma medição de 160 Mbps em um momento específico.
Tarefa: Calcule o $z$-score para essa medição. No espaço da resposta, desenhe um gráfico da distribuição normal padrão, marcando a posição do $z$-score calculado e indicando se ele está em uma região de valores comuns ou incomuns.
Solução:
Média ($\mu$) = 120 Mbps
Desvio padrão ($\sigma$) = 15 Mbps
Valor observado ($x$) = 160 Mbps
Cálculo do $z$-score:
$$ z = \frac{x - \mu}{\sigma} = \frac{160 - 120}{15} = \frac{40}{15} \approx 2.67 $$Como $z \approx 2.67$, essa medição está significativamente acima da média. Em uma distribuição normal padrão, valores com $|z| > 2$ são geralmente considerados incomuns.
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros
z_obs <- 2.67
z_limite <- 2
x <- seq(-4, 4, length.out = 1000)
y <- dnorm(x)
df <- data.frame(x = x, y = y)
# Regiões incomuns (z > 2)
df_area_incomum <- subset(df, x >= z_limite)
# Criar o gráfico
p <- ggplot(df, aes(x = x, y = y)) +
geom_line(color = "black", linewidth = 1.2) +
# Região incomum (z > 2)
geom_area(data = df_area_incomum, aes(x, y), fill = "orange", alpha = 0.5) +
# Linhas verticais principais
geom_vline(xintercept = z_obs, linetype = "dashed", color = "blue", linewidth = 1.2) +
geom_vline(xintercept = z_limite, linetype = "dotted", color = "red", linewidth = 1) +
# Marcação dos desvios padrão
geom_vline(xintercept = -1, color = "darkgreen", linetype = "dashed") +
geom_vline(xintercept = 1, color = "darkgreen", linetype = "dashed") +
# Anotações
annotate("text", x = z_obs, y = 0.15,
label = paste0("z = ", round(z_obs, 2)),
color = "blue", angle = 90, vjust = -0.4, hjust = 0) +
annotate("text", x = z_limite + 0.3, y = 0.05,
label = "Região incomum (z > 2)",
color = "darkred", size = 4, hjust = 0) +
annotate("text", x = 0, y = 0.25,
label = "±1 desvio padrão",
color = "darkgreen", size = 4.2) +
labs(
title = "Distribuição Normal Padrão",
subtitle = "Faixas de 1 desvio padrão e região incomum (z > 2)",
x = "z",
y = "Densidade"
) +
theme_minimal()
# Salvar como imagem temporária
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 8, height = 5, dpi = 100)
# Codificar em Base64
img_b64 <- dataURI(file = img_path, mime = "image/png")
IRdisplay::display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width: 100%%; height: auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width: 800px; margin-left:auto; margin-right:auto;">
<b>Figura:</b> distribuição normal padrão com destaque para a faixa de ±1 desvio padrão (linhas verdes) e para a região incomum de cauda direita (z > 2), sombreada em laranja. A linha azul indica o valor observado, z = %.2f, e a linha vermelha pontilhada marca o limite adotado (z = %.0f). A área sombreada representa a probabilidade de observar valores acima do limite sob N(0,1).
</div>
</div>
', img_b64, z_obs, z_limite))
Exercício 158 — Variação do Erro Padrão com o Tamanho da Amostra¶
O gráfico abaixo mostra como o erro padrão da média de um conjunto de dados com desvio padrão de 10 varia com o tamanho da amostra. Usando o gráfico, descreva a relação entre o tamanho da amostra e o erro padrão da média. Se você precisasse reduzir o erro padrão pela metade, o que isso implicaria no tamanho da amostra?
A fórmula do erro padrão da média é:
$$ \text{EP} = \frac{\sigma}{\sqrt{n}} $$Se desejamos reduzir o erro padrão pela metade, temos:
$$ \text{EP}_{\text{novo}} \propto \frac{1}{2} \cdot \text{EP} $$$$ EP_{novo} \propto \frac{1}{2 \cdot \sqrt{n}} =\frac{1}{\sqrt{4n}} $$então é necessário quadruplicar $n$
Sabemos que o erro padrão cai com o inverso da raíz da amostra. A tabela e o gráfico abaixo nos ajuda a demonstrar.
$n$ | $\sqrt{n}$ | $1/\sqrt{n}$ | Erro Padrão |
---|---|---|---|
5 | 2.2361 | 0.4472 | 4.4721 |
10 | 3.1623 | 0.3162 | 3.1623 |
15 | 3.8730 | 0.2582 | 2.5820 |
20 | 4.4721 | 0.2236 | 2.2361 |
25 | 5.0000 | 0.2000 | 2.0000 |
30 | 5.4772 | 0.1826 | 1.8257 |
35 | 5.9161 | 0.1690 | 1.6903 |
40 | 6.3246 | 0.1581 | 1.5811 |
45 | 6.7082 | 0.1491 | 1.4907 |
50 | 7.0711 | 0.1414 | 1.4142 |
---
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
desvio_padrao_pop <- 10
n_valores <- seq(5, 200, by = 5)
erro_padrao_valores <- desvio_padrao_pop / sqrt(n_valores)
df_ep <- data.frame(N = n_valores, Erro_Padrao = erro_padrao_valores)
# Gráfico (atribuir a 'p')
p <- ggplot(df_ep, aes(x = N, y = Erro_Padrao)) +
geom_line(color = "darkblue", linewidth = 1) +
geom_point(color = "darkblue", size = 2) +
labs(title = "Erro Padrão da Média vs. Tamanho da Amostra",
x = "Tamanho da Amostra (n)", y = "Erro Padrão da Média") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:800px; margin:0 auto;">
<b>Figura:</b> relação entre o tamanho da amostra e o erro padrão da média, com $\\sigma = 10$ e $EP=\\sigma/\\sqrt{n}$.
O erro padrão decresce proporcionalmente a $1/\\sqrt{n}$; para reduzir o $EP$ pela metade, é necessário quadruplicar $n$.
O gráfico evidencia ganhos marginais decrescentes ao aumentar o tamanho amostral.
</div>
</div>
', img_b64))
Exercício 159 — Teste de A/B para Tempo de Carregamento de Página¶
Uma equipe de desenvolvimento web testou duas versões (A e B) de uma página para ver qual tinha menor tempo de carregamento (em segundos). Foram coletadas 50 medições para cada versão.
Versão A: média = 3.2 s, desvio padrão = 0.8 s Versão B: média = 3.0 s, desvio padrão = 0.9 s
Tarefa: Realize um teste de hipótese para determinar se a Versão B é significativamente mais rápida que a Versão A (teste unilateral, $\alpha = 0.05$). No espaço da resposta, apresente um gráfico que compare as distribuições de tempo de carregamento das duas versões, indicando suas médias.
Precisamos formular nossas hipóteses: $$ \begin{cases} H_0: \mu_B \geq \mu_A \\ H_1: \mu_B < \mu_A \end{cases} $$Como sabemos a variância e n > 30 e temos duas médias, e desvios independentes, devemos usar valor crítico z (próxima a normal), com um teste monocaudal a direita. Cuja fórmula está abaixo:
Para obter $z_{crit}$ no R para $\alpha= 0.05$:
qnorm(1 - 0.05) = 1,645
Agora vamos obter $z_{obs}$¶
A forma geral de $z_{obs}$ é
$$ z_{\text{obs}} = \frac{\text{diferença observada}}{\text{erro padrão da diferença}} $$Nesse caso
$$ z_{\text{obs}} = \frac{\bar{x}_A - \bar{x}_B}{\sqrt{ \frac{s_A^2}{n_A} + \frac{s_B^2}{n_B} }} $$$$ z_{\text{obs}} = \frac{3.2 - 3.0}{\sqrt{ \frac{0.8^2}{50} + \frac{0.9^2}{50} }} = \frac{0.2}{\sqrt{ \frac{0.64 + 0.81}{50} }} = \frac{0.2}{\sqrt{ \frac{1.45}{50} }} = \frac{0.2}{\sqrt{0.029}} = \frac{0.2}{0.170} z_{\text{obs}}\approx 1.18 $$Portanto $z_{\text{obs}}\approx 1.18$ < $z_{crit}$, então não devemos rejeitar a Hipótese nula. De modo que não houve redução do tempo de carregamento da página com 95% de confiança.
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros do teste
z_obs <- 1.18
alpha <- 0.05
z_crit <- qnorm(1 - alpha) # z crítico unilateral (cauda direita)
p_val <- 1 - pnorm(z_obs) # valor-p unilateral (direita)
# Dados da distribuição normal padrão
x <- seq(-3.5, 3.5, length.out = 1000)
y <- dnorm(x)
dfn <- data.frame(x = x, y = y)
# Região crítica (cauda direita)
df_rej <- subset(dfn, x >= z_crit)
# Gráfico (atribuir a 'p')
p <- ggplot(dfn, aes(x = x, y = y)) +
geom_line(color = "black", linewidth = 1.2) +
geom_area(data = df_rej, aes(x, y), fill = "orange", alpha = 0.6) +
geom_vline(xintercept = z_obs, color = "blue", linetype = "dashed", linewidth = 1.2) +
geom_vline(xintercept = z_crit, color = "red", linetype = "dashed", linewidth = 1.2) +
annotate("text", x = z_obs, y = 0.10, label = sprintf("z obs = %.2f", z_obs),
color = "blue", angle = 90, vjust = -0.5, hjust = 0) +
annotate("text", x = z_crit, y = 0.12, label = sprintf("z crítico = %.3f", z_crit),
color = "red", angle = 90, vjust = -0.5, hjust = 0) +
annotate("text", x = z_crit + 0.2, y = 0.025, label = "Região crítica (α = 0.05)",
color = "darkred", hjust = 0, size = 4) +
labs(
title = "Distribuição Normal Padrão — Teste de Hipótese Unilateral",
subtitle = "Comparação entre tempos médios das versões A e B",
x = "z", y = "Densidade"
) +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:800px; margin:0 auto;">
<b>Figura:</b> teste unilateral à direita com α = 0.05. A área em laranja indica a região crítica (z > %.3f).
A linha azul marca o valor observado, z = %.2f. O valor-p unilateral é %.4f; como z<sub>obs</sub> < z<sub>crítico</sub>,
não se rejeita H<sub>0</sub> ao nível de significância especificado.
</div>
</div>
', img_b64, z_crit, z_obs, p_val))
Exercício 160 — Intervalos de Confiança para Múltiplos Switches de Rede¶
Em uma auditoria, foram avaliados 15 switches de rede, e para cada um, construiu-se um intervalo de confiança de 90% para a taxa de pacotes perdidos. O gráfico fictício abaixo ilustra um cenário típico de 15 intervalos de confiança.
Tarefa: Considerando que a linha tracejada vermelha representa a verdadeira média populacional (0.5% de perda), quantos dos intervalos apresentados você esperaria que não contivessem a média real? Explique o porquê dessa expectativa. Se você estivesse buscando um nível de confiança maior, como 99%, o que aconteceria com a largura dos intervalos e o número esperado de falhas?
Pelo gráfico, observamos que apenas dois dos quinze intervalos de confiança contêm a média populacional de 0.5% (indicada pela linha tracejada vermelha).
Como cada intervalo foi construído com 90% de confiança, espera-se que cerca de 13 ou 14 deles contenham a média real, o que claramente não ocorre nesse cenário específico. Isso exemplifica que, mesmo com 90% de confiança, cerca de 10% dos intervalos, em média, não conterão o parâmetro verdadeiro e neste caso, houve mais falhas do que o esperado.
Se aumentarmos o nível de confiança para 99%, os intervalos se tornariam mais largos, o que aumentaria a chance de conter a média real em cada um deles. No entanto, isso também implicaria em menor precisão das estimativas individuais.
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
set.seed(18)
n_switches <- 15
media_pop <- 0.005
medias_amostrais <- rnorm(n_switches, mean = media_pop, sd = 0.002)
desvio_padrao_amostra <- 0.001
tamanho_amostra_ic <- 50
t_critico_90 <- qt(0.95, df = tamanho_amostra_ic - 1) # IC 90% => cauda 5%
erro_margem <- t_critico_90 * (desvio_padrao_amostra / sqrt(tamanho_amostra_ic))
df_ic <- data.frame(
id = 1:n_switches,
media = medias_amostrais,
lower = medias_amostrais - erro_margem,
upper = medias_amostrais + erro_margem
)
# Gráfico (atribuir a 'p')
p <- ggplot(df_ic, aes(x = id, y = media)) +
geom_point(size = 2) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
geom_hline(yintercept = media_pop, color = "red", linetype = "dashed", linewidth = 1) +
labs(title = "Intervalos de Confiança (90%) para Perda de Pacotes em Switches",
x = "ID do Switch", y = "Taxa de Perda de Pacotes") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:800px; margin:0 auto;">
<b>Figura:</b> intervalos de confiança de 90%% para a taxa de perda de pacotes por switch. A linha vermelha tracejada indica a taxa populacional de referência (%.4f).
Cada barra representa $\\hat{p}_i \\pm ME$, com $ME = t_{0.95,\\,df=%.0f} \\cdot s/\\sqrt{n} = %.5f$.
Barras que cruzam a linha de referência não fornecem evidência de diferença em relação à média populacional ao nível de 10%%, ou seja, capturam com pouco erro a média populacional.
</div>
</div>
', img_b64, media_pop, tamanho_amostra_ic - 1, erro_margem))
Exercício 161 — Determinação do Z-score para Anomalias de Tráfego¶
O tráfego de rede diário (em TB) de uma empresa segue uma distribuição aproximadamente normal com média de 50 TB e desvio padrão de 5 TB. Um sistema de monitoramento detecta um tráfego de 62 TB em um dia.
Tarefa: Calcule o $z$-score para este valor de tráfego. No espaço da resposta, apresente um gráfico da distribuição normal padrão, marcando o $z$-score calculado e a probabilidade de ocorrências iguais ou superiores a ele.
$$ z = \frac{\text{diferença observada}}{\text{variabilidade observada}} = \frac{x - \mu}{\sigma} $$$$ z = \frac{62 - 50}{5} = \frac{12}{5} = 2.4 $$Um valor de $z = 2.4$ indica que o tráfego de 62 TB está 2.4 desvios padrão acima da média. A probabilidade de observar valores iguais ou superiores a esse, sob a curva normal padrão, é tipicamente pequena.
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros
z <- 2.4
pval <- pnorm(z, lower.tail = FALSE) # P(Z >= z)
# Gráfico (atribuir a 'p')
p <- ggplot(data.frame(x = c(-4, 4)), aes(x)) +
stat_function(fun = dnorm, geom = "line", linewidth = 1) +
geom_area(stat = "function", fun = dnorm, xlim = c(z, 4),
fill = "steelblue", alpha = 0.5) +
geom_vline(xintercept = z, linetype = "dashed", color = "red", linewidth = 1) +
annotate("text", x = z + 0.3, y = 0.05,
label = sprintf("z = %.2f", z), color = "red") +
annotate("text", x = 3, y = 0.15,
label = sprintf("P(X ≥ 62) ≈ %.4f", pval),
color = "blue", size = 4) +
labs(title = "Distribuição Normal Padrão",
x = "Z-score", y = "Densidade") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
display_html(sprintf('
<div style="text-align:center; max-width: 100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:800px; margin:0 auto;">
<b>Figura:</b> probabilidade de cauda direita na N(0,1) para z = %.2f.
A área sombreada representa $P(Z \\ge z) = %.4f$. A linha vermelha tracejada marca o z-score observado.
</div>
</div>
', img_b64, z, pval))
Exercício 162 — Teste de Homogeneidade de Variâncias (F-test) em Tempos de Resposta¶
Dois diferentes algoritmos de roteamento (Algoritmo 1 e Algoritmo 2) foram implementados em laboratório, e os tempos de resposta (em ms) foram medidos. O objetivo é verificar se a variabilidade dos tempos de resposta é a mesma para ambos os algoritmos.
Algoritmo 1: $s_1^2 = 120$, $n_1 = 30$ Algoritmo 2: $s_2^2 = 80$, $n_2 = 25$
Tarefa: Realize um teste de hipótese para verificar se as variâncias dos tempos de resposta são significativamente diferentes ($\alpha = 0.05$). No espaço da resposta, crie um gráfico da distribuição $F$, destacando o valor-$F$ observado e a(s) região(ões) crítica(s).
Contrução das Hipóteses¶
$$ \begin{cases} H_0: \sigma_1^2 = \sigma_2^2 & \text{(as variâncias são iguais)} \\ H_1: \sigma_1^2 \neq \sigma_2^2 & \text{(as variâncias são diferentes)} \end{cases} $$Dados:
- Nível de significância: $\alpha = 0.05$
- Como é bicaudal, cada cauda terá $\alpha/2 = 0.025$
Estatística do teste:¶
$$ F_{\text{obs}} = \frac{s_1^2}{s_2^2} = \frac{120}{80} = \color{blue}{1.5} $$Graus de liberdade:
- $gl_1 = n_1 - 1 = 29$
- $gl_2 = n_2 - 1 = 24$
Valores críticos da distribuição $F$ para $\alpha/2 = 0.025$ (bicaudal):
Conclusão¶
Com base no teste F de homogeneidade de variâncias:
- Valor observado: $F_{\text{obs}} = 1.5$
- Valores críticos (nível de significância $\alpha = 0.05$):
- Inferior: $F_{\text{crit,inf}} \approx 0.460$
- Superior: $F_{\text{crit,sup}} \approx 2.141$
Como $F_{\text{obs}}$ está dentro do intervalo de não rejeição, não rejeitamos a hipótese nula $H_0$.
Portanto, não há evidências suficientes para afirmar que as variâncias dos tempos de resposta dos dois algoritmos são diferentes. As variações podem ser consideradas estatisticamente semelhantes.
---
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros
alpha <- 0.05
gl1 <- 29
gl2 <- 24
F_obs <- 1.5
# Críticos bicaudais
F_crit_upper <- qf(1 - alpha/2, gl1, gl2)
F_crit_lower <- 1 / qf(1 - alpha/2, gl2, gl1) # simétrico da cauda inferior
# Curva F
x <- seq(0.2, 3.5, length.out = 1000)
y <- df(x, gl1, gl2)
df_plot <- data.frame(x = x, y = y)
# Faixas de rejeição
rej_sup <- subset(df_plot, x >= F_crit_upper)
rej_inf <- subset(df_plot, x <= F_crit_lower)
# Decisão
rejeita <- (F_obs >= F_crit_upper) || (F_obs <= F_crit_lower)
# Gráfico (atribuir a 'p')
p <- ggplot(df_plot, aes(x = x, y = y)) +
geom_line(linewidth = 1.2) +
geom_area(data = rej_sup, aes(x, y), fill = "orange", alpha = 0.6) +
geom_area(data = rej_inf, aes(x, y), fill = "orange", alpha = 0.6) +
geom_vline(xintercept = F_obs, color = "blue", linetype = "dashed", linewidth = 1.2) +
geom_vline(xintercept = F_crit_upper, color = "red", linetype = "dashed") +
geom_vline(xintercept = F_crit_lower, color = "red", linetype = "dashed") +
annotate("text", x = F_obs + 0.1, y = 0.2,
label = sprintf("F_obs = %.2f", F_obs),
color = "blue", angle = 90, vjust = -0.5) +
annotate("text", x = F_crit_upper, y = 0.15,
label = sprintf("F_crit_sup = %.3f", F_crit_upper),
color = "red", angle = 90, vjust = -0.5) +
annotate("text", x = F_crit_lower, y = 0.15,
label = sprintf("F_crit_inf = %.3f", F_crit_lower),
color = "red", angle = 90, vjust = -0.5) +
labs(title = "Distribuição F (bicaudal)",
subtitle = "Teste de homogeneidade de variâncias (α = 0.05)",
x = "F", y = "Densidade") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:820px; margin:0 auto;">
<b>Figura:</b> teste F bicaudal com gl<sub>1</sub> = %d e gl<sub>2</sub> = %d.
As áreas em laranja indicam as regiões críticas (F ≤ %.3f ou F ≥ %.3f).
A linha azul marca a estatística observada, F<sub>obs</sub> = %.2f.
Decisão ao nível α = 0.05: %s H<sub>0</sub> de igualdade de variâncias.
</div>
</div>
', img_b64, gl1, gl2, F_crit_lower, F_crit_upper, F_obs,
if (rejeita) "rejeita-se" else "não se rejeita"))
Exercício 163 — Potência estatística¶
Um engenheiro deseja detectar uma diferença de 0.1% na taxa de perda com 80% de potência. O desvio padrão estimado é 0.2%.
Tarefas:
Explique o que significa ter 80% de potência.
Determine o tamanho mínimo de amostra necessário para atingir esse objetivo com nível de significância de 5%.
Situação Real | Decisão Tomada | Resultado Estatístico | Nome Técnico | Probabilidade |
---|---|---|---|---|
$H_0$ é verdadeira | Rejeita $H_0$ | Erro Tipo I | Falso Positivo | $\alpha$ |
$H_0$ é verdadeira | Não rejeita $H_0$ | Decisão correta | Verdadeiro Negativo | $1 - \alpha$ |
$H_1$ é verdadeira | Rejeita $H_0$ | Decisão correta | Verdadeiro Positivo | $1 - \beta$ |
$H_1$ é verdadeira | Não rejeita $H_0$ | Erro Tipo II | Falso Negativo | $\beta$ |
Hipóteses do teste:¶
$$ \begin{cases} H_0: \mu = 0 \quad \text{(sem redução na taxa de perda)} \\ H_1: \mu = -0.001 \quad \text{(houve redução de 0.1\% na taxa de perda)} \end{cases} $$Interpretação da potência estatística¶
Ter 80% de potência ($1 - \beta = 0.8$) significa que o teste tem 80% de chance de detectar corretamente uma redução de 0.1% na taxa de perda, se ela de fato existir. Isso também implica que a probabilidade de cometer um erro tipo II ($\beta$) — ou seja, não detectar o efeito real — é de 20%.
Por que precisamos do tamanho da amostra $n$?¶
O valor de $n$ não foi fornecido diretamente no enunciado, pois o objetivo era justamente determiná-lo a partir da potência desejada. Para isso, usamos uma fórmula semelhante à usada para estimar tamanhos de amostra em intervalos de confiança:
$$ n = \left( \frac{z_{\alpha} + z_{\beta}}{\delta / \sigma} \right)^2 $$ou reorganizada:
$$ n = \left( \frac{(z_{\alpha} + z_{\beta}) \cdot \sigma}{\delta} \right)^2 $$onde:
- $\delta$ é o tamanho do efeito que se deseja detectar (redução de 0.001),
- $\sigma$ é o desvio padrão estimado (0.002),
- $z_{\alpha}$ e $z_{\beta}$ são os quantis normais correspondentes ao nível de significância e à potência desejada.
Portanto, para construir as distribuiçõe das Hipóteses, explicitando os erros tipo I e II, é obrigatório calcular previamente $n$. Nesse caso específico abaixo, veja que não usamos a escala padrão z-score, mas a percenteagem.
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros do teste
delta <- -0.1 # redução esperada (negativa)
sd <- 0.2 # desvio padrão
alpha <- 0.05 # nível de significância (cauda esquerda)
power <- 0.8 # potência desejada
# Cálculo do tamanho da amostra (teste unilateral à esquerda)
z_alpha <- qnorm(alpha) # negativo (cauda esquerda)
z_beta <- qnorm(power) # positivo
n <- ((z_alpha + z_beta) * sd / delta)^2
n <- ceiling(n)
# Valor crítico em escala da estatística (H0: mu = 0)
se <- sd / sqrt(n)
crit <- qnorm(alpha, mean = 0, sd = se)
# Distribuições sob H0 e H1
x <- seq(-0.5, 0.3, length.out = 1000)
h0 <- dnorm(x, mean = 0, sd = se)
h1 <- dnorm(x, mean = delta, sd = se)
df <- data.frame(x = x, H0 = h0, H1 = h1)
# Gráfico (atribuir a 'p')
p <- ggplot(df, aes(x = x)) +
geom_line(aes(y = H0), color = "black", linewidth = 1) +
geom_line(aes(y = H1), color = "blue", linewidth = 1) +
# Erro tipo I (α) à esquerda sob H0
stat_function(fun = dnorm, args = list(mean = 0, sd = se),
geom = "area", fill = "red", alpha = 0.4,
xlim = c(min(x), crit)) +
# Erro tipo II (β) à direita do crit sob H1 (porque a região de aceitação está à direita do crit)
stat_function(fun = dnorm, args = list(mean = delta, sd = se),
geom = "area", fill = "orange", alpha = 0.4,
xlim = c(crit, max(x))) +
geom_vline(xintercept = crit, linetype = "dashed", color = "darkred") +
annotate("text", x = 0.15, y = max(h0)*0.9, label = "H0: \u03BC = 0", color = "black") +
annotate("text", x = -0.30, y = max(h1)*0.9, label = "H1: \u03BC = -0.1", color = "blue") +
annotate("text", x = -0.40, y = max(h0)*0.35, label = "Área vermelha — Erro Tipo I (α)", color = "red") +
annotate("text", x = 0.10, y = max(h0)*0.35, label = "Área laranja — Erro Tipo II (β)", color = "orange") +
annotate("text", x = crit + 0.001, y = max(h0)*0.95,
label = sprintf("limiar (crit) = %.3f", crit), hjust = -0.1, angle = 90) +
labs(
title = "Distribuições sob H0 e H1 (teste unilateral à esquerda)",
subtitle = sprintf("n = %d, \u03B1 = 0.05, potência = 0.80, \u03B4 = %.3f, sd = %.3f", n, delta, sd),
x = "Estatística (diferença média)", y = "Densidade"
) +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 7.5, height = 4.2, dpi = 130)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:900px; margin:0 auto;">
<b>Figura:</b> teste unilateral à esquerda para detectar redução de média.
As curvas mostram H0: \u03BC = 0 (preta) e H1: \u03BC = %.3f (azul), com desvio padrão amostral sd = %.3f e tamanho amostral n = %d.
O limiar crítico (linha tracejada) é o quantil de cauda esquerda para \u03B1 = 0.05 sob H0, em escala da estatística (crit = %.3f).
A área vermelha representa o erro tipo I (probabilidade de rejeitar H0 quando H0 é verdadeira).
A área laranja representa o erro tipo II (probabilidade de não rejeitar H0 quando H1 é verdadeira), compatível com potência = 1 - \u03B2 = %.2f.
</div>
</div>
', img_b64, delta, sd, n, crit, power))
Exercício 164 — Hipótese nula em throughput de redes¶
Uma empresa afirma que seu novo protocolo atinge throughput médio de 150 Mbps. Um teste com 25 medições gerou média de 144 Mbps e desvio padrão de 10 Mbps.
Tarefas:
Formule $H_0$ e $H_1$.
Realize um teste de hipótese com $\alpha = 0.01$.
Conclua se a diferença é estatisticamente significativa.
Formulação das Hipóteses¶
- Hipótese nula: $H_0\!:\ \mu = 150$
- Hipótese alternativa: $H_1\!:\ \mu \ne 150$ (teste bicaudal)
Estatística do Teste¶
Parâmetros conhecidos:
- $\bar{x} = 144$
- $\mu_0 = 150$
- $s = 10$
- $n = 25$
- $\alpha = 0.01$
Erro padrão: $$ EP = \frac{s}{\sqrt{n}} = \frac{10}{\sqrt{25}} = \frac{10}{5} = 2 $$
Estatística t observada: $$ t_{obs} = \frac{\bar{x} - \mu_0}{EP} = \frac{144 - 150}{2} = -3 $$
Região Crítica¶
Graus de liberdade: $gl = 25 - 1 = 24$
Valor crítico para teste bicaudal com $\alpha = 0.01$/:
$$> t_{crítico} = t_{0.005,\,24} \approx 2.797 $$
Região crítica:
- Rejeita $H_0$ se $|t_{obs}| > 2.797$
Como $|t_{obs}| = 3 > 2.797$, então:
Conclusão¶
A estatística observada ($t$) cai dentro da região crítica, logo:
Rejeita-se $H_0$ ao nível de significância de 1%.
Há evidência estatística de que o throughput médio é diferente de 150 Mbps.
# Pacotes
library(ggplot2)
library(gridExtra)
library(base64enc)
library(IRdisplay)
# Parâmetros gerais
gl <- 24
alpha <- 0.05
t_obs <- 2.3
t_obs_esq <- -2.3
t_obs_bi <- 2.3
# Sequência t
x <- seq(-4, 4, length.out = 1000)
df_t <- data.frame(x = x, y = dt(x, df = gl))
# Gráfico 1 — Unilateral à direita
t_crit_dir <- qt(1 - alpha, df = gl)
g1 <- ggplot(df_t, aes(x, y)) +
geom_line(color = "black", linewidth = 1) +
geom_area(data = subset(df_t, x > t_crit_dir), aes(x, y), fill = "red", alpha = 0.4) +
geom_vline(xintercept = t_crit_dir, linetype = "dotted", color = "red") +
geom_vline(xintercept = t_obs, linetype = "dashed", color = "blue") +
labs(title = "Unilateral à direita (α = 0.05)", x = "t", y = "Densidade") +
annotate("text", x = t_crit_dir + 0.3, y = 0.05, label = "t crítico", color = "red") +
annotate("text", x = t_obs + 0.3, y = 0.10, label = "t observado", color = "blue") +
theme_minimal()
# Gráfico 2 — Unilateral à esquerda
t_crit_esq <- qt(alpha, df = gl)
g2 <- ggplot(df_t, aes(x, y)) +
geom_line(color = "black", linewidth = 1) +
geom_area(data = subset(df_t, x < t_crit_esq), aes(x, y), fill = "red", alpha = 0.4) +
geom_vline(xintercept = t_crit_esq, linetype = "dotted", color = "red") +
geom_vline(xintercept = t_obs_esq, linetype = "dashed", color = "blue") +
labs(title = "Unilateral à esquerda (α = 0.05)", x = "t", y = "Densidade") +
annotate("text", x = t_crit_esq - 0.5, y = 0.05, label = "t crítico", color = "red") +
annotate("text", x = t_obs_esq - 0.2, y = 0.10, label = "t observado", color = "blue") +
theme_minimal()
# Gráfico 3 — Bicaudal
t_crit_bi <- qt(1 - alpha/2, df = gl)
g3 <- ggplot(df_t, aes(x, y)) +
geom_line(color = "black", linewidth = 1) +
geom_area(data = subset(df_t, x < -t_crit_bi), aes(x, y), fill = "red", alpha = 0.4) +
geom_area(data = subset(df_t, x > t_crit_bi), aes(x, y), fill = "red", alpha = 0.4) +
geom_vline(xintercept = -t_crit_bi, linetype = "dotted", color = "red") +
geom_vline(xintercept = t_crit_bi, linetype = "dotted", color = "red") +
geom_vline(xintercept = -t_obs_bi, linetype = "dashed", color = "blue") +
geom_vline(xintercept = t_obs_bi, linetype = "dashed", color = "blue") +
labs(title = "Bicaudal (α/2 em cada cauda)", x = "t", y = "Densidade") +
annotate("text", x = t_crit_bi + 0.3, y = 0.05, label = "± t crítico", color = "red") +
annotate("text", x = t_obs_bi + 0.3, y = 0.10, label = "± t observado", color = "blue") +
theme_minimal()
# Combinar sem desenhar na tela
combined <- arrangeGrob(g1, g2, g3, ncol = 3)
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = combined, width = 14, height = 5, dpi = 140)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:1100px; margin:0 auto;">
<b>Figura:</b> comparação entre três testes t com %d graus de liberdade: (i) unilateral à direita, (ii) unilateral à esquerda e (iii) bicaudal.
As áreas vermelhas representam as regiões críticas para α = 0.05. Linhas azuis marcam os valores observados de t; linhas vermelhas pontilhadas marcam os críticos.
O painel bicaudal reparte α/2 em cada cauda, enquanto os unilaterais concentram α apenas na cauda correspondente ao sinal da hipótese alternativa.
</div>
</div>
', img_b64, gl))
Exercício 165 — Interpretação de erro tipo I e II¶
Durante um teste de validação de pacotes perdidos, a hipótese nula considera que a taxa de perda é inferior a 2%.
Situação Real | Decisão Tomada | Resultado Estatístico | Nome Técnico | Probabilidade |
---|---|---|---|---|
$H_0$ é verdadeira | Rejeita $H_0$ | Erro Tipo I | Falso Positivo | $\alpha$ |
$H_0$ é verdadeira | Não rejeita $H_0$ | Decisão correta | Verdadeiro Negativo | $1 - \alpha$ |
$H_1$ é verdadeira | Rejeita $H_0$ | Potência estatística | Verdadeiro Positivo | $1 - \beta$ |
$H_1$ é verdadeira | Não rejeita $H_0$ | Erro Tipo II | Falso Negativo | $\beta$ |
O que representa o erro tipo I neste contexto?
Erro tipo I ocorre quando $H_0$ é verdadeira, mas foi rejeitada. Ou seja, a taxa de perda realmente é inferior a 2%, mas o teste indicou que não é. Isso leva a um falso positivo: as equipes acreditam que há um problema quando na verdade não há.O que representa o erro tipo II?
Erro tipo II ocorre quando $H_1$ é verdadeira, mas não se rejeita $H_0$. Ou seja, a taxa de perda é maior que 2%, mas o teste falhou em detectar isso. Isso leva a um falso negativo: um problema real na rede é ignorado.Dê um exemplo prático em redes onde cada erro causaria impacto negativo.
Acompanhe através dos gráficos acima...
Erro tipo I: Falso positivo, aciona-se uma equipe de resposta para investigar um suposto problema de perda de pacotes, gerando custo e alarme desnecessários, quando a taxa real está dentro do esperado.
Erro tipo II: Falso negativo, um sistema de monitoramento deixa de sinalizar uma perda significativa de pacotes. A degradação continua afetando QoS de serviços sensíveis, como VoIP ou videoconferência.
Exercício 166 — Gráfico da região de rejeição¶
Crie um gráfico com a curva normal padrão mostrando a região de rejeição para um teste unilateral a direita com $\alpha = 0.05$.
Tarefas:
O que essa área vermelha representa?
A área representa o erro tipo I com $\alpha$ sendo o nível de significancia para rejeição da Hipótese nulaSe um teste retornar $z = 1.90$, qual seria a conclusão?
Se um teste retornar $z=1.90 > 1.65$ a conclusão é que o número de amostras é maior que trinta e conhecemos a variancia o suficiente para aplicar um teste normal. Também podemos dizer que esse z se refere a uma média amostral observada que nos impele a rejeitar a hipótese nula.# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados
x <- seq(-4, 4, length.out = 1000)
y <- dnorm(x)
dfn <- data.frame(x, y)
alpha <- 0.05
z_alpha <- qnorm(1 - alpha) # 1.645...
z_obs <- 1.9
p_val <- 1 - pnorm(z_obs) # unilateral à direita
# Gráfico (atribuir a 'p')
p <- ggplot(dfn, aes(x = x, y = y)) +
geom_line(color = "black") +
geom_area(data = subset(dfn, x > z_alpha), fill = "red", alpha = 0.3) +
geom_vline(xintercept = z_alpha, linetype = "dashed", color = "red") +
geom_vline(xintercept = z_obs, linetype = "dotted", color = "blue", linewidth = 1) +
labs(title = "Região de rejeição (unilateral, α = 0.05)", x = "z", y = "Densidade") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 8, height = 5, dpi = 120)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; font-size:90%%; color:#555; text-align:justify; max-width:820px; margin:0 auto;">
<b>Figura:</b> teste unilateral à direita com α = 0.05. A área em vermelho indica a região de rejeição (z > %.3f).
A linha azul pontilhada marca o valor observado, z = %.2f, cujo valor-p unilateral é %.4f.
Como z<sub>obs</sub> %s z<sub>crítico</sub>, %s H<sub>0</sub>.
</div>
</div>
', img_b64, z_alpha, z_obs, p_val,
if (z_obs > z_alpha) ">" else "<",
if (z_obs > z_alpha) "rejeita-se" else "não se rejeita"))
Exercício 167 — Erro Tipo I, Tipo II e Potência Estatística (perda de pacotes)¶
Uma operadora afirma que sua taxa de perda de pacotes é de no máximo 4%.
Um engenheiro de redes suspeita que a taxa real seja superior a isso e decide testar a alegação.
Ele coleta uma amostra de $n = 400$ pacotes, na qual $x = 24$ apresentaram perda. Isso nos conferiria uma perda de $p= \frac{24}{400}= 0.06$. Assim, podemos assumir que essa passa a ser nossa Hipótese alternaniva, ou seja $p_1=0.06$
Para este exercício, precisaremos de uma pequena introdução:
Introdução Teórica — Cálculo de Potência e Erro Tipo II¶
Quando realizamos um teste de hipótese, a decisão de rejeitar ou não a hipótese nula $ H_0 $ baseia-se em um valor crítico $ z_{crit} $, calculado a partir de um nível de significância $ \alpha $. Esse valor define uma fronteira na escala de proporções: qualquer valor amostral $ \hat{p} $ acima desse limite leva à rejeição de $ H_0 $.
Para calcular a potência do teste (ou, complementarmente, o erro tipo II $ \beta $), simulamos o que aconteceria se a hipótese alternativa $ H_1 $ fosse verdadeira. Para isso, seguimos os seguintes passos:
Calcular o erro padrão sob $ H_0 $: $$ EP_0 = \sqrt{ \frac{p_0(1 - p_0)}{n} } $$
Determinar o valor z-crítico em escala de proporções:
O valor $ z_{crit} $ é obtido a partir da distribuição normal padrão, por exemplo usando a função qnorm
no R.
Para um teste unilateral à direita com nível de significância $ \alpha = 0.05 $, temos:
z_crit <- qnorm(1 - 0.05)= 1.645
$$ p_{crit} = p_0 + z_{crit} \cdot EP_0 $$
Calcular o erro padrão sob $ H_1 $: $$ EP_1 = \sqrt{ \frac{p_1(1 - p_1)}{n} } $$
Obter o valor padronizado (z-score) de $ p_{crit} $ no contexto de $ H_1 $: $$ Z^* = \frac{p_{crit} - p_1}{EP_1} $$
Determinar $ \beta $, a probabilidade de não ultrapassar o valor crítico mesmo quando $ H_1 $ é verdadeira: $$ \beta = P(Z < Z^*) = \texttt{pnorm}(Z^*) $$
A potência do teste é o complemento de $ \beta $: $$ \text{Potência} = 1 - \beta $$
Este processo permite avaliar se o teste tem uma boa capacidade de detectar um desvio real em relação à hipótese nula.
Erro Tipo II ($\beta$):?
Potência do Teste:
Interpretação dos Erros:
Tarefas:¶
Formulação das Hipóteses:
$ \begin{cases} H_0: p \leq 0.04\\ H_1: p > 0.04 \end{cases} $
Estatística de Teste:
Calcule a proporção amostral $\hat{p}$, sendo que $p_0 =$ 4% dado. Calcule também a estatística $Z$ para este teste unilateral:
$$ \hat{p} = \frac{24}{400} = 0.06 $$
$$ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} $$
$$ EP = \sqrt{ \frac{p_0 (1 - p_0)}{n} } = \sqrt{ \frac{0.04 \cdot 0.96}{400} } = \sqrt{0.000096} \approx 0.009798 $$$$ Z = \frac{\hat{p} - p_0}{EP} = \frac{0.06 - 0.04}{0.009798} \approx \frac{0.02}{0.009798} \approx 2.04 $$Converter $z_{crit}$ para a escala de proporções
Esta é a fórmula de conversão para saber qual proporção amostral corresponde ao valor crítico da estatística padronizada:
$$ p_{crit} = p_0 + z_{crit} \cdot EP_0 $$Substituindo os valores:
$$ p_{crit} = 0.04 + 1.645 \cdot 0.009798 \approx 0.0561 $$Esse valor representa o limiar na escala de proporções acima do qual rejeitamos $H_0$.
Decisão ao Nível de 5%:
Use $\alpha = 0.05$ e determine se rejeita-se ou não $H_0$.
Como $z_{obs} = 2.04 > z_{crit} = 1.645$, rejeitamos $H_0$ ao nível de 5%.
Alternativamente, podemos tomar a decisão diretamente na escala da proporção amostral: como $\hat{p} = 0.06 > p_{crit} = 0.0561$, também rejeitamos $H_0$.
Ambas as abordagens — pela estatística padronizada ($z$) ou pela proporção crítica ($p_{crit}$) — conduzem à mesma decisão.
Erro padrão sob $H_1$:
$$ EP_1 = \sqrt{ \frac{p_1 (1 - p_1)}{n} } = \sqrt{ \frac{0.06 \cdot 0.94}{400} } \approx 0.01188 $$Novo valor $Z^*$ sob $H_1$:
Queremos saber a chance de que a proporção amostral fique abaixo do valor crítico $p_{crit} = 0.0561$, assumindo que a verdadeira proporção seja $p_1 = 0.06$.
Essa probabilidade define o erro tipo II ($\beta$). Para isso, calculamos o escore padronizado de $p_{crit}$ na distribuição sob $H_1$:
$$ Z^* = \frac{p_{crit} - p_1}{EP_1} = \frac{0.0561 - 0.06}{0.01188} \approx -0.33 $$Valores no R:
z_crit <- qnorm(1 - 0.05) # 1.645
p_crit <- 0.04 + 1.645 * ep0 # 0.0561
z_novo <- (p_crit - 0.06) / ep1 # ≈ -0.33
beta <- pnorm(z_novo) # ≈ 0.3707
potencia <- 1 - beta # ≈ 0.6293
A conclusão é que a potência estatística de $1-\beta \approx 62.93%$ está moderada, mas abaixo do ideal O ideal seria > 80%, para atingirmos esse valor, umas das ações possíveis é aumentar o número de amostras
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Parâmetros
p0 <- 0.04
p1 <- 0.06
n <- 400
alpha <- 0.05
# Erros padrão
ep0 <- sqrt(p0 * (1 - p0) / n)
ep1 <- sqrt(p1 * (1 - p1) / n)
# Crítico (unilateral à direita)
z_crit <- qnorm(1 - alpha)
p_crit <- p0 + z_crit * ep0
# Curvas sob H0 e H1
p_vals <- seq(0.02, 0.09, length.out = 1000)
h0 <- dnorm(p_vals, mean = p0, sd = ep0)
h1 <- dnorm(p_vals, mean = p1, sd = ep1)
df <- data.frame(p = p_vals, H0 = h0, H1 = h1)
# Métricas: β e potência
beta <- pnorm((p_crit - p1) / ep1) # P_H1(p < p_crit)
power <- 1 - beta
# Gráfico (atribuir a 'p')
p <- ggplot(df, aes(x = p)) +
geom_line(aes(y = H0), color = "black", linewidth = 1) +
geom_line(aes(y = H1), color = "blue", linewidth = 1) +
geom_area(data = subset(df, p > p_crit), aes(y = H0),
fill = "red", alpha = 0.4) + # α (tipo I)
geom_area(data = subset(df, p < p_crit), aes(y = H1),
fill = "orange", alpha = 0.3) + # β (tipo II)
geom_vline(xintercept = p0, linetype = "dashed", color = "black") +
geom_vline(xintercept = p1, linetype = "dashed", color = "blue") +
geom_vline(xintercept = p_crit,linetype = "dotted", color = "darkred") +
labs(title = "Teste de Hipótese: Erros Tipo I (α) e II (β)",
x = "Proporção amostral", y = "Densidade") +
annotate("text", x = 0.026, y = max(h0)*0.9, label = "H[0](p)", parse = TRUE, color = "black") +
annotate("text", x = 0.072, y = max(h1)*0.9, label = "H[1](p)", parse = TRUE, color = "blue") +
annotate("text", x = p_crit + 0.001, y = max(h0)*0.75,
label = sprintf("p_crit = %.4f", p_crit), hjust = 0, color = "darkred") +
theme_minimal()
# Salvar e embutir em base64
img_path <- tempfile(fileext = ".png")
ggsave(filename = img_path, plot = p, width = 9, height = 5.2, dpi = 130)
img_b64 <- dataURI(file = img_path, mime = "image/png")
# Exibir com legenda justificada
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:900px; margin:0 auto;">
<b>Figura:</b> teste unilateral à direita para proporções com n = %d.
Curvas: H<sub>0</sub>: p = %.2f (preta) e H<sub>1</sub>: p = %.2f (azul).
O limiar de decisão é p<sub>crit</sub> = %.4f (linha pontilhada vermelha).
A área vermelha representa o erro tipo I (α = %.2f), e a área laranja representa o erro tipo II (β = %.3f),
resultando em potência = 1 − β = %.3f.
</div>
</div>
', img_b64, n, p0, p1, p_crit, alpha, beta, power))
Exercício 168 — Potência estatística e tamanho de amostra¶
Uma empresa quer detectar uma diferença de 2 Mbps no throughput médio, com desvio padrão estimado de 5 Mbps, $\alpha = 0.05$ e potência de 90%.
Tarefas:
Calcule o tamanho mínimo da amostra necessário.
Explique o impacto de aumentar a potência para 95%.
Nossos dados:
- diferença no throughput médio desejada: 2 Mbps
- desvio padrão amostral = 5Mbps
- área de rejeição \alpha e erro tipo 1 = 0.05
- potência estatística $1-\beta$ = 90%
Uma fórmula possível é a que relaciona n ao z-crítico de $\alpha$ e $\beta$. Expressa o cálculo de $n$ com base em poder estatístico e o erro tipo I
$$ n = \left( \frac{(z_{\alpha} + z_{\beta}) \cdot \sigma}{\delta} \right)^2 $$Encontrando $z_{\alpha}$ e $z_{\beta}$ no R:
z_alpha <- qnorm(1 - 0.05) = 1.645
z_beta <- qnorm(0.90) = 1.282
Substituindo os valores:
$$ n = \left( \frac{(1.645 + 1.282) \cdot 5.0}{2.0} \right)^2 $$$$ n = \left( \frac{2.927 \cdot 5.0}{2.0} \right)^2 $$$$ n = \left( \frac{14.635}{2.0} \right)^2 $$$$ n = (7.3175)^2 $$$$ n \approx 53.6 \implies n = 54 $$Para um novo $1-\beta$=95%
z_beta <- qnorm(0.95)
# 1.645
Quando aumentamos a potência de 90% para 95%, o valor crítico $z_{\beta}$ cresce:
- Potência 90%: $z_{\beta} = 1.282$
- Potência 95%: $z_{\beta} = 1.645$
Logo, a soma $(z_{\alpha} + z_{\beta})$ aumenta:
$$ (z_{\alpha} + z_{\beta})_{90\%} = 1.645 + 1.282 = 2.927 $$$$ (z_{\alpha} + z_{\beta})_{95\%} = 1.645 + 1.645 = 3.290 $$Como $n$ depende do quadrado dessa soma, o crescimento é amplificado:
$$ n_{95\%} > n_{90\%} $$2. Conceitual¶
- Reduzir $\beta$ (aumentar a potência) significa querer menos falsos negativos, ou seja, garantir que diferenças reais sejam detectadas quase sempre.
- Para isso, é necessário que a curva de $H_1$ fique mais separada da curva de $H_0$.
- Como não podemos reduzir $\sigma$ (desvio da rede) nem aumentar $\delta$ (diferença mínima de interesse), o único recurso é aumentar $n$.
- Mais amostras $\implies$ menor erro padrão $\sigma / \sqrt{n}$ $\implies$ distribuições mais estreitas $\implies$ maior separação efetiva entre $H_0$ e $H_1$.
3. Intuição final¶
Exigir mais potência é como pedir mais certeza contra o erro tipo II e é possível ver claramente a redução do erro tipo II no cenário com $1-\beta$ = 95%.
Essa certeza só vem com mais dados: daí o aumento inevitável de $n$.
# Pacotes necessários
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(gridExtra)) install.packages("gridExtra")
if (!require(base64enc)) install.packages("base64enc")
if (system.file(package = "IRdisplay") != "") {
library(IRdisplay)
}
library(ggplot2)
library(gridExtra)
library(base64enc)
# Parâmetros fixos globais
delta <- 2.0
sigma <- 5.0
alpha <- 0.05
# Função para criar os gráficos sem plotar automaticamente
plot_power_analysis <- function(n, power, title) {
z_alpha <- qnorm(1 - alpha)
se <- sigma / sqrt(n)
mu0 <- 0
mu1 <- delta
crit <- mu0 + z_alpha * se
x <- seq(-5, 8, length.out = 2000)
df <- data.frame(
x = x,
H0 = dnorm(x, mean = mu0, sd = se),
H1 = dnorm(x, mean = mu1, sd = se)
)
alpha_df <- subset(df, x >= crit)
beta_df <- subset(df, x < crit)
alpha_val <- 1 - pnorm(crit, mean = mu0, sd = se)
beta_val <- pnorm(crit, mean = mu1, sd = se)
ggplot(df, aes(x)) +
geom_line(aes(y = H0, color = "H0")) +
geom_line(aes(y = H1, color = "H1")) +
geom_area(data = alpha_df, aes(y = H0), fill = "blue", alpha = 0.3) +
geom_area(data = beta_df, aes(y = H1), fill = "red", alpha = 0.3) +
geom_vline(xintercept = crit, linetype = "dashed") +
annotate("text", x = crit, y = max(df$H0)*0.9,
label = sprintf("Ponto crítico = %.2f", crit),
hjust = -0.1, vjust = 1, size = 3.5) +
annotate("text", x = mu0 + 3.9*se, y = max(df$H0)/2,
label = sprintf("α = %.3f", alpha_val),
color = "blue", size = 4) +
annotate("text", x = mu1 - 3.9*se, y = max(df$H1)/2,
label = sprintf("β = %.3f", beta_val),
color = "red", size = 4) +
annotate("text", x = -4.5, y = 0.5,
label = sprintf("H0: N(%.1f, %.2f²)", mu0, se),
color = "blue", size = 4, hjust = 0) +
annotate("text", x = 5, y = 0.3,
label = sprintf("H1: N(%.1f, %.2f²)", mu1, se),
color = "red", size = 4, hjust = 0) +
labs(title = sprintf("%s (n=%d, Potência=%.0f%%)", title, n, power*100),
y = "Densidade", x = "Diferença (Mbps)") +
scale_color_manual(values = c("H0" = "blue", "H1" = "red")) +
theme_minimal() +
theme(legend.position = "bottom", legend.title = element_blank(),
plot.margin = unit(c(1,1,1,1), "cm"))
}
# Cria os gráficos sem mostrar
p1 <- plot_power_analysis(54, 0.90, "Cenário 1")
p2 <- plot_power_analysis(68, 0.95, "Cenário 2")
# --- NOVO BLOCO: Renderiza e salva o gráfico de forma controlada ---
img_path <- tempfile(fileext = ".png")
png(img_path, width = 1200, height = 500, res = 100)
grid.arrange(p1, p2, ncol = 2) # Renderiza a combinação diretamente para o arquivo PNG
dev.off()
# Converte para base64 e remove o arquivo temporário
img_b64 <- base64enc::dataURI(file = img_path, mime = "image/png")
unlink(img_path)
# Cálculos para a legenda
delta <- 2.0
sigma <- 5.0
alpha <- 0.05
beta_n54 <- pnorm(qnorm(1 - alpha, mean = 0, sd = sigma/sqrt(54)), mean = delta, sd = sigma/sqrt(54))
beta_n68 <- pnorm(qnorm(1 - alpha, mean = 0, sd = sigma/sqrt(68)), mean = delta, sd = sigma/sqrt(68))
power_54 <- 1 - beta_n54
power_68 <- 1 - beta_n68
display_html(sprintf('
<div style="text-align:center; max-width:100%%;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:12px; font-size:90%%; color:#555; text-align:justify; max-width:900px; margin:0 auto;">
<b>Figura:</b> Esta análise de poder estatístico para um teste Z de uma cauda compara dois cenários com uma diferença real (δ) de %.1f Mbps, desvio padrão (σ) de %.1f Mbps e nível de significância (α) de %.2f. O cenário 1 (n=54) apresenta um erro tipo II (β) de %.3f, resultando em uma potência de %.3f. Já o cenário 2 (n=68), com um tamanho amostral maior, reduz o erro β para %.3f, elevando a potência para %.3f. O gráfico demonstra visualmente como o aumento do tamanho da amostra (n) diminui a área de β (vermelha) e, consequentemente, aumenta a potência do teste.
</div>
</div>',
img_b64, delta, sigma, alpha, beta_n54, power_54, beta_n68, power_68))
Exercício 169 — Comparação visual de dois grupos¶
Um experimento foi feito para medir o tempo total de entrega (latência de ida) de pacotes transmitidos usando dois protocolos distintos (ex: TCP e UDP), sob as mesmas condições de rede.
Embora o tempo de propagação física não dependa do protocolo, diferentes protocolos podem adicionar sobrecargas de controle, framing ou temporização que afetam a latência total observada.
Deseja-se comparar, visualmente e estatisticamente, os tempos médios observados para cada protocolo.
Tarefas:
Construa um gráfico de caixas (boxplot) com os tempos medidos para os dois grupos.
Verifique se há indícios visuais de diferença entre os protocolos.
Por “indícios visuais”, entende-se a observação de separação entre as medianas, pouca sobreposição entre as caixas ou diferenças evidentes de variabilidade. Esses sinais podem sugerir uma possível diferença estatística entre os grupos, a ser confirmada no teste.
Calcule a média, o desvio padrão e o tamanho da amostra de cada grupo.
Realize um teste de hipótese para diferença de médias (assuma variâncias iguais).
Interprete o resultado: há diferença estatisticamente significativa nos tempos de entrega?
# Pacotes
library(ggplot2)
library(base64enc)
library(IRdisplay)
# Dados simulados
set.seed(42)
n <- 50
dados <- data.frame(
latencia_ms = c(rnorm(n, 20, 2), # UDP
rnorm(n, 24, 3)), # TCP
protocolo = rep(c("UDP", "TCP"), each = n)
)
# Criar gráfico
p <- ggplot(dados, aes(x = protocolo, y = latencia_ms, fill = protocolo)) +
geom_boxplot() +
scale_fill_brewer(palette = "Pastel1") +
labs(title = "Latência UDP vs TCP",
x = "Protocolo",
y = "Latência (ms)") +
theme_minimal()
# Estatísticas descritivas
estatisticas <- aggregate(latencia_ms ~ protocolo, dados,
FUN = function(x) c(mediana = median(x),
iqr = IQR(x)))
# Salvar e embutir
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 7, height = 5)
img_b64 <- base64enc::dataURI(file = img_path, mime = "image/png")
# Exibir com legenda
display_html(sprintf('
<div style="text-align:center; max-width:800px; margin:0 auto;">
<img src="%s" style="max-width:100%%; height:auto;">
<div style="margin-top:10px; color:#555; text-align:justify;">
<b>Figura:</b> comparação de latência entre protocolos (n=%d por grupo).
Mediana UDP = %.1f ms (IQR = %.1f ms) vs TCP = %.1f ms (IQR = %.1f ms).
Boxplots mostram quartis, com bigodes de 1.5×IQR e pontos para outliers.
</div>
</div>',
img_b64, n,
estatisticas[1,2][1], estatisticas[1,2][2], # UDP: mediana e IQR
estatisticas[2,2][1], estatisticas[2,2][2])) # TCP: mediana e IQR
Exercício 170 — Variação de significância e conclusão do teste¶
Um analista realiza testes em links de backbone para detectar aumento na latência. Os dados abaixo mostram o valor da estatística de teste $z = 2.1$.
Tarefas:
- Gere um gráfico da curva normal padrão destacando a área de rejeição para três valores de $\alpha$: 0.10, 0.05 e 0.01.
- Para cada $\alpha$, conclua se $z = 2.1$ leva à rejeição da hipótese nula.
- Comente o impacto da escolha de $\alpha$ na decisão.
library(ggplot2)
library(tidyr)
x <- seq(-4, 4, length.out = 1000)
df <- data.frame(
x = x,
dnorm = dnorm(x)
)
# Limiares para diferentes níveis de significância
limiares <- data.frame(
alpha = c(0.10, 0.05, 0.01),
zcrit = qnorm(1 - c(0.10, 0.05, 0.01)),
cor = c("orange", "blue", "red")
)
ggplot(df, aes(x, dnorm)) +
geom_line(size = 1.2) +
geom_area(data = subset(df, x > limiares$zcrit[1]), fill = limiares$cor[1], alpha = 0.3) +
geom_area(data = subset(df, x > limiares$zcrit[2]), fill = limiares$cor[2], alpha = 0.3) +
geom_area(data = subset(df, x > limiares$zcrit[3]), fill = limiares$cor[3], alpha = 0.3) +
geom_vline(xintercept = 2.1, linetype = "dashed", color = "black") +
labs(title = "Rejeição da Hipótese nula para diferentes níveis de significância",
subtitle = "Linha preta: z observado = 2.1",
x = "z", y = "densidade") +
theme_minimal()
Exercício 171 — Potência estatística¶
Um engenheiro deseja detectar uma diferença de 0.1% na taxa de perda com 80% de potência. O desvio padrão estimado é 0.2%.
Tarefa:
- Estime o tamanho mínimo da amostra necessário para detectar essa diferença com $\alpha = 0.05$.
- Interprete a importância da potência nesse teste.
Exercício 172 — Simulação de tamanho da amostra¶
Simule no R:
n <- c(10, 20, 50, 100)
margem_erro <- 1.96 * 8 / sqrt(n)
plot(n, margem_erro, type = "b", col = "blue", ylab = "Margem de erro", xlab = "Tamanho da amostra")
Tarefa:
- Interprete o gráfico: como a margem de erro varia com $n$?
- Para que $n$ a margem de erro cai abaixo de 2 ms?