Plano de exercícios: versão 1248

  1. Espaço amostral e conjuntos distintos

    • Espaço amostral finito e discreto ✅
    • Eventos como subconjuntos ✅
  2. Combinação, Permutação e Binômio de Newton

    • Contagem de eventos ✅
    • Fatorial e coeficientes binomiais ✅
    • Aplicações em transmissão e endereçamento
  3. Variáveis Aleatórias, Esperança e Variância

    • Função de probabilidade
    • Valor esperado como centro de massa 🔲
    • Variância como medida de dispersão 🔲
  4. Distribuições de Probabilidade em Telecom (Binomial e Poisson)

    • Binomial: número de sucessos em n transmissões ✅
    • Poisson: número de eventos por intervalo de tempo ✅
    • Modelos discretos aplicados a tráfego e erros ✅

4.1. Probabilidade Condicional e Independência

  • Probabilidade conjunta e condicional ✅
  • Independência de eventos ✅
  • Aplicações em segurança, falhas e confiabilidade ✅
  1. Teorema de Bayes e Inferência Probabilística

    • Atualização de crenças com evidências ✅
    • Classificação e fusão de sensores ✅
    • Aplicações em HAR, QoS e decisão binária 🔲
  2. Erros, Resíduos e Intervalos de Confiança

    • Erro amostral vs erro residual
    • Construção de intervalos de confiança
    • Interpretação em experimentos repetíveis
  3. Regressão Linear Simples

    • Ajuste de curva por mínimos quadrados
    • Interpretação geométrica dos resíduos
    • Aplicações em modelagem de tráfego e séries temporais

Exercício 1¶

Um roteador gerencia a sub-rede 192.168.1.0/24, com 254 IPs disponíveis para hosts. Suponha que um sistema sorteia aleatoriamente 1 endereço IP dessa sub-rede.

Pergunta: Qual é o espaço amostral desse experimento?
$\displaystyle \Omega = \{192.168.1.1,\ 192.168.1.2,\ ...,\ 192.168.1.254\}$

Quantos elementos ele possui?
$\displaystyle 2^8 - 2$


Exercício 2¶

Na sub-rede 10.0.0.0/30, quais são os possíveis IPs atribuíveis a hosts?

$\displaystyle 2^2 - 2$ hosts,
$\displaystyle \Omega = \{10.0.0.1, 10.0.0.2\} \Rightarrow |\Omega| = 2$


Exercício 4¶

Uma ferramenta sorteia um endereço de IP da faixa 172.16.0.0 até 172.16.0.15.

Pergunta: Quantos elementos tem o espaço amostral?
$\displaystyle \Omega = 16$

Bloco 2 – Portas e protocolos¶

Exercício 5¶

Um cliente escolhe aleatoriamente uma porta TCP entre 49152 e 65535.
$\Omega = \{49152, 49153, ..., 65535\}$
$|\Omega| = 16384$


exercicio 6¶

Dez portas UDP (entre 8000 e 8009) estão ativas. Um sistema escolhe uma delas.
$\Omega = \{8000, 8001, ..., 8009\} \Rightarrow |\Omega| = 10$


Exercício 7¶

Uma conexão HTTPS usa sempre a porta 443. Um IDS verifica se a porta está ativa (Sim ou Não).

$\Omega = \{Sim, Não\}$


Exercício 8¶

Um scanner testa aleatoriamente 5 portas entre 1 e 1024, sem repetição:
Permutação (ordem importa):
O A permutação é um caso particular do arranjo,a combinação é menor por que ABC é igual a CBA

$|\Omega| = 1024 \cdot 1023 \cdot 1022 \cdot 1021 \cdot 1020$
Combinação (ordem importa não, ou seja ABC = CBA ):
$|\Omega| = \binom{1024}{5} = \dfrac{1024 \cdot 1023 \cdot 1022 \cdot 1021 \cdot 1020}{120}$


Bloco 3 – Pacotes e interfaces¶

Exercício 9¶

Um comutador recebe pacotes rotulados A, B, C. Um pacote é escolhido para inspeção.
$\Omega = \{A, B, C\} \Rightarrow |\Omega| = 3$


Exercício 10¶

Pacotes chegam com rótulo e interface: (A, eth0), (B, eth1), (C, eth2).
Produto cartesiano: $|\Omega| = 3 \cdot 3 = 9$


Exercício 11¶

Dois pacotes chegam por três interfaces possíveis (ordem importa):
$|\Omega| = 3 \cdot 3 \cdot 2 = 18$ combinações


Exercício 12¶

Um roteador pode encaminhar pacotes por 4 links. Um pacote sai por um link aleatório.
$\Omega = \{L_1, L_2, L_3, L_4\} \Rightarrow |\Omega| = 4$

Bloco 4 – MAC e ARP¶

Exercício 13¶

Um host emite uma requisição ARP e pode receber resposta de 3 hosts diferentes.
$\Omega = \{A_1, A_2, A_3\} \Rightarrow |\Omega| = 3$


Exercício 14¶

Um switch associa 4 MACs a 4 portas. Um pacote chega.
$\Omega = \{D_1, D_2, D_3\} \Rightarrow |\Omega| = 3$


Exercício 15¶

Em uma tabela ARP com 5 entradas únicas, uma entrada é apagada aleatoriamente.
$\Omega = \{P_1, P_2, P_3, P_4, P_5\} \Rightarrow |\Omega| = 5$

Bloco 5 – Protocolo e conteúdo de pacotes¶

Exercício 16¶

O campo de protocolo IP:
$\Omega = \{1, 6, 17\}$


Exercício 17¶

Campo TTL de um pacote IPv4:
$\Omega = \{1, 2, ..., 255\} \Rightarrow |\Omega| = 255$


Exercício 18¶

Cabeçalho TCP com 6 flags (URG, ACK, PSH, RST, SYN, FIN).
Total de subconjuntos: $|\Omega| = 2^6 = 64$

Bloco 6 – Combinatórias simples em redes¶

Exercício 19¶

Escolher 2 switches entre 5 (ordem não importa):
$|\Omega| = \binom{5}{2} = 10$


Exercício 20¶

3 firewalls podem ser ativados em qualquer ordem (ordem importa):
$|\Omega| = 3! = 6$


Exercício 21¶

Entre 10 pacotes, escolhem-se 3 para monitoramento (sem reposição):
$|\Omega| = \binom{10}{3} = 120$


Exercício 22¶

Permutação dos servidores A, B e C:
$|\Omega| = 3! = 6$

Bloco 8 – Eventos binários em redes¶

Exercício 26¶

Uma conexão pode ser estabelecida ou não:
$|\Omega| = 2$


Exercício 27¶

Um firewall pode permitir ou negar um pacote:
$|\Omega| = 2$


Exercício 28¶

Um link pode estar ativo/inativo a cada 10 minutos, observado 3 vezes:
$|\Omega| = 2^3 = 8$ tuplas
$\Omega = \{(0,0,0),\ (0,0,1),\ ...,\ (1,1,1)\}$

Bloco 7 – DNS, HTTP e protocolos de aplicação¶

Exercício 23¶

Servidor DNS retorna 1 de 4 possíveis IPs:
$|\Omega| = 4$


Exercício 24¶

Cliente HTTP escolhe: GET, POST, PUT, DELETE:
$|\Omega| = 4$


Exercício 25¶

Navegador alterna entre 3 servidores proxy:
$|\Omega| = 3$

Bloco 9 – Fragmentação e retransmissão¶

Exercício 29¶

Um datagrama IP pode ser fragmentado em 1, 2 ou 3 pedaços.
Pergunta: Qual o espaço amostral?
$\displaystyle \Omega = \{1, 2, 3\} \Rightarrow |\Omega| = 3$


Exercício 30¶

Um pacote TCP pode exigir 0, 1 ou 2 retransmissões.
Pergunta: Qual o espaço amostral?
$\displaystyle \Omega = \{0, 1, 2\} \Rightarrow |\Omega| = 3$

Fase 2 – Bloco 1: Eventos como Subconjuntos (continuação)¶

Exercício 31¶

Considere o espaço amostral $\Omega = \{p_0, p_1, p_2\}$. Quantos eventos distintos podem ser formados?
$\displaystyle n = 2^3$


Exercício 32¶

Considere o espaço amostral $\Omega = \{p_0, p_1, p_2, p_3\}$. Quantos eventos distintos podem ser formados?
$\displaystyle n = 2^4$


Exercício 33¶

Considere o espaço amostral $\Omega = \{p_0, p_1, p_2, p_3, p_4\}$. Quantos eventos distintos podem ser formados?
$\displaystyle n = 2^5$


Exercício 34¶

Considere o espaço amostral $\Omega = \{p_0, p_1, p_2, p_3, p_4, p_5\}$. Quantos eventos distintos podem ser formados?
$\displaystyle n = 2^6$


Exercício 35¶

Considere o espaço amostral $\Omega = \{p_0, p_1\}$. Quantos eventos distintos podem ser formados?
$\displaystyle n = 2^2$


Exercício 36¶

Considere o espaço amostral $\Omega = \{\text{eth0}, \text{eth1}, \text{eth2}, \text{eth3}\}$. Liste todos os eventos que contêm exatamente dois elementos.
$\{\{\text{eth0}, \text{eth1}\}, \{\text{eth0}, \text{eth2}\}, \{\text{eth0}, \text{eth3}\}, \{\text{eth1}, \text{eth2}\}, \{\text{eth1}, \text{eth3}\}, \{\text{eth2}, \text{eth3}\}\}$


