mercoledì 23 dicembre 2009

Standardizzazione e diamond chart

In questo post vediamo come creare un diamond plot, o diamond chart, o spider chart, o diagramma di Kiviat, ossia uno dei tanti metodi grafici per confrontare diversi parametri tra vari oggetti in studio. Per questo esempio, ho scelto di confrontare tra loro 3 diversi modelli di auto, ottenendo i dati dal sito gaadi.com. I 3 modelli che ho scelto sono:
- Fiat Grande Punto 1.4 Emotion Pack
- Lamborghini Gallardo Spyder Base
- Mercedes Benz SLK Class SLK 350

I parametri che andremo a confrontare invece sono:
- Kilometri per litro (Mileage)
- Capacità del serbatoio (FuelTank)
- Velocità massima (MaxSpeed)
- Cilindrata (Displacement)
- Potenza in cavalli (PowerPS)

Per ottenere il diamond plot che cerchiamo, installiamo e carichiamo la libreria plotrix. Qui sono disponibili due funzioni tra loro simili, sebbene richiedano due diverse sintassi. Cominciamo a studiare la funzione radial.plot().
Prima di procedere, però dobbiamo standardizzare i dati. La standardizzazione si rende necessaria dal momento che i valori coprono un range troppo elevato per poter essere visualizzato in un unico grafico (da circa 5 a circa 5000, la rappresentazione grafica sarebbe quasi illeggibile). Perciò dobbiamo standardizzare i dati, e utilizzeremo la funzione decostand della libreria vegan. Per prima cosa creiamo una matrice con i dati:


Mileage <- c(11.8, 5.4, 7)
FuelTank <- c(45, 90, 70)
MaxSpeed <- c(180, 315, 252)
Displacement <- c(1368, 4961, 3498)
PowerPS <- c(90, 520, 275.8)

dati1 <- matrix(c(Mileage, FuelTank, MaxSpeed, Displacement, PowerPS), nrow=3)

dati1
[,1] [,2] [,3] [,4] [,5]
[1,] 11.8 45 180 1368 90.0
[2,] 5.4 90 315 4961 520.0
[3,] 7.0 70 252 3498 275.8


A questo punto carichiamo la libreria vegan, e utilizziamo la funzione decostand. Leggendo l'help relativo (help(decostand)), osserviamo che sono a disposizione numerosi metodi di standardizzazione. In questo caso ho scelto di utilizzare il metodo "max": per ogni variabile, il valore più alto viene rapportato ad 1, e gli altri vengono calcolati con una semplice proporzione; dobbiamo specificare MARGIN=2, in modo tale che vengano standardizzati tra loro i valori di ogni colonna (scegliendo MARGIN=1 avrebbe standardizzato tra loro i valori di ogni riga):


library(vegan)
dati1ST <- decostand(dati1, "max", MARGIN=2)

dati1ST
[,1] [,2] [,3] [,4] [,5]
[1,] 1.0000000 0.5000000 0.5714286 0.2757509 0.1730769
[2,] 0.4576271 1.0000000 1.0000000 1.0000000 1.0000000
[3,] 0.5932203 0.7777778 0.8000000 0.7050998 0.5303846
attr(,"decostand")
[1] "max"


Con la matrice così costruita, possiamo utilizzare la funzione radial.plot():


radial.plot(dati1ST,labels=c("Mileage", "FuelTank", "MaxSpeed", "Displacement", "PowerPS") ,rp.type="p", main="Diamond plot auto",line.col=2:4,show.grid=FALSE,lwd=1:3, radial.lim=c(0,1.2))


Prima di osservare il risultato, analizziamo la sintassi:
- dati1ST: specificare il nome della matrice contenente i dati; la matrice deve essere organizzata in modo che le variabili considerate (kilometraggio, capacità, etc.) siamo disposte in colonne;
- labels: elenco dei nomi delle variabili, che verrano sistemati sul grafico
- rp.type="p": specifica di disegnare le linee che congiungono i vari punti
- main: titolo della finestra
- line.col: colori da utilizzare
- show.grid=F: non mostra la griglia
- lwd: spessore delle linee
- radial.lim: range di valori, in questo caso da 0 a 1.2 (essendo il nostro valore massimo pari a 1)

Ecco il risultato (eventualmente si può aggiungere una legenda):



L'altra funzione a disposizione per i grafici a diamante, è la funzione diamondplot(). La sintassi è leggermente diversa: innanzitutto i dati devono essere scritti sottoforma di dataframe, e non di matrice come sopra. Inoltre le colonne sono rappresentate dagli oggetti in studio, e non dalle variabili come per la funzione precedente. Fatte queste precisazioni, ecco il codice che ho utilizzato per ottenere un grafico molto simile al precedente:


Mileage <- c(11.8, 5.4, 7)
FuelTank <- c(45, 90, 70)
MaxSpeed <- c(180, 315, 252)
Displacement <- c(1368, 4961, 3498)
PowerPS <- c(90, 520, 275.8)

dati2 <- matrix(c(Mileage, FuelTank, MaxSpeed, Displacement, PowerPS), ncol=3, byrow=T)
dati2
[,1] [,2] [,3]
[1,] 11.8 5.4 7.0
[2,] 45.0 90.0 70.0
[3,] 180.0 315.0 252.0
[4,] 1368.0 4961.0 3498.0
[5,] 90.0 520.0 275.8

library(vegan)
dati2ST <- decostand(dati2, "max", MARGIN=1)

dati2ST
[,1] [,2] [,3]
[1,] 1.0000000 0.4576271 0.5932203
[2,] 0.5000000 1.0000000 0.7777778
[3,] 0.5714286 1.0000000 0.8000000
[4,] 0.2757509 1.0000000 0.7050998
[5,] 0.1730769 1.0000000 0.5303846
attr(,"decostand")
[1] "max"

dati2DF <- as.data.frame(dati2ST)
colnames(dati2DF) <- c("Fiat", "Lamborghini", "Mercedes")
rownames(dati2DF) <- c("Mileage", "FuelTank", "MaxSpeed", "Displacement", "PowerPS")
dati2DF
Fiat Lamborghini Mercedes
Mileage 1.0000000 0.4576271 0.5932203
FuelTank 0.5000000 1.0000000 0.7777778
MaxSpeed 0.5714286 1.0000000 0.8000000
Displacement 0.2757509 1.0000000 0.7050998
PowerPS 0.1730769 1.0000000 0.5303846

library(plotrix)
diamondplot(dati2DF, bg=gray(0.6), col=cm.colors, name="Diamond plot auto")



1 commento: