Vai al contenuto principale

Stima della densità con kernel: dalla teoria alla pratica

La stima della densità con kernel è un metodo non parametrico per stimare la forma di una distribuzione dei dati senza assumere un modello fisso. Scopri la formula, la scelta della larghezza di banda e l’implementazione pratica in Python e R.
Aggiornato 16 giu 2026  · 11 min leggi

Hai mai provato a visualizzare una distribuzione ottenendo un istogramma che cambia forma ogni volta che cambi la dimensione dei bin?

Di solito va così. Scegli 10 bin e vedi una curva liscia. Poi passi a 30 e compaiono più picchi. I dati sono rimasti gli stessi, ma conteggi di bin diversi danno interpretazioni diverse. È questo il problema più grande degli istogrammi: non ti mostrano la distribuzione, ma una sua versione. E quella versione è influenzata da un parametro che imposti a caso.

La KDE adotta un approccio diverso. Invece di suddividere i dati in bin, piazza una piccola curva liscia su ogni punto dati e le somma tutte. Questo ti dà una singola stima continua della distribuzione sottostante.

In questo articolo troverai l’intuizione dietro la KDE, una spiegazione della formula, come la larghezza di banda controlla la levigatezza e esempi pratici in Python e R.

Se gli istogrammi sono una novità per te, ecco una guida completa agli istogrammi di frequenza per iniziare.

Cos’è la stima della densità con kernel?

La stima della densità con kernel è un metodo non parametrico per stimare la funzione di densità di probabilità di un dataset.

La parte non parametrica è ciò che la rende diversa.

Con i metodi parametrici, assumi che i tuoi dati seguano una distribuzione specifica — normale, esponenziale — e poi adatti i parametri per farla combaciare. Se questa assunzione è sbagliata, il tuo modello è sbagliato. La KDE non fa queste assunzioni. Lascia che siano i dati a parlare e costruisce una stima della distribuzione sottostante direttamente dalle osservazioni.

L’output è una curva liscia che mostra dove è probabile che cadano i valori — e quanto è probabile. I punti alti sulla curva indicano regioni dense. Quelli bassi indicano regioni rade.

Perché usare la stima della densità con kernel?

Gli istogrammi sono lo strumento di default per visualizzare le distribuzioni, ma hanno un problema: la forma che vedi dipende dal numero di bin che scegli. E quel numero lo devi scegliere tu. Due persone possono guardare lo stesso dataset e trarre conclusioni completamente diverse solo scegliendo conteggi di bin diversi.

Con la KDE, invece di forzare i dati in bin, ottieni una curva liscia e continua che non cambia in base a un parametro arbitrario impostato a priori.

Questo la rende utile per un paio di cose:

  • Visualizzare la forma complessiva di una distribuzione senza bias dovuto alla dimensione dei bin
  • Rilevare pattern come multipli picchi, asimmetria o code pesanti
  • Confrontare distribuzioni tra gruppi nello stesso grafico
  • Ottenere una visione più pulita dei dati prima della modellazione

Intuizione alla base della KDE

Prendi ogni punto dati e ci sovrapponi una piccola curva liscia. Quella curva si chiama kernel. Poi sommi tutte queste curve individuali in una sola.

Ottieni una singola curva liscia che mostra la densità dei tuoi dati. Dove i punti si raggruppano, più kernel si sovrappongono e si sommano, quindi la curva sale. Dove i dati sono radi, i kernel si sovrappongono appena e la curva resta bassa. Ogni punto contribuisce allo stesso modo alla stima finale.

Immagina di aver registrato i voti finali di una classe. Invece di suddividerli in un istogramma, la KDE piazza una piccola curva liscia su ogni voto. Dove i voti si concentrano — diciamo, intorno a 70-75 — le curve si sommano e la stima sale. Uno studente che ha preso 95 aggiunge solo un piccolo rigonfiamento in coda.

L’immagine qui sotto mostra proprio questo. La maggior parte degli studenti ha preso un voto vicino alla media e uno studente ha preso molto di più:

KDE visualizzata

KDE visualizzata

Formula della stima della densità con kernel

La formula della KDE sembra più intimidatoria di quanto sia in realtà.

Formula della KDE

Ecco cosa significa ogni parte:

  • n è il numero di punti dati

  • x_i sono i singoli punti dati nel tuo dataset

  • K è la funzione kernel — la curva liscia posta su ciascun punto

  • h è la larghezza di banda — controlla quanto è larga ciascuna funzione kernel

  • x è il punto in cui stai valutando la densità

In parole semplici, la formula dice: per qualsiasi punto x, guarda quanto è vicino ogni punto dati x_i, pesa quella vicinanza usando la funzione kernel K e fai la media del risultato su tutti i n punti. Ripeti per ogni x lungo l’intervallo e ottieni l’intera curva di densità.

La larghezza di banda h sta al denominatore della frazione dentro K. Un h più piccolo rende il kernel più stretto, quindi solo i punti molto vicini influenzano la stima. Un h più grande ne allarga l’influenza. Ne parleremo meglio più avanti nell’articolo.

Cos’è una funzione kernel?

Il kernel è la curva liscia che poni su ciascun punto dati. Definisce come l’influenza di quel punto si diffonde verso i vicini.

Ogni kernel è centrato su un punto dati e assegna pesi in base alla distanza. I punti vicini al centro hanno peso alto. Quelli lontani hanno peso basso o nullo. La forma esatta di quel peso dipende dal kernel che scegli.

Ci sono tre scelte comuni:

  • Gaussiano: la curva a campana. Assegna peso a ogni punto del dataset e l’influenza diminuisce con la distanza. È il default nella maggior parte delle librerie e funziona bene nella pratica
  • Uniforme: un rettangolo piatto. Ogni punto entro una distanza fissa ha lo stesso peso e tutto ciò che è fuori non conta. Semplice, ma produce stime meno lisce
  • Epanechnikov: una forma parabolica ottimale dal punto di vista dell’errore quadratico medio. È più efficiente del Gaussiano ma raramente fa una differenza visibile in pratica.

Nella maggior parte dei casi, la scelta del kernel conta poco. Due kernel diversi applicati agli stessi dati con la stessa larghezza di banda produrranno curve quasi identiche. Ciò che conta molto di più è la larghezza di banda — ed è quello che vedremo ora.

Il ruolo della larghezza di banda nella KDE

La larghezza di banda è il singolo parametro che ha l’impatto maggiore sull’output della KDE, persino più della scelta del kernel.

Controlla quanto è larga ciascuna funzione kernel. Un kernel stretto trae influenza solo dai punti vicini. Un kernel ampio diffonde quell’influenza su un intervallo molto più grande. Il risultato è una curva che segue da vicino i dati oppure una che li leviga.

Larghezza di banda piccola

Una larghezza di banda piccola rende ogni kernel stretto e concentrato. La stima reagisce bruscamente a ogni punto dati, il che significa che coglie la struttura reale dei dati ma anche il rumore.

In pratica, questo appare come una curva frastagliata con molti piccoli picchi. Alcuni di quei picchi mostrano veri cluster nei dati. Altri sono solo artefatti dovuti a un’eccessiva mancanza di levigatura. È difficile capire quali siano quali, ed è questo il problema.

KDE con larghezza di banda piccola

KDE con larghezza di banda piccola

Larghezza di banda grande

Una larghezza di banda grande allarga ogni kernel. I kernel vicini si sovrappongono e la curva finale risulta liscia.

Se diventa troppo liscia, inizi a perdere struttura reale. Due cluster distinti possono fondersi in un’unica curva. Una distribuzione con coda pesante può sembrare simmetrica. La rappresentazione visiva potrebbe nasconderti delle cose.

KDE con larghezza di banda grande

KDE con larghezza di banda grande

Trovare la giusta larghezza di banda

Non esiste una larghezza di banda universalmente corretta. L’obiettivo è trovare un valore abbastanza liscio da filtrare il rumore ma non così liscio da cancellare pattern reali.

La maggior parte delle librerie lo fa con metodi automatici di selezione della larghezza di banda. La regola del pollice di Silverman è la più comune. Sceglie una larghezza di banda in base alla dimensione del campione e alla deviazione standard dei dati. Funziona bene per distribuzioni approssimativamente normali ma può levigare troppo quelle multimodali.

Se non sei sicuro, prova un paio di valori di larghezza di banda e confronta le curve. Le differenze ti diranno molto sui tuoi dati.

KDE vs. istogramma

Sia gli istogrammi che la KDE mostrano la distribuzione dei tuoi dati — ma lo fanno in modo molto diverso.

Istogramma

Un istogramma divide i dati in bin discreti e conta quanti punti cadono in ciascuno. È veloce, intuitivo e facile da spiegare a un pubblico non tecnico.

Il problema è la sensibilità ai bin. Se cambi il numero di bin, cambia la forma. Non c’è un conteggio dei bin oggettivamente corretto, il che significa che due persone possono guardare gli stessi dati e trarre conclusioni diverse solo per quella scelta.

Gli istogrammi producono anche una forma a gradini, discontinua. Va bene per un’occhiata rapida, ma può offuscare la vera distribuzione sottostante.

KDE

La KDE ti dà una curva liscia e continua senza coinvolgere bin. È migliore nel rivelare la forma reale di una distribuzione — cose come asimmetrie, multipli picchi o code pesanti che un istogramma potrebbe mancare o rappresentare male a seconda della scelta dei bin.

Il compromesso è che la KDE introduce un proprio parametro — la larghezza di banda — e richiede più calcolo. È anche meno intuitiva da spiegare, dato che l’asse y mostra la densità di probabilità, non i conteggi, il che può confondere chi non ha familiarità col concetto.

Quando usare l’uno o l’altra

Usa un istogramma quando ti serve un riassunto rapido e interpretabile dei tuoi dati o quando il tuo pubblico non conosce le stime di densità. Usa la KDE quando conta la forma della distribuzione — ad esempio, quando confronti gruppi o cerchi di rilevare più modi nei dati.

Istogramma rispetto a KDE

Istogramma rispetto a KDE

In pratica, spesso si usano insieme: un istogramma per i conteggi e una curva KDE sovrapposta per la forma.

Stima della densità con kernel in Python

Python offre un paio di modi per calcolare e tracciare la KDE, a seconda che ti serva un grafico veloce o più controllo sulla stima stessa.

Visualizzare la KDE con seaborn

Il modo più rapido per ottenere un grafico KDE è seaborn.kdeplot(). Ecco tutto ciò che serve:

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 con seaborn

KDE con seaborn

Il parametro bw_adjust ridimensiona la larghezza di banda selezionata automaticamente. Valori sotto 1 stringono la curva, valori sopra 1 la rendono più liscia. È un moltiplicatore sopra qualunque larghezza di banda scelta internamente da seaborn, quindi non devi impostare tu stesso un valore grezzo.

L’asse y mostra la densità di probabilità, non i conteggi. La curva ti dice quanto è probabile un valore rispetto al resto della distribuzione. Più in alto significa più dati concentrati lì.

Calcolare la KDE con scipy

Se ti servono i valori di densità reali — non solo un grafico — usa scipy.stats.gaussian_kde. Questo ti dà un oggetto richiamabile che puoi valutare in qualsiasi punto.

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 la regola di Scott per scegliere automaticamente la larghezza di banda. È un buon default nella maggior parte dei casi. Puoi anche passare uno scalare per impostarla manualmente.

KDE con scipy e matplotlib

KDE con scipy e matplotlib

Stima della densità con kernel in R

In R, la KDE è integrata nel linguaggio base. Non servono pacchetti aggiuntivi.

Calcolare la KDE con density()

La funzione density() prende un vettore numerico e restituisce un oggetto KDE.

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

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

L’argomento bw controlla la selezione della larghezza di banda. "SJ" usa il metodo di Sheather-Jones, che gestisce meglio le distribuzioni multimodali rispetto al default. Puoi anche passare un valore numerico per impostarla manualmente.

Il risultato è un oggetto lista con due componenti chiave:

  • kde$x: la sequenza di punti in cui è stata valutata la densità
  • kde$y: i corrispondenti valori di densità

Tracciare la curva

Passa semplicemente il risultato direttamente a plot().

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

KDE tracciata in R

Per sovrapporre la KDE a un istogramma, usa prima hist() con freq = FALSE, poi aggiungi la curva con lines().

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

Istogramma con KDE in R

freq = FALSE ridimensiona l’istogramma a densità così che barre e curva condividano lo stesso asse y.

Vantaggi e limiti della KDE

La KDE è davvero una visualizzazione utile, ma come ogni cosa comporta compromessi da conoscere prima di usarla al posto degli istogrammi.

Vantaggi

Il suo punto di forza è che la KDE non fa assunzioni sulla distribuzione dei tuoi dati. Non devi decidere a priori se i dati sono normali, esponenziali o altro. La forma deriva dai dati stessi, il che rende la KDE abbastanza flessibile da gestire distribuzioni multimodali e tutto ciò che non si adatta a una forma parametrica standard.

L’output è anche una curva liscia e continua invece di un’approssimazione a gradini. Questo rende più facile individuare pattern — come multipli picchi o code lunghe — che un istogramma potrebbe nascondere a seconda della scelta dei bin.

E poiché la KDE lavora sui dati grezzi senza richiedere di adattare prima un modello, è un buon primo passo in qualsiasi analisi esplorativa.

Limiti

La selezione della larghezza di banda è la principale debolezza. Se la sbagli, la stima insegue il rumore oppure leviga troppo e cancella pattern reali nei dati. Metodi automatici come la regola di Silverman funzionano bene per dati approssimativamente normali, ma possono trarre in inganno con distribuzioni complesse. Spesso è bene verificare manualmente un paio di valori prima di fidarsi del risultato.

Le prestazioni possono diventare un problema su larga scala. La KDE valuta una funzione kernel per ogni punto dati a ogni posizione di valutazione, il che significa che il calcolo cresce rapidamente all’aumentare del dataset. Per la maggior parte del lavoro esplorativo non è un problema, ma può essere lento con centinaia di migliaia di punti.

Gli effetti di bordo sono un problema più sottile. La KDE standard assume che i dati possano estendersi all’infinito in entrambe le direzioni. Quando i tuoi dati hanno un limite rigido — come valori che non possono andare sotto zero — la stima “perde” massa di probabilità oltre quel limite, producendo una curva artificialmente bassa vicino al bordo. Esistono versioni con correzione di bordo, ma sono meno comuni nelle librerie standard.

Conclusione

La KDE offre un modo più pulito di osservare la distribuzione dei tuoi dati rispetto agli istogrammi. Niente scelte sui bin e niente assunzioni parametriche — solo una curva liscia che mostra cosa c’è davvero nel tuo dataset.

La larghezza di banda è l’unico parametro che conta davvero. Prova un paio di valori, confronta le curve, usa le opzioni automatiche e assicurati che la stima sia coerente con ciò che sai dei tuoi dati prima di trarne conclusioni.

Il modo migliore per costruire intuizione sulla KDE è applicarla a dati reali. Scegli un dataset che conosci già, applica la KDE e confrontala con un istogramma per vedere cosa ti stavi perdendo.

Ti interessa la visualizzazione dei dati? Dai un’occhiata al nostro corso su Data Visualization with Seaborn se usi Python, oppure Data Visualization with ggplot2 se usi R.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Senior Data Scientist con base in Croazia. Top Tech Writer con oltre 700 articoli pubblicati, per più di 10 milioni di visualizzazioni. Autore del libro Machine Learning Automation with TPOT.

FAQ

A cosa serve la stima della densità con kernel?

La KDE si usa per stimare la distribuzione di probabilità di un dataset senza assumere che segua una forma specifica come la normale o l’esponenziale. È comune nell’analisi esplorativa, quando vuoi visualizzare come sono distribuiti i dati prima di modellarli. La trovi anche nel rilevamento di anomalie, nel confronto di distribuzioni tra gruppi e come passaggio di levigatura in pipeline statistiche.

In cosa la KDE è diversa da un istogramma?

Un istogramma suddivide i dati in bin discreti e conta quanti punti cadono in ciascuno. La forma che ottieni dipende da quanti bin scegli, il che lo rende sensibile a un parametro arbitrario. La KDE evita questo piazzando una curva liscia su ogni punto dati e sommandole, fornendo una stima continua che non cambia in base al numero di bin.

Serve un dataset grande per usare la KDE?

La KDE funziona anche con dataset piccoli, ma le stime sono meno affidabili quando hai pochissimi punti. Con pochi dati, le singole osservazioni hanno un’influenza grande sulla curva finale, rendendo più difficile separare la struttura reale dal rumore. Man mano che il dataset cresce, la stima si stabilizza e riflette più accuratamente la distribuzione reale.

Cosa succede se scegli la larghezza di banda sbagliata?

Una larghezza di banda troppo piccola produce una curva frastagliata che reagisce a ogni singolo punto, rendendo difficile vedere la forma complessiva dei dati. Una larghezza di banda troppo grande leviga eccessivamente la stima e può fondere picchi distinti in un’unica gobba, nascondendo strutture reali. La maggior parte delle librerie offre metodi automatici come la regola di Silverman come punto di partenza, ma è buona pratica testare manualmente un paio di valori prima di trarre conclusioni.

La KDE funziona bene vicino ai limiti dei dati?

La KDE standard assume che i dati possano estendersi all’infinito in entrambe le direzioni, il che causa problemi quando la variabile ha un limite inferiore o superiore rigido — come età, reddito o qualsiasi conteggio che non può scendere sotto zero. Vicino a questi limiti, la stima perde massa di probabilità fuori dall’intervallo valido, rendendo la curva artificialmente bassa ai bordi. Esistono metodi di KDE con correzione di bordo per gestire questo aspetto, ma non sono disponibili in tutte le librerie e richiedono configurazione aggiuntiva.

Argomenti

Impara con DataCamp

Corso

Support Vector Machines in R

4 h
11K
Questo corso ti farà conoscere le macchine a vettori di supporto (SVM) in modo facile da capire, usando immagini e grafici.
Vedi dettagliRight Arrow
Inizia il corso
Mostra altroRight Arrow