Exercício 37¶

Seja $\Omega = \{A, B, C, D\}$. Quantos eventos existem que não contêm o elemento $A$?
$\displaystyle n = 2^3$


Exercício 38¶

Seja $\Omega = \{\text{GET}, \text{POST}, \text{PUT}, \text{DELETE}\}$. Quantos eventos possuem pelo menos dois elementos?
$\displaystyle \binom{4}{2} + \binom{4}{3} + \binom{4}{4} = 6 + 4 + 1 = 11$


Exercício 39¶

Considere $\Omega = \{\text{ICMP}, \text{TCP}, \text{UDP}\}$. Liste todos os eventos que são subconjuntos próprios de $\Omega$.
$\displaystyle \binom{3}{0} + \binom{3}{1} + \binom{3}{2} = 1 + 3 + 3 = 7$ subconjuntos próprios


Exercício 39b¶

Seja $\Omega = \{1, 2, 3, 4, 5\}$. Quantos eventos contêm simultaneamente os elementos 1 e 2?
$\displaystyle \text{Fixando 1 e 2, restam 3 elementos livres} \Rightarrow 2^3 = 8$ subconjuntos
Eventos:
$\{1,2\}, \{1,2,3\}, \{1,2,4\}, \{1,2,5\}, \{1,2,3,4\}, \{1,2,3,5\}, \{1,2,4,5\}, \{1,2,3,4,5\}$

Fase 2 – Bloco 1: Eventos como Subconjuntos (continuação)¶


40. Seja $\Omega = \{1,2,3,4\}$. Quantos eventos contêm exatamente um único elemento?
$\displaystyle n = 4$


41. Seja $\Omega = \{a,b,c,d,e\}$. Quantos eventos não contêm o elemento $e$?
$\displaystyle 2^{4} = 16$


42. Seja $\Omega = \{x_1, x_2, x_3, x_4, x_5\}$. Quantos eventos possuem pelo menos dois elementos?
$\displaystyle 2^5 - \binom{5}{0} - \binom{5}{1} = 32 - 1 - 5 = 26$


43. Considere o espaço amostral $\Omega = \{0,1\}^3$ (todos os vetores binários de 3 bits). Quantos eventos distintos podem ser formados?
$\displaystyle |\Omega| = 2^3 = 8$


44. Seja $\Omega = \{A,B,C\}$. Quantos eventos contêm exatamente dois elementos?
$\displaystyle \binom{3}{2} = 3$


45. Seja $\Omega = \{\text{GET}, \text{POST}, \text{PUT}, \text{DELETE}, \text{PATCH}\}$. Quantos eventos contêm simultaneamente GET e POST?
Fixando GET e POST, restam 3 elementos livres → $\displaystyle 2^3 = 8$


46. Seja $\Omega = \{1,2,3,4,5,6\}$. Quantos eventos contêm os elementos 1 e 2, mas não o 3?
Fixando 1 e 2, excluindo 3 → sobram 3 elementos → $\displaystyle 2^3 = 8$


47. Considere $\Omega = \{a,b,c,d\}$. Liste todos os eventos com exatamente três elementos.
$\{abc,\ abd,\ acd,\ bcd\}$


48. Seja $\Omega = \{r_1, r_2, r_3, r_4, r_5\}$. Quantos eventos possuem no máximo dois elementos?
$\displaystyle \binom{5}{0} + \binom{5}{1} + \binom{5}{2} = 1 + 5 + 10 = 16 = 2^4$


49. Seja $\Omega = \{a,b,c,d,e\}$. Quantos eventos $\{P_1, P_2, P_3, P_4\}$ contêm pelo menos o elemento $a$?
Fixando $a$, escolher 3 entre os outros 4 → $\displaystyle \binom{4}{3} = 4$


50. Seja $\Omega = \{P_1, P_2, P_3, P_4\}$. Quantos eventos têm exatamente três elementos?
$\displaystyle \binom{4}{3} = 4$


51. Seja $\Omega = \{1,2,3,4,5,6\}$. Quantos eventos são subconjuntos com número ímpar de elementos?
$\binom{6}{1} + \binom{6}{3} + \binom{6}{5} = 6 + 20 + 6 = 32$


52. Seja $\Omega = \{A,B,C,D,E\}$. Quantos eventos possuem exatamente dois ou três elementos?
$\binom{5}{2} + \binom{5}{3} = 10 + 10 = 20$


53. Seja $\Omega = \{x,y,z\}$. Quantos eventos não contêm simultaneamente $x$ e $y$?
$2^3 - 1 = 8 - 2 = 6$ (excluindo $\{x,y\}$ e todos que o contêm)


54. Seja $\Omega = \{a,b,c,d,e,f\}$. Quantos eventos contêm pelo menos quatro elementos?
$\binom{6}{4} + \binom{6}{5} + \binom{6}{6} = 15 + 6 + 1 = 22$


55. Seja $\Omega = \{1,2,3,4\}$. Quantos eventos contêm exatamente os elementos 1 e 2, e mais um outro qualquer?
Escolher 1 entre $\{3,4\} \Rightarrow \binom{2}{1} = 2 \Rightarrow$ eventos: $\{1,2,3\}, \{1,2,4\}$


56. Seja $\Omega = \{P_1, P_2, P_3, P_4, P_5\}$. Quantos eventos possuem exatamente quatro elementos?
$\displaystyle \binom{5}{4} = 5$


57. Seja $\Omega = \{A,B,C,D,E\}$. Quantos eventos existem que não contêm os elementos $A$ nem $B$?
Eventos sobre $\{C,D,E\} \Rightarrow 2^3 = 8$


58. Seja $\Omega = \{r,s,t,u\}$. Quantos eventos contêm pelo menos o elemento $r$?
Fixando $r$, livres $\{s,t,u\} \Rightarrow 2^3 = 8$


59. Seja $\Omega = \{1,2,3,4,5\}$. Quantos eventos têm exatamente dois elementos ímpares?
$\binom{3}{2} \cdot 2^1 = 3 \cdot 2 = 6$ subconjuntos com dois ímpares e um par (ex: $\{1,3,2\}$)

  • $\binom{3}{2} = 3$ com apenas os dois ímpares. Total = 9 eventos.

60. Seja $\Omega = \{a,b,c,d\}$. Quantos eventos contêm exatamente dois elementos e não contêm o elemento $a$?
Escolher 2 entre $\{b,c,d\} \Rightarrow \binom{3}{2} = 3$

Fase 3 – Bloco 1: Variável Aleatória Discreta¶

61. Considere a variável aleatória $X$ que representa o número de pacotes recebidos por um roteador em 1 segundo, podendo assumir os valores $0$, $1$ ou $2$. Suponha que as probabilidades sejam $P(X=0)=0,.$, $P(X=1)=0,.$, $P(X=2)=0.3$. Represente graficamente a função de probabilidade.

In [2]:
library(ggplot2)
library(base64enc)
library(IRdisplay)

# Criar dataframe
df <- data.frame(X = factor(c(0, 1, 2)), P = c(0.2, 0.5, 0.3))

# Caminho temporário
img_path <- tempfile(fileext = ".png")

# Criar gráfico
p <- ggplot(df, aes(x = X, y = P)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Distribuição de Probabilidade de X",
       x = "Pacotes por segundo (X)", y = "P(X = x)") +
  ylim(0, 1) +
  theme_minimal()

# Salvar com tamanho reduzido
ggsave(filename = img_path, plot = p, width = 4, height = 1.5, dpi = 150)


# Codificar como base64
img_b64 <- dataURI(file = img_path, mime = "image/png")

# Exibir no notebook (centralizado)
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> esta distribuição de probabilidade discreta representa a variável aleatória X, 
    que assume os valores 0, 1 e 2 pacotes por segundo. 
    A altura de cada barra indica a probabilidade P(X = x) de ocorrência de cada valor.
    Observa-se que o valor mais provável é X = 1 (50%%), seguido de X = 2 (30%%) e X = 0 (20%%). 
    Esse tipo de visualização ajuda a compreender a concentração de probabilidade e a assimetria de uma distribuição discreta.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: esta distribuição de probabilidade discreta representa a variável aleatória X, que assume os valores 0, 1 e 2 pacotes por segundo. A altura de cada barra indica a probabilidade P(X = x) de ocorrência de cada valor. Observa-se que o valor mais provável é X = 1 (50%), seguido de X = 2 (30%) e X = 0 (20%). Esse tipo de visualização ajuda a compreender a concentração de probabilidade e a assimetria de uma distribuição discreta.

Exercício 62¶

Para a variável aleatória do exercício anterior, calcule $P(X \leq 1)$ e $P(X > 0)$.

R – $P(X \leq 1) = 0.2$ e $P(X > 0) = 0.8$


Exercício 63¶

Verifique se as probabilidades fornecidas no exercício 61 constituem uma distribuição de probabilidade válida.

R – Sim, $\displaystyle \sum P(X = x) = 1$

Exercícios 64–65¶

Um servidor monitora o número de tentativas de acesso por segundo.
A variável $Y$ pode assumir os valores de $0$ a $4$, com probabilidades proporcionais a esses valores.

64. Determine a função de probabilidade de $Y$.

Como as probabilidades são proporcionais aos valores de $Y$, temos:
$P(Y = y) = \dfrac{y}{\sum_{k=0}^{4} k} = \dfrac{y}{10}$, para $y = 0, 1, 2, 3, 4$
Logo, $P(Y = 0) = 0$, $P(Y = 1) = 0.1$, $P(Y = 2) = 0.2$, $P(Y = 3) = 0.3$, $P(Y = 4) = 0.4$


65. Crie um gráfico de barras com os valores de $Y$ e suas respectivas probabilidades.

In [3]:
library(ggplot2)
library(IRdisplay)

# Criar dataframe
df <- data.frame(X = factor(c(0, 1, 2, 3, 4)), P = c(0.0, 0.1, 0.2, 0.3, 0.4))

# img_path para salvar o gráfico
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/probabilidade_X.png"

# Criar o gráfico
p <- ggplot(df, aes(x = X, y = P)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Distribuição de Probabilidade de X",
       x = "Pacotes por segundo (X)", y = "P(X = x)") +
  ylim(0, 1) +
  theme_minimal()
# Salvar no diretório
ggsave(filename = img_path, plot = p, width = 7, height = 5, dpi = 300)

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> a distribuição apresentada mostra a probabilidade de X assumir valores entre 0 e 4 pacotes por segundo. 
    Nota-se que a probabilidade cresce de forma contínua até atingir seu valor máximo em X = 4 (40%%), 
    indicando que valores maiores de X são mais prováveis nesta configuração. 
    A visualização permite comparar rapidamente a frequência relativa de cada valor possível.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: a distribuição apresentada mostra a probabilidade de X assumir valores entre 0 e 4 pacotes por segundo. Nota-se que a probabilidade cresce de forma contínua até atingir seu valor máximo em X = 4 (40%), indicando que valores maiores de X são mais prováveis nesta configuração. A visualização permite comparar rapidamente a frequência relativa de cada valor possível.

Exercício 66/67¶

Um pacote pode ser aceito ($1$) ou descartado ($0$).
Defina a variável aleatória $Z$ associada a esse experimento e descreva sua distribuição de probabilidade.

A variável aleatória $Z$ assume valores em $\{0,1\}$.
Essa é uma distribuição de Bernoulli, utilizada para modelar experimentos com dois resultados possíveis.

$\text{Distribuição de Bernoulli: } Z \in \{0,1\}$ $$ P(Z = z) = \begin{cases} p & \text{se } z = 1 \\\\ 1 - p & \text{se } z = 0 \\\\ 0 & \text{caso contrário} \end{cases} $$
In [4]:
library(IRdisplay)
library(base64enc)

# Caminho temporário
img_path <- tempfile(fileext = ".png")

# Valores possíveis da variável Z
z <- c(0, 1)

# Probabilidades genéricas (valores arbitrários apenas para o desenho)
p_val <- 0.7
probs <- c(1 - p_val, p_val)

# Abrir dispositivo gráfico
png(filename = img_path, width = 600, height = 400)

# Criar gráfico de barras
barplot(probs, names.arg = z, col = "steelblue",
        main = "Distribuição de Probabilidade de Z ~ Bernoulli(p)",
        xlab = "Z", ylab = "P(Z = z)",
        ylim = c(0, 1))

# Adicionar rótulos simbólicos
text(x = 1, y = probs[1] + 0.05, labels = expression(1 - p), cex = 1.2)
text(x = 2, y = probs[2] + 0.05, labels = expression(p), cex = 1.2)

dev.off()

# Converter para base64
img_b64 <- dataURI(file = img_path, mime = "image/png")

# Exibir centralizado com descriçã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> representação gráfica da distribuição de Bernoulli para a variável Z, 
    onde $P(Z=1) = p$ e $P(Z=0) = 1 - p$. Essa forma de visualização é útil para compreender 
    a natureza dicotômica do experimento, no qual o pacote pode ser aceito ou descartado.
  </div>
</div>
', img_b64))
agg_record_338827050: 2
No description has been provided for this image
Figura: representação gráfica da distribuição de Bernoulli para a variável Z, onde $P(Z=1) = p$ e $P(Z=0) = 1 - p$. Essa forma de visualização é útil para compreender a natureza dicotômica do experimento, no qual o pacote pode ser aceito ou descartado.

Exercício 68¶

Suponha uma variável $W$ que representa o número de links ativos entre 3 disponíveis. Liste o espaço amostral e associe os valores da variável.

In [5]:
# Pacotes necessários
library(IRdisplay)

# Criar diretório, se necessário
dir.create("D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/", recursive = TRUE, showWarnings = FALSE)

# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/enlaces_ativos.png"

# Abrir dispositivo gráfico para salvar
png(filename = img_path, width = 700, height = 500)

# Valores possíveis da variável Z
z <- c(0, 1, 2, 3)

# Probabilidades associadas
p <- c(1/8, 3/8, 3/8, 1/8)

# Gráfico de barras
barplot(p, names.arg = z, col = "steelblue",
        main = "Distribuição de Probabilidade do Número de Enlaces Ativos",
        xlab = "Z", ylab = "P(Z = z)",
        ylim = c(0, 1))

# Fechar dispositivo gráfico
invisible(dev.off())

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição de probabilidade do número de enlaces ativos, 
    onde a variável aleatória $Z$ representa a contagem de enlaces simultaneamente em operação. 
    A simetria na distribuição indica que configurações com dois enlaces ativos e 
    configurações com apenas um ou três enlaces ativos possuem probabilidades iguais (3/8), 
    enquanto os extremos (nenhum ou todos ativos) têm menor probabilidade (1/8). 
    
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuição de probabilidade do número de enlaces ativos, onde a variável aleatória $Z$ representa a contagem de enlaces simultaneamente em operação. A simetria na distribuição indica que configurações com dois enlaces ativos e configurações com apenas um ou três enlaces ativos possuem probabilidades iguais (3/8), enquanto os extremos (nenhum ou todos ativos) têm menor probabilidade (1/8).

Exercícios 69/70¶

Defina a variável aleatória que representa o número de sucessos em 4 transmissões independentes, cada uma com probabilidade $0.8$ de sucesso.
Usando R, gere o gráfico da distribuição de probabilidade da variável definida no exercício.

Para a solução deste exercício, primeiro temos que definir alguns termos:
  • $n = 4$ como número de tentativas
  • $\Omega = \{0,1,2,3,4\}$ como o possível número de sucessos
  • $p = 0.8$ como a probabilidade de sucesso
  • $1 - p = 0.2$ como a probabilidade de falha
  • $k$ representa o número de sucessos
Podemos então modelar isso como uma função binomial de ensaios de Bernoulli, ou seja, 4 tentativas com resultados discretos (0 ou 1), onde 0 é falha e 1 é sucesso. A função de probabilidade associada é: $$ X \sim \text{Bin}(n, p) $$ Nota: dizemos que ${X∼Bin(n,p) = Bin(4,0.8)}$. A variável $ X$ segue uma distribuiçao binomial.
In [6]:
# Pacotes
library(IRdisplay)

# Criar diretório, se necessário
dir.create("D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs", recursive = TRUE, showWarnings = FALSE)

# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_n4_p08.png"

# Valores de k e parâmetros da binomial
k <- 0:4
n <- 4
p <- 0.8
y <- dbinom(k, size = n, prob = p)

# Salvar gráfico
png(filename = img_path, width = 700, height = 500)
barplot(y, names.arg = k, col = "steelblue",
        main = "Distribuição Binomial (n = 4, p = 0.8)",
        xlab = "Número de sucessos (k)", ylab = "P(X = k)",
        ylim = c(0, 0.5))
invisible(dev.off())

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição binomial com parâmetros $n = 4$ e $p = 0.8$. 
    A variável aleatória $X$ representa o número de sucessos em quatro tentativas independentes, 
    cada uma com probabilidade $p$ de sucesso. 
    A maior probabilidade ocorre em $k = 4$ sucessos e a menor em $k = 0$, 
    o que indica predominância de resultados com alto número de sucessos.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuição binomial com parâmetros $n = 4$ e $p = 0.8$. A variável aleatória $X$ representa o número de sucessos em quatro tentativas independentes, cada uma com probabilidade $p$ de sucesso. A maior probabilidade ocorre em $k = 4$ sucessos e a menor em $k = 0$, o que indica predominância de resultados com alto número de sucessos.

Exercícios 71/72¶

Um IDS (sistema de detecção de intrusos) detecta entre 0 e 3 tentativas maliciosas por hora.
As probabilidades são:

  • $P(0) = 0.1$
  • $P(1) = 0.3$
  • $P(2) = 0.4$
  • $P(3) = 0.2$

71. Modele graficamente.

In [7]:
# Pacotes
library(IRdisplay)

# Criar diretório, se necessário
dir.create("D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs", recursive = TRUE, showWarnings = FALSE)

# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/tentativas_maliciosas.png"

# Valores da variável Z e probabilidades
z <- c(0, 1, 2, 3)
p <- c(0.1, 0.3, 0.4, 0.2)

# Salvar gráfico
png(filename = img_path, width = 700, height = 500)
barplot(p, names.arg = z, col = "steelblue",
        main = "Distribuição de Probabilidade Tentativas Maliciosas",
        xlab = "Z", ylab = "P(Z = z)",
        ylim = c(0, 0.5))
invisible(dev.off())

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição de probabilidade da variável $Z$, que representa o número de tentativas maliciosas observadas em um intervalo. 
    A maior probabilidade ocorre em $Z = 2$, seguida de $Z = 1$ e $Z = 3$. 
    O menor valor é observado em $Z = 0$, indicando que o cenário mais comum envolve múltiplas tentativas maliciosas.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuição de probabilidade da variável $Z$, que representa o número de tentativas maliciosas observadas em um intervalo. A maior probabilidade ocorre em $Z = 2$, seguida de $Z = 1$ e $Z = 3$. O menor valor é observado em $Z = 0$, indicando que o cenário mais comum envolve múltiplas tentativas maliciosas.

Exercício 73¶

Uma variável aleatória $X$ tem distribuição dada por $P(X = k) = \dfrac{1}{n}$ para $k = 1, \dots, n$.
Que nome se dá a essa distribuição?

Essa é a **distribuição uniforme discreta**, na qual todos os valores de $k$ têm a **mesma probabilidade**: $P(X = k) = \dfrac{1}{n}$, $k \in \{1, 2, \dots, n\}$.

Exercícios 74/75¶

Um roteador recebe até 5 pacotes por segundo. A variável $X$ conta quantos pacotes chegam.
Dê um exemplo de função de probabilidade que modele esse caso com viés para números baixos de pacotes por segundo.

Uma função de probabilidade com viés para valores baixos pode ser: $$ P(X = k) = \begin{cases} 0.30 & \text{se } k = 0 \\\\ 0.25 & \text{se } k = 1 \\\\ 0.20 & \text{se } k = 2 \\\\ 0.15 & \text{se } k = 3 \\\\ 0.06 & \text{se } k = 4 \\\\ 0.04 & \text{se } k = 5 \\\\ 0 & \text{caso contrário} \end{cases} $$
In [8]:
# Pacotes
library(IRdisplay)

# Criar diretório, se necessário
dir.create("D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs", recursive = TRUE, showWarnings = FALSE)

# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/vies_pacotes_baixos.png"

# Valores e probabilidades
k <- 0:5
p <- c(0.30, 0.25, 0.20, 0.15, 0.06, 0.04)

# Salvar imagem
png(filename = img_path, width = 700, height = 500)
barplot(p, names.arg = k, col = "steelblue",
        main = "Distribuição com viés para pacotes baixos",
        xlab = "Número de pacotes por segundo (k)",
        ylab = "P(X = k)",
        ylim = c(0, 0.35))
invisible(dev.off())

# Exibir centralizado no notebook
# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição de probabilidade da variável $X$, que representa o número de pacotes por segundo. 
    As maiores probabilidades estão associadas aos menores valores de $k$, com destaque para $k = 0$, 
    indicando um viés na ocorrência de pacotes baixos.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuição de probabilidade da variável $X$, que representa o número de pacotes por segundo. As maiores probabilidades estão associadas aos menores valores de $k$, com destaque para $k = 0$, indicando um viés na ocorrência de pacotes baixos.

Exercício 76/77¶

Uma variável $X$ representa o número de falhas em 4 enlaces.
Cada enlace pode falhar com probabilidade $0.2$.
Defina a distribuição e justifique. $k = 0,1,2,3$

Para a solução deste exercício, primeiro temos que definir alguns termos:
  • $n = 4$ como número de tentativas (enlaces)
  • $\Omega = \{0,1,2,3\}$ como o possível número de falhas observadas
  • $p = 0.2$ como a probabilidade de falha em um enlace
  • $1 - p = 0.8$ como a probabilidade de sucesso (não falha)
  • $k$ representa o número de falhas observadas entre os 4 enlaces
Podemos então modelar isso como uma distribuição binomial de ensaios de Bernoulli, ou seja, 4 enlaces independentes com resultados discretos: 0 (sem falha) ou 1 (falha). A função de probabilidade é: $$ X \sim \text{Bin}(n, p) $$ $$ P(X = k) = \binom{n}{k} \cdot p^k \cdot (1 - p)^{n - k}, \quad k = 0,1,2,3 $$$$ \Longrightarrow P(X = k) = \binom{4}{k} \cdot 0.2^k \cdot 0.8^{4 - k}, \quad k = 0,1,2,3 $$ Nota: dizemos que $X \sim \text{Bin}(4,\ 0.2)$, ou seja, a variável $X$ segue uma distribuição binomial. em seguida o gráfico.
In [9]:
# Pacotes
library(IRdisplay)

# Criar diretório se necessário
dir.create("D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs", recursive = TRUE, showWarnings = FALSE)

# img_path do arquivo
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_falhas_enlaces.png"

# Parâmetros da binomial
n <- 4
p <- 0.2
k <- 0:n
prob <- dbinom(k, size = n, prob = p)

# Salvar gráfico
png(filename = img_path, width = 700, height = 500)
barplot(prob,
        names.arg = k,
        col = "steelblue",
        main = "Distribuição Binomial B(4, 0.2)",
        xlab = "Número de falhas (X)",
        ylab = "P(X = k)",
        ylim = c(0, max(prob) + 0.1))
invisible(dev.off())

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição binomial $B(4, 0.2)$ da variável aleatória $X$, que representa o número de falhas em quatro enlaces. 
    A maior probabilidade ocorre em $k = 1$, seguida de $k = 0$ e $k = 2$, mostrando que eventos com poucas falhas são mais prováveis.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuição binomial $B(4, 0.2)$ da variável aleatória $X$, que representa o número de falhas em quatro enlaces. A maior probabilidade ocorre em $k = 1$, seguida de $k = 0$ e $k = 2$, mostrando que eventos com poucas falhas são mais prováveis.

Exercício 78 – Distribuição Binomial: Limites de $p$


Quando $p \rightarrow 0$:

  • A distribuição se concentra em $X = 0$
  • A maioria das amostras terá zero sucessos
  • O gráfico exibe um pico acentuado em $X = 0$

Quando $p \rightarrow 1$:

  • A distribuição se concentra em $X = n$
  • Quase todas as amostras terão sucesso
  • O gráfico mostra um pico acentuado em $X = n$
In [10]:
# Criar e salvar os dois gráficos lado a lado no diretório atual (para exibição no notebook)
png("binomial_p0_p1.png", width = 800, height = 400)
par(mfrow = c(1, 2))

# Valores
k <- 0:4
n <- 4

p1 <- dbinom(k, size = n, prob = 0.01)
p2 <- dbinom(k, size = n, prob = 0.99)

barplot(p1, names.arg = k, col = "tomato",
        main = "p -> 0", xlab = "X", ylab = "P(X=k)", ylim = c(0,1))

barplot(p2, names.arg = k, col = "steelblue",
        main = "p -> 1", xlab = "X", ylab = "P(X=k)", ylim = c(0,1))
invisible(dev.off())

# Copiar a figura para o diretório externo
invisible(file.copy("binomial_p0_p1.png",
          to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_p0_p1.png",
          overwrite = TRUE))

# Ajustar o caminho para a imagem gerada
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_p0_p1.png"

# Converter para base64
img_b64 <- dataURI(file = img_path, mime = "image/png")

# Exibir centralizado 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ções binomiais $B(4, p)$ para dois casos extremos: $p \\to 0$ e $p \\to 1$. 
    No primeiro caso, a probabilidade concentra-se em $k = 0$, enquanto no segundo caso a concentração está em $k = 4$. 
    Esses cenários mostram como valores extremos de $p$ resultam em distribuições altamente concentradas em um único valor de $k$.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: distribuições binomiais $B(4, p)$ para dois casos extremos: $p \to 0$ e $p \to 1$. No primeiro caso, a probabilidade concentra-se em $k = 0$, enquanto no segundo caso a concentração está em $k = 4$. Esses cenários mostram como valores extremos de $p$ resultam em distribuições altamente concentradas em um único valor de $k$.

Exercício 79 – Modelagem com Binomial e Animação

Em um sistema de autenticação, a variável aleatória ( X ) representa o número de logins bem-sucedidos em 3 tentativas.

Modelamos com:

$ X \sim \text{Bin}(3, p), \qquad P(X = k) = \binom{3}{k}p^k (1-p)^{3-k}, \quad k = 0,1,2,3$$ Abaixo, uma animação com a variação de $ p \in \{0.1, 0.2, ..., 1.0\} $.
In [11]:
# Instale os pacotes se necessário
# install.packages("animation")
# install.packages("base64enc")
# install.packages("IRdisplay")

library(animation)
library(base64enc)
library(IRdisplay)

# Número de tentativas
n <- 3
k <- 0:n

# Função para plotar a distribuição binomial
binom_plot <- function(p) {
  y <- dbinom(k, size = n, prob = p)
  barplot(y,
          names.arg = k,
          col = "steelblue",
          ylim = c(0, 1),
          main = paste("Distribuição Binomial - n =", n, ", p =", round(p, 1)),
          xlab = "Número de sucessos (k)",
          ylab = "P(X = k)")
}

# img_path do arquivo GIF
gif_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_animation.gif"

# Suprimir todas as saídas do saveGIF
invisible({
  sink(tempfile())  # Redireciona saída padrão
  try(
    suppressMessages(suppressWarnings(
      saveGIF({
        for (p in seq(0.1, 1, by = 0.1)) {
          binom_plot(p)
        }
      }, movie.name = gif_path,
         interval = 0.8, ani.width = 600, ani.height = 400)
    )),
    silent = TRUE
  )
  sink()  # Restaura a saída padrão
})

