lunedì 3 ottobre 2022

Analisi dei gruppi (clustering non esclusivo)

L'obiettivo dell'analisi dei gruppi (cluster analysis o clustering) è concettualmente semplice: verificare la possibile esistenza, in un insieme di oggetti, di sottoinsiemi di oggetti particolarmente simili tra loro (gruppi/cluster).

L'analisi dei gruppi si applica a dati multivariati ed è un metodo statistico di tassonomia numerica che riveste un ruolo importante nella analisi esplorativa dei dati.

Nonostante alla base dell'analisi dei gruppi vi sia un'idea semplice e logica, vi sono numerosi modi per realizzarla [1], qui ci occupiamo dell'implementazione del clustering non escusivo con metodi fuzzy nelle due versioni:
→ clustering con il metodo di Bezdek (fuzzy c-means);
→ clustering con il pacchetto 'fclust' (fuzzy clustering con algoritmi alternativi).

Come dati impieghiamo i valori di BMI (indice di massa corporea) rilevati a livello europeo alcuni anni fa e pubblicati dall'Istat [2].

Per proseguire è necessario:
→ effettuare il download del file di dati bmi.csv
→ salvare il file nella cartella C:\Rdati\

Per il file di dati trovate link e modalità di download alla pagina Dati, ma potete anche semplicemente copiare i dati riportati qui sotto aggiungendo un ↵ Invio al termine dell'ultima riga e salvarli in C:\Rdati\ in un file di testo denominato bmi.csv (assicuratevi che il file sia effettivamente salvato con l'estensione .csv).

Nazione;sottopeso;normale;sovrappeso;obeso
Austria;2.4;49.6;33.3;14.7
Belgio;2.7;48.0;35.3;14.0
Bulgaria;2.2;43.8;39.2;14.8
Cipro;3.9;47.8;33.8;14.5
Croazia;1.9;40.7;38.7;18.7
Danimarca;2.2;50.0;32.9;14.9
Estonia;2.2;43.9;33.5;20.4
Finlandia;1.2;44.1;36.4;18.3
Francia;3.2;49.6;31.9;15.3
Germania;1.8;46.1;35.2;16.9
Grecia;1.9;41.3;39.4;17.3
Irlanda;1.9;42.3;37.0;18.7
Lettonia;1.7;41.8;35.2;21.3
Lituania;1.9;42.5;38.3;17.3
Lussemburgo;2.8;49.3;32.4;15.6
Malta;2.0;37.0;35.0;26.0
Olanda;1.6;49.0;36.0;13.3
Polonia;2.4;42.9;37.5;17.2
Portogallo;1.8;44.6;36.9;16.6
Regno Unito;2.1;42.2;35.6;20.1
Repubblica Ceca;1.1;42.1;37.6;19.3
Romania;1.3;42.9;46.4;9.4
Slovacchia;2.1;43.6;38.0;16.3
Slovenia;1.6;41.8;37.4;19.2
Spagna;2.2;45.4;35.7;16.7
Svezia;1.8;48.3;35.9;14.0
Ungheria;2.9;41.9;34.0;21.2

Inoltre è necessario scaricare dal CRAN il pacchetto aggiuntivo ppclust [3] e il pacchetto aggiuntivo fclust [4]. 

Per capire meglio il fuzzy clustering dotiamoci di una tabella di riferimento costruita manualmente, nella quale è stata le Nazioni sono state raggruppate, secondo un minimo di criteri, in quattro gruppi:
→ in un primo gruppo (colore rosso) sono state riportate le Nazioni in cui prevalgono i soggetti con peso normale (oltre il 47%);
→ in un secondo gruppo (colore blu) sono state riportate le Nazioni caratterizzate dalla presenza di una percentuale elevata di soggetti obesi (oltre il 20%);
→ è stata evidenziata (colore verde) una Nazione che si differenzia nettamente dalla altre per la percentuale particolarmente elevata di soggetti con sovrappeso (46.4%) e particolarmente ridotta di obesi (9.4%); 
→ infine sono state lasciate nello stesso gruppo (colore giallo) le rimanenti Nazioni, che hanno una percentuale di soggetti con peso normale inferiore al primo gruppo, una percentuale di obesi inferiore al secondo gruppo e una percentuale di sovrappeso mediamente elevata.


