R: Distribuições de Probabilidade em R
Última atualização: 2026-08-26
Na aula anterior, aprendemos sobre “análise de dados” — estatística descritiva. Nesta aula, aprenderemos sobre “análise da aleatoriedade” — distribuições de probabilidade. Toda inferência estatística no R (testes t, regressão, teste de hipóteses) se baseia em distribuições de probabilidade. Nesta aula, abordaremos as
d/p/q/rquatro principais famílias de funções do R + quatro distribuições comumente utilizadas.
Ao concluir esta aula, você será capaz de usar o R para simular qualquer fenômeno aleatório, realizar cálculos de probabilidade e estabelecer as bases para futuros testes de hipóteses.
1. O que você vai aprender
- As quatro principais famílias de funções de distribuição de probabilidade (d/p/q/r)
- Distribuição normal (a mais utilizada)
- Distribuição binomial (sucesso/fracasso)
- Distribuição de Poisson (número de eventos)
- distribuição t / distribuição F / distribuição qui-quadrado
- set.seed: semente aleatória
- Prática: Simulação de inspeção de qualidade
2. Uma história sobre a inspeção de qualidade
(1) Desafio: Qual é a taxa de aprovação normal de um produto?
Alice é uma inspetora de controle de qualidade que descobriu que o peso médio dos produtos em uma determinada linha de produção é de 100 g, com um desvio padrão de 2 g. Seu gerente perguntou: “Qual é a proporção de produtos com peso inferior a 95 g?”
Consultar a tabela de distribuição normal em um livro? Usar uma fórmula do Excel? Ou apenas uma linha de código em R—
(2) Solução utilizando R
# Weight < 95g the probability
pnorm(95, mean = 100, sd = 2)
# [1] 0.00621 ← 0.6%
# Extract 1000 Product Simulation Testing
set.seed(42)
samples <- rnorm(1000, mean = 100, sd = 2)
mean(samples < 95) # 0.6% ← Verification
2 linhas de código → Resposta + Verificação por simulação.
3. As quatro principais famílias de funções de distribuição de probabilidade no R
(1) Comparação das quatro principais funções
| Prefixo de função | Significado | Finalidade |
|---|---|---|
d |
densidade | função de densidade de probabilidade (FDP) |
p |
probabilidade | Função de Distribuição Cumulativa (CDF) |
q |
quantil | função inversa (determinar um quantil a partir de uma probabilidade) |
r |
aleatório | Gerar um número aleatório |
Todas as distribuições possuem estas quatro funções: dnorm pnorm qnorm rnorm (normal); dbinom pbinom... (binomial), e assim por diante.
(2) Frases mnemônicas
graph LR
A[d Density] -->|Find the probability| B[p Cumulative]
B -->|Inverse Quantile| C[q quantile]
A -->|Simulation| D[r Random]
style A fill:#cce5ff
style B fill:#d4edda
style C fill:#f8d7da
style D fill:#fff3cd
(3) Uma explicação detalhada das quatro funções principais
# Take the normal distribution as an example (Mean 0, Standard Deviation 1)
dnorm(0) # 0.3989 ← Probability Density
pnorm(0) # 0.5 ← Cumulative Probability
qnorm(0.975) # 1.96 ← Given that 97.5% Find the percentile
rnorm(5) # 5 A random number
# Custom Parameters (Mean 100, Standard Deviation 2)
dnorm(95, 100, 2) # 95 Density at that point
pnorm(95, 100, 2) # 95 Left-sided cumulative probability
qnorm(0.975, 100, 2) # Given that 97.5% Find the percentile
rnorm(5, 100, 2) # 5 Per capita average 100 Random Number
4. Distribuição normal (a mais utilizada)
(1) O que é uma distribuição normal?
graph TB
A[Normal Distribution N mu sigma] --> B[Bell-shaped symmetry]
A --> C[68-95-99.7 Principles]
A --> D[Central Limit Theorem]
A --> E[Widely found in nature/Social Phenomena]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
Distribuição Normal = Em forma de sino, simétrica e a distribuição mais comum encontrada na natureza.
(2) A regra 68-95-99,7
μ ± 1σ → 68.27% Data
μ ± 2σ → 95.45% Data
μ ± 3σ → 99.73% Data
(3) As 4 funções normais padrão
# Standard Normal N(0, 1)
dnorm(0) # 0.3989
pnorm(1.96) # 0.975 ← 1.96 On the left 97.5%
qnorm(0.975) # 1.96 ← 97.5% quantile = 1.96
rnorm(5) # 5 A standard normal random number
# General Normal N(μ, σ)
mu <- 100
sigma <- 2
# P(X < 95) = ?
pnorm(95, mean = mu, sd = sigma) # 0.00621
# P(95 < X < 105) = ?
pnorm(105, mu, sigma) - pnorm(95, mu, sigma) # 0.9876
# 99% Data Range
qnorm(0.005, mu, sigma) # The Lower World
qnorm(0.995, mu, sigma) # Upper Realm
(4) Teste de normalidade
# 1. Visual: QQ plot
qqnorm(x)
qqline(x, col = "red")
# 2. Statistical Tests
shapiro.test(x) # Shapiro-Wilk (n < 5000)
# p < 0.05 Indicates non-normal distribution
5. Distribuição binomial (sucesso/fracasso)
(1) O que é uma distribuição binomial?
A distribuição do número de sucessos em n ensaios de Bernoulli independentes. A probabilidade de sucesso em cada ensaio é p, e a probabilidade de fracasso é 1-p.
Example: Toss 10 coins, number of times facing up X ~ Binomial(10, 0.5)
(2) As quatro principais funções binárias
# Toss 10 coins, number of heads
dbinom(5, size = 10, prob = 0.5) # 0.246 <- P(5 heads)
pbinom(5, size = 10, prob = 0.5) # 0.623 <- P(<= 5 heads)
qbinom(0.5, size = 10, prob = 0.5) # 5 ← Median
rbinom(1000, size = 10, prob = 0.5) # 1000 sets of 10 trials, number of successes each
# Example: 100 shots, hit rate 80%, probability of at least 90 hits
1 - pbinom(89, size = 100, prob = 0.8)
# [1] 0.0227 ← 2.3%
(3) Visualização binomial
n <- 10
p <- 0.5
x <- 0:n
# Probability Mass Function
plot(x, dbinom(x, n, p), type = "h",
main = paste0("Binomial(", n, ",", p, ")"),
xlab = "Number of Successes", ylab = "Probability",
col = "blue", lwd = 2)
points(x, dbinom(x, n, p), pch = 19, col = "red")
6. Distribuição de Poisson (Número de Eventos)
(1) O que é a distribuição de Poisson?
A distribuição do número de eventos que ocorrem dentro de um intervalo de tempo ou espaço determinado. Comumente utilizada para:
- Número de clientes que chegam à loja em 1 hora
- Número de acidentes de trânsito por quilômetro de estrada
- Número de chamadas recebidas em 1 dia
Parâmetro λ = número médio de eventos por unidade de tempo.
(2) As quatro funções de Poisson
# Example: Average 10 customers per hour
dpois(8, lambda = 10) # P(X = 8) = 0.1126
ppois(8, lambda = 10) # P(X ≤ 8) = 0.3328
qpois(0.5, lambda = 10) # Median = 10
rpois(100, lambda = 10) # 100 Number of customers visiting the store per hour
# Example: 5 complaints per day, probability of more than 10
1 - ppois(10, lambda = 5) # 0.0137 ← 1.4%
(3) A relação entre as distribuições de Poisson e normal
Quando λ é grande, a distribuição de Poisson se aproxima da distribuição normal N(λ, √λ):
# λ = 100
lambda <- 100
# Poisson P(90 ≤ X ≤ 110)
ppois(110, lambda) - ppois(89, lambda) # ≈ 0.728
# Equivalent Normal Approximation
pnorm(110, 100, 10) - pnorm(90, 100, 10) # ≈ 0.683
# Approximate but not exactly equal
7. Distribuição t / Distribuição F / Distribuição qui-quadrado
(1) Referência rápida às três principais distribuições amostrais
| Distribuição | Finalidade | Função R |
|---|---|---|
| Distribuição t | Inferência da média em amostras pequenas | dt/pt/qt/rt |
| Distribuição F | Análise de variância (ANOVA) | df/pf/qf/rf |
| Distribuição qui-quadrado | Variáveis categóricas, adequação do modelo | dchisq/pchisq/qchisq/rchisq |
(2) Uma explicação detalhada da distribuição t
# Degrees of freedom df = 10
qt(0.975, df = 10) # 2.228 <- t threshold (larger than the normal distribution's 1.96)
pt(2.228, df = 10) # 0.975
# As df -> inf, t distribution -> standard normal
qt(0.975, df = 1000) # 1.962 ← Approach 1.96
qt(0.975, df = 10000) # 1.960
(3) Distribuição do qui-quadrado
# Degrees of freedom df = 5
dchisq(3, df = 5) # Density
pchisq(11.07, df = 5) # 0.95 <- Chi-square critical value (95%)
qchisq(0.95, df = 5) # 11.07
# Example: Observed 8 events, expected 5, p-value
1 - pchisq(8, df = 5) # 0.846
(4) Distribuição F
# Degrees of freedom df1 = 5, df2 = 10
qf(0.95, df1 = 5, df2 = 10) # 3.326 ← F Threshold
pf(3.326, df1 = 5, df2 = 10) # 0.95
8. set.seed: Semente aleatória
(1) Por que as sementes são necessárias?
Os “números aleatórios” do R são, na verdade, pseudoaleatórios — quando se define uma semente, os resultados são reproduzíveis:
# No seeded players
rnorm(3) # The results are different every time
# Let $s$ be a seed
set.seed(42)
rnorm(3) # The First Time
set.seed(42)
rnorm(3) # Exactly the same
set.seed() em sua pesquisa/relatório — para garantir que os resultados sejam reproduzíveis.
(2) Aplicações práticas
# 1. Simulate Preset Seeds
set.seed(42)
sim_data <- rnorm(1000, 100, 15)
# 2. Set a seed before training the model
set.seed(123)
model <- lm(y ~ x, data)
# 3. Set a seed before cross-validation
set.seed(2024)
folds <- createFolds(data$y, k = 5)
9. Amostragem e simulação
(1) sample() Amostragem
# 1. Simple Random Sampling
sample(1:100, 10) # Draw 10 from 1-100 (no duplicates)
sample(1:100, 10, replace = TRUE) # Sampling with replacement
# 2. Data Frame Sampling
sample_n(df, 10) # Draw 10 rows (old)
slice_sample(df, n = 10) # Draw 10 rows (dplyr 1.0+)
# 3. Stratified Sampling
df |>
group_by(class) |>
slice_sample(n = 5) # Draw one from each group 5 row
# 4. Set Up Probability Sampling
sample(c("A", "B", "C"), 100, replace = TRUE,
prob = c(0.5, 0.3, 0.2))
(2) Simulação de Monte Carlo
# Example: Estimate pi
set.seed(42)
n_sim <- 100000
x <- runif(n_sim, -1, 1)
y <- runif(n_sim, -1, 1)
inside <- sqrt(x^2 + y^2) <= 1
pi_est <- 4 * mean(inside)
# [1] 3.14116 ← Approach π = 3.14159
10. Exemplo completo: Simulação de inspeção de qualidade
A seguir, apresentamos um exemplo de um fluxo de trabalho completo que reúne todos os conceitos de distribuição de probabilidade abordados nesta aula.
▶ Exemplo: Simulação de inspeção de qualidade em uma linha de produção
# ============================================
# Production Line Quality Inspection Simulation
# Features: Comprehensive Application of 4 Distributions
# ============================================
set.seed(42)
# 1. Product Weight Inspection (Normal Distribution)
# Specifications: Mean 100g, Standard Deviation 2g
n_products <- 10000
weights <- rnorm(n_products, mean = 100, sd = 2)
cat("=== Weight Inspection (Normal Distribution N(100, 2)) ===\n")
cat("Sample size:", length(weights), "\n")
cat("Actual Mean:", round(mean(weights), 4), "\n")
cat("Actual standard deviation:", round(sd(weights), 4), "\n")
cat("Theory < 95g Ratio:", round(pnorm(95, 100, 2), 4), "\n")
cat("Actual < 95g Ratio:", round(mean(weights < 95), 4), "\n")
cat("Theory < 105g Ratio:", round(pnorm(105, 100, 2), 4), "\n")
cat("Actual < 105g Ratio:", round(mean(weights < 105), 4), "\n\n")
# 2. Inspection of Nonconforming Products (Binomial Distribution)
# Sample 100 items, probability of at least 95 passing
n_sample <- 100
p_pass <- 0.95
prob_at_least_95 <- 1 - pbinom(94, n_sample, p_pass)
cat("=== Random Sampling Inspection (Binomial(100, 0.95)) ===\n")
cat("P(95 Qualified) =", round(prob_at_least_95, 4), "\n\n")
# 3. Customers Visit the Store (Poisson Distribution)
# Average 10 customers per hour
n_hours <- 1000
customers <- rpois(n_hours, lambda = 10)
cat("=== Customers Visit the Store (Poisson(10)) ===\n")
cat("Theoretical mean: 10\n")
cat("Actual Mean:", round(mean(customers), 2), "\n")
cat("Theory P(>15):", round(1 - ppois(15, 10), 4), "\n")
cat("Actual P(>15):", round(mean(customers > 15), 4), "\n\n")
# 4. Sample Survey (t Distribution)
# Sample 30 products, estimate mean
sample_size <- 30
sample_data <- sample(weights, sample_size)
cat("=== Sample Survey (t Distribution) ===\n")
cat("Sample size:", sample_size, "\n")
cat("Sample mean:", round(mean(sample_data), 2), "\n")
cat("95% Confidence Interval: [\n")
ci <- t.test(sample_data)$conf.int
cat(" ", round(ci[1], 2), ",", round(ci[2], 2), "]\n\n")
# 5. Hypothesis Testing (use qnorm)
# I want to know if the weight deviates significantly 100g
z_score <- (mean(sample_data) - 100) / (sd(sample_data) / sqrt(sample_size))
p_value <- 2 * (1 - pnorm(abs(z_score)))
cat("=== Hypothesis Testing (Z Test) ===\n")
cat("Z score:", round(z_score, 4), "\n")
cat("P value:", round(p_value, 4), "\n")
cat("Conclusion:", ifelse(p_value < 0.05, "Significant deviation from 100g", "No significant difference"), "\n\n")
# 6. Outlier Detection (The Concept of the Chi-Square Distribution)
# Use 3-sigma principle
outliers <- weights[abs(weights - 100) > 3 * 2]
cat("=== Outlier Detection (3-sigma Principle) ===\n")
cat("Theoretical Anomaly Ratio:", round(2 * pnorm(-3), 6), "(i.e. 0.27%)\n")
cat("Actual Number of Exceptions:", length(outliers), "/", n_products, "\n")
cat("Actual Exception Rate:", round(length(outliers) / n_products, 6), "\n")
# 7. Sampling Design (Stratified Sampling)
cat("\n=== Stratified Sampling ===\n")
# Simulate 3 production lines (Different Pass Rates)
production <- tibble::tibble(
line = rep(c("Line A", "Line B", "Line C"), each = 1000),
weight = c(rnorm(1000, 100, 2),
rnorm(1000, 101, 2),
rnorm(1000, 99, 2))
)
# Draw 50 from each line
library(dplyr)
sampled <- production |>
group_by(line) |>
slice_sample(n = 50)
cat("Draw 50 per line, Estimated Overall Mean:\n")
cat("Overall Sample Mean:", round(mean(sampled$weight), 2), "\n")
cat("Total True Mean:", round(mean(production$weight), 2), "\n")
Resultado esperado (trecho):
=== Weight Inspection (Normal Distribution N(100, 2)) ===
Sample size: 10000
Actual Mean: 99.9898
Actual standard deviation: 1.9973
Theory < 95g Ratio: 0.0062
Actual < 95g Ratio: 0.0063
=== Random Sampling Inspection (Binomial(100, 0.95)) ===
P(95 Qualified) = 0.5647
❓ Perguntas Frequentes
P: Como distinguir entre d, p, q e r? R: d significa densidade, p significa cumulativa, q significa quantil e r significa aleatória. Use p quando x for conhecido e você quiser calcular a probabilidade; use q quando a probabilidade for conhecida e você quiser calcular x; use r para simulação.
P: Quando se deve usar a distribuição t em vez da distribuição normal? R: Use a distribuição normal (Teorema do Limite Central) quando n ≥ 30 e a distribuição t (amostra pequena) quando n < 30. Quando a variância for desconhecida, dê preferência à distribuição t.**
P: Qual é a diferença entre a distribuição de Poisson e a distribuição binomial? R: A distribuição binomial conta o número de sucessos em n tentativas (onde n é fixo), enquanto a distribuição de Poisson conta o número de eventos por unidade de tempo (onde n não é fixo). A distribuição de Poisson é uma aproximação da distribuição binomial para casos em que n é grande e p é pequeno.
P: Como escolho uma semente aleatória? R: Qualquer número inteiro serve —
set.seed(42)é um “número mágico” comum. O importante é que o código seja reproduzível após a definição da semente.**
P: Como se interpreta um gráfico da norma QQ? R: Os pontos próximos à linha vermelha indicam uma distribuição normal. Uma curva em forma de S indica uma distribuição assimétrica, e uma curva em forma de U indica uma distribuição com caudas pesadas ou caudas leves.
P: Para que serve a distribuição qui-quadrado? R: ① Teste de adequação ② Teste de independência (tabela de contingência) ③ Intervalos de confiança para variâncias estimadas. Não entraremos em detalhes nesta aula, mas ela será utilizada na próxima aula sobre teste de hipóteses.
📖 Resumo
- Distribuições de probabilidade em R: 4 grandes famílias de funções:
dDensidade /pCumulativa /qQuantil /rAleatória - Distribuição Normal (a mais utilizada): em forma de sino e simétrica, regra 68-95-99,7,
pnorm/qnorm/rnorm - Distribuição binomial: O número de resultados positivos em n ensaios independentes,
dbinom/pbinom/qbinom/rbinom - Distribuição de Poisson: Número de eventos por unidade de tempo,
dpois/ppois/qpois/rpois - distribuição t: Estimativa da média em amostras pequenas (n < 30); distribuição F: Relação entre variâncias; distribuição qui-quadrado: Dados categóricos
set.seed(42)Tornando a aleatoriedade reproduzível — Um elemento indispensável em relatórios de pesquisa- Amostragem:
sample(x, n)Sem reposição /replace = TRUECom reposição - Simulação de Monte Carlo = Geração de um grande número de amostras usando R + estatística para estimar probabilidades complexas
📝 Exercícios
-
Problema básico: Use
pnormpara calcular o seguinte para uma distribuição N(100, 2): ① P(X < 95), ② P(X > 105), ③ P(95 < X < 105) e ④ o intervalo de confiança de 99%. Verifique os resultados. -
Problema básico: Use
rbinom(1000, 10, 0.5)para simular 1.000 ensaios de “lançar uma moeda 10 vezes” e calcule a média, a variância e o desvio padrão da amostra. Compare esses valores com os valores teóricos (5, 2,5, 1,58). -
Problema básico: Use
rpois(1000, 5)para simular 1.000 instâncias do “número de chamadas recebidas em 5 minutos”, trace um histograma e a função de densidade de probabilidade (PDF) teórica de Poisson e compare as distribuições. -
Problema avançado: Simule 10.000 pesos de produtos (distribuídos normalmente N(100, 2)), utilize a regra dos 3σ para identificar o número de valores atípicos e compare-o com o valor teórico de 0,27% para verificar o Teorema do Limite Central (TLC).
-
Desafio: Estime π usando a simulação de Monte Carlo: ① Lance um dado 10.000 vezes; ② Calcule a proporção de lançamentos que caem dentro de um quarto de círculo; ③ Estime 4 × essa proporção = π; ④ Varie o número de lançamentos (100, 1.000, 10.000, 100.000) para observar as mudanças na precisão. Faça capturas de tela dos resultados para os quatro níveis de precisão.