Pular para o conteúdo principal

Estimativa de densidade por kernel: da teoria à prática

A estimativa de densidade por kernel é um método não paramétrico para estimar o formato de uma distribuição de dados sem assumir um modelo fixo. Aprenda a fórmula, a seleção de largura de banda e a implementação prática em Python e R.
Atualizado 16 de jun. de 2026  · 11 min lido

Já tentou visualizar uma distribuição e acabou com um histograma que muda de forma toda vez que você altera o tamanho das classes?

Geralmente é assim: você escolhe 10 classes e vê uma curva suave. Aí muda para 30 e surgem vários picos. Os dados são os mesmos, mas contagens de classes diferentes geram interpretações diferentes. Esse é o maior problema dos histogramas: eles não mostram a distribuição em si, e sim uma versão dela. E essa versão é influenciada por um parâmetro que você definiu arbitrariamente.

KDE segue outro caminho. Em vez de fatiar os dados em classes, coloca-se uma pequena curva suave em cada ponto de dado e soma-se tudo. Isso gera uma estimativa única e contínua da distribuição subjacente.

Neste artigo, você vai entender a intuição por trás do KDE, percorrer a fórmula, ver como a largura de banda controla a suavidade e conferir exemplos práticos em Python e R.

Está começando com histogramas? Aqui vai um guia completo de histogramas de frequência para você começar com o pé direito.

O que é estimativa de densidade por kernel?

A estimativa de densidade por kernel é um método não paramétrico para estimar a função densidade de probabilidade de um conjunto de dados.

O "não paramétrico" é o que faz a diferença.

Em métodos paramétricos, você assume que seus dados seguem uma distribuição específica — normal, exponencial — e então ajusta parâmetros para se encaixar nela. Se essa suposição estiver errada, seu modelo estará errado. KDE não faz esse tipo de suposição. Ele deixa os dados falarem por si e constrói uma estimativa da distribuição subjacente diretamente a partir das observações.

A saída é uma curva suave que mostra onde os valores tendem a se concentrar — e com que probabilidade. Pontos altos na curva indicam regiões densas. Pontos baixos indicam regiões com poucos dados.

Por que usar estimativa de densidade por kernel?

Histogramas são a ferramenta padrão para visualizar distribuições, mas têm um problema: o formato que você vê depende do número de classes escolhido. E esse número é você quem define. Duas pessoas podem olhar para o mesmo conjunto de dados e tirar conclusões completamente diferentes só por escolherem contagens de classes distintas.

Com KDE, em vez de forçar os dados em classes, você obtém uma curva suave e contínua que não muda com base em um parâmetro arbitrário definido previamente.

Isso é útil para várias coisas:

  • Visualizar o formato geral de uma distribuição sem o viés do tamanho das classes
  • Detectar padrões como múltiplos picos, assimetria ou caudas pesadas
  • Comparar distribuições entre grupos no mesmo gráfico
  • Ter uma visão mais limpa dos dados antes de modelar

A intuição por trás do KDE

Você pega cada ponto de dado e coloca uma pequena curva suave sobre ele. Essa curva é chamada de kernel. Depois, soma todas essas curvas individuais.

O resultado é uma única curva suave que mostra a densidade dos seus dados. Onde há aglomeração de pontos, vários kernels se sobrepõem e se acumulam, então a curva sobe. Onde há poucos dados, quase não há sobreposição e a curva fica baixa. Cada ponto contribui igualmente para a estimativa final.

Imagine que você registrou as notas finais de uma turma. Em vez de criar um histograma, o KDE coloca uma pequena curva suave em cada nota. Onde as notas se concentram — digamos, entre 70 e 75 — as curvas se acumulam e a estimativa sobe. Um único aluno que tirou 95 adiciona só um pequeno "calombo" na cauda.

A visualização abaixo mostra exatamente isso. A maioria dos alunos ficou perto da média, e um aluno teve nota bem mais alta:

KDE visualized

KDE visualizado

Fórmula do kernel density estimation

A fórmula do KDE parece mais assustadora do que é.

Fórmula do KDE

Veja o que cada parte significa:

  • n é o número de pontos de dados

  • x_i são os pontos individuais do seu conjunto de dados

  • K é a função kernel — a curva suave colocada em cada ponto

  • h é a largura de banda — controla quão larga é cada curva

  • x é o ponto onde você está avaliando a densidade

Em bom português, a fórmula diz: para qualquer ponto x, veja quão perto cada ponto de dado x_i está dele, pese essa proximidade usando a função kernel K e faça a média do resultado em todos os n pontos. Faça isso para cada x ao longo do intervalo e você obtém a curva de densidade completa.