Vediamo ora il fuzzy clustering con il metodo di Bezdek (fuzzy c-means).

Copiate questo script, incollatelo nella Console di R e premete ↵ Invio:

# CLUSTERING NON ESCLUSIVO (FUZZY) con il metodo di Bezdek (fuzzy c-means)
#  
library(ppclust) # carica il pacchetto
mydata <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
#
fuzzy <- fcm(mydata, centers=4) # calcola le percentuali di appartenenza dei dati ai 4 cluster
clunes <- cbind(fuzzy$u, fuzzy$cluster) # combina dati originali e cluster più rappresentativo
clunes[order(clunes[,5]),] # mostra la tabella ordinata per cluster 
#

Con prima cosa viene caricato il pacchetto ppclust, quindi i dati sono importati in mydata

Il fuzzy clustering viene effettuato impiegando la funzione fcm() (da fuzzy c-means), che ha come unici argomenti i dati (mydata) e il numero (4) dei cluster in cui suddividere i dati.

Dall'oggetto fuzzy che contiene i dati del fuzzy clustering sono estratti i dati originali (fuzzy$u) e, per ciascun dato, il cluster cui corrisponde la percentuale di appartenenza più elevata (fuzzy$cluster), che con la funzione cbind() sono combinati in un'unica tabella denominata clunes da clustering non esclusivo.

Con l'ultima riga di codice la tabella clunes viene ordinata per numero del cluster di appartenenza (colonna numero [,5]), con questo risultato:

> clunes[order(clunes[,5]),] # mostra la tabella ordinata per cluster 
                  Cluster 1  Cluster 2   Cluster 3   Cluster 4  
Estonia         0.667634277 0.11252359 0.149410982 0.070431153 1
Lettonia        0.958266772 0.01095656 0.026474715 0.004301955 1
Malta           0.491021069 0.15624358 0.264287496 0.088447851 1
Regno Unito     0.790353366 0.05102544 0.143114367 0.015506822 1
Ungheria        0.914138562 0.02579834 0.047401053 0.012662047 1
Bulgaria        0.047573779 0.73911039 0.159914511 0.053401319 2
Finlandia       0.174433173 0.38232277 0.382317053 0.060927001 2
Germania        0.131783981 0.39538759 0.171854699 0.300973735 2
Polonia         0.055772389 0.49224613 0.429183994 0.022797491 2
Portogallo      0.035927962 0.82921903 0.099909121 0.034943891 2
Romania         0.161443930 0.35907319 0.283259904 0.196222972 2
Slovacchia      0.006818789 0.95511365 0.033080423 0.004987139 2
Spagna          0.111429023 0.53373933 0.177822943 0.177008704 2
Croazia         0.085407339 0.10214244 0.795057675 0.017392545 3
Grecia          0.074338046 0.23144021 0.666957863 0.027263879 3
Irlanda         0.084041629 0.08650640 0.817102118 0.012349852 3
Lituania        0.042125460 0.28646014 0.655145014 0.016269381 3
Repubblica Ceca 0.090628501 0.07445451 0.822199171 0.012717815 3
Slovenia        0.078295256 0.05547535 0.856745593 0.009483801 3
Austria         0.008129413 0.01539587 0.008807597 0.967667119 4
Belgio          0.031551737 0.10068345 0.043130871 0.824633938 4
Cipro           0.030977486 0.06876469 0.035518430 0.864739392 4
Danimarca       0.020413065 0.03551855 0.021319185 0.922749201 4
Francia         0.042794189 0.06388769 0.040922110 0.852396008 4
Lussemburgo     0.031571890 0.04926516 0.030614865 0.888548086 4
Olanda          0.048915824 0.15009665 0.068931421 0.732056106 4
Svezia          0.045051649 0.15475022 0.064798888 0.735399244 4

Con un grado di appartenenza che va dal 73.2% al 96.7% le Nazioni che il fuzzy clustering codifica come prevalentemente appartenenti al cluster 4 trovano corripondenza nella tabella di riferimento riportata sopra:

                  Cluster 1  Cluster 2   Cluster 3   Cluster 4  
Austria         0.008129413 0.01539587 0.008807597 0.967667119 4
Belgio          0.031551737 0.10068345 0.043130871 0.824633938 4
Cipro           0.030977486 0.06876469 0.035518430 0.864739392 4
Danimarca       0.020413065 0.03551855 0.021319185 0.922749201 4
Francia         0.042794189 0.06388769 0.040922110 0.852396008 4
Lussemburgo     0.031571890 0.04926516 0.030614865 0.888548086 4
Olanda          0.048915824 0.15009665 0.068931421 0.732056106 4
Svezia          0.045051649 0.15475022 0.064798888 0.735399244 4

Una corrispondenza con la tabella di riferimento costruita manualmente la abbiamo anche per le Nazioni che il fuzzy clustering codifica come prevalentemente appartenenti al cluster 1 con percentuali che vanno dal 49.1% al 95.8%:

                  Cluster 1  Cluster 2   Cluster 3   Cluster 4  
Estonia         0.667634277 0.11252359 0.149410982 0.070431153 1
Lettonia        0.958266772 0.01095656 0.026474715 0.004301955 1
Malta           0.491021069 0.15624358 0.264287496 0.088447851 1
Regno Unito     0.790353366 0.05102544 0.143114367 0.015506822 1
Ungheria        0.914138562 0.02579834 0.047401053 0.012662047 1

I due rimananenti cluster raggruppano tutte le altra Nazioni: ma a questo punto potrebbe essere opinabile se sia meglio riportare in un unico cluster separato la Romania, oppure se sia preferibile decomporne l'appartenenza tra tutti i quattro cluster, come prevede il fuzzy clustering.

Da notare che quando si riesegue lo script la numerazione dei cluster può cambiare, senza tuttavia che cambino i valori percentuali di appartenenza ai vari cluster e il raggruppamento in base alla percentuale di appartenenza più elevata.

Un aiuto ulteriore nella valutazione dei risultati del fuzzy clustering ci può venire dal grafico del clustering non gerarchico con il metodo di MacQueen delle k-means, che mostra la Romania isolata nell'angolo inferiore sinistro del grafico: ma bisogna ricordare che si tratta di strategie di clustering differenti, e quindi l'interpretazione dei risultati deve essere condotta tenendo ben presente questo fatto.


Vediamo ora il clustering con il pacchetto 'fclust' (fuzzy clustering con algoritmi alternativi).

# CLUSTERING NON ESCLUSIVO (FUZZY) con il pacchetto "fclust"
#  
library(fclust) # carica il pacchetto
mydata <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
#
fuzzy <- Fclust(mydata, k=4) # calcola le percentuali di appartenenza dei dati a 4 cluster 
clunes <- cbind(fuzzy$U, fuzzy$clus[,1]) # unisce dati originali e cluster più rappresentativo
clunes[order(clunes[,5]),] # mostra la tabella ordinata per cluster
#

Rispetto allo script precedente qui di diverso ci sono solamente il pacchetto fclust, e la funzione impiegata per calcolare le percentuali di appartenenza dei dati a 4 cluster, che ora è la funzione Fclust() mentre il resto è identico.

> clunes[order(clunes[,5]),] # mostra la tabella ordinata per cluster
                    Clus 1      Clus 2      Clus 3      Clus 4  
Bulgaria        0.73911039 0.159914512 0.053401319 0.047573779 1
Finlandia       0.38232277 0.382317052 0.060927001 0.174433172 1
Germania        0.39538759 0.171854699 0.300973734 0.131783981 1
Polonia         0.49224613 0.429183994 0.022797491 0.055772389 1
Portogallo      0.82921903 0.099909121 0.034943891 0.035927961 1
Romania         0.35907319 0.283259904 0.196222972 0.161443930 1
Slovacchia      0.95511365 0.033080424 0.004987140 0.006818789 1
Spagna          0.53373933 0.177822942 0.177008704 0.111429022 1
Croazia         0.10214244 0.795057676 0.017392545 0.085407339 2
Grecia          0.23144021 0.666957864 0.027263879 0.074338046 2
Irlanda         0.08650640 0.817102117 0.012349852 0.084041629 2
Lituania        0.28646014 0.655145015 0.016269381 0.042125460 2
Repubblica Ceca 0.07445451 0.822199170 0.012717815 0.090628501 2
Slovenia        0.05547535 0.856745592 0.009483801 0.078295256 2
Austria         0.01539587 0.008807597 0.967667119 0.008129413 3
Belgio          0.10068345 0.043130871 0.824633938 0.031551737 3
Cipro           0.06876469 0.035518430 0.864739392 0.030977486 3
Danimarca       0.03551855 0.021319185 0.922749201 0.020413065 3
Francia         0.06388769 0.040922110 0.852396008 0.042794189 3
Lussemburgo     0.04926516 0.030614865 0.888548086 0.031571890 3
Olanda          0.15009665 0.068931421 0.732056105 0.048915824 3
Svezia          0.15475022 0.064798888 0.735399244 0.045051649 3
Estonia         0.11252359 0.149410982 0.070431153 0.667634277 4
Lettonia        0.01095656 0.026474715 0.004301955 0.958266772 4
Malta           0.15624358 0.264287496 0.088447851 0.491021069 4
Regno Unito     0.05102544 0.143114367 0.015506822 0.790353366 4
Ungheria        0.02579834 0.047401053 0.012662047 0.914138562 4

Da notare che di default la funzione Fclust() impiega lo stesso algoritmo della funzione fcm() dello script precedente, quindi vi sarà facile constatare che i risultati sono identici ai precedenti. Per gli algoritmi alternativi che è possibile impiegare si rimanda al manuale del pacchetto [4]. 

Conclusione: l'analisi dei gruppi con il clustering non esclusivo (fuzzy) non è commisurabile con quella fornita dai metodi esclusivi, in quanto per definizione decompone l'appartenenza di un oggetto in frazioni percentuali, tante quanti sono i cluster in cui si intende classificare i dati. Tuttavia è anche riconducibile ai metodi di clustering esclusivo quando si considera il cluster al quale l'oggetto appartiene maggiormente in percentuale. E questo duplice punto di vista sui dati, anziché fonte di perplessità, deve essere considerato una informazione utile nella fase di interpretazione dei risultati degli altri tipi di clustering.

Trovate il seguito e le strategie alternative di clustering e di analisi dei dati multivariati nei post:


----------

[1] Nonostante alla base dell'analisi dei gruppi vi sia un'idea semplice e logica, vi sono numerosi modi per realizzarla, infatti esistono:
→ metodi gerarchici, che danno luogo a una suddivisione ad albero (dendrogramma) in base alla distanza tra i singoli oggetti dell'insieme;
→ metodi non gerarchici, nei quali l'appartenenza di un oggetto (dell'insieme) ad uno specifico sottoinsieme/gruppo/cluster viene stabilita sulla base della sua distanza dal centro o dalla media dei dati o da un punto rappresentativo del cluster;
→ metodi bottom-up noti anche come metodi agglomerativi nei quali all'inizio del processo di classificazione ad ogni oggetto viene fatto corrispondere un cluster. In questo stadio gli oggetti sono considerati tutti dissimili tra di loro. Al passaggio successivo i due oggetti più simili sono raggruppati nello stesso cluster. Il numero dei cluster risulta quindi pari al numero di oggetti diminuito di uno. Il procedimento viene ripetuto ciclicamente, fino ad ottenere (all'ultimo passaggio) un unico cluster;
→ metodi top-down noti anche come metodi divisivi nei quali inizialmente tutti gli oggetti sono considerati come appartenenti ad un unico cluster, che viene via via suddiviso in cluster fino ad avere un numero di cluster uguale al numero degli oggetti;
→ metodi esclusivi, che prevedono che un oggetto possa appartenere esclusivamente a un cluster;
→ metodi non esclusivi (fuzzy) che prevedono che un oggetto possa appartenere, in modo quantitativamente diverso, a più di un cluster. 

[2] Vedere il post Indice di massa corporea (BMI).

[3] Trovate la documentazione nel manuale di riferimento del pacchetto: Package ‘ppclust’. URL consultato il 06/01/2023.

[4] Trovate la documentazione nel manuale di riferimento del pacchetto: Package ‘fclust’. URL consultato il 06/01/2023.

Nessun commento:

Posta un commento