5 Rappresentazioni grafiche di base
Illustriamo le principali rappresentazioni grafiche disponibili nella versione base di R. A questo scopo utilizziamo un insieme di dati che riporta le misurazioni della temperatura corporea espresse in gradi centigradi e della frequenza cardiaca espressa in termini di numero di battiti al minuto per maschi e femmine. In particolare, la prima colonna contiene le misurazioni della temperatura corporea, la seconda colonna l’indicazione del genere maschile o femminile codificato rispettivamente con 1 e 2 e la terza colonna le misurazioni della frequenza cardiaca.
posizione <- "http://datascience.maths.unitn.it/schools/ips2021/R/data/normtempc.txt"
temp.corporea <- read.table(posizione, header=FALSE)
colnames(temp.corporea) <- c("temperatura", "sesso", "battiti")
Si possono visualizzare le prime osservazioni dei dati con la funzione head
## temperatura sesso battiti
## 1 35.7 1 70
## 2 35.9 1 71
## 3 36.1 1 74
## 4 36.1 1 80
## 5 36.2 1 73
## 6 36.2 1 75
Per vedere la ripartizione di maschi e femmine si può calcolare la frequenza relativa percentuale delle due modalità della variabile sesso
##
## 1 2
## 0.5 0.5
e rappresentare graficamente la variabile sesso
con la funzione barplot
, che serve per realizzare diagrammi a rettangoli separati, ed è adatta a variabili che sono su scala qualitativa sconnessa o ordinale
barplot(proportions(table(temp.corporea$sesso)), xlab="Sesso",
ylab="Frequenza relativa", main="Diagramma della variabile 'Sesso'",
names.arg=c("Maschi", "Femmine"),
col=c("lightblue", "pink"))
Gli argomenti xlab
e ylab
sono la descrizione degli “assi”, main
è il titolo del grafico, mentre names.arg
contiene il nome delle modalità della variabile. Dal grafico si vede che vi è un ugual numero di misurazioni riferite ai maschi e alle femmine.
Si possono creare tre vettori contenenti le tre diverse variabili analizzate,
Per rappresentare graficamente una variabile quantitativa, si può semplicemente utilizzare il grafico ramo-foglia (stem-leaf), attraverso la funzione
##
## The decimal point is 1 digit(s) to the left of the |
##
## 356 | 0
## 358 | 000
## 360 | 000
## 362 | 000000000000
## 364 | 0000000000
## 366 | 0000000000000000000000000
## 368 | 000000000000000000000000000
## 370 | 0000000000000000000000000000
## 372 | 0000000000000
## 374 | 00000
## 376 | 0
## 378 | 0
## 380 |
## 382 | 0
dove si vede che la classe modale è costituita dalla classe \(37.0 \vdash 37.2\). Una rappresentazione grafica alternativa e forse più usata è l’istogramma (l’istogramma e il diagramma a rettangoli separati sono due rappresentazioni simili dal punto di vista visivo ma ben diverse per costruzione e interpretazione,ne discuteremo nella parte che riguarda la statistica descrittiva)
Diversamente dalla funzione barplot
nella funzione hist
l’area rappresenta la frequenza della classe.
R decide automaticamente il numero di classi, in questo caso ha generato \(13\) classi. Il numero di classi può essere facilmente fissato usando l’argomento breaks
hist(temperatura, main="Istogramma delle temperatura",
breaks=20,
xlab="Temperatura in gradi centigradi")
Come si vede dalla figura, aumentare il numero di classi porta ad un maggiore dettaglio. Specificando un vettore di valori nell’argomento breaks
definiamo gli estremi delle classi, in questa maniera precisiamo sia l’ampiezza delle classi (che può risultare diversa) sia il numero di classi, inoltre con l’argomento probability=FALSE
otteniamo un grafico che usa le frequenze assolute invece delle frequenze relative
hist(temperatura,main="Istogramma delle temperatura",
breaks=c(35.5, 36.5, 37.5, 38.5),
probability=FALSE, xlab="Temperatura in gradi centigradi")
Nella figura abbiamo l’istogramma definito con tre classi. Se usiamo l’argomento plot=FALSE
il grafico non verrà presentato nella finestra grafica, questa opzione è utile se vogliamo memorizzare in una variabile le informazioni relative ad un istogramma
## Warning in hist.default(temperatura, breaks = c(35.5, 36.5, 37.5, 38.5), :
## argument 'probability' is not made use of
## List of 6
## $ breaks : num [1:4] 35.5 36.5 37.5 38.5
## $ counts : int [1:3] 29 98 3
## $ density : num [1:3] 0.2231 0.7538 0.0231
## $ mids : num [1:3] 36 37 38
## $ xname : chr "temperatura"
## $ equidist: logi TRUE
## - attr(*, "class")= chr "histogram"
In $breaks
ci sono gli estremi delle classi, in $counts
ci sono le frequenze assolute che cadono all’interno di ogni classe, mentre in $rel.freqs
ci sono le frequenze relative, anche se a volte questa variabile non sembra calcolata correttamente, quindi si presti particolare attenzione al suo utilizzo. In $mids
sono riportati i valori centrali delle classi.
Può risultare interessante verificare se esiste una differenza tra la distribuzione delle temperature registrate per i maschi e la distribuzione per le femmine. Suddividiamo le misurazioni relative alla temperatura in due vettori distinti:
Usando le funzioni summary
e boxplot.stats
vediamo se vi sono differenze tra le due distribuzioni. In particolare i valori forniti da boxplot.stats
si riferiscono a $stats
: l’estremo inferiore del baffo, l’estremo inferiore della scatola, il valore centrale, l’estremo superiore della scatola e l’estremo superiore del baffo; $n
: il numero di osservazioni; $out
: il valore di tutte le osservazioni che sono al di fuori dei baffi.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 35.70 36.40 36.70 36.73 37.00 37.50
## $stats
## [1] 35.7 36.4 36.7 37.0 37.5
##
## $n
## [1] 65
##
## $conf
## [1] 36.58242 36.81758
##
## $out
## numeric(0)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 35.80 36.70 36.90 36.89 37.10 38.20
## $stats
## [1] 36.2 36.7 36.9 37.1 37.7
##
## $n
## [1] 65
##
## $conf
## [1] 36.82161 36.97839
##
## $out
## [1] 35.8 35.9 36.0 37.8 38.2
La temperatura delle femmine sembra leggermente superiore a quella dei maschi, ma per decidere quanto questa differenza sia realmente significativa è necessario utilizzare una tecnica che vedremo più avanti basata sulla statistica inferenziale.
Per rappresentare in un diagramma a scatola e baffi le temperature possiamo scrivere
Oppure per ottenere lo stesso risultato possiamo usare la seguente sintassi che risulta equivalente
dove la sintassi temperatura ~ sesso
si chiama formula
ed è un modo molto generale e potente per descrivere quello che vogliamo fare. Ne riparleremo in dettaglio più avanti. Dal diagramma a baffi si nota come la distribuzione della temperatura corporea delle femmine tenda ad essere più elevata di quella dei maschi. Differenze si possono trovare anche nella dispersione di queste due distribuzioni.
Infine un’ulteriore maniera per verificare se le distribuzioni della temperatura dei maschi e delle femmine sono oppure no le stesse, possiamo usare una rappresentazione basata sui quantili
Quando siamo interessati allo studio della relazione tra due variabili quantitative su scala continua, è sempre opportuno rappresentare le osservazioni in un piano cartesiano. In R questo si ottiene facilmente attraverso la funzione plot
Come si vede dal grafico non sembra esserci una relazione marcata tra la temperatura corporea e il numero di battiti al minuto.
In questo contesto potrebbe essere interessante vedere dove sono collocate le osservazioni che si riferiscono alle femmine rispetto a quelle dei maschi. Per ottenere un grafico di questo genere possiamo scrivere
plot(battiti, temperatura, ylab="Temperatura del Corpo",
xlab="Numero di battiti al minuto",
col=ifelse(sesso==1, "lightblue", "pink"),
pch=ifelse(sesso==1, "m", "f"))
o in maniera più semplice, ma meno elegante,
plot(battiti, temperatura, ylab="Temperatura del Corpo",
xlab="Numero di battiti al minuto", type="n")
points(battiti[sesso==1], temperatura[sesso==1], col="lightblue", pch="m")
points(battiti[sesso==2], temperatura[sesso==2], col="pink", pch="f")
dove prima abbiamo preparato il grafico (si noti l’argomento type="n"
) e poi con la funzione points
abbiamo aggiunti i punti. Dal grafico non si evidenzia una marcata differenza tra le osservazioni riferite alle femmine rispetto a quelle riferite ai maschi.