# Codificar o GIF como base64 (silencioso)
invisible(gif_b64 <- dataURI(file = gif_path, mime = "image/gif"))

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> animação da distribuição binomial $B(3, p)$ variando o valor de $p$ de 0,1 até 1,0. 
    A probabilidade concentra-se nos valores de $k$ mais próximos de $np$, 
    mostrando como o formato da distribuição se desloca e se modifica conforme $p$ aumenta.
  </div>
</div>
', gif_b64))
No description has been provided for this image
Figura: animação da distribuição binomial $B(3, p)$ variando o valor de $p$ de 0,1 até 1,0. A probabilidade concentra-se nos valores de $k$ mais próximos de $np$, mostrando como o formato da distribuição se desloca e se modifica conforme $p$ aumenta.

Exercício 81¶

Qual a variância da variável definida no exercício 80?

A fórmula da variância populacional é geral e vale para qualquer distribuição discreta finita: $$ \mathrm{Var}(X) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2 $$ No caso particular da distribuição uniforme discreta sobre valores consecutivos $\{1,\ 2,\ \dots,\ k\}$, existe uma forma fechada para a variância: $$ \mathrm{Var}(X) = \frac{k^2 - 1}{12} $$ No exercício anterior, $k = 5$, então: $$ \mathrm{Var}(X) = \frac{5^2 - 1}{12} = \frac{24}{12} = 2 $$

Exercícios 82/83/84¶

Se uma variável $X$ assume os valores $1$, $2$, $3$ com probabilidades $0.2$, $0.5$, $0.3$, calcule o valor esperado $E[X]$ e $\mathrm{Var}(X)$.

O valor esperado $E[X]$ de uma variável aleatória discreta é calculado como uma média ponderada dos seus possíveis valores.
A fórmula é:

$$E[X] = \sum_k k \cdot P(X = k)$$

Ou seja, cada valor $k$ que a variável pode assumir é ponderado pela sua probabilidade $P(X = k)$, e todos esses produtos são somados.
Essa definição é válida para qualquer variável aleatória discreta.

Por exemplo, se $X$ assume os valores $1$, $2$ e $3$ com probabilidades $0.2$, $0.5$ e $0.3$, então:

$$E[X] = 1 \cdot 0.2 + 2 \cdot 0.5 + 3 \cdot 0.3 = 2.1$$

O valor esperado representa, nesse caso, o “centro de massa” da distribuição. Ver gráfico ao lado

Para a variância, usamos a fórmula:
$$\mathrm{Var}(X) = \sum_k \left(k - \mu \right)^2 \cdot P(X = k)$$

Com $\mu = E[X] = 2.1$, temos:
$$\mathrm{Var}(X) = (1 - 2.1)^2 \cdot 0.2 + (2 - 2.1)^2 \cdot 0.5 + (3 - 2.1)^2 \cdot 0.3 = 0.49$$

In [12]:
library(base64enc)
library(IRdisplay)

# Dados da população
x <- 1:3
p <- c(0.2, 0.5, 0.3)

# Valor esperado (centro de massa)
E_X <- sum(x * p)

# Variância populacional (com divisor n)
var_pop <- sum((x - E_X)^2 * p)
#invisible(cat(sprintf("Var(X) = %.4f\n", var_pop)))  # Esperado: 0.49

# img_paths de salvamento
local_path <- "valor_esperado_pop.png"
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/valor_esperado_pop.png"

# Salvar figura
png(local_path, width = 700, height = 400)

# Gráfico de barras
barplot(p, names.arg = x, col = "steelblue",
        main = "Centro de Massa (Valor Esperado)",
        xlab = "X", ylab = "P(X = x)", ylim = c(0, max(p) + 0.1))

# Adicionar linha e texto do valor esperado
arrows(x0 = E_X, y0 = max(p) + 0.05,
       x1 = E_X, y1 = 0, col = "red", lwd = 2, lty = 2)
text(E_X, max(p) + 0.08, labels = sprintf("E[X] = %.2f", E_X),
     col = "red", cex = 0.9)

invisible(dev.off())  # Fecha o dispositivo gráfico

# Copiar imagem para pasta final
invisible(file.copy(local_path, img_path, overwrite = TRUE))

# Converter para base64
img_b64 <- dataURI(file = img_path, 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> distribuição de probabilidade da variável $X$ com valores $1$, $2$ e $3$. 
    A linha tracejada em vermelho indica o valor esperado $E[X] = %.2f$, 
    representando o centro de massa da distribuição.
  </div>
</div>
', img_b64, E_X))
No description has been provided for this image
Figura: distribuição de probabilidade da variável $X$ com valores $1$, $2$ e $3$. A linha tracejada em vermelho indica o valor esperado $E[X] = 2.10$, representando o centro de massa da distribuição.

Exercício 85¶

Uma variável aleatória $X$ representa o número de retransmissões em uma transmissão com no máximo 2 tentativas.
Liste os valores possíveis e proponha uma função de probabilidade.

$X \sim \text{Bin}(2,\ p)$
$P(X = k) = \binom{2}{k} \cdot p^k \cdot (1 - p)^{2 - k}, \quad k = 0,1,2$


Exercício 86¶

Modele graficamente a distribuição do exercício 85 para diferentes taxas de sucesso.
Variações em $p$ afetam a forma da distribuição binomial: valores mais altos de $p$ deslocam a massa para $k = 2$, enquanto valores baixos concentram em $k = 0$.


Exercício 87/88¶

Um analisador de pacotes classifica conexões como normal ($0$) ou anômala ($1$) com probabilidade $0.95$ e $0.05$ respectivamente.
Represente essa variável e sua distribuição.
Mostre como o gráfico da distribuição de $X$ se altera se a taxa de anomalias aumentar para $0.20$.

Há múltiplos cenários possíveis de modelagem:

  • 1. Se detectar anomalia for considerado sucesso: $X \sim \text{Bern}(0.05)$
  • 2. Se detectar conexão normal for sucesso: $X \sim \text{Bern}(0.95)$
  • 3. Se cada tentativa visa detectar anomalia entre $n$ conexões: $X \sim \text{Bin}(n, 0.05)$
  • 4. Se normal for o evento de interesse em $n$ conexões: $X \sim \text{Bin}(n, 0.95)$

Com o aumento da taxa de anomalias para $0.20$, o valor de $p$ muda nos modelos 1 e 3, o que desloca a massa da distribuição para valores maiores de $X$.

In [13]:
# Criar e salvar os dois gráficos lado a lado no diretório atual
png("bernoulli_comparativo.png", width = 800, height = 300)
par(mfrow = c(1, 2))

# Valores possíveis de X
x <- c(0, 1)

# Probabilidades para p = 0.05
p1 <- c(0.95, 0.05)

# Probabilidades para p = 0.20
p2 <- c(0.80, 0.20)

# Primeiro gráfico
barplot(p1, names.arg = x, col = "steelblue",
        main = "Bernoulli(p = 0.05)", xlab = "X", ylab = "P(X)",
        ylim = c(0, 1))

# Segundo gráfico
barplot(p2, names.arg = x, col = "tomato",
        main = "Bernoulli(p = 0.20)", xlab = "X", ylab = "P(X)",
        ylim = c(0, 1))
invisible(dev.off())

# Copiar para diretório externo
invisible(file.copy("bernoulli_comparativo.png",
          to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/bernoulli_comparativo.png",
          overwrite = TRUE))
img_path = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/bernoulli_comparativo.png"

# Converter para base64
img_b64 <- dataURI(file = img_path, 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 de distribuições de Bernoulli para $p = 0.05$ e $p = 0.20$. 
    À medida que $p$ aumenta, a probabilidade associada a $X = 1$ cresce e a de $X = 0$ diminui, 
    modificando a concentração da distribuição.
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura: comparação de distribuições de Bernoulli para $p = 0.05$ e $p = 0.20$. À medida que $p$ aumenta, a probabilidade associada a $X = 1$ cresce e a de $X = 0$ diminui, modificando a concentração da distribuição.

Exercício 89¶

Um sistema de backup realiza entre $0$ e $3$ tentativas por hora. Calcule a esperança e compare graficamente duas distribuições discretas com mesma média mas variâncias diferentes
Suponha que:

  • $P(0) = 0.5$
  • $P(1) = 0.3$
  • $P(2) = 0.15$
  • $P(3) = 0.05$
Para calcular o valor esperado $E[X]$, usamos a fórmula: $$ E[X] = \sum_{k=0}^{3} k \cdot P(X = k) $$ Substituindo os valores: $$ E[X] = 0 \cdot 0.5 + 1 \cdot 0.3 + 2 \cdot 0.15 + 3 \cdot 0.05 = 0 + 0.3 + 0.3 + 0.15 = 0.75 $$ Logo, $E[X] = 0.75$
In [14]:
# Carregar biblioteca
library(IRdisplay)

# Intervalo para X
k_full <- 0:50
k_a <- 0:20

# Distribuições com mesma média, mas variâncias diferentes
p_A <- dbinom(k_a, size = 20, prob = 0.5)       # Menor variância
p_B <- dbinom(k_full, size = 200, prob = 0.05)  # Maior variância

# Salvar figura como PNG
png("comparacao_dispersao.png", width = 900, height = 400)
par(mfrow = c(1, 2))

barplot(p_A, names.arg = k_a, col = "steelblue",
        main = "Bin(20, 0.5) - Menor dispersão",
        ylab = "P(X = k)", xlab = "k", ylim = c(0, max(p_A, p_B)))

barplot(p_B, names.arg = k_full, col = "tomato",
        main = "Bin(200, 0.05) - Maior dispersão",
        ylab = "P(X = k)", xlab = "k", ylim = c(0, max(p_A, p_B)))



# Gerar e salvar a figura original
png("comparacao_dispersao.png", width = 800, height = 400)
plot(1:10, 1:10, main = "Exemplo Comparação Dispersão")
dev.off()  # fecha o dispositivo e grava o arquivo

# Copiar imagem para pasta de destino
file.copy("comparacao_dispersao.png",
          to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/comparacao_dispersao.png",
          overwrite = TRUE)

# Definir caminho final
img_path <- "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/comparacao_dispersao.png"

# Converter para base64
library(base64enc)
library(IRdisplay)
img_b64 <- dataURI(file = img_path, 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 de duas distribuições binomiais com a mesma média e variâncias diferentes. 
    A primeira, $B(20, 0.5)$, apresenta menor dispersão em torno da média, enquanto a segunda, $B(200, 0.05)$, apresenta maior dispersão. 
    A diferença na largura das distribuições ilustra o efeito da variância sobre a concentração das probabilidades.
  </div>
</div>
', img_b64))
agg_record_131039860: 2
TRUE
No description has been provided for this image
Figura: comparação de duas distribuições binomiais com a mesma média e variâncias diferentes. A primeira, $B(20, 0.5)$, apresenta menor dispersão em torno da média, enquanto a segunda, $B(200, 0.05)$, apresenta maior dispersão. A diferença na largura das distribuições ilustra o efeito da variância sobre a concentração das probabilidades.

Exercício 91¶

Um sistema realiza 4 testes com probabilidade $0.9$ de sucesso em cada.
Defina a variável número de falhas e modele sua distribuição.

$X \sim \text{Bin}(4,\ 0.1)$ $P(X = k) = \binom{4}{k} \cdot 0.1^k \cdot (0.9)^{4 - k}, \quad k = 0,1,2,3,4$

Exercício 92¶

Qual a esperança e variância da variável do exercício 91?

$X_A \sim \text{Bin}(4,\ 0.1)$ com variância populacional: $\mathrm{Var}(X_A) = n \cdot p \cdot (1 - p) = 4 \cdot 0.1 \cdot (1 - 0.1) = 0.36$

Exercício 93¶

Um sistema tolera no máximo 1 falha entre 3 enlaces. Modele a distribuição do número de falhas e desenhe seu gráfico.
Vamos reescrever este problema.
Um dado sistema $S$ continua funcionando se ocorrerem 0 ou 1 falha, então estamos interessados em estimar a probabilidade dos casos:

$P(X \leq 1) = P(X = 0) + P(X = 1)$

Mais ainda, na distribuição binomial

$|\Omega| = n+1 \Rightarrow \Omega =\{\emptyset, L_1, L_2, L_3\} \Rightarrow n = 3$

Então a distribuição pode ser representada por $X_A \sim \text{Bin}(3, p)$, assim: $P(X = k) = \binom{3}{k} \cdot p^k \cdot (1 - p)^{3 - k}, \quad k = 0,1,2,3$


Exercício 94¶

Um firewall bloqueia pacotes com probabilidade $0.1$. Para 5 pacotes, modele a variável que conta quantos são bloqueados.

Neste caso, $\Omega = \{0,1,2,3,4,5\} \Rightarrow |\Omega| = n+1 = 6 \Rightarrow n = 5$. Assim: $P(X = k) = \binom{5}{k} \cdot 0.1^k \cdot (0.9)^{5 - k}, \quad k = 0,1,2,3,4,5$

Exercício 95¶

Gere a função de probabilidade do exercício 94 no R e interprete.

A maior barra está em $k=0$, indicando que o evento mais provável é nenhum pacote ser bloqueado, com probabilidade próxima a 60%, isso de deve a baixa probabilidade de bloqueio (0.1). A cauda longa e a assimetria a esquerda são características de distribuições binomiais com probabilidades se aproximando de 0.
In [15]:
library(base64enc)
library(IRdisplay)

# Parâmetros
n <- 5
p <- 0.1
k <- 0:n

# Probabilidades da distribuição binomial
y <- dbinom(k, size = n, prob = p)

# Salvar figura como PNG
png("binomial_pacotes_bloqueados.png", width = 600, height = 400)

# Gráfico
barplot(y, names.arg = k, col = "steelblue",
        main = "Distribuição Binomial (n = 5, p = 0.1)",
        xlab = "Número de pacotes bloqueados (k)",
        ylab = "P(X = k)",
        ylim = c(0, max(y) + 0.05))

invisible(dev.off())

# Copiar para diretório externo, se necessário
invisible(file.copy("binomial_pacotes_bloqueados.png",
          to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_pacotes_bloqueados.png",
          overwrite = TRUE))

# Converter para base64 para funcionar no nbviewer
img_b64 <- dataURI(file = "binomial_pacotes_bloqueados.png", mime = "image/png")

# Exibir centralizado no notebook
display_html(sprintf('
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh;">
  <div style="text-align:center">
    <img src="%s" width="600">
    <div style="margin-top:8px; font-size:90%%; color:#555; text-align:justify;">
      Figura 1: a maior barra está em $k=0$, indicando que o evento mais provável é nenhum pacote ser bloqueado, 
      com probabilidade próxima a 60%%. Isso se deve à baixa probabilidade de bloqueio ($p=0.1$). 
      A cauda longa e a assimetria à esquerda são características de distribuições binomiais com probabilidades próximas de zero.
    </div>
  </div>
</div>
', img_b64))
No description has been provided for this image
Figura 1: a maior barra está em $k=0$, indicando que o evento mais provável é nenhum pacote ser bloqueado, com probabilidade próxima a 60%. Isso se deve à baixa probabilidade de bloqueio ($p=0.1$). A cauda longa e a assimetria à esquerda são características de distribuições binomiais com probabilidades próximas de zero.

Exercício 96.¶

Como o gráfico do exercício 94 muda se a taxa de bloqueio for $0,5$?

In [16]:
# Parâmetros
n <- 5
p <- 0.5
k <- 0:n

# Probabilidades da distribuição binomial
y <- dbinom(k, size = n, prob = p)

# Salvar figura como PNG
png("binomial_pacotes_bloqueados_p05.png", width = 600, height = 400)

# Gráfico
barplot(y, names.arg = k, col = "steelblue",
        main = "Distribuição Binomial (n = 5, p = 0.5)",
        xlab = "Número de pacotes bloqueados (k)",
        ylab = "P(X = k)",
        ylim = c(0, max(y) + 0.05))

invisible(dev.off())

# Copiar para diretório externo, se necessário
invisible(file.copy("binomial_pacotes_bloqueados_p05.png",
          to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_pacotes_bloqueados_p05.png",
          overwrite = TRUE))

# Exibir centralizado no notebook
library(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:8px; font-size:90%%; color:#555; text-align:justify;">
    <b>Figura:</b> distribuição binomial $B(5, 0.5)$ da variável $X$, que representa o número de pacotes bloqueados em cinco tentativas independentes. 
    A simetria em torno de $k = 2$ e $k = 3$ resulta do fato de $p = 0.5$, que torna sucessos e falhas igualmente prováveis, 
    concentrando a maior parte da probabilidade nos valores próximos à média $np = 2.5$.
  </div>
</div>
', dataURI(file = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/binomial_pacotes_bloqueados_p05.png", mime = "image/png")))
No description has been provided for this image
Figura: distribuição binomial $B(5, 0.5)$ da variável $X$, que representa o número de pacotes bloqueados em cinco tentativas independentes. A simetria em torno de $k = 2$ e $k = 3$ resulta do fato de $p = 0.5$, que torna sucessos e falhas igualmente prováveis, concentrando a maior parte da probabilidade nos valores próximos à média $np = 2.5$.

Exercício 97/98¶

Uma variável aleatória $X$ assume os valores $\{0,1,2,3\}$ com distribuição de Poisson de parâmetro $\lambda = 1$.
Calcule e construa o gráfico da função de probabilidade. Compare graficamente distribuições de Poisson para $\lambda=1$, $\lambda=3$, $\lambda=3$.

Podemos escrever a distribuição de Poisson como: $$ P(X = k) = \frac{e^{-np} \cdot (np)^k}{k!} $$ A distribuição de Poisson é ideal para modelar **eventos raros**, ou seja, eventos com baixa probabilidade de ocorrência individual em pequenos intervalos de tempo ou espaço. Esse comportamento emerge da aproximação de Poisson para a binomial quando $p \to 0$ e $n \to \infty$, com $np = \lambda$ constante. Assim, a fórmula geral da distribuição de Poisson com parâmetro $\lambda$ é: $$ P(X = k) = \frac{\lambda^k \cdot e^{-\lambda}}{k!} $$ Para $\lambda = 1$, basta substituir na fórmula e calcular para $k = 0, 1, 2, 3$.
In [17]:
library(ggplot2)
library(base64enc)
library(IRdisplay)

# --- Parâmetros da distribuição ---
k <- 0:3
lambda <- 1
prob <- dpois(k, lambda)

# --- Criar dataframe para ggplot ---
df <- data.frame(k = factor(k), prob = prob)

# --- Criar gráfico com ggplot2 ---
p <- ggplot(df, aes(x = k, y = prob)) +
  geom_bar(stat = "identity", fill = "steelblue", width = 0.7) +
  geom_text(aes(label = round(prob, 3)), vjust = -0.5, size = 4) +
  labs(title = expression(paste("Distribuição de Poisson com ", lambda, " = 1")),
       x = "k", 
       y = "P(X = k)") +
  ylim(0, max(prob) + 0.1) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# --- Salvar como PNG e converter para base64 ---
img_path <- tempfile(fileext = ".png")
ggsave(img_path, p, width = 6, height = 4, dpi = 100)
img_b64 <- base64enc::dataURI(file = img_path, mime = "image/png")

# --- Exibir no Jupyter com legenda ---
display_html(sprintf('
<div style="text-align:center; margin:20px 0;">
  <img src="%s" style="max-width:100%%; height:auto;">
  <div style="margin-top:10px; font-size:0.9em; color:#555;">
    Figura: Distribuição de Poisson com $\\lambda = 1$. A maior probabilidade ocorre em $k = 1$.
  </div>
</div>', img_b64))
No description has been provided for this image
Figura: Distribuição de Poisson com $\lambda = 1$. A maior probabilidade ocorre em $k = 1$.
In [18]:
library(base64enc)
library(IRdisplay)

# --- Gerar e salvar a figura ---
png("poisson_lambdas.png", width = 800, height = 300)

# Suporte da variável
k <- 0:8

# Configurar layout: 1 linha, 3 colunas
par(mfrow = c(1, 3))

# Vetor de lambdas e cores
lambdas <- c(1, 2, 3)
cores <- c("steelblue", "tomato", "darkgreen")

# Loop para plotar os 3 gráficos
for (i in seq_along(lambdas)) {
  lambda <- lambdas[i]
  p <- dpois(k, lambda)
  barplot(p, names.arg = k, col = cores[i],
          main = bquote(Poisson(lambda == .(lambda))),
          xlab = "k", ylab = "P(X = k)", ylim = c(0, max(p) + 0.05))
  text(x = seq_along(k), y = p + 0.02, labels = round(p, 2), cex = 0.8)
}

invisible(dev.off())

# Copiar para diretório externo (opcional)
invisible(file.copy("poisson_lambdas.png",
                    to = "D:/g_drive/docencia/uff/disciplinas/posgrad/vis_rep_data/jupiter/figs/poisson_lambdas.png",
                    overwrite = TRUE))

# Converter para base64
img_b64 <- dataURI(file = "poisson_lambdas.png", mime = "image/png")

# Exibir figura centralizada no Jupyter
display_html(sprintf('
  <div style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh;">
    div style="text-align:center; max-width: 100%%;">
      <img src="%s" width="700">
      <div style="margin-top:8px; font-size:90%%; color:#555;">
        Figura: a visualização dos gráficos abaixo mostra que com o crescimento de lambda, 
        a distribuição de Poisson tende a se comportar como a normal. 
        Na realidade para valores próximos de $\\lambda=30$ é comum essa análise.
        Para $\\lambda=1$ a curva formada pelos histogramas da esquerda para a direita é claramente assimétrica, 
        tendendo à simetrização com o aumento de $\\lambda$.
      </div>
    </div>
  </div>
', img_b64))
div style="text-align:center; max-width: 100%;"> No description has been provided for this image
Figura: a visualização dos gráficos abaixo mostra que com o crescimento de lambda, a distribuição de Poisson tende a se comportar como a normal. Na realidade para valores próximos de $\lambda=30$ é comum essa análise. Para $\lambda=1$ a curva formada pelos histogramas da esquerda para a direita é claramente assimétrica, tendendo à simetrização com o aumento de $\lambda$.

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
então o número de perdas por segundo tende a seguir uma Poisson com parâmetro $\lambda$. Isso decorre do **teorema do limite de Poisson**, que aproxima a binomial $B(n, p)$ por $Poisson(\lambda)$ quando $n \to \infty$ e $p \to 0$ com $np = \lambda$ 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$


In [19]:
# 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))
No description has been provided for this image
Figura: 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$.

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$


In [20]:
# 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))
No description has been provided for this image
Figura: 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$.

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$

In [21]:
# 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))
No description has been provided for this image
Figura: 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.

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!}$


In [ ]:
 

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$

$X \sim \text{Bin}(15,\ 0.9)$ $\displaystyle P(X = k) = \binom{15}{k} \cdot 0.9^k \cdot (1 - 0.9)^{15 - k}, \quad k = 0, 1, 2, \dots, 15$
In [22]:
# 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))
No description has been provided for this image
Figura: 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$.

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$

$\displaystyle P(X = k) = \frac{10^k \cdot e^{-10}}{k!}$
In [ ]:
 

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$

$X \sim \text{Bin}(40,\ 0.05)$ $\displaystyle P(X = k) = \binom{40}{k} \cdot 0.05^k \cdot (1 - 0.05)^{40 - k}, \quad k = 0, 1, 2, \dots, 40$
In [23]:
# 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))
No description has been provided for this image
Figura: 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.

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.

In [24]:
# 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)
agg_record_127311942: 2

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:**

No description has been provided for this image

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%
In [25]:
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)
agg_record_121420982: 2

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.

No description has been provided for this image

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
Vamos primeiro montar o espaço amaostral para todos os casos Possiveis de N78 e N258, on 0 e 1 são enlace em falha e em operação. Como N& e N2 são independentes P(n7) falhar é sempre 0.05 e P(n7) não falhar é sempre 0.95. Assim como P(n2) falhar é sempre 0.05 e P(n2) não falhar é sempre 0.95
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 todas
R1 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:

Considere um sistema em que pacotes podem ser perdidos na primeira transmissão e, se necessário, retransmitidos. As variáveis aleatórias $P$ (perda) e $R$ (retransmissão) indicam:
  • $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.


In [26]:
# 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.
No description has been provided for this image
Figura: 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.

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

  1. Quais são os eventos mutuamente exclusivos representados?
  2. Qual é a probabilidade de um pacote não ser interativo?
  3. Calcule a soma total das probabilidades. O que isso indica?
  4. Podemos considerar essa distribuição como uma função de probabilidade discreta?
  5. Supondo que maior proporção implique maior prioridade, qual serviço deve ser tratado com maior QoS (qualidade de serviço)?
  6. Interprete o valor da barra menor em termos de comportamento da rede (ex: largura de banda, latência).

Respostas:

  1. Interativo streaming e em lote
  2. 55%
  3. 1 - significa que todos os eventos estão representados, ou seja, representam completamente $\Omega$.
  4. sim. são valores finitos e não contínuos
  5. Interativo
  6. Streaming, aceita alguma latencia
In [27]:
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))
agg_record_1396777289: 2
No description has been provided for this image
Figura: 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.

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$


In [28]:
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))
agg_record_689064821: 2
No description has been provided for this image
Figura: 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%.

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

In [29]:
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]))
agg_record_213410439: 2
No description has been provided for this image
Figura: atraso por tipo de pacote. Pacotes urgentes com atraso representam 0.024 da probabilidade total, urgentes sem atraso 0.276, comuns com atraso 0.105 e comuns sem atraso 0.595. A distribuição evidencia que a maior parte dos pacotes é comum e sem atraso.

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:

  1. Qual é a probabilidade de o IDS emitir um alerta?
    $$ P(\text{alerta}) = ? $$

  2. 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} $$
In [30]:
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]))
agg_record_1587984352: 2
No description has been provided for this image
Figura: resposta do IDS. Ataques detectados correspondem a 0.135 da probabilidade total, ataques não detectados 0.015, tráfego normal com alerta 0.042 e tráfego normal sem alerta 0.807. A maior parte dos eventos corresponde a tráfego normal sem alerta.

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:

In [31]:
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]))
agg_record_1685929966: 2
No description has been provided for this image
Figura: entrega de pacotes por classe. Pacotes prioritários entregues representam 0.540 da probabilidade total, prioritários perdidos 0.060, comuns entregues 0.120 e comuns perdidos 0.280. Observa-se predominância de entregas, especialmente na classe prioritária.

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$

Pacote necessário¶

library(ggplot2)

Dados¶

probs <- c(0.40 * 0.05, 0.40 * 0.95, 0.60 * 0.02, 0.60 * 0.98) labels <- c("Servidor A+Falha", "Servidor A+OK", "Servidor B+Falha", "Servidor B+OK")

df <- data.frame( Categoria = labels, Probabilidade = probs )

In [32]:
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]))
agg_record_1132442985: 2
No description has been provided for this image
Figura: distribuição de falhas por servidor. O Servidor A representa 0.25 da probabilidade total de falhas, o Servidor B 0.15, o Servidor C 0.40 e o Servidor D 0.20. A concentração de falhas no Servidor C sugere possível necessidade de manutenção preventiva ou investigação adicional.

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.


In [33]:
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))
agg_record_2049088368: 2
No description has been provided for this image
Figura: 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.

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


In [34]:
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))
agg_record_84690599: 2
No description has been provided for this image
Figura: 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.

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.

In [35]:
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)
No description has been provided for this image
Figura: 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.

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?
O fato de apenas 3 dos 10 intervalos conterem a média real ($\mu = 52$ ms) sugere que **algo está fora do esperado** para um nível de confiança de 95%.

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.

In [36]:
# 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))
No description has been provided for this image
Figura: 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 = 52$ ms). Barras que não cruzam essa linha indicam estimativas estatisticamente diferentes da média 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:

  1. Calcule o erro padrão para cada linha usando a fórmula:

$$ \sigma_{\bar{x}} = \frac{s}{\sqrt{n}} $$

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

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

  1. 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} $$
  2. 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.
$$ z=\frac{x-\mu}{\sigma}= \frac{2.4-1.5}{0.4} = 2.25 $$
  • 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.

$$ z=\frac{x-\mu}{\sigma}= \frac{64-50}{8} = 1.25 $$ - Interprete o resultado: essa latência está dentro de uma faixa comum de variaçã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 2

  • Pareadas: 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$.


In [37]:
# 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))
No description has been provided for this image
Figura: Distribuição t de Welch com 56.7 graus de liberdade ajustados. As linhas vermelhas indicam o valor observado da estatística t (t = 0.99) e seu simétrico sob a hipótese nula. O valor-p bicaudal do teste de Welch é 0.3263, indicando a probabilidade de observar uma diferença tão extrema quanto 0.50 ms entre as médias, assumindo igualdade populacional.

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


In [38]:
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))
No description has been provided for this image
Figura: 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.

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
$$ IC = \bar{x} \pm z \cdot \frac{s}{\sqrt{n}} \quad \therefore \quad \text{Erro Padrão } EP = \frac{s}{\sqrt{n}} $$

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.


In [39]:
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)
No description has been provided for this image

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


In [40]:
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))
No description has been provided for this image
Figura: Distribuição Normal Padrão mostrando a probabilidade acumulada P(Z ≤ -2.36) = 0.0091. A área vermelha representa a probabilidade de observar valores tão extremos quanto Z = -2.36 ou menores sob a hipótese nula.

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


In [41]:
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))
No description has been provided for this image
Figura: Distribuição t de Student com 14 graus de liberdade. A área vermelha (α = 0.05) representa a região de rejeição unilateral direita. A linha vermelha marca t crítico = 1.76 (q0.950), enquanto a azul mostra t observado = 6.45. O p-valor (P(T ≥ 6.45) = 7.6e-06) é < 0.050, indicando rejeição de H₀. A seta vermelha ilustra α como probabilidade de erro Tipo I sob H₀ verdadeira.

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] $

Nota: Uma observação interessante aqui é que, em uma função de densidade de probabilidade contínua, o valor de $f(x)$ (isto é, a altura da curva no ponto $x$) pode ser maior que 1. O que não pode ser maior que 1 é a área sob a curva, que representa a probabilidade total.

In [42]:
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))
No description has been provided for this image
Figura: Distribuição amostral da média (Teorema Central do Limite) com desvio padrão σ/√n = 0.313. A área azul representa o intervalo de confiança de 95% (34.386 a 35.614), contendo o parâmetro populacional μ com 95% de confiança. O IC foi calculado como μ ± zα/2·(σ/√n), onde z0.975 = 1.96. A linha azul tracejada indica a estimativa pontual (35.0).

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] $$
Este exercício é interessante por vários motivos. Um deles é que, ao construirmos o intervalo de confiança — mostrado no gráfico abaixo — observamos que ele contém o valor nulo da hipótese nula, ou seja, $p_1 - p_2 = 0$. Isso implica que a diferença observada entre as proporções não é estatisticamente significativa ao nível de 5%, pois a hipótese nula não pode ser rejeitada enquanto o valor que ela postula estiver contido no intervalo de confiança.

In [43]:
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)
No description has been provided for this image

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.

No description has been provided for this image

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.


In [44]:
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))
No description has been provided for this image

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 $

In [45]:
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))
No description has been provided for this image
Figura: IC 95% = [24.41, 25.59] mW (Média = 25.0 mW, EP = 0.300 mW). Com 95% de confiança, o verdadeiro consumo médio populacional está neste intervalo. Amplitude = 1.18 mW (n = 100).

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.


In [46]:
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 &gt; 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))
No description has been provided for this image
Figura: 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 = 2.67, e a linha vermelha pontilhada marca o limite adotado (z = 2). A área sombreada representa a probabilidade de observar valores acima do limite sob N(0,1).

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

In [47]:
# 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))
No description has been provided for this image
Figura: 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.

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.


In [48]:
# 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 &gt; %.3f).
    A linha azul marca o valor observado, z = %.2f. O valor-p unilateral é %.4f; como z<sub>obs</sub> &lt; 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))
No description has been provided for this image
Figura: teste unilateral à direita com α = 0.05. A área em laranja indica a região crítica (z > 1.645). A linha azul marca o valor observado, z = 1.18. O valor-p unilateral é 0.1190; como zobs < zcrítico, não se rejeita H0 ao nível de significância especificado.

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.


In [49]:
# 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))
No description has been provided for this image
Figura: 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 (0.0050). Cada barra representa $\hat{p}_i \pm ME$, com $ME = t_{0.95,\,df=49} \cdot s/\sqrt{n} = 0.00024$. 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.

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.


In [50]:
# 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))
No description has been provided for this image
Figura: probabilidade de cauda direita na N(0,1) para z = 2.40. A área sombreada representa $P(Z \ge z) = 0.0082$. A linha vermelha tracejada marca o z-score observado.

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.


In [51]:
# 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"))
No description has been provided for this image
Figura: teste F bicaudal com gl1 = 29 e gl2 = 24. As áreas em laranja indicam as regiões críticas (F ≤ 0.464 ou F ≥ 2.217). A linha azul marca a estatística observada, Fobs = 1.50. Decisão ao nível α = 0.05: não se rejeita H0 de igualdade de variâncias.

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.


In [52]:
# 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))
No description has been provided for this image
Figura: teste unilateral à esquerda para detectar redução de média. As curvas mostram H0: μ = 0 (preta) e H1: μ = -0.100 (azul), com desvio padrão amostral sd = 0.200 e tamanho amostral n = 3. O limiar crítico (linha tracejada) é o quantil de cauda esquerda para α = 0.05 sob H0, em escala da estatística (crit = -0.190). 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 - β = 0.80.

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.

Mais abaixo há gráficos mostrando todos os casos em que se rejeita $H_0$ a partir de um dado $t$-observado.

In [53]:
# 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))
No description has been provided for this image
Figura: comparação entre três testes t com 24 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.

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 nula

Se 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.
In [54]:
# 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 &gt; %.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"))
No description has been provided for this image
Figura: teste unilateral à direita com α = 0.05. A área em vermelho indica a região de rejeição (z > 1.645). A linha azul pontilhada marca o valor observado, z = 1.90, cujo valor-p unilateral é 0.0287. Como zobs > zcrítico, rejeita-se H0.

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:

  1. Calcular o erro padrão sob $ H_0 $: $$ EP_0 = \sqrt{ \frac{p_0(1 - p_0)}{n} } $$

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

  1. Calcular o erro padrão sob $ H_1 $: $$ EP_1 = \sqrt{ \frac{p_1(1 - p_1)}{n} } $$

  2. Obter o valor padronizado (z-score) de $ p_{crit} $ no contexto de $ H_1 $: $$ Z^* = \frac{p_{crit} - p_1}{EP_1} $$

  3. Determinar $ \beta $, a probabilidade de não ultrapassar o valor crítico mesmo quando $ H_1 $ é verdadeira: $$ \beta = P(Z < Z^*) = \texttt{pnorm}(Z^*) $$

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


In [55]:
# 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))
No description has been provided for this image
Figura: teste unilateral à direita para proporções com n = 400. Curvas: H0: p = 0.04 (preta) e H1: p = 0.06 (azul). O limiar de decisão é pcrit = 0.0561 (linha pontilhada vermelha). A área vermelha representa o erro tipo I (α = 0.05), e a área laranja representa o erro tipo II (β = 0.372), resultando em potência = 1 − β = 0.628.

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

$$ n = \left( \frac{(1.645 + 1.645) \cdot 5.0}{2.0} \right)^2 $$$$ n = \left( \frac{16.45}{2.0} \right)^2 $$$$ n = (8.225)^2 \approx 67.6 \implies n= 68 $$

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


In [56]:
# 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))
agg_record_1707740561: 2
No description has been provided for this image
Figura: Esta análise de poder estatístico para um teste Z de uma cauda compara dois cenários com uma diferença real (δ) de 2.0 Mbps, desvio padrão (σ) de 5.0 Mbps e nível de significância (α) de 0.05. O cenário 1 (n=54) apresenta um erro tipo II (β) de 0.098, resultando em uma potência de 0.902. Já o cenário 2 (n=68), com um tamanho amostral maior, reduz o erro β para 0.049, elevando a potência para 0.951. 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.

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:

  1. Construa um gráfico de caixas (boxplot) com os tempos medidos para os dois grupos.

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

  3. Calcule a média, o desvio padrão e o tamanho da amostra de cada grupo.

  4. Realize um teste de hipótese para diferença de médias (assuma variâncias iguais).

  5. Interprete o resultado: há diferença estatisticamente significativa nos tempos de entrega?

In [57]:
# 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
No description has been provided for this image
Figura: comparação de latência entre protocolos (n=50 por grupo). Mediana UDP = 24.8 ms (IQR = 3.6 ms) vs TCP = 19.8 ms (IQR = 2.6 ms). Boxplots mostram quartis, com bigodes de 1.5×IQR e pontos para outliers.

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?

In [ ]: