mercoledì 25 dicembre 2019

Come stabilire il giusto numero di cifre significative

Per le cifre significative va ricordato che:
→ gli zero prima dei numeri diversi da zero non fanno parte delle cifre significative, quindi 0.0193 ha tre cifre significative;
→ gli zero dopo i numeri diversi da zero fanno parte delle cifre significative, quindi 0.30 ha due cifre significative;
→ il numero di cifre significative dipende dall'errore del processo di misura.

Si supponga che una serie di misure abbiano media = 9.37652, deviazione standard = 0.10835 ed errore standard = 0.004203. Dall'errore standard si ricava che le misure effettuate presentano una incertezza a livello della terza cifra decimale (0.004203), dovuta all'errore del processo di misura. In questo caso non avrebbe senso riportare la media e la deviazione standard con più di tre cifre decimali: la media 9.37652 deve essere arrotondata e riportata come 9.376 e la deviazione standard 0.10835 deve essere arrotondata e riportata come 0.108 e il risultato sarà quindi espresso come 9.376 ± 0.108 (media ± deviazione standard) o come 9.376 ± 0.004 (media ± errore standard).

Se non si conosce l'errore standard in genere si esprime la deviazione standard con due cifre significative. Così avendo ottenuto ad esempio una media = 1.34648 e una deviazione standard = 0.10295 quest'ultima va riportata come 0.10 con due cifre significative e il risultato sarà quindi espresso, arrotondando anche la media a due decimali, come 1.35 ± 0.11 (media ± deviazione standard).

Per effettuare l'arrotondamento si può procedere seguendo quanto riportato nel post Come arrotondare i numeri.

domenica 1 dicembre 2019

Inserire più grafici nella stessa immagine

Vediamo come sia possibile disporre in vari modi più grafici all'interno di una stessa immagine impiegando una sola riga di codice.

Per farlo ci serviamo delle funzioni par()layout() e matrix() [1] impiegando come esempi alcuni grafici realizzati con la funzione boxplot() [2].

Il codice impiega solamente le funzioni grafiche di base di RI dati sono contenuti nella tabella ais del pacchetto DAAG - accertatevi di avere installato il pacchetto o in alternativa procedete come indicato in [3].

Copiate lo script che segue, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,2)) # quattro grafici in due righe per due colonne
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori dell'altezza aggregati per sesso
#
boxplot(ais$bmi~ais$sex, xlab="Sesso", ylab="BMI in kg/m2", notch=TRUE, col="green") # [3] valori dell'indice di massa coroporea (BMI) aggregati per sesso
#
boxplot(ais$pcBfat~ais$sex, xlab="Sesso", ylab="Grasso corporeo in %", notch=TRUE, col="yellow") # [4] valori della percentuale di grasso corporeo aggregati per sesso
#

In questo primo script con par(mfrow=c(2,2)) è stata predisposta la suddivisione della finestra grafica in 2 righe per 2 colonne, quindi in quattro quadranti,

1
2
3
4

nei quali sono inseriti, procedendo da sinistra verso destra e dall'alto verso il basso, i quattro grafici realizzati con la funzione boxplot() sui dati separati per sesso (~ais$sex) della tabella ais - impiegando l'argomento notch=TRUE per riportare sui lati dei box le tacche (notch) o incisure che rappresentano i limiti di confidenza al 95% della mediana - con questo risultato.


Ora copiate lo script che segue, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(1,2)) # due grafici in una riga e due colonne
#
boxplot(ais$bmi~ais$sex, xlab="Sesso", ylab="BMI in kg/m2", notch=TRUE, col="green") # [1] boxplot per sesso dell'indice di massa corporea (BMI)
#
boxplot(ais$pcBfat~ais$sex, xlab="Sesso", ylab="Grasso corporeo in %", notch=TRUE, col="yellow") # [2] boxplot per sesso della percentuale di grasso corporeo
#

In questo secondo script con par(mfrow=c(1,2)) è stata predisposta la suddivisione della finestra in 1 riga e 2 colonne


1

2

per realizzare due grafici affiancati, il primo sulla sinistra e il secondo sulla destra, con questo risultato.


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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,1)) # due grafici in una colonna e due righe
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [1] valori della percentuale di grasso corporeo aggregati per sport
#
boxplot(ais$wt~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Peso corporeo nei vari sport", xlab="Sport praticato", ylab="Peso corporeo in kg", notch=FALSE, col="yellow") # [2] valori del peso corporeo aggregati per sport
#

In questo caso con par(mfrow=c(2,1)) è stata predisposta la suddivisione della finestra in 2 righe e 1 colonna 
- riportando i boxplot in verticale (horizontal=FALSE), le etichette delle ascisse in verticale (las=2), riducendo la larghezza dei box (boxwex=0.4) e senza le incisure (notch=FALSEche rappresentano i limiti di confidenza al 95% della mediana - per posizionare i due grafici uno sopra l'altro in questo modo

1
2

con questo risultato.


Potete anche aumentare il numero delle righe e/o delle colonne, prestando ovviamente sempre molta attenzione alla leggibilità e alla fruibilità del risultato finale.

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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
layout(matrix(c(1,1,2,3), 2, 2, byrow=TRUE)) # tre grafici, il primo occupa riga 1/colonne 1 e 2, il secondo riga 2/colonna 1, il terzo riga 2/colonna 2
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [1] valori della percentuale di grasso corporeo aggregati per sport
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [2] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [3] valori di altezza aggregati per sesso
#

In questo caso vediamo come organizzare i grafici all'interno dell'immagine in maniera più articolata con layout(matrix(c(1,1,2,3), 2, 2, byrow=TRUE)). Viene infatti predisposta la suddivisione della finestra in 2 righe per 2 colonne (... 2, 2, ...) procedendo per riga (byrow=TRUE), ma specificando con il primo argomento c(1,1,2,3) che il primo grafico occuperà riga 1/colonne 1 e 2, il secondo grafico occuperà riga 2/colonna 1 e il terzo grafico occuperà riga 2/colonna 2, con questa logica

1     1
2
3

e questo risultato.



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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
layout(matrix(c(1,3,2,3), 2, 2, byrow=TRUE)) # (4) tre grafici, il primo occupa riga 1/colonna 1, il secondo riga 2/colonna 1, il terzo righe 1 e 2/colonna 2
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori di altezza aggregati per sesso
#
boxplot(ais$pcBfat~ais$sport, horizontal=TRUE, boxwex=0.4, cex.axis=0.8, las=1, xlab="Grasso corporeo in %", ylab="Sport praticato", notch=FALSE, col="yellow") # [3] valori della percentuale di grasso corporeo aggregati per sport
#

In questo script con layout(matrix(c(1,3,2,3), 2, 2, byrow=TRUE)) è stata predisposta di nuovo la suddivisione della finestra in 2 righe per 2 colonne (... 2, 2, ...) procedendo per riga (byrow=TRUE), ma questa volta specificando con il primo argomento c(1,3,2,3) che il primo grafico occuperà riga 1/colonna 1, il secondo grafico occuperà riga 2/colonna 1 e il terzo grafico occuperà le righe 1 e 2 della colonna 2 
- con i boxplot in orizzontale (horizontal=TRUE) e le etichette delle ascisse in orizzontale (las=1) - con questa logica

1
3

3
2

 e con questo risultato.


Finora abbiamo visto come organizzare più grafici all'interno della finestra grafica standard. Ma potremmo volere ampliare la finestra grafica, come facciamo ora riprendendo l'esempio precedente.

Copiate quest'ultimo script, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
#
dev.new(width=45, height=15, unit="cm") # nuova dimensione della finestra grafica
layout(matrix(c(1,2,3), 1, 3, byrow=TRUE)) # tre grafici in 1 riga e 3 colonne 
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori di altezza aggregati per sesso
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [3] valori della percentuale di grasso corporeo aggregati per sport
#

Per specificare le nuove dimensioni della finestra grafica impieghiamo la funzione dev.new() che richiede semplicemente larghezza della finestra, altezza della finestra e unità di misura. Queste possono essere pollici (unit="in"), pixel (unit="px") o centimetri (unit="cm"), come facciamo noi definendo quindi una finestra molto ampia, di 45 centimetri di larghezza (width=) per 15 centimetri di altezza (height=).

La funzione layout(matrix(c(1,2,3), 1, 3, byrow=TRUE)) predispone la suddivisione della finestra in 1 riga per 3 colonne (... 1, 3, ...)
 procedendo per riga (byrow=TRUE) specificando con c(1,2,3) che vogliamo tre grafici affiancati, con questa logica

1

2

3


e con questo risultato:


Nel caso dei grafici generati con il pacchetto ggplot2 per disporre più grafici all'interno della stessa immagine è necessario impiegare la funzione grid.arrange() inclusa nel pacchetto gridExtra [4]: per esempi di applicazione di questa funzione fate click su ggplot2 nelle Parole chiave oppure digitate ggplot o, ancor più selettivo, grid.arrange nella casella Cerca nel blog quindi fate click su Cerca.

Infine ricordo che impiegando l'utilità riportata nel post Salvare i grafici di R in un file potete salvare le immagini realizzate con R sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per poterle stampare, archiviare, inserire in una pubblicazione, in un post o in un sito web.


----------

[1] Digitate help(nomedellafunzione) nella Console di R per consultare la documentazione delle funzioni.

[2] La funzione boxplot() è illustrata nel post Grafici a scatola con i baffi (boxplot).

[3] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza impiegare il pacchetto DAAG

[4] Il manuale di riferimento Package ‘gridExtra’ lo trovate facendo click sul link alla voce Reference manual nella pagina di documentazione del pacchetto. URL consultato il 03/12/2022.


giovedì 3 ottobre 2019

Analisi dei gruppi (clustering gerarchico e non gerarchico)

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, ed 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 [1];
metodi agglomerativi (o metodi bottom-up) 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 divisivi (o metodi top-down) 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. 

Da notare infine che non esiste una regola per stabilire il numero di cluster in cui sono aggregati gli oggetti, che va deciso caso per caso, cosa che complica ulteriormente lo scenario.

Per una trattazione completa dei diversi metodi di clustering, tutti metodi esclusivi tranne i metodi fuzzy, rimando ai post:
 Analisi dei gruppi (clustering gerarchico) [include il confronto tra dendrogrammi]
→ Analisi dei gruppi (clustering non gerarchico) [include metodi agglomerativi e metodi divisivi]

Qui riporto una breve sintesi con i due metodi più frequentemente impiegati, e capostipiti delle due alternative più tradizionali nel campo del clustering, entrambi metodi esclusivi:
→ il metodo di Ward, un metodo gerarchico che misura la somiglianza di due oggetti/punti sulla base della loro distanza euclidea;
→ il metodo di MacQueen, un metodo non gerarchico che misura l'appartenenza di un oggetto/punto ad uno specifico cluster con l'algoritmo delle k-means.

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 cluster [3]. Copiate questo script, incollatelo nella Console di R e premete ↵ Invio:

# ANALISI DEI GRUPPI (CLUSTERING GERARCHICO E NON GERARCHICO)
#
mydata <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
z <- scale(mydata) # standardizza le variabili
cbind(mydata, z) # mostra i dati originali e i rispettivi valori z
#
# clustering gerarchico con il metodo di Ward (distanza euclidea)
#
mat <- hclust(dist(z, method="euclidean"), method="ward.D") # genera la matrice delle distanze euclidee e costruisce i cluster
plot(mat, main="Dendrogramma", xlab="BMI nei Paesi europei", sub="", ylab="Distanza nei valori di BMI dei cluster", cex=0.7) # traccia il dendrogramma
rect.hclust(mat, k=4, border=c("red","blue","green","goldenrod")) # evidenzia i 4 gruppi/cluster
#
# clustering non gerarchico con il metodo di MacQueen (k-means )
#
library(cluster) # carica il pacchetto
windows() # apre e inizializza una nuova finestra grafica
myclust <- kmeans(z, 4, algorithm = c("MacQueen"), nstart=50) # genera i 4 gruppi/cluster
clusplot(z, myclust$cluster, color=TRUE, col.clus=c("blue", "goldenrod", "red", "green"), shade=FALSE, labels=3, lines=0, sub="", main="Grafico dei cluster", xlab="Componente principale 1", ylab="Componente principale 2", cex=0.6, col.txt="black", col.p="black") # traccia il grafico dei cluster per le prime due componenti principali
#

Con la prima riga di codice sono importati i dati nell'oggetto mydata.

Con la funzione scale() della seconda riga per ciascun dato viene calcolata la deviata normale standardizzata z. In pratica questa funzione prima calcola per i dati di ciascuna colonna/variabile la media e la deviazione standard, poi calcola per ciascuno datola corrispondente deviata normale standardizzata z come

z = (x – media) / deviazione standard

I valori disono poi salvati nel nuovo oggetto qui denominato, per comodità mnemonica, z.

Nella terza riga infine i dati originali e i corrispondenti valori di deviata normale standardizzata z sono mostrati insieme, combinati con la funzione cbind().

Dopo questi preliminari si passa al clustering gerarchico con il metodo di Ward con la funzione hclust() [5] e due soli argomenti:
 il primo è costituito dalla matrice delle distanze calcolata con la funzione dist() sui dati standardizzati z impiegando per il calcolo delle distanze il metodo di euclideo (method="euclidean"), che prevede di misurare la distanza tra due punti con il teorema di Pitagora. I metodi che si possono impiegare in alternativa includono: "euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski" [6];
→ il secondo è l'argomento method=ward.D che specifica come costruire i cluster, e può assumere in alternativa uno dei seguenti valori: "ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC), "centroid" (= UPGMC).

A partire dalla matrice delle distanze euclidee salvata nell'oggetto mat, con la funzione plot() viene tracciato il dendrogramma e con la funzione rect.hclust() e l'argomento k= viene stabilito in 4 il numero dei gruppi da evidenziare nel dendrogramma.


Per il clustering non gerarchico con il metodo di MacQueen dopo avere caricato il pacchetto cluster e aperto una nuova finestra grafica con windows()impiegando la funzione kmeans() [7] viene generata la matrice delle distanze che viene salvata nell'oggetto myclust.

Viene poi impiegata per tracciare il grafico la funzione clusplot() nella quale si fanno notare i seguenti argomenti:
color=TRUE consente l'impiego dei colori nei dati riportati sul grafico;
col.clus nel quale la sequenza dei colori è stata adattata manualmente per avere gli stessi colori del dendrogramma;
shade che se posto =TRUE riporta all'interni dei cluster un tratteggio con una densità uguale al numero di punti inclusi nel cluster diviso per l'area dell'ellisse;
labels=3 che è uno dei possibili valori per le etichette da riportare (vederli con help(clusplot));
lines=0 che dice di non riportare le lineee che collegano i cluster;
sub="" che elimina il sottotitolo previsto di default dalla funzione;
cex=0.6 che riduce la dimensione dei caratteri dei nomi delle nazioni riportati all'interno dei cluster;
col.txt che definisce il colore del testo che compare all'interno dei cluster;
col.p che definisce il colore impiegato per rappresentare i punti all'interno dei cluster.

Da notare che se nella Console di R digitate

myclust$cluster

viene mostrato il vettore con l'elenco delle nazioni, ciascuna con il cluster cui appartiene

> myclust$cluster
        Austria          Belgio        Bulgaria           Cipro         Croazia 
              4               4               2               4               2 
      Danimarca         Estonia       Finlandia         Francia        Germania 
              4               3               2               4               2 
         Grecia         Irlanda        Lettonia        Lituania     Lussemburgo 
              2               2               3               2               4 
          Malta          Olanda         Polonia      Portogallo     Regno Unito 
              3               4               2               2               3 
Repubblica Ceca         Romania      Slovacchia        Slovenia          Spagna 
              2               1               2               2               2 
         Svezia        Ungheria 
              4               3 


Questo infine è il grafico dei cluster generati.


Per un confronto contenente anche il dettaglio numerico i dati originali forniti dall'Istat sono stati importati in un foglio elettronico nel quale sono stati ordinati e suddivisi manualmente impiegando i seguenti criteri:
→ è stato identificato un paese che si discosta in modo significativo da tutti gli altri essendo l'unico con una quota di obesi inferiore al 10% e l'unico con una quota di soggetti sovrappeso superiore al 40%;
→ sono stati raccolti in un unico gruppo i paesi con una percentuale di soggetti di peso normale superiore del 5% circa alla media dei restanti paesi, e precisamente superiore al 47%.
→ sono stati raggruppati insieme tutti i paesi rimanenti, distinguendo tra quelli con una quota di obesi uguale o superiore al 10% e inferiore al 20% e quelli con una quota di obesi uguale o superiore al 20% e inferiore al 30%. 

Dalla tabella così costruita, che riconduce i risultati del clustering ai dati originari, risulta evidente che nel cluster rosso predomina il peso normale, nel cluster blu è dominante la categoria obeso, nel cluster giallo è dominante la presenza di sovrappeso, mentre un caso a sé stante è quello della Romania, con valori estremi sia nel sovrappeso (percentuale di casi molto elevata) sia nell'obeso (percentuale di casi molto bassa).


Questa analisi, semplice ma di buon senso, coincide con quella fornita dai due metodi di clustering, a parte il fatto che il metodo di MacQueen include Svezia e Olanda nel cluster normale cerchiato in rosso     mentre il metodo di Ward li include nel cluster sovrappeso cerchiato in giallo    .

In conclusione vale la pena di notare alcune cose:
→ la standardizzazione, intesa come trasformazione dei dati nelle corrispondenti deviate normali standardizzate è d'obbligo per  i metodi non gerarchici mentre per i metodi gerarchici potrebbe non essere necessaria - ma lo potrebbe essere in alcuni casi. Questo però apre un tema che va al di la dei limiti di questo post: qui è stata impiegata la standardizzazione, che personalmente ritengo opportuno eseguire sempre;
→ metodi di clustering che impiegano differenti criteri per il raggruppamento dei dati possono fornire risultati diversi;
→ la presenza di oggetti a cavallo tra due cluster (come qui accade per Svezia e Olanda) potrebbe deporre a favore dell'impiego del clustering con metodi non esclusivi (fuzzy) 
[8] assegnando gli oggetti contemporaneamente a tutti i cluster in modo quantitativamente diverso;
non esiste una "regola aurea" per stabilire il numero di cluster in cui aggregare gli oggetti;
→ anche se matematicamente definito, quindi esente da arbitrarietà, qualsiasi metodo di classificazione risente degli assunti che inevitabilmente devono essere posti alla sua base;
→ nel caso di dati non eccessivamente complessi una loro attenta disamina effettuata mediante strumenti tradizionali può essere di aiuto nella interpretazione dei risultati del clustering.


----------

[1] Massart DL, Vandeginste BGM, Deming SN, Michotte Y, Kaufman L. Chemometrics: a textbook. Elsevier, New York, 1988, ISBN 0-444-42660-4, pp. 371-384.

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

[3] Vedere il manuale di riferimento del pacchetto Package 'cluster'. URL consultato il 27/09/2019: http://bit.ly/2neaTna

[4] Digitate help(scale) nella Console di R per la documentazione della funzione scale().

[5] Digitate help(hclust) nella Console di R per la documentazione della funzione hclust().

[6] Digitate help(dist) nella Console di R per vedere la documentazione della funzione dist().

[7] Digitate help(kmeans) nella Console di R per vedere il significato degli argomenti impiegati.