Guia Completo: Estimativa de Densidade por Kernel (KDE) em R
2025-04-05
Contents
0.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2 1. Comparando Histograma e Density Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.3 2. Efeito da Largura de Banda (Bandwidth) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.4 3. Comparação entre Kernels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.5 4. Exemplo com Poucos Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
0.6 5. Comparação com Densidade Teórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
0.7 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
0.1 Introdução
Este documento apresenta uma explicação detalhada sobre a construção de gráficos de densidade (density
plots) usando a técnica de estimativa por kernel (KDE) em R. Abordaremos desde conceitos básicos até
o efeito da escolha da largura de banda e do tipo de função kernel.
0.2 1. Comparando Histograma e Density Plot
[Link](123)
dados <- rnorm(1000, mean = 170, sd = 10) # Simulando alturas (cm)
# Plotando histograma com curva de densidade
ggplot([Link](x = dados), aes(x)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black", alpha = 0.5) +
geom_density(color = "red", size = 1.2) +
labs(title = "Histograma vs Density Plot",
x = "Altura (cm)", y = "Densidade Estimada") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## i Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
1
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## i Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Histograma vs Density Plot
0.04
0.03
Densidade Estimada
0.02
0.01
0.00
140 160 180 200
Altura (cm)
Comentário: - O histograma mostra a frequência em “caixas” (bins). - O KDE gera uma curva suave que
representa uma estimativa contínua da distribuição.
0.3 2. Efeito da Largura de Banda (Bandwidth)
bw_vals <- c(5, 10, 20)
ggplot([Link](x = dados), aes(x)) +
geom_density(aes(color = "Padrão"), size = 1.2) +
geom_density(kernel = "gaussian", bw = bw_vals[1], aes(color = paste0("bw = ", bw_vals[1])), size = 1)
geom_density(kernel = "gaussian", bw = bw_vals[2], aes(color = paste0("bw = ", bw_vals[2])), size = 1)
geom_density(kernel = "gaussian", bw = bw_vals[3], aes(color = paste0("bw = ", bw_vals[3])), size = 1)
labs(title = "Efeito da Bandwidth no KDE",
x = "Altura (cm)", y = "Densidade Estimada", color = "Legenda") +
theme_minimal()
2
Efeito da Bandwidth no KDE
0.04
0.03
Densidade Estimada
Legenda
bw = 10
bw = 20
0.02
bw = 5
Padrão
0.01
0.00
140 160 180 200
Altura (cm)
Comentário: - Bandwidth pequeno: curva detalhada, mas sensível ao ruído. - Bandwidth grande: curva
suave demais, pode esconder detalhes.
0.4 3. Comparação entre Kernels
ggplot([Link](x = dados), aes(x)) +
geom_density(kernel = "gaussian", aes(color = "Gaussiano"), size = 1) +
geom_density(kernel = "epanechnikov", aes(color = "Epanechnikov"), size = 1) +
geom_density(kernel = "rectangular", aes(color = "Uniforme"), size = 1) +
geom_density(kernel = "triangular", aes(color = "Triangular"), size = 1) +
labs(title = "Comparação entre Kernels no KDE",
x = "Altura (cm)", y = "Densidade Estimada", color = "Kernel") +
theme_minimal()
3
Comparação entre Kernels no KDE
0.04
0.03
Densidade Estimada
Kernel
Epanechnikov
Gaussiano
0.02
Triangular
Uniforme
0.01
0.00
140 160 180 200
Altura (cm)
Comentário: - A forma da função kernel afeta levemente o resultado. - A largura de banda (h) é geralmente
mais importante que o tipo de kernel.
0.5 4. Exemplo com Poucos Dados
dados_exemplo <- c(-2.1, -1.3, -0.4, 1.9, 5.1, 6.2)
ggplot([Link](x = dados_exemplo), aes(x)) +
geom_rug(sides = "b", color = "black") +
geom_density(kernel = "gaussian", bw = 1, fill = "lightblue", alpha = 0.5, color = "blue", size = 1.2)
labs(title = "KDE com Pequena Amostra", x = "Valor", y = "Densidade") +
theme_minimal()
4
KDE com Pequena Amostra
0.15
0.10
Densidade
0.05
0.00
−2.5 0.0 2.5 5.0
Valor
Comentário: - Cada ponto adiciona uma “bolha” de densidade. - A curva resultante é a soma dessas
contribuições suavizadas.
0.6 5. Comparação com Densidade Teórica
x_teorico <- rnorm(1000)
ggplot([Link](x = x_teorico), aes(x)) +
stat_function(fun = dnorm, args = list(mean = 0, sd = 1), color = "black", size = 1, linetype = "dashe
geom_density(bw = 0.05, aes(color = "Subsuavizado"), size = 1) +
geom_density(bw = 0.337, aes(color = "Ideal"), size = 1) +
geom_density(bw = 2, aes(color = "Suavizado demais"), size = 1) +
labs(title = "Comparação de Bandwidths com Verdade Teórica",
x = "Valor", y = "Densidade", color = "Curvas") +
theme_minimal()
5
Comparação de Bandwidths com Verdade Teórica
0.4
0.3
Curvas
Densidade
Ideal
0.2 Suavizado demais
Subsuavizado
0.1
0.0
−2 0 2
Valor
Comentário: - A curva preta tracejada é a densidade teórica da Normal padrão. - As curvas coloridas
mostram estimativas com diferentes graus de suavização.
0.7 Conclusão
O gráfico de densidade via KDE é uma poderosa ferramenta de visualização que, quando bem parametrizada,
fornece uma imagem clara e intuitiva da distribuição dos dados. Neste guia, vimos:
• A diferença entre histogramas e density plots;
• Como a largura de banda influencia a suavização;
• Como diferentes kernels afetam (levemente) a forma da curva;
• E como interpretar resultados com amostras pequenas e distribuições conhecidas.
Ajustar bem o KDE é mais arte do que ciência, mas conhecer esses fundamentos ajuda muito na interpretação
dos dados.