A largura de banda h aparece no denominador da fração dentro de K. Um h menor deixa o kernel mais estreito, então só pontos muito próximos influenciam a estimativa. Um h maior espalha a influência. Mais sobre isso mais adiante no artigo.

O que é uma função kernel?

O kernel é a curva suave que você coloca em cada ponto de dado. Ele define como a influência desse ponto se espalha para os vizinhos.

Todo kernel é centrado em um ponto de dado e atribui pesos com base na distância. Pontos próximos ao centro recebem peso alto. Pontos distantes recebem peso baixo ou nenhum. O formato exato desse peso depende do kernel escolhido.

Três escolhas comuns são:

  • Gaussiano: a famosa curva em sino. Atribui peso a todos os pontos do conjunto, com influência que cai com a distância. É o padrão na maioria das bibliotecas e funciona bem na prática
  • Uniforme: um retângulo plano. Todo ponto dentro de uma distância fixa recebe o mesmo peso, e qualquer coisa fora disso não recebe peso. Simples, mas gera estimativas menos suaves
  • Epanechnikov: um formato parabólico que é matematicamente ótimo em termos de erro quadrático médio. É mais eficiente que o Gaussiano, mas raramente faz diferença visível na prática.

Na maioria dos casos, a escolha do kernel importa pouco. Dois kernels diferentes aplicados aos mesmos dados, com a mesma largura de banda, produzem curvas quase idênticas. O que importa muito mais é a largura de banda — e é isso que vamos ver agora.

O papel da largura de banda no KDE

A largura de banda é o parâmetro que mais impacta o resultado do KDE, mais até do que o kernel escolhido.

Ela controla o quão larga é cada curva. Um kernel estreito só puxa influência de pontos próximos. Um kernel largo espalha essa influência por uma faixa bem maior. O resultado é uma curva que acompanha de perto os dados ou que suaviza mais o desenho.

Largura de banda pequena

Uma largura de banda pequena deixa cada kernel justo e estreito. A estimativa reage fortemente a cada ponto, o que ajuda a captar estrutura real dos dados, mas também capta ruído.

Na prática, isso parece uma curva cheia de picos pequenos. Alguns desses picos mostram aglomerados reais nos seus dados. Outros são apenas artefatos de pouca suavização. É difícil distinguir, e esse é o problema.

KDE with small bandwidth

KDE com largura de banda pequena

Largura de banda grande

Uma largura de banda grande deixa cada kernel bem amplo. Os kernels vizinhos se sobrepõem e a curva final sai bem suave.

Se suavizar demais, você começa a perder estrutura real. Dois aglomerados distintos podem se misturar em uma única curva. Uma distribuição com cauda pesada pode parecer simétrica. A visualização pode estar escondendo informação de você.

KDE with large bandwidth

KDE com largura de banda grande

Como encontrar a largura de banda ideal

Não existe uma largura de banda universalmente correta. A ideia é encontrar um valor suficientemente suave para filtrar o ruído, mas não a ponto de apagar padrões reais.

A maioria das bibliotecas faz isso com métodos automáticos de seleção de largura de banda. A regra prática de Silverman é a mais comum. Ela escolhe a largura de banda com base no tamanho da amostra e no desvio-padrão dos dados. Funciona bem para distribuições aproximadamente normais, mas pode suavizar demais distribuições multimodais.

Se ficar em dúvida, teste alguns valores de largura de banda e compare as curvas. As diferenças vão dizer muito sobre seus dados.

KDE vs. histograma

Tanto histogramas quanto KDE mostram a distribuição dos seus dados — mas fazem isso de maneiras bem diferentes.

Histograma

Um histograma divide os dados em classes discretas e conta quantos pontos caem em cada uma. É rápido, intuitivo e fácil de explicar para um público não técnico.

O problema é a sensibilidade ao número de classes. Se você muda a quantidade de classes, o formato muda. Não há um número de classes objetivamente correto, o que significa que duas pessoas podem olhar os mesmos dados e chegar a conclusões diferentes só por causa dessa escolha.

Além disso, histogramas geram um formato em degraus, descontínuo. Isso serve para uma visão rápida, mas pode ocultar a distribuição real por trás.

KDE

KDE entrega uma curva suave e contínua, sem classes envolvidas. É melhor para revelar o formato real de uma distribuição — assimetria, múltiplos picos ou caudas pesadas que um histograma pode perder ou distorcer dependendo da escolha das classes.

A contrapartida é que o KDE introduz seu próprio parâmetro — a largura de banda — e exige mais computação. Também é menos intuitivo de explicar, já que o eixo y mostra densidade de probabilidade, não contagens, o que pode confundir quem não está familiarizado com o conceito.

Quando usar cada um

Use histograma quando precisar de um resumo rápido e interpretável dos dados ou quando o seu público não está familiarizado com estimativas de densidade. Use KDE quando o formato da distribuição importa — por exemplo, ao comparar grupos ou ao tentar detectar múltiplos modos nos seus dados.

Histogram compared to KDE

Histograma comparado ao KDE

Na prática, eles costumam ser usados juntos: o histograma para as contagens e a curva de KDE sobreposta para o formato.

Kernel density estimation em Python

Em Python, você tem algumas formas de calcular e plotar o KDE, dependendo se precisa de um gráfico rápido ou de mais controle sobre a estimativa.

Visualizando KDE com seaborn

A forma mais rápida de obter um gráfico de KDE é com seaborn.kdeplot(). Só isso já resolve:

import seaborn as sns
import numpy as np

np.random.seed(42)
scores = np.concatenate([
    np.random.normal(65, 4, 60),
    np.random.normal(80, 3, 40)
])

sns.kdeplot(scores, bw_adjust=1)

KDE with seaborn

KDE com seaborn

O parâmetro bw_adjust escala a largura de banda selecionada automaticamente. Valores abaixo de 1 deixam a curva mais justa; acima de 1, mais suave. É um multiplicador em cima da largura de banda que o seaborn escolhe internamente, então você não precisa definir um valor bruto manualmente.

O eixo y mostra densidade de probabilidade, não contagens. A curva indica quão provável é um valor em relação ao restante da distribuição. Quanto mais alto, maior a concentração de dados naquela faixa.

Calculando KDE com scipy

Se você precisa dos valores de densidade de fato — e não só do gráfico — use scipy.stats.gaussian_kde. Ela retorna um objeto chamável que você avalia em qualquer ponto.

from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt

kde = gaussian_kde(scores, bw_method="scott")
x = np.linspace(45, 100, 500)
density = kde(x)

plt.plot(x, density)

bw_method="scott" usa a regra de Scott para escolher a largura de banda automaticamente. É um bom padrão para a maioria dos casos. Você também pode passar um escalar para definir a largura de banda manualmente.

KDE with scipy and matplotlib

KDE com scipy e matplotlib

Kernel density estimation em R

Em R, o KDE já vem na base da linguagem. Você não precisa de pacotes extras.

Calculando KDE com density()

A função density() recebe um vetor numérico e retorna um objeto de KDE.

set.seed(42)
scores <- c(rnorm(60, mean = 65, sd = 4),
            rnorm(40, mean = 80, sd = 3))

kde <- density(scores, bw = "SJ")

O argumento bw controla a seleção da largura de banda. "SJ" usa o método de Sheather-Jones, que lida melhor com distribuições multimodais do que o padrão. Você também pode passar um valor numérico para definir a largura de banda manualmente.

O resultado é um objeto lista com dois componentes principais:

  • kde$x: a sequência de pontos onde a densidade foi avaliada
  • kde$y: os valores de densidade correspondentes

Plotando a curva

Basta passar o resultado diretamente para plot().

plot(kde,
     main = "Exam Score Distribution",
     xlab = "Score",
     ylab = "Density")

KDE plotado em R

Para sobrepor o KDE a um histograma, use hist() com freq = FALSE primeiro e depois adicione a curva com lines().

hist(scores, freq = FALSE, main = "Histogram + KDE", xlab = "Score")
lines(kde, col = "blue", lwd = 2)

Histograma com KDE em R

freq = FALSE reescala o histograma para densidade, assim as barras e a curva compartilham o mesmo eixo y.

Vantagens e limitações do KDE

KDE é uma visualização realmente útil, mas como tudo, vem com trade-offs que vale conhecer antes de substituir histogramas por ele.

Vantagens

O maior diferencial é que o KDE não faz suposições sobre a distribuição dos dados. Você não precisa decidir de antemão se seus dados são normais, exponenciais ou qualquer outra coisa. O formato vem dos próprios dados, o que torna o KDE flexível para lidar com distribuições multimodais e tudo mais que não se encaixa em modelos paramétricos padrão.

A saída também é uma curva suave e contínua, em vez de uma aproximação em degraus. Isso facilita enxergar padrões — como múltiplos picos ou caudas longas — que um histograma pode esconder dependendo da escolha das classes.

E como o KDE funciona diretamente nos dados brutos, sem exigir o ajuste prévio de um modelo, é um ótimo primeiro passo em qualquer análise exploratória.

Limitações

A escolha da largura de banda é o principal ponto fraco. Se você errar, a estimativa ou persegue o ruído, ou suaviza demais e apaga padrões reais. Métodos automáticos como a regra de Silverman funcionam bem para dados aproximadamente normais, mas podem enganar em distribuições complexas. Muitas vezes é preciso testar manualmente alguns valores antes de confiar no resultado.

Desempenho pode virar problema em escala. O KDE avalia uma função kernel para cada ponto de dado em cada ponto de avaliação, o que faz o custo computacional crescer rápido conforme o conjunto aumenta. Para exploração, geralmente não é um impeditivo, mas pode ficar lento em conjuntos com centenas de milhares de pontos.

Efeitos de borda são um problema mais sutil. O KDE padrão assume que os dados podem se estender infinitamente em ambas as direções. Quando há um limite rígido — como valores que não podem ser abaixo de zero — a estimativa "vaza" massa de probabilidade para além desse limite, deixando a curva artificialmente baixa perto da borda. Existem versões com correção de borda, mas são menos comuns nas bibliotecas padrão.

Conclusão

KDE oferece uma forma mais limpa de olhar para a distribuição dos seus dados do que histogramas. Não há escolhas de classes nem suposições paramétricas — só uma curva suave que mostra o que realmente está no seu dataset.

A largura de banda é o único parâmetro que realmente importa. Teste alguns valores, compare as curvas, use opções automáticas e confirme se a estimativa faz sentido com o que você já sabe sobre os dados antes de tirar conclusões.

A melhor forma de criar intuição para KDE é rodar em dados reais. Escolha um conjunto que você já conhece, aplique KDE e compare com um histograma para ver o que estava passando batido.

Curte visualização de dados? Confira nosso curso de visualização de dados com Seaborn se você usa Python, ou visualização de dados com ggplot2 se você prefere R.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Cientista de dados sênior baseado na Croácia. Principal redator técnico com mais de 700 artigos publicados, gerando mais de 10 milhões de visualizações. Autor do livro Automação do aprendizado de máquina com TPOT.

FAQs

Para que serve a estimativa de densidade por kernel?

KDE é usado para estimar a distribuição de probabilidade de um conjunto de dados sem assumir que ele segue um formato específico, como uma distribuição normal ou exponencial. É comum na análise exploratória, quando você quer visualizar como seus dados estão distribuídos antes de modelar. Você também vai encontrar KDE em detecção de anomalias, comparação de distribuições entre grupos e como etapa de suavização em pipelines estatísticos.

Como o KDE é diferente de um histograma?

Um histograma divide os dados em classes discretas e conta quantos pontos caem em cada uma. O formato obtido depende de quantas classes você escolhe, o que o torna sensível a um parâmetro arbitrário. KDE evita isso colocando uma curva suave em cada ponto de dado e somando, o que gera uma estimativa contínua que não muda com o número de classes.

Precisa de um conjunto grande para usar KDE?

KDE funciona com conjuntos pequenos, mas as estimativas são menos confiáveis quando há poucos pontos. Com poucos dados, observações individuais têm grande influência na curva final, o que dificulta separar estrutura real de ruído. À medida que o conjunto cresce, a estimativa se estabiliza e reflete melhor a distribuição verdadeira.

O que acontece se você escolher a largura de banda errada?

Uma largura de banda muito pequena gera uma curva cheia de picos, que reage a cada ponto individual, dificultando ver o formato geral dos dados. Uma largura de banda muito grande suaviza demais e pode juntar picos distintos em um único "morro", escondendo estrutura real. A maioria das bibliotecas oferece métodos automáticos, como a regra de Silverman, como ponto de partida, mas é boa prática testar alguns valores manualmente antes de tirar conclusões.

KDE funciona bem perto dos limites dos seus dados?

O KDE padrão assume que os dados podem se estender infinitamente em ambas as direções, o que causa problemas quando sua variável tem limite inferior ou superior rígido — como idade, renda ou qualquer contagem que não pode ser menor que zero. Perto desses limites, a estimativa "vaza" massa de probabilidade para fora da faixa válida, tornando a curva artificialmente baixa nas bordas. Existem métodos de KDE com correção de borda para lidar com isso, mas nem todas as bibliotecas os oferecem e eles exigem configuração adicional.

Tópicos

Aprenda com a DataCamp

Curso

Support Vector Machines in R

4 h
11K
This course will introduce the support vector machine (SVM) using an intuitive, visual approach.
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow