Visualizzazione post con etichetta row.names(). Mostra tutti i post
Visualizzazione post con etichetta row.names(). Mostra tutti i post

domenica 20 gennaio 2019

Grafici a linee (line chart)

Vediamo come rappresentare i grafici a linee impiegando una funzione e un set di dati inclusi nella installazione base di R. Si tratta della funzione plot() [1], utile per una molteplicità di rappresentazioni

Se nella Console di R digitate data() potete vedere l'elenco dei set dati che sono caricati automaticamente all'avvio del programma e che include il set di dati WorldPhones qui impiegato.

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

# GRAFICI A LINEE set di dati di R
#
mydata <- data.frame(WorldPhones) # trasforma il set di dati WorldPhones in dataframe
mydata # mostra i dati
#
windows() # apre una nuova finestra
#
# traccia il grafico a linee per la prima variabile
plot(mydata$N.Amer, type="o", pch=19, lty=1, col="red", ylim=c(0,80000), axes=FALSE, ann=FALSE)
# sovrappone i grafici a linee per le variabili successive
lines(mydata$Europe, type="o", pch=20, lty=2, col="blue")
lines(mydata$Asia, type="o", pch=21, lty=3, col="brown")
lines(mydata$S.Amer, type="o", pch=22, lty=4, col="darkolivegreen")
lines(mydata$Oceania, type="o", pch=23, lty=5, col="gold1")
lines(mydata$Africa, type="o", pch=24, lty=6, col="green4")
lines(mydata$Mid.Amer, type="o", pch=25, lty=7, col="cornflowerblue")
#
# traccia gli assi con le rispettive scale e riporta le etichette sull'asse orizzontale
axis(1, at=1:7, labels=c("1951","1956","1957","1958","1959","1960","1961"))
axis(2, las=1, at=20000*0:80000)
#
# riporta titolo ed etichetta dell'asse delle x
title(main="Numero di apparecchi telefonici nel mondo", col.main="black", font.main=1)
title(xlab="Anno della rilevazione", col.lab="black")
#
# riporta una legenda con i nomi delle variabili e i simboli delle linee impiegati
legend(5, 70000, c("Nord America", "Europa", "Asia", "Sud America", "Oceania", "Africa", "Centro America"), cex=0.8, col=c("red","blue", "brown", "darkolivegreen", "gold1", "green4", "cornflowerblue"), pch=19:25, lty=1:7, bty="y")
#

Nella prima riga di codice dal set di dati WorldPhones con la funzione data.frame() viene creata una tabella (dataframe) che viene assegnata (<-) all'oggetto mydata, quindi con mydata sono mostrati i dati importati:

> mydata # mostra i dati
     N.Amer Europe Asia S.Amer Oceania Africa Mid.Amer
1951  45939  21574 2876   1815    1646     89      555
1956  60423  29990 4708   2568    2366   1411      733
1957  64721  32510 5230   2695    2526   1546      773
1958  68484  35218 6662   2845    2691   1663      836
1959  71799  37598 6856   3000    2868   1769      911
1960  76036  40341 8220   3145    3054   1905     1008
1961  79831  43173 9053   3338    3224   2005     1076

che sono rappresentati dalle rilevazioni, effettuate tra l'anno 1951 e l'anno 1961, del numero di apparecchi telefonici, suddivisi per le principali aree geografiche del mondo.

Dopo avere aperto la finestra grafica con windows() nel successivo blocco di codice viene generato mediante la funzione plot() il grafico a linee che riporta in ascisse (x) i descrittori delle righe (1951, 1952, … 1961) e impiega come argomenti:
mydata$N.Amer la prima variabile del set di dati, posta in ordinate (y);
type="o" che consente di sovrascrivere i grafici successivi;
pch=19 quale dei simboli dei punti di R deve essere impiegato per i punti da rappresentare;
lty=1 quale degli stili delle linee di R deve essere impiegato per la linea da rappresentare;
col="red" quale colore impiegare per i punti e le linee da rappresentare;
ylim=c(0,80000) limiti inferiore e superiore dell'asse delle y;
axes=FALSE che indica di non rappresentare gli assi del grafico che verranno poi configurati manualmente nelle righe successive;
ann=FALSE che indica di non rappresentare titolo ed etichette dell'asse delle x e delle y che verranno poi configurati manualmente nelle righe successive.

Al grafico così creato, con le sei righe di codice successive sono sovrapposti i grafici a linee delle altre sei variabili che vogliamo rappresentare: Europe, Asia, S.Amer, Oceania, Africa, Mid.Amer.

Viene poi tracciato l'asse delle x axis(1....) ponendo nelle posizioni che vanno dalla 1 alla 7 (at=1:7) le etichette "1951", "1956", "1957", "1958", "1959", "1960", "1961" riportate nell'argomento labels. Per l'asse delle ordinate axis(2....) le tacche sono tracciate in orizzontale (las = 1) ogni 20000 (at=20000) per la scala che va da 0 a 80000 (0:80000).

Titolo ed etichetta dell'asse delle x riportati nel blocco di codice successivo non richiedono particolari commenti.

Infine la funzione legend() consente di aggiungere una legenda, che prevede i seguenti argomenti:
5, 70000 sono le coordinate x e y alle quali viene posizionato l'angolo superiore sinistro della legenda;
"Nord America", "Europa", "Asia", "Sud America", "Oceania", "Africa", "Centro America" sono i nomi da riportare;
cex.axis = 0.8 specifica la dimensione dei caratteri da impiegare;
"red","blue", "brown", "darkolivegreen", "gold1", "green4", "cornflowerblue" sono i colori di R che ovviamente riprendono nell'ordine quelli delle linee riportate nel grafico;
pch=19:25 sono i simboli dei punti di R impiegati nel grafico;
lty=1:7 sono gli stili delle linee di R impiegati nel grafico;
bty="y" che è l'opzione di default della funzione plot() e consente di tracciare il riquadro contenente la legenda, viene qui riportato per ricordare che con bty="n" è possibile eliminarlo.


Da notare che l'esempio è stato sviluppato esclusivamente per illustrare le funzioni e gli argomenti per rappresentare un grafico a linee. Ma si fa notare nel set di dati fornito, tra il 1951 e il 1956 intercorrono 5 anni, mentre gli intervalli successivi sono di un anno: questo distorce la rappresentazione, aumentando la pendenza del primo segmento di retta rispetto al reale. Ovviamente si raccomanda di non introdurre mai distorsioni di questo o di altro genere nella rappresentazione dei propri dati.

I grafici a linee vengono spesso impiegati per rappresentare variabili con pochi dati: potrebbe pertanto essere utile disporre di un esempio nel quale i dati sono inseriti manualmente. Copiate e incollate nella Console di R questo script e premete ↵ Invio:

# GRAFICI A LINEE dataframe costruito manualmente
#
N.Amer <- c(45939, 60423, 64721, 68484, 71799, 76036, 79831) # vettore con la prima variabile
Europe <- c(21574, 29990, 32510, 35218, 37598, 40341, 43173) # vettore con la seconda variabile
Asia <- c(2876, 4708, 5230, 6662, 6856, 8220, 9053) # vettore con la terza variabile
S.Amer <- c(1815, 2568, 2695, 2845, 3000, 3145, 3338) # vettore con la quarta variabile
Oceania <- c(1646, 2366, 2526, 2691, 2868, 3054, 3224) # vettore con la quinta variabile
Africa <- c(89, 1411, 1546, 1663, 1769, 1905, 2005) # vettore con la sesta variabile
Mid.Amer <- c(555, 733, 773, 836, 911, 1008, 1076) # vettore con la settima variabile
mydata <- data.frame(N.Amer, Europe, Asia, S.Amer, Oceania, Africa, Mid.Amer) # combina i vettori nel dataframe mydata
row.names(mydata) <- c(1951, 1956, 1957, 1958, 1959, 1960, 1961) # aggiunge i nomi delle righe
mydata # mostra i dati
#
windows() # apre una nuova finestra
#
# traccia il grafico a linee per la prima variabile
plot(N.Amer, type="o", pch=19, lty=1, col="red", ylim=c(0,80000), axes=FALSE, ann=FALSE)
# sovrappone i grafici a linee per le variabili successive
lines(Europe, type="o", pch=20, lty=2, col="blue")
lines(Asia, type="o", pch=21, lty=3, col="brown")
lines(S.Amer, type="o", pch=22, lty=4, col="darkolivegreen")
lines(Oceania, type="o", pch=23, lty=5, col="gold1")
lines(Africa, type="o", pch=24, lty=6, col="green4")
lines(Mid.Amer, type="o", pch=25, lty=7, col="cornflowerblue")
#
# traccia gli assi con le rispettive scale e riporta le etichette sull'asse orizzontale
axis(1, at=1:7, labels=c("1951", "1956", "1957", "1958", "1959", "1960", "1961"))
axis(2, las=1, at=20000*0:80000)
#
# riporta titolo ed etichetta dell'asse delle x
title(main="Numero di apparecchi telefonici nel mondo", col.main="black", font.main=1)
title(xlab="Anno della rilevazione", col.lab="black")
#
# riporta una legenda con i nomi delle variabili e i simboli delle linee impiegati
legend(5, 70000, c("Nord America", "Europa", "Asia", "Sud America", "Oceania", "Africa", "Centro America"), cex=0.8, col=c("red","blue", "brown", "darkolivegreen", "gold1", "green4", "cornflowerblue"), pch=19:25, lty=1:7, bty="y")
#

Dopo avere inserito mediante la funzione c() i valori delle singole variabili, questi sono combinati mediante la funzione data.frame() nella tabella (dataframe) mydata, alla quale sono infine aggiunti con la funzione row.names() i nomi delle righe che verranno riportati sull'asse orizzontale del grafico. Il resto del codice è identico a quello dello script precedente.

Da notare come ultima cosa che in quest'ultimo script avendo eseguito la funzione row.names() si possono impiegare direttamente i nomi delle variabili (ad esempio N.Amer) senza eseguire la funzione attach(), mentre nello script precedente, nel quale la funzione attach() non è stata eseguita, si è reso necessario specificare per le variabili il nome completo (ad esempio mydata$N.Amer).

Entrambi gli script possono essere facilmente riutilizzati, il primo sostituendo al set di dati WorldPhones i propri dati, organizzati in modo analogo, il secondo adattando opportunamente numero, nomi e valori delle variabili che confluiscono nell'oggetto mydata.

Nota bene: in alternativa alle funzioni di base qui illustrate è possibile realizzare grafici a linee anche impiegando le funzioni del pacchetto ggplot2, per questo rimando al post Grafici a linee con ggplot.


----------

[1] Digitate help(plot) nella Console di R per la documentazione della funzione plot() e digitate help(nomedellafunzione) nella Console di R per la documentazione delle altre funzioni impiegate nello script.

domenica 25 novembre 2018

Inserimento manuale dei dati [1]

Inserire a mano i dati in R non accade di frequente, ma è utile quando i dati da inserire sono pochi, come ad esempio quando si vuole effettuare un test chi-quadrato [1], impiegare il teorema di Bayes [2] o realizzare dei grafici a torta [3].

Per questo ho predisposto due esempi che illustrano la sintassi da utilizzare per inserire direttamente da tastiera array (vettori) e combinarli in matrici assegnando i nomi alle variabili e ai casi [4].

Il primo esempio genera un vettore (array), lo trasforma in una matrice, assegna un nuovo nome alla variabile/colonna e infine assegna un nuovo descrittore a ciascuno dei casi/righe.

Per eseguire lo script copiatelo quindi incollatelo nella Console di R e premete ↵ Invio.

# GENERA UN ARRAY E LO TRASFORMA IN UNA MATRICE
#
x <- c(4.2, 6.8, 2.5, 8.3, 5.4, 7.9, 5.3, 6.7, 2.2, 3.1) # genera l'array x
x # mostra l'array x
mean(x) # calcola la media
#
mymatrix <- data.frame(x) # trasforma l'array x in una matrice
mymatrix # mostra la matrice con i casi/righe identificati automaticamente da R
mean (mymatrix$x) # calcola la media
#
names(mymatrix) <- c("Variabile_1") # assegna un nuovo nome alla variabile/colonna
mymatrix # mostra la matrice con il nuovo nome della variabile/colonna
mean(mymatrix$Variabile_1) # calcola la media richiamando il nome della variabile/colonna
#
row.names(mymatrix) <- c("Riga_uno", "Riga_due", "Riga_tre", "Riga_quattro", "Riga_cinque", "Riga_sei", "Riga_sette", "Riga_otto", "Riga_nove", "Riga_dieci") # sostituisce gli identificativi numerici di riga di R con nuovi descrittori univoci dei casi/righe
mymatrix # mostra la matrice con i nuovi descrittori dei casi/righe
mean(mymatrix[,1]) # calcola la media richiamando il numero della variabile/colonna
#

Utilizzate i tasti Pag-su e Pag-giù per scorrere nella finestra della Console di R quanto è accaduto, che viene illustrato dai commenti inseriti in ciascuna riga.

Da notare come, quando l'array x viene trasformato nella matrice mymatrix mediante la funzione data.frame() [5], ai casi/righe viene assegnato di default un identificativo numerico univoco.

A questo punto viene impiegata la funzione names() per assegnare un nuovo nome alla variabile. In questo modo gli identificativi numerici dei casi/righe assegnati di default sono sostituiti con dei nuovi descrittori univoci (“Riga_uno”, “Riga_due”, eccetera) impiegando la funzione row.names().

Questo è quindi il contenuto dell'oggetto mymatrix definitivo riportato alla penultima riga di codice:

> mymatrix # mostra mymatrix con il nome della variabile/colonna e i descrittori dei casi
             Variabile_1
Riga_uno             4.2
Riga_due             6.8
Riga_tre             2.5
Riga_quattro         8.3
Riga_cinque          5.4
Riga_sei             7.9
Riga_sette           5.3
Riga_otto            6.7
Riga_nove            2.2
Riga_dieci           3.1

Il calcolo della media è stato introdotto ogni volta per illustrare la sintassi da impiegare. Interessante l'ultimo caso, all'ultima riga di codice: qui la media è stata calcolata richiamando il numero della colonna sulla quale va calcolata, un modo interessante e utile per richiamare una variabile di una matrice o di una tabella.

> mean(mymatrix[,1]) # calcola la media richiamando il numero della colonna
[1] 5.24

In questo secondo esempio di inserimento manuale dei dati sono generati due vettori (array), che sono combinati in una matrice di 2 colonne per 10 righe, quindi alla matrice viene aggiunta una terza colonna/variabile. Sono poi assegnati nuovi nomi alle variabili/colonne e infine viene assegnato un nuovo descrittore univoco a ciascuno dei casi/righe.

Copiate lo script quindi incollatelo nella Console di R e premete ↵ Invio.

# GENERA DUE ARRAY, LI COMBINA IN UNA MATRICE E AGGIUNGE UNA COLONNA
#
x <- c(4.2, 6.8, 2.5, 8.3, 5.4, 7.9, 5.3, 6.7, 2.2, 3.1) # genera l'array x
y <- c(3.1, 2.2, 6.7, 5.3, 7.9, 5.4, 8.3, 2.5, 6.8, 4.2) # genera l'array y
#
mymatrix <- data.frame(x, y) # combina gli array x e y in una matrice
mymatrix # mostra la matrice con i casi/righe identificati automaticamente da R
sapply(mymatrix, mean) # calcola la media
#
mymatrix$z <- mymatrix$x + mymatrix$y # aggiunge una nuova colonna
mymatrix # mostra la matrice con i casi/righe identificati automaticamente da R
sapply(mymatrix, mean) # calcola la media
#
names(mymatrix) <- c("Var_1", "Var_2", "Var_3") # assegna un nuovo nome alle variabili/colonne
mymatrix # mostra la matrice con i nuovi nomi delle variabili/colonne
mean(mymatrix$Var_3) # calcola la media richiamando il nome della variabile/colonna
#
row.names(mymatrix) <- c("Caso_uno", "Caso_due", "Caso_tre", "Caso_quattro", "Caso_cinque", "Caso_sei", "Caso_sette", "Caso_otto", "Caso_nove", "Caso_dieci") # sostituisce gli identificativi numerici di riga di R con nuovi descrittori univoci dei casi/righe
mymatrix # mostra la matrice con i nuovi descrittori dei casi/righe
mean(mymatrix[,3]) # calcola la media richiamando il numero della variabile/colonna
#

Dopo avere eseguito lo script utilizzate i tasti Pag-su e Pag-giù per scorrere nella finestra della Console di R quanto è accaduto, che viene di nuovo illustrato dai commenti inseriti in ciascuna riga.

Da notare nuovamente come una volta combinati i due array x e y nella matrice mymatrix mediante la funzione data.frame() ai casi/righe viene assegnato di default un identificativo numerico univoco. Quindi con la funzione sapply() viene calcolata la media su tutte le colonne/variabili della matrice. Questo accade anche quando viene aggiunta alla matrice una nuova colonna/variabile z contenente la somma della variabile x e della variabile y.

A questo punto viene impiegata la funzione names() per assegnare i nuovi nomi alle variabili delle due colonne mentre con la funzione mean() è possibile calcolare separatamente la media della colonna/variabile Var_3.

Infine gli identificativi numerici delle righe/casi assegnati da R sono sostituiti con dei nuovi descrittori univoci (“Riga uno”, “Riga due”, eccetera) impiegando la funzione row.names().

Questo è quindi il contenuto dell'oggetto mymatrix definitivo riportato alla penultima riga di codice:

> mymatrix # mostra la matrice con i nuovi descrittori dei casi/righe
             Var_1 Var_2 Var_3
Caso_uno       4.2   3.1   7.3
Caso_due       6.8   2.2   9.0
Caso_tre       2.5   6.7   9.2
Caso_quattro   8.3   5.3  13.6
Caso_cinque    5.4   7.9  13.3
Caso_sei       7.9   5.4  13.3
Caso_sette     5.3   8.3  13.6
Caso_otto      6.7   2.5   9.2
Caso_nove      2.2   6.8   9.0
Caso_dieci     3.1   4.2   7.3

Infine l'ultima riga di codice ci ricorda la possibilità di impiegare il numero della colonna per specificare i dati sui quali effettuare il calcolo della media:

> mean(mymatrix[,3]) # calcola la media richiamando il numero della colonna
[1] 10.48

Se siete interessati al tema potrebbero esservi utili anche gli esempi riportati in:


----------

[1] Vedere la sezione Analisi di dati qualitativi alla pagina Indice.


[3] Vedere il post Grafici a torta.

[4] Parliamo di array o vettore nel caso di dati numerici monodimensionali, disposti su una sola riga, 

8
6
11
7

di matrice nel caso di dati numerici disposti su più righe e più colonne

8
9
15
14
6
7
18
12
11
8
17
13
7
4
19
17

e di tabella nei casi in cui il contenuto, disposto su più righe e più colonne, è rappresentato oltre che da dati numerici, anche da testo e/o operatori logici

M
7
9
VERO
F
3
12
VERO
F
5
10
FALSO

Di fatto i vettori sono matrici aventi una sola riga o una sola colonna. Una matrice con una sola riga e più colonne è detta matrice riga o vettore riga, mentre una matrice con una sola colonna e più righe è detta matrice colonna o vettore colonna.

[5] Digitate help(nomedellafunzione) nella Console di R per la documentazione di questa e delle altre funzioni qui impiegate.