% Esempio clustering con i dati della qualità della vita % Caricare dentro MATLAB i dati della qualità della vita delle province % Italiane (v. sezione sulle componenti principali). Dopo aver % opportunamente trasformato i dati costruire il dendrogramma utilizzando % il metodo del legame medio. % Visualizzare il dendrogramma aggiungendo i nomi delle righe. % Mostrare nel dendrogramma prima tutte le aggregazioni e poi le ultime 70 % aggregazioni (utilizzando l'opzione 'Orientation','left'). % Tagliare il dendrogramma al valore soglia di distanza 3.5 e attribuire % ogni unità (provincia) ad un determinato gruppo %% Interpretazione gruppi % La parte di seguito è dedicata all'interpretazione dei gruppi che sono % stati ottenuti % % Calcolare la distribuzione di frequenza dei gruppi che sono stati % ottenuti % Calcolare i centroidi dei gruppi (matrice delle medie aritmetiche % parziali riferite ai gruppi trovati) % Rappresentare graficamente i dati tramite un diagramma di dispersione in % cui i punti presentano un colore che dipende dal gruppo di appartenenza % (suggerimento: utilizzare la funzione gscatter) e aggiungere al grafico % le etichette del gruppo di appartenenza e del nome della provincia. % Aggiugnere al grafico i centroidi dei gruppi con riferimento alle % variabili in esame. % Costruire il diagramma di dispersione prima con riferimento alle % variabili 1 e 2 poi alle variabili 3 e 4 e successivamente alle variabili % 5 e 6. Interpretare i risultati ottenuti. % % Rappresentare i dati in termini di scatterplot matrix distinguendo per % gruppo di appartenenza % % Rappresentare in coordinate parallele le province utilizzando % un colore diverso in base al gruppo di appartenenza % Rappresentare in coordinate parallele i centroidi % % Effettuare la trasformzione in termini di componenti principali % Rappresentare gli scores (matrice ZV) delle prime due componenti % principali con le etichette delle province e centroidi dei gruppi % Osservazione: i centroidi dei gruppi devoon essere proiettati nello % spazio delle prime due componenti principali. % % Rappresentare gli score con gruppo % di appartenenza + centroidi dei gruppi % % Rappresentare gli score con etichetta del nome della provincia e gruppo % di appartenenza + centroidi dei gruppi %% Caricamento dati Xtable=readtable('benessere.xlsx','Sheet','X (database originale)','Range','A3:H106','ReadRowNames',true); % X = matrice di double senza nomi delle righe e nomi delle colonne X=table2array(Xtable); % varalbs = cell che contiene i nomi delle variabili varlabs=Xtable.Properties.VariableNames; rowlabs=Xtable.Properties.RowNames; [Z,mu,sigma]=zscore(X); % Osservazione: questa volta l'input di linkage è la matrice dei dati % (standardizzata) out=linkage(Z,'average'); dendrogram(out,'labels',rowlabs); % vengono mostrate per default solo le ultime 30 aggregazioni % Per mostrare tutte le aggregazioni dendrogram(out,0,'labels',rowlabs); % Per mostrare solo le ultime 70 aggregazioni dendrogram(out,70,'labels',rowlabs,'Orientation','left') cutoff=3.5; % Per mostrare solo le ultime 70 aggregazioni dendrogram(out,70,'labels',rowlabs,'Orientation','left','ColorThreshold',3.5) idx=cluster(out,'cutoff',cutoff,'Criterion','distance'); idxAndRowLabels=strcat(num2str(idx),'--',rowlabs); % Distribuzione di frequenze dei gruppi che sono stati trovati tabulate(idx) % Commento i gruppi 1, 2, 4 e 5 sono formati da una sola unità. Queste 4 % province sono da considerare valori anomali multivariati %% Calcolo dei centroidi (medie) per ogni gruppo % Table che contiene i centroidi dei gruppi che sono stati trovati % Xtablewithidx è una table che ha 8 colonna % L'ultima colonna contiene il gruppo di classificazione Xtablewithidx=Xtable; Xtablewithidx.idx=idx; nomicentroidi={'Milano','Siracusa','Gruppo3','Napoli','Roma','Gruppo6'}; centroidiT=grpstats(Xtablewithidx,'idx',{'mean'}); centroidiT.Properties.RowNames=nomicentroidi; % Le prime due colonne non interessano. Prendo solo le rimanenti centroidi=centroidiT{:,3:end}; %% Interpretazione dei gruppi che sono stati trovati tramite i diagrammi di dispersione i=1; j=2; figure gscatter(X(:,i),X(:,j),idx) text(X(:,i),X(:,j),idxAndRowLabels) xlabel(varlabs(i)) ylabel(varlabs(j)) hold('on') % Aggiungo i centroidi plot(centroidi(:,i),centroidi(:,j),'s','MarkerFaceColor','r','LineWidth',5) %% Plot variabili 3 e 4 figure i=3; j=4; gscatter(X(:,i),X(:,j),idx) text(X(:,i),X(:,j),idxAndRowLabels) xlabel(varlabs(i)) ylabel(varlabs(j)) hold('on') % Aggiungo i centroidi plot(centroidi(:,i),centroidi(:,j),'s','MarkerFaceColor','r','LineWidth',5) %% Plot variabili 5 e 6 figure i=5; j=6; gscatter(X(:,i),X(:,j),idx) text(X(:,i),X(:,j),idxAndRowLabels) xlabel(varlabs(i)) ylabel(varlabs(j)) hold('on') % Aggiungo i centroidi plot(centroidi(:,i),centroidi(:,j),'s','MarkerFaceColor','r','LineWidth',5) %% Rappresentazione tramite spmplot spmplot(Xtable,idx) %% Rappresentazione in coordinate parallele dei gruppi che sono stati trovati hold('off') parallelplot(Xtablewithidx,'GroupVariable','idx') %% Rappresentazione in coordinate parallele dei centroidi parallelplot(centroidiT(:,[1 3:end])); %% Calcolo delle componenti principali e rappresentazione dei centroidi nello spazio delle prime due PC PCAout=pcaFS(Xtable,'plots',0,'biplot',0,'dispresults',0); Y=PCAout.score; % Proietto i centroidi nello spazio delle prime due componenti principali % In altri termini applico ai centroidi le stesse trasformazioni che ho % applicato alla matrice X per ottenere le componenti principali % ossia standardizzo moltiplico per i primi due autovettori centroidiPCA=((centroidi-mu)./sigma)*PCAout.coeff; %% Rappresentazione degli score con etichette delle province e centroidi dei gruppi close all plot(Y(:,1),Y(:,2),'o') xlabel('Prima componente principale (Indice di povertà)'); ylabel('Seconda componente principale (Indice di malessere delle aziende)'); text(Y(:,1),Y(:,2),rowlabs) % Aggiungo l'asse x yline(0) % Aggiungo l'asse y xline(0) hold('on') plot(centroidiPCA(:,1),centroidiPCA(:,2),'s','MarkerFaceColor','r','LineWidth',5) %% Rappresentazione degli score + centroidi + gruppo di appartenenza close all plot(Y(:,1),Y(:,2),'o') xlabel('Prima componente principale (Indice di povertà)'); ylabel('Seconda componente principale (Indice di malessere delle aziende)'); text(Y(:,1),Y(:,2),num2str(idx)) % Aggiungo l'asse x yline(0) % Aggiungo l'asse y xline(0) hold('on') plot(centroidiPCA(:,1),centroidiPCA(:,2),'s','MarkerFaceColor','r','LineWidth',5) %% Rappresentazione degli score + centroidi + (gruppi di appartenenzae etichetta provincia) close all plot(Y(:,1),Y(:,2),'o') xlabel('Prima componente principale (Indice di povertà)'); ylabel('Seconda componente principale (Indice di malessere delle aziende)'); text(Y(:,1),Y(:,2),idxAndRowLabels) % Aggiungo l'asse x yline(0) % Aggiungo l'asse y xline(0) hold('on') plot(centroidiPCA(:,1),centroidiPCA(:,2),'s','MarkerFaceColor','r','LineWidth',5)