Para esta primeira aula prática de Estatística Computacional I, precisaremos dos seguintes pacotes:
require(ggplot2) # Abordagem gráfica
require(patchwork) # Ajuda no manejo de múltiplos gráficos
A estatística está presente em quase todas as áreas do conhecimento, desde ciências da saúde até inteligência artificial. Um dos pilares da estatística é a teoria das distribuições de probabilidade, que descreve como os dados se comportam e nos permite fazer previsões e inferências. Mas por que estudá-las computacionalmente?
Exploração visual e interativa: Nas disciplinas teóricas, estudar as distribuições envolve apenas o uso de fórmulas e tabelas de valores críticos. Aqui, poderemos visualizar distribuições, simular dados e compreender comportamentos complexos por meio da programação.
Simulação de fenômenos reais: Para entender a variabilidade no tempo de espera de um ônibus, podemos usar a distribuição exponencial. Para modelar notas de provas de uma turma, podemos usar a distribuição Normal. Para simular um sorteio de loteria, podemos usar a distribuição Uniforme. Para prever o número de chamadas em um call center, podemos usar a distribuição Poisson.
Inferência Estatística e Modelagem: A maioria dos testes estatísticos assume que os dados seguem uma determinada distribuição. Ao simular diferentes distribuições e verificar suas propriedades, podemos entender quando certos métodos são válidos ou não.
Tomada de Decisão Baseada em Probabilidade: Em aplicações reais, como seguros, análise de risco e machine learning, entender distribuições permite construir modelos mais robustos e tomar melhores decisões.
O que faremos neste estudo computacional?: Vamos gerar dados de distribuições conhecidas e explorar suas características estatísticas. Além disso, vamos comparar distribuições diferentes e entender suas aplicações.
Essa abordagem vai permitir que vocês vejam a estatística
além das fórmulas, transformando conceitos abstratos em algo
visual e intuitivo. Para começar, o R
oferece quatro funções principais para manipular
distribuições de probabilidade:
d"distribuição", r"distribuição",
p"distribuição" e q"distribuição". Cada uma
delas tem um primeiro argumento específico (veremos nas
próximas seções). Já os demais argumentos são os
parâmetros de cada distribuição analisada. Nesta aula,
trabalharemos com as seguintes distribuições:
| Distribuição | d |
p |
q |
r |
|---|---|---|---|---|
| Poisson | dpois |
ppois |
qpois |
rpois |
| Binomial | dbinom |
pbinom |
qbinom |
rbinom |
| Exponencial | dexp |
pexp |
qexp |
rexp |
| Normal | dnorm |
pnorm |
qnorm |
rnorm |
| Gama | dgamma |
pgamma |
qgamma |
rgamma |
d: DENSIDADE OU PROBABILIDADEPara distribuições contínuas, essa função retorna o valor da função densidade de probabilidade e, para distribuições discretas, a função retorna a probabilidade exata de um determinado valor. O primeiro argumento dessa função, x, é o valor o qual deseja-se obter a densidade (variável contínua) ou probabilidade (variável discreta).
p: PROBABILIDADE ACUMULADAEssa função retorna, para uma variável aleatória X,
a probabilidade acumulada \(P(X\leq x)\), no ponto x. Para
variáveis contínuas, por exemplo, equivale à área abaixo da
curva da densidade até o ponto x. O primeiro
argumento dessa função, x, é o valor o qual deseja-se obter a
probabilidade acumulada até ele. Para obter a
probabilidade \(P(X > x)\),
utilize o argumento lower.tail=F.
q: QUANTISA função q retorna o quantil, ou seja,
o valor correspondente a uma determinada probabilidade
p acumulada da distribuição. Isto é, dado uma
variável aleatória X e um valor de
probabilidade p, a função q
encontra o valor x tal que \(P(X\leq x)\) = p. Basicamente, a função
q é a inversa da função p. O
primeiro argumento dessa função, p, é a
probabilidade acumulada a qual deseja-se obter o
quantil. Para encontrar o valor x tal que \(P(X > x)\) = p, utilize o
argumento lower.tail=F.
r: GERAÇÃO DE AMOSTRAS ALEATÓRIASPermite a simulação de dados de distribuições
conhecidas. O seu primeiro argumento,
n, é o tamanho da amostra que será
gerada.
Esta seção é dedicada ao estudo computacional de algumas distribuições discretas (Poisson e binomial).
A distribuição Poisson é uma distribuição de probabilidade discreta que descreve o número de eventos que ocorrem em um intervalo fixo de tempo ou espaço, assumindo que esses eventos ocorrem com uma taxa constante e independentemente uns dos outros. Alguns exemplos clássicos de aplicação incluem:
Número de chamadas recebidas por um call center por minuto;
Número de defeitos em um metro quadrado de tecido;
Número de acidentes de trânsito em um cruzamento por dia;
Número de mutações genéticas em um trecho específico de DNA.
A função de probabilidade de uma variável aleatória X com distribuição Poisson é dada por:
\[P(X = x) = \frac{\lambda^x e^{-\lambda}}{x!}, \quad x = 0, 1, 2, \dots\]
em que \(\lambda\) é o parâmetro da distribuição e representa a intensidade ou taxa de ocorrência. Por fim, lembre-se que os valores da média e variância associados a essa distribuição são:
\[E(X)=\lambda\] \[Var(X)=\lambda\]
A equidispersão é uma característica fundamental da distribuição Poisson e significa que a variância é igual à média. Isso implica que a dispersão dos dados aumenta proporcionalmente ao valor médio de eventos.
Para os estudos computacionais, suponha o
seguinte exemplo: Uma central de atendimento
recebe chamadas de clientes durante o dia. O número de
chamadas por minuto pode variar, mas em média, a central recebe
um número constante de chamadas por minuto. Esse tipo
de fenômeno, onde os eventos (no caso, chamadas) ocorrem
aleatoriamente, mas a uma taxa constante, pode ser
modelado por uma distribuição Poisson. Vamos considerar,
inicialmente, que o parâmetro \(\lambda\) seja igual a 5. Dessa forma,
tem-se uma média de 5 chamadas por minuto. Podemos
usar as funções d, p e
q para calcular quantidades de interesse
sobre esta distribuição. Cada uma dessas funções têm o
argumento lambda para a distribuição Poisson.
lambdar=5
# A probabilidade de receber exatamente 10 chamadas em um minuto:
dpois(x=10,lambda=lambdar)
## [1] 0.01813279
# A probabilidade de receber 3 ou menos chamadas por minuto:
ppois(q=3,lambda=lambdar)
## [1] 0.2650259
# A probabilidade de receber mais de 8 chamadas por minuto:
1-ppois(q=8,lambda=lambdar)
## [1] 0.06809363
# A probabilidade de receber mais de 8 chamadas por minuto:
ppois(q=8,lambda=lambdar,lower.tail=F)
## [1] 0.06809363
# O percentil 80 do número de chamadas por minuto:
qpois(p=0.8,lambda=lambdar)
## [1] 7
EXERCÍCIO: Resolva os seguintes itens com as funções aprendidas.
A probabilidade do número de chamadas recebidas ser maior que 6 e menor ou igual a 12.
Qual é o número de chamadas recebidas x tal que 25% dos valores da variável são maiores que ele.
Agora, vamos gerar uma amostra de tamanho \(n=100\) desta distribuição com a função
rpois e visualizá-la graficamente:
# tamanho da amostra
n_amostra=100
# lambda verdadeiro
lambdar = 5
# media verdadeira
media = lambdar
# gerando os dados
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rpois(n=n_amostra, lambda=lambdar)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = min(dados):max(dados)
df_teorico <- data.frame(
valores = valores,
p_x = dpois(valores, lambda=lambdar)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..count../sum(..count..)), binwidth = 1,
fill = "lightblue", color = "black") +
# ponto e segmento
geom_point(data = df_teorico, aes(x = valores, y = p_x),
color = "red", size = 2) +
geom_segment(data = df_teorico, aes(x = valores, xend = valores,
y = 0, yend = p_x),color = "red") +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed", color="blue",size=1)+
labs(title = "Poisson(5)",
x = "Valores", y = "Probabilidade") +
theme_minimal()
Para finalizar, vamos investigar o efeito de diferentes valores de \(\lambda\) para esta situação problema:
# Função para gerar o gráfico
gerar_grafico <- function(lambdar) {
# Tamanho da amostra
n_amostra=500
# Gerar amostra da distribuição Poisson
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rpois(n_amostra, lambda=lambdar)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = min(dados):max(dados)
df_teorico <- data.frame(
valores = valores,
p_x = dpois(valores, lambda=lambdar)
)
# Calcular a média da distribuição Poisson
media <- lambdar
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..count../sum(..count..)), binwidth = 1,
fill = "lightblue", color = "black") +
# ponto e segmento
geom_point(data = df_teorico, aes(x = valores, y = p_x),
color = "red", size = 2) +
geom_segment(data = df_teorico, aes(x = valores, xend = valores,
y = 0, yend = p_x),color = "red") +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed",color="blue",size=1)+
labs(title = paste("Poisson(", lambdar, ")", sep = ""),
x = "Valores", y = "Probabilidade") +
theme_minimal() +
scale_x_continuous(limits = c(0, 30))
}
# Usar lapply para gerar os gráficos para diferentes valores de lambda
lambdar <- c(5, 10, 15)
graficos <- lapply(lambdar, gerar_grafico)
# Combinar os gráficos com patchwork
graficos[[1]] + graficos[[2]] + graficos[[3]] + plot_layout(ncol = 1)
Quanto maior o valor de \(\lambda\) na distribuição Poisson:
A média e a variância aumentam: Como a média e a variância de uma distribuição Poisson são iguais a \(\lambda\), aumentar \(\lambda\) resulta em uma distribuição com maior média e maior variabilidade.
A distribuição fica mais simétrica: Para valores pequenos de \(\lambda\), a distribuição é assimétrica, com um pico mais próximo de 0 e caudas assimétricas à direita. À medida que \(\lambda\) aumenta, a distribuição torna-se mais simétrica.
O pico da distribuição se desloca para valores maiores: O valor mais provável (a moda) se aproxima de \(\lambda\), então, à medida que \(\lambda\) aumenta, o pico da distribuição se desloca para a direita. Isso implica que, à medida que \(\lambda\) cresce, o número de eventos mais provável se desloca para valores mais altos.
O intervalo de valores possíveis se expande: Para valores grandes de \(\lambda\), a distribuição Poisson abrange um intervalo maior de valores possíveis, com a maior parte da probabilidade concentrada em torno de \(\lambda\), mas com mais probabilidade de ocorrerem valores bem distantes da média.
Probabilidade de 0 eventos diminui: A probabilidade de observar 0 eventos diminui com o aumento de \(\lambda\).
A distribuição binomial é uma distribuição
discreta que modela o número de sucessos em
n tentativas independentes de um experimento de Bernoulli
(experimento 0 ou 1), onde cada tentativa tem apenas
dois possíveis resultados: sucesso ou fracasso. A
distribuição binomial é amplamente usada em situações
onde há repetição de experimentos independentes,
como:
O número de vezes que um aluno acerta uma questão em uma prova de múltipla escolha com alternativas ao acaso.
O número de clientes que compram um produto entre os que entram em uma loja.
O número de peças defeituosas em um lote de produção.
O número de pessoas que sobrevivem a uma determinada doença após um tratamento.
A função de probabilidade de uma variável aleatória X com distribuição binomial é dada por:
\[P(X = x) = \binom{n}{x} p^x (1 - p)^{n - x}, \quad x = 0, 1, 2, \dots, n\]
em que o parâmetro \(p\) é a probabilidade de sucesso. Por fim, lembre-se que os valores da média e variância associados a essa distribuição são:
\[E(X)=n\cdot p\] \[Var(X)=n \cdot p\cdot(1-p)\]
Para os estudos computacionais, considere a seguinte
situação problema: Uma empresa realiza uma pesquisa de
satisfação com seus clientes. Sabe-se que cada cliente
tem uma probabilidade p de estar
satisfeito com o produto ou serviço prestado. A empresa
decide amostrar n
clientes aleatoriamente para avaliar sua satisfação.
Podemos modelar o número de clientes satisfeitos na amostra como
uma distribuição binomial(n,p). Vamos considerar,
inicialmente, que o tamanho da amostra seja
n=10 e o parâmetro \(p\) seja igual a 0,50. Dessa forma, tem-se
um valor esperado de 5 pessoas satisfeitas nessa
amostra. Podemos usar as funções d, p
e q para calcular quantidades de interesse sobre
esta distribuição. Para a utilização dessas funções, os
argumentos que representam os parâmetros da
distribuição binomial são o size e p.
sizer = 10
probr = 0.5
# A probabilidade de que exatamente 4 clientes estejam satisfeitos:
dbinom(x=4,size=sizer,prob =probr)
## [1] 0.2050781
# A probabilidade de que menos de 6 clientes estejam satisfeitos:
pbinom(q=5,size=sizer,prob =probr)
## [1] 0.6230469
# A probabilidade de que mais de 9 clientes estejam satisfeitos:
1-pbinom(q=9,size=sizer,prob =probr)
## [1] 0.0009765625
# A probabilidade de que mais de 9 clientes estejam satisfeitos:
pbinom(q=9,size=sizer,prob =probr,lower.tail=F)
## [1] 0.0009765625
# O percentil 95 do número de clientes satistfeitos:
qbinom(p=0.95,size=sizer,prob =probr)
## [1] 8
EXERCÍCIO: Resolva os seguintes itens com as funções aprendidas.
Calcule a probabilidade de que o número de clientes satisfeitos esteja entre 4 e 10, inclusive.
Encontre o primeiro quartil (Q1) e o terceiro quartil (Q3) do número de clientes satisfeitos. Em seguida, determine a amplitude interquartílica (AIQ = Q3 – Q1).
Agora, vamos gerar uma amostra desta distribuição
com a função rbinom e visualizá-la graficamente:
# tamanho da amostra gerada
n_amostra=100
sizer = 10
probr = 0.5
# media verdadeira
media = sizer*probr
# gerando os dados
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rbinom(n_amostra, size=sizer,prob =probr)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = min(dados):max(dados)
df_teorico <- data.frame(
valores = valores,
p_x = dbinom(valores, size=sizer,prob =probr)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..count../sum(..count..)), binwidth = 1,
fill = "lightblue", color = "black") +
# ponto e segmento
geom_point(data = df_teorico, aes(x = valores, y = p_x),
color = "red", size = 2) +
geom_segment(data = df_teorico, aes(x = valores, xend = valores,
y = 0, yend = p_x),color = "red") +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed", color="blue",size=1)+
labs(title = "Binomial (10,0.5)",
x = "Valores", y = "Probabilidade") +
theme_minimal()
Para finalizar, vamos investigar o efeito de diferentes valores de \(n\) e \(p\) para esta situação problema:
# Função para gerar o gráfico
gerar_grafico <- function(sizer,probr) {
# Tamanho da amostra
n_amostra=500
# Gerar amostra da distribuição Binomial
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rbinom(n_amostra, size=sizer,prob =probr)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = min(dados):max(dados)
df_teorico <- data.frame(
valores = valores,
p_x = dbinom(valores, size=sizer,prob =probr)
)
# Calcular a média da distribuição Binomial
media <- sizer*probr
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..count../sum(..count..)), binwidth = 1,
fill = "lightblue", color = "black") +
# ponto e segmento
geom_point(data = df_teorico, aes(x = valores, y = p_x),
color = "red", size = 2) +
geom_segment(data = df_teorico, aes(x = valores, xend = valores,
y = 0, yend = p_x),color = "red") +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed",color="blue",size=1)+
labs(title = paste("Binomial(", sizer,",", probr, ")", sep = ""),
x = "Valores", y = "Probabilidade") +
theme_minimal() +
scale_x_continuous(limits = c(0, 20))
}
# Definir os valores de size e prob
sizer <- c(10, 20)
probr <- c(0.25, 0.50, 0.75)
# Criar todas as combinações possíveis de n e p
combinacoes <- expand.grid(sizer = sizer, probr = probr)
# Aplicar a função gerar_grafico para cada combinação
graficos <- lapply(1:nrow(combinacoes), function(i) {
gerar_grafico(combinacoes$sizer[i], combinacoes$probr[i])
})
# Combinar os gráficos usando patchwork
layout_graficos <- (graficos[[1]] | graficos[[3]] | graficos[[5]]) /
(graficos[[2]] | graficos[[4]] | graficos[[6]])
# Exibir o conjunto de gráficos
layout_graficos
O efeito gráfico das mudanças de
size e prob na distribuição
binomial pode ser analisado separadamente para cada
parâmetro:
Aumento de size: A distribuição se
espalha mais, pois a variância da binomial é
np(1-p), que cresce com n (mantendo
p constante). Visualmente, o histograma se
alarga e se torna mais suave, se aproximando
de uma curva contínua.
Aumento de p: A distribuição se desloca
para a direita, pois a média da binomial é np.
Visualmente, a moda da distribuição se move para valores mais
altos.
A aproximação Poisson para a distribuição
binomial é relevante porque permite simplificar
cálculos probabilísticos quando n (o número de
tentativas) é grande e p (a probabilidade
de sucesso em cada tentativa) é pequeno. Em muitos
contextos práticos, como na modelagem de eventos raros
(por exemplo, número de falhas em um sistema ou
mutações genéticas em um DNA), a distribuição
binomial é a escolha natural, mas seu cálculo direto
pode ser computacionalmente custoso para valores altos de
n.
A distribuição Poisson fornece uma aproximação útil nesses casos, já que seu formato matemático é mais simples e os cálculos de probabilidade podem ser realizados sem recorrer a fatoriais ou coeficientes binomiais, que podem ser complicados para números grandes.
A aproximação Poisson para uma variável aleatória \(X\sim Bin(n,p)\) é dada por:
\[X \approx Y\sim Poisson(\lambda=np)\]
Quando a aproximação é boa? A regra prática para que
a aproximação de Poisson seja adequada é que n seja grande
e p seja pequeno, de modo que np (a média da binomial) se
mantenha em um valor moderado (típicamente menor que 10). Embora
não haja um limite rígido, costuma-se considerar \(n\geq 30\) e \(p\leq0,1\). De um modo geral,
aproximação de Poisson funciona bem quando \(np\leq 5\) ou, em alguns casos, até \(np\leq 10\).
EXERCÍCIO: Gere uma amostra de tamanho 200 de uma variável aleatória Binomial(n=50,p=0.05). Faça o histograma dessa amostra e acrescente a função de probabilidade da aproximação pela distribuição Poisson. Verifique se a aproximação é boa.
Esta seção é dedicada ao estudo computacional de algumas distribuições contínuas (Exponencial, Normal e Gama).
A distribuição exponencial é amplamente utilizada em estatística e probabilidade, principalmente para modelar o tempo entre eventos, que ocorre de maneira contínua e independente ao longo do tempo. Aqui estão algumas aplicações básicas dessa distribuição:
Tempo de espera entre as ligações recebidas em um call center
Tempo até até a falha de um sistema ou produto
Tempo de decaimento de partículas radioativas.
A função densidade de probabilidade de uma variável aleatória X com distribuição exponencial é dada por:
\[f(x) = \lambda e^{-\lambda x}, \quad x \geq 0, \quad \lambda > 0\]
em que o parâmetro \(\lambda\) controla a taxa de ocorrência dos eventos. Ele está diretamente relacionado à frequência com que os eventos ocorrem ao longo do tempo. Por fim, lembre-se que os valores da média e variância associados a essa distribuição são:
\[E(X)=\frac{1}{\lambda}\] \[Var(X)=\frac{1}{\lambda^2}\]
Uma situação clássica onde a distribuição exponencial é
aplicável é o tempo entre chegadas de clientes no caixa de uma
loja. Suponha que em este tempo, em minutos, seja modelado por
uma distribuição exponencial com parâmetro \(\lambda\). Inicialmente, suponha
que \(\lambda=1/2\) e, dessa
forma, temos um tempo médio de 2 minutos entre as chegadas dos
clientes. Podemos usar as funções d,
p e q para calcular quantidades de interesse
sobre esta distribuição. Para utilizar estas funções, o
argumento que representa o parâmetro da distribuição
exponencial é denotado por rate.
rater = 1/2
# A probabilidade de que o tempo entre chegada de clientes é maior que 10 minutos
1-pexp(q=10,rate = rater)
## [1] 0.006737947
# A probabilidade de que o tempo entre chegada de clientes é maior que 10 minutos
pexp(q=10,rate = rater,lower.tail=F)
## [1] 0.006737947
# A probabilidade de que o tempo entre chegada de clientes é menor que 4 minutos
pexp(q=4,rate = rater)
## [1] 0.8646647
# A mediana do tempo entre chegada de clientes:
qexp(p=0.5,rate = rater)
## [1] 1.386294
EXERCÍCIO: Resolva os seguintes itens com as funções aprendidas.
Qual a probabilidade de que esse tempo esteja entre 5 e 15 minutos?
Qual o tempo t tal que a probabilidade de que o próximo cliente chegue antes de t minutos seja igual a 0.9?
Vamos gerar uma amostra desta distribuição com a
função r e visualizá-la graficamente:
# tamanho da amostra gerada
n_amostra=100
# lambda verdadeiro
rater = 1/2
# media verdadeira
media = 1/rater
# gerando os dados
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rexp(n=n_amostra, rate = rater)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dexp(valores, rate = rater)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed", color="blue",size=1)+
labs(title = "Exponencial (1/2)",
x = "Valores", y = "Densidade") +
theme_minimal() +
xlim(0,10)
Para finalizar, vamos investigar o efeito de diferentes valores de \(\lambda\) para esta situação problema:
# Função para gerar o gráfico
gerar_grafico <- function(rater) {
# Tamanho da amostra
n_sample=100
# Gerar amostra da distribuição Exponencial
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rexp(n_sample, rate=rater)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dexp(valores, rate = rater)
)
# Calcular a média da distribuição Exponencial
media <- 1/rater
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed",color="blue",size=1)+
labs(title = paste("Exponencial (", rater, ")", sep = ""),
x = "Valores", y = "Densidade") +
theme_minimal() +
scale_x_continuous(limits = c(0, 10))
}
# Usar lapply para gerar os gráficos para diferentes valores de rate
rater <- c(1/2, 1, 2)
graficos <- lapply(rater, gerar_grafico)
# Combinar os gráficos com patchwork
graficos[[1]] + graficos[[2]] + graficos[[3]] + plot_layout(ncol = 1)
Nota-se que, com o aumento de \(\lambda\):
Concentração perto de zero: À medida que \(\lambda\) cresce, os valores pequenos da variável tornam-se mais prováveis.
Decaimento mais rápido: A curva da f.d.p. cai mais rapidamente para valores maiores da variável, indicando que a probabilidade de valores altos é menor.
Média e dispersão: A média e a variância diminuem com o aumento de \(\lambda\), indicando que a distribuição fica mais concentrada perto de zero.
A propriedade de perda de memória (ou sem memória) da distribuição exponencial é uma característica importante e única dessa distribuição. Ela diz que a probabilidade de um evento ocorrer após um determinado tempo não depende do tempo que já passou sem o evento ocorrer. Formalmente, a propriedade de perda de memória pode ser enunciada da seguinte forma:
Se X é uma variável aleatória com distribuição exponencial, então para quaisquer \(t,s\geq 0\), temos:
\[ P(X > t + s \mid X > t) = P(X > s) \]
Para ilustrar, considere X um tempo de falha, em dias,
exponencialmente distribuido. A propriedade da perda de
memória diz que dado um tempo de falha maior do que
t, a probabilidade de ele ser maior que t+s é
igual a probabilidade de que ele seja somente maior que
s. Isto é como se o relógio começasse a contar
novamente a partir de t.
EXERCÍCIO Use o R, para mostrar que se
\(X\sim exp(\lambda=1/100)\)
\[P(X > 150 \mid X > 100) = P(X > 50)\]
A distribuição normal, também conhecida como distribuição de Gauss, é uma das distribuições mais importantes da estatística. Ela é uma distribuição contínua e simétrica em torno da média, modelando fenômenos naturais e diversas variáveis em contextos estatísticos.
Aplicabilidade:
Alturas e pesos de uma população.
Erros de medição em experimentos científicos.
Notas de alunos em provas padronizadas.
Flutuações em retornos financeiros.
A função densidade de probabilidade de uma variável aleatória X com distribuição normal é dada por:
\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left( -\frac{(x - \mu)^2}{2\sigma^2} \right), \quad x \in \mathbb{R}\]
em que o parâmetro \(\mu\) é a média e o parâmetro \(\sigma\) é o desvio padrão.
Um exemplo clássico de situação prática modelada pela
distribuição normal é a altura de adultos em uma população. Se
você medir a altura de um grande número de adultos de um mesmo grupo
populacional (por exemplo, homens brasileiros adultos),
perceberá que os valores tendem a se concentrar em torno de uma
média, com poucas pessoas sendo muito mais altas ou muito mais
baixas. Esse padrão simétrico, com a maioria dos valores
próximos à média e caudas que se afunilam para os extremos, é
característico da distribuição normal. Suponha que
determinada população tenha a altura modelada pela
distribuição normal com média \(\mu=170\) e desvio padrão \(\sigma=7cm\). Podemos usar as funções
d, p e q para calcular
quantidades de interesse sobre esta distribuição. Nessas funções,
os argumentos que representam os parâmetros da
distribuição são mean e sd.
meanr = 170
sdr = 7
# A probabilidade de que a altura de uma pessoa da população seja maior que 180 cm
1-pnorm(q=180,mean=meanr,sd=sdr)
## [1] 0.07656373
# A probabilidade de que a altura de uma pessoa da população seja maior que 180 cm
pnorm(q=180,mean=meanr,sd=sdr,lower.tail=F)
## [1] 0.07656373
# A probabilidade de que a altura de uma pessoa da população seja menor que 150 cm
pnorm(q=150,mean=meanr,sd=sdr)
## [1] 0.002137367
# A probabilidade de que a altura de uma pessoa da população esteja entre 140 cm e 150 cm
pnorm(q=150,mean=meanr,sd=sdr)-pnorm(q=140,mean=meanr,sd=sdr)
## [1] 0.002128259
# O percentil 95 do da altura de uma pessoa da população:
qnorm(p=0.95,mean=meanr,sd=sdr)
## [1] 181.514
EXERCÍCIO: Resolva os seguintes itens com as funções aprendidas.
Apenas os 10% mais altos serão chamados para um determinado processo. Qual deve ser a altura mínima exigida?
Qual a proporção de pessoas tem uma altura que esteja fora do intervalo (160;180)?
Vamos gerar uma amostra desta distribuição e visualizá-la graficamente:
# tamanho da amostra gerada
n_amostra=100
# Parametros verdadeiros
meanr = 170
sdr = 7
# gerando os dados
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rnorm(n_amostra, mean=meanr,sd=sdr)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dnorm(valores, mean=meanr,sd=sdr)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = meanr, linetype = "dashed", color="blue",size=1)+
labs(title = "Normal (170,7)",
x = "Valores", y = "Densidade") +
theme_minimal()
Para finalizar, vamos investigar o efeito de diferentes valores de \(mean\) e \(sd\) para esta situação problema:
# Função para gerar o gráfico
gerar_grafico <- function(meanr,sdr) {
# Tamanho da amostra
n_amostra=100
# Gerar amostra da distribuição de Normal
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
dados <- rnorm(n_amostra, mean=meanr,sd=sdr)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dnorm(valores, mean=meanr,sd=sdr)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y =..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = meanr, linetype = "dashed",color="blue",size=1)+
labs(title = paste("Normal(", meanr,",", sdr, ")", sep = ""),
x = "Valores", y = "Densidade") +
theme_minimal() +
scale_x_continuous(limits = c(135,200))
}
# Definir os valores de mu e sigma
mean <- c(160, 170)
sd <- c(5, 7, 10)
# Criar todas as combinações possíveis de mu e sigma
combinacoes <- expand.grid(mean = mean, sd = sd)
# Aplicar a função gerar_grafico para cada combinação
graficos <- lapply(1:nrow(combinacoes), function(i) {
gerar_grafico(combinacoes$mean[i], combinacoes$sd[i])
})
# Combinar os gráficos usando patchwork
layout_graficos <- (graficos[[1]] | graficos[[3]] | graficos[[5]]) /
(graficos[[2]] | graficos[[4]] | graficos[[6]])
# Exibir o conjunto de gráficos
layout_graficos
O efeito do aumento de \(\mu\) e \(\sigma\) na função densidade de probabilidade de uma distribuição normal pode ser analisado assim:
Aumento de \(\mu\): A curva se desloca horizontalmente para a direita, mantendo a mesma forma. Isso ocorre porque \(\mu\) define a localização central da distribuição.
Aumento de \(\sigma\): A curva se alarga e abaixa, espalhando os valores por uma faixa maior. Isso acontece porque \(\sigma\) controla a dispersão: valores mais altos significam maior variação nos dados.
Uma propriedade fundamental da Normal é a propriedade de escala:
Seja
\[
X \sim N(\mu, \sigma^2),
\]
e seja \(a \in \mathbb{R}\).
Definindo
\[
Y = aX,
\]
temos que
\[
Y \sim N(a\mu, a^2\sigma^2).
\]
Ou seja, multiplicar a Normal por uma constante \(a\) altera a média e a variância é multiplicada por \(a^2\).
Considere \(X \sim N(170, 7^2)\):
A distribuição Gamma é utilizada em diversas áreas quando se deseja modelar tempos de espera e tempos de vida.
Aplicabilidade:
Tempo de vida de componentes eletrônicos, motores, lâmpadas e outros dispositivos que falham ao longo do tempo
Modelagem da precipitação acumulada em um período específico.
Tempo até que um determinado nível de perdas seja atingido em um processo financeiro.
Duração de doenças ou tempo até a recuperação de pacientes.
A função densidade de probabilidade de uma variável aleatória X com distribuição gama é dada por:
\[ f(x; \alpha, \beta) = \frac{\beta^\alpha x^{\alpha - 1} e^{-\beta x}}{\Gamma(\alpha)}, \quad x > 0 \]
em que o parâmetro \(\alpha\) é o
parâmetro de forma (shape) e o parâmetro \(\beta\) é a taxa (rate).
Os valores da média e variância associados a essa
distribuição são:
\[E(X)=\frac{\alpha}{\beta}\] \[Var(X)=\frac{\alpha}{\beta^2}\]
Utilizaremos, portanto, as funções rgamma,
dgamma, pgamma e qgamma com os
argumentos shape e rate.
Um hospital quer modelar o tempo de atendimento de pacientes na emergência. Sabe-se que o tempo total de atendimento depende de várias etapas, como triagem, consulta e exames. Esse tipo de fenômeno pode ser bem modelado pela distribuição Gamma, pois o tempo total até a conclusão de várias etapas sucessivas frequentemente segue essa distribuição. Considere, portanto, que o tempo total de atendimento, em horas, tem uma distribuição Gama com parâmetros \(\alpha=2\) e \(\beta=1\). Dessa forma, tem-se um tempo médio de atendimento de \(\alpha/\beta\)=2 horas.
ATIVIDADES
Simule uma amostra de tamanho 100 desta distribuição. Faça o histograma e acrescente a densidade verdadeira.
Sabemos que Gama(\(\alpha=1\),\(\beta\)) \(\equiv\) Exponencial(\(\lambda=\beta\)). Assim, gere uma amostra de tamanho 500 de uma Gama(\(\alpha=1\),\(\beta=4\)) e sobreponha a densidade da distribuição Exponencial(\(\lambda=4\)). O que acontece?
No estudo de distribuições de probabilidade, é comum
encontrar relações matemáticas entre diferentes
distribuições. Algumas dessas relações podem ser
demonstradas analiticamente, enquanto outras podem ser
exploradas por meio de simulações. O R
oferece uma excelente plataforma para esse tipo de
investigação, permitindo gerar amostras
aleatórias, visualizar distribuições e
verificar empiricamente certas propriedades
estatísticas.
O estudo das relações entre distribuições de probabilidade é fundamental para a estatística teórica e aplicada. Essas conexões permitem desenvolver métodos estatísticos mais poderosos, justificar aproximações, facilitar cálculos complexos e compreender o comportamento de estimadores e testes estatísticos.
A distribuição T de Student surge naturalmente em estatística quando trabalhamos com amostras finitas e não conhecemos a variância populacional, para populações normais. A variável aleatória T que possui distribuição T-student com \(\nu\) graus de liberdade é definida como:
\[ T = \frac{Z}{\sqrt{W / \nu}} \]
onde:
Lembre-se que \(E(T)=0\) e \(Var(T)=\frac{\nu}{\nu-2}\). Vamos gerar uma amostra de 500 observações da distribuição T com \(\nu=10\) graus de liberdade segundo a fórmula acima e, posteriormente, verificar a aproximação com a densidade verdadeira.
Para a distribuição qui-quadrado, utilizaremos o comando
rchisqcom o argumento df para os graus de
liberdade da distribuição.
Para a distribuição T, utilizaremos o comando dtcom
o argumento df para os graus de liberdade da
distribuição.
# tamanho da amostra gerada
n_amostra=500
# Graus de liberdade verdadeiro
dfr=10
# media verdadeira
media = 0
# gerando os dados
set.seed(2025) # Fixar a semente para gerarmos juntos as mesmas amostras
# Normal padrão
dadosZ <- rnorm(n=n_amostra, mean=0,sd=1)
# Qui-Quadrado
dadosChi <- rchisq(n_amostra,df=dfr)
# T-Student
dados <- dadosZ/sqrt(dadosChi/dfr)
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dt(valores, df=dfr)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed", color="blue",size=1)+
labs(title = "T-student (10)",
x = "Valores", y = "Densidade") +
theme_minimal()
Gere uma amostra de tamanho 500 de uma distribuição \(Y\sim Uniforme(0,1)\). Aplique a
transformação \(W=-log(Y)\) e prove que
\(W\sim Exp(1)\). Compare os gráficos
empíricos e teóricos. Use a função runif
para a distribuição uniforme. Essa função tem como
argumentos min e max.
R GERA VALORES DE DISTRIBUIÇÕES DE
PROBABILIDADE?A geração de números aleatórios é um componente
essencial da Estatística Computacional e da Simulação.
Sempre que usamos funções como rnorm(),
rexp() ou rbinom() no R, estamos
gerando números de distribuições específicas. Mas como
o R consegue criar números que seguem uma
determinada distribuição de probabilidade?
A resposta está na geração de números pseudoaleatórios e em métodos matemáticos que transformam esses números para se adequarem a distribuições desejadas. O principal método utilizado para essa transformação é o método da transformação inversa, que exploraremos em detalhes nesta seção.
Antes de falar sobre a transformação inversa, precisamos entender como os números “aleatórios” são gerados em um computador. Nesse sentido, vamos entender a diferença entre números verdadeiramente aleatórios e números pseudoaleatórios.
Números verdadeiramente aleatórios vêm de fenômenos físicos imprevisíveis, como ruído térmico ou decaimento radioativo.
Números pseudoaleatórios são gerados por algoritmos determinísticos que produzem sequências que parecem aleatórias, mas são completamente previsíveis se soubermos o estado inicial do algoritmo.
Os números gerados no R (e em
praticamente todas as linguagens de programação) são
pseudoaleatórios, pois vêm de um gerador de
números pseudoaleatórios (PRNG - Pseudo Random Number
Generator).
O gerador de números aleatórios do R
baseia-se no algoritmo Mersenne Twister, que é
um dos geradores de números pseudoaleatórios mais utilizados
devido à sua longa sequência periódica e boas
propriedades estatísticas.
A semente (set.seed()) é um número inicial
que determina o estado do PRNG. Se usarmos a mesma
semente, o R produzirá exatamente os
mesmos números aleatórios, o que é essencial para
reprodutibilidade em estudos computacionais.
A distribuição uniforme contínua no intervalo (0,1) tem um papel central na geração de números aleatórios. Isso acontece porque:
Ela é fácil de gerar computacionalmente.
Podemos transformá-la em muitas outras distribuições usando funções matemáticas adequadas.
Para gerar os dados de uma distribuição uniforme (0,1) o
R, em sequência:
1- Semente inicial: O gerador inicia com uma
semente (definida pelo usuário via set.seed() ou aleatória). No
caso de semente aleatória, o R
pega um estado aleatório baseado no relógio do sistema,
gerando sequências diferentes a cada execução.
2- De acordo com o estado inicial (fixado ou aleatório) o
R gera uma sequência de números pseudoaleatórios
\(K_1,K_2,K_3,...\).
3- Os números gerados são transformados para o intervalo (0,1) ao serem divididos pelo maior valor possível que o gerador pode produzir.
Uma vez que temos valores da distribuição Uniforme(0,1), podemos usar técnicas para convertê-los em amostras de outras distribuições. A mais conhecida dessas técnicas é o método da transformação inversa.
O método da transformação inversa é uma técnica fundamental para gerar valores de distribuições arbitrárias a partir da distribuição uniforme U(0,1). Ele é amplamente usado porque permite transformar facilmente um gerador de números pseudoaleatórios uniforme em valores de determinadas distribuições.
A ideia principal é a seguinte:
1- Geramos um número aleatório \(u \sim U(0,1)\).
2- Transformamos \(u\)
aplicando a inversa da função de distribuição cumulativa \(F\), denotada por \(F^{-1}(\cdot)\), para obter um
valor da distribuição desejada. Matematicamente, o
valor x, gerado da distribuição de
interesse, será dado por:
\[x=F^{-1}(U)\]
Esse método funciona porque a função \(F\) de qualquer distribuição mapeia o intervalo (0,1) no suporte da variável aleatória. Assim, quando aplicamos sua inversa, obtemos valores com a mesma distribuição da variável original. Graficamente, temos a seguinte situação:
Para uma variável aleatória \(X\sim Exp(\lambda)\), tem-se a seguinte função densidade de probabilidade (já vista anteriormente):
\[f(x) = \lambda e^{-\lambda x}, \quad x \geq 0, \quad \lambda > 0\]
A função de distribuição \(F\) é obtida fazendo:
\[ F(x) = \int_{0}^{x} \lambda e^{-\lambda t} \, dt = 1 - e^{-\lambda x}, \quad x \geq 0. \]
Na sequência, precisamos gerar valores x dessa variável aleatória segundo o método da transformação inversa. Para um valor u, gerado a partir da distribuição uniforme(0,1), temos que encontrar \(x=F^{-1}(u)\). Para isto, tem-se o seguinte raciocínio:
\[\begin{align*} F(x) &= u \Rightarrow 1 - e^{-\lambda x} = u \\ &\Rightarrow 1 - u = e^{-\lambda x} \\ &\Rightarrow \ln(1 - u) = -\lambda x \\ &\Rightarrow x = -\frac{1}{\lambda} \ln(1 - u) \\ &\Rightarrow x = F^{-1}(u) \end{align*}\]
Assim, geramos um valor x da distribuição exponencial (\(\lambda\)), ao aplicar um valor \(u\) na função \(F^{-1}(u)=-\frac{1}{\lambda} \ln(1 - u)\). Portanto, para gerar \(n\) valores da distribuição exponencial (\(\lambda\)), basta gerar \(n\) valores da distribuição Uniforme (0,1) e aplicar na função inversa \(F^{-1}(u)\).
No R, vamos criar uma função para gerar os
valores da distribuição exponencial para qualquer valor de
\(\lambda\). Na sequência, vamos gerar
uma amostra de tamanho 500 de uma exponencial com
parâmetro \(\lambda=1/2\) usando essa
função e verificar a aproximação com a densidade verdadeira:
set.seed(2025) # Define uma semente para reprodutibilidade
# Metodo da transformação inversa
r_exp = function(u,rate)
return(-(1/rate)*log(1-u))
# Lambda verdadeiro
rater = 1/2
# Gerando a amostra
n_amostra = 500
u = runif(n_amostra,min=0,max=1)
dados = r_exp(u=u,rate=rater)
# media verdadeira
media = 2
# Criar data frame
df <- data.frame(valores = dados)
# Criar data frame das probabilidades teóricas
valores = seq(min(dados),max(dados),length.out = 500)
df_teorico <- data.frame(
valores = valores,
dens = dexp(valores,rate=rater)
)
# Criar o gráfico
ggplot(df, aes(x = valores)) +
# histograma
geom_histogram(aes(y = ..density..),
fill = "lightblue", color = "black") +
# gráfico de linha
geom_line(data = df_teorico, aes(x = valores, y = dens),
color = "red", size = 1) +
# acrescentar a média verdadeira em uma linha vertical
geom_vline(xintercept = media, linetype = "dashed", color="blue",size=1)+
labs(title = "Exponencial (1/2)",
x = "Valores", y = "Densidade") +
theme_minimal() +
xlim(0,10)
Acabamos de fazer, portanto, o que a função
rexp() faz automaticamente.
A distribuição de Pareto é especialmente útil para modelar variáveis positivas com alta assimetria à direita, sendo frequentemente associada à chamada lei dos poucos vitais.
Considere a variável aleatória \(X \sim \text{Pareto}(x_m, \alpha)\), com:
As expressões da função densidade de probabilidade e da função de distribuição acumulada são, respectivamente:
\[ f(x) = \frac{\alpha\, x_m^\alpha}{x^{\alpha + 1}}, \quad x \ge x_m \]
e
\[ F(x) = 1 - \left(\frac{x_m}{x}\right)^\alpha, \quad x \ge x_m \]
A esperança existe somente se \(\alpha > 1\):
\[ \mathbb{E}[X] = \frac{\alpha x_m}{\alpha - 1}, \quad \alpha > 1. \]
A variância existe somente se \(\alpha > 2\):
\[ \text{Var}(X) = \frac{\alpha x_m^2}{(\alpha - 1)^2(\alpha - 2)}, \quad \alpha > 2. \]
Utilizando o método da transformação inversa,
crie a função r_pareto que gera \(n\) observações da distribuição de Pareto
com parâmetros \(x_m\) e \(\alpha\).
Use essa função para gerar 500 valores de uma distribuição Pareto
(\(\alpha=1\) e \(x_m=10\)). Gere o histograma dos dados e
verifique a aproximação para a verdadeira distribuição. Dica:
Utilize a função dpareto do pacote VGAM com os
argumentos shape (\(\alpha\)) e scale (\(x_m\))
O método da transformação inversa é uma abordagem
fundamental para gerar amostras aleatórias a partir de
distribuições de probabilidade arbitrárias. Como vimos,
ele se baseia na inversão da função de distribuição acumulada,
transformando números uniformemente distribuídos em números que
seguem a distribuição desejada. O R usa este
método para gerar as seguintes distribuições:
Por depender, analiticamente, da função \(F\), o método da transformação inversa possui algumas desvantagens. Para muitas distribuições, essa inversa não possui uma forma fechada, o que pode dificultar ou até inviabilizar a implementação direta do método. Quando a inversa da FDA não tem uma forma analítica simples, precisamos recorrer a métodos numéricos (como bissecção ou Newton-Raphson) para encontrar \(F^{-1}(u)\). Isso pode ser computacionalmente custoso, especialmente para distribuições complexas ou quando precisamos gerar um grande número de amostras rapidamente. Além disso, podem ocorrer erros de arredondamento, impactando a qualidade das amostras geradas. Se a distribuição tem múltiplos picos (multimodalidade), o método da transformação inversa pode ser ineficiente porque pode ser difícil encontrar a inversa de \(F\) com precisão.
O R não usa métodos numéricos para calcular a
inversa da função de distribuição acumulada ao gerar amostras de
distribuições. Quando a inversa de \(F\) não tem uma forma
fechada, o R geralmente adota outros
métodos mais eficientes: