Corso di Analisi dei Dati Esercitazione R n. 1 30 marzo 2006 Il pacchetto R è un programma statistico liberamente scaricabile dal CRAN (http//www.r-preject.org) che fornisce un ambiente integrato che permette di elaborare dati, eseguire calcoli ed effettuare rappresentazioni grafiche. Le sue principali caratteristiche sono: insiemi di strumenti per l analisi statistica dei dati; un linguaggio pensato per descrivere modelli statistici; molteplici tipologie di rappresentazioni grafiche dei dati; è un linguaggio object-oriented; è interamente gratuito ed open source, ovvero ciascuno può avere accesso al codice interno di R e può proporne modifiche. Tipicamente le risorse di R sono fruibili mediante righe di comando inserite in quella che è denominata R-console, in quanto i menu disponibili consentono di effettuare solo poche e ricorrenti operazioni, come aprire o salvare file. Recentemente è stata realizzata la versione italiana di R. Per tale motivo nel seguente paragrafo saranno illustrati sia i comandi della versione inglese che quelli della versione italiana (forniti tra parentesi ed in rosso) 1 Come organizzare il proprio lavoro L ambiente R consente di salvare tutti i dati importati, gli oggetti creati e molte altre informazioni utili, in un area di lavoro denominata workspace. Per salvare la propria workspace in una cartella, dal menu File selezionare l opzione Save Workspace... (Salva area di lavoro...) e così accedere alla cartella desiderata. Esempio: Se desidero salvare la mia workspace con il nome Esercitazione1 nella cartella c:\analisideidati, dal menu File, Save Workspace... (File, Salva area di lavoro...) accedo a c:\analisideidati ed inserisco il nome del file Esercitazione1. Una conferma dell operazione effettuata è possibile averla dalla Console di R nella quale è presente la seguente linea di comando: > save.image("c:/analisideidati/esercitazione1.rdata") Ho così creato una workspace con questo percorso c:\analisideidati\esercitazione1.rdata alla quale posso accedere in successive sessioni di lavoro per utilizzare le informazioni in essa contenute. 1
Per accedere ad una workspace precedentemente salvata selezionare dal menu File l opzione Load Workspace... (Carica area di lavoro...) ed accedere alla cartella desiderata. Cliccare sul file con estensione.rdata e premere Apri. Anche in questo caso l eco dell operazione effettuata tramite il menu sarà visibile dalla Console di R. In ogni workspace sono presenti gli oggetti creati durante le sessioni di lavoro. Per visualizzarne l elenco di tali oggetti usare il comando: ls() 2 Tipologie di dati Le tipologie di dati supportate da R sono: character: stringhe di caratteri; numeric: numeri reali integer: numeri interi eventualmente con segno; logical: elementi che assumono solo due valori TRUE o FALSE complex: numeri complessi. 3 Sintassi di base Il prompt di R è dato dal seguente simbolo > dopo il quale è possibile fornire al sistema linee di comando, operazioni ed altro. I simboli usati per la 4 operazioni aritmetiche sono: +, -, *, / e pertanto con il loro utilizzo si possono effettuare le più articolate operazioni e visualizzare a video il risultato. Ad esempio: > 23*45/2+(21-5*(3+11))/14 [1] 514 In molti casi però è utile associare il risultato di un operazione ad una variabile creando quindi un oggetto per l ambiente R. Il simbolo usato per creare un oggetto è <-. Ad esempio se il risultato della precedente espressione numerica lo voglio salvare nell oggetto x: x<-23*45/2+(21-5*(3+11))/14 ed il valore di x posso visualizzarlo digitando x in corrispondenza del prompt e premendo invio: [1] 514 Il simbolo [1] alla sinistra di 514 sta ad indicare che il sistema identifica uno scalare come un vettore (di lunghezza 1). Quando invece si vuole creare un vettore di lunghezza maggiore di 1 si utilizza il comando di concatenazione c() nel seguente modo: x<-c(2,4,6,8) 2
dove x è un vettore di lunghezza 4 di elementi 2,4,6,8. Tale operatore si può impiegare anche per concatenare modalità di variabili qualitative: x<-c("a", "B", "C") dove le stringhe di caratteri devono essere incluse tra virgolette. Si ottiene così: [1] "A" "B" "C" Si fa inoltre notare che in fase di assegnazione di nomi agli oggetti creati, l ambiente R è case sensitive quindi ad esempio l oggetto x è diverso da X. 4 Vettori e Matrici 4.1 Vettori La procedura generalmente utilizzata per creare vettori di lunghezza n è la seguente: x<-vector(mode="numeric", length=10) dove gli argomenti tra le parentesi indicano che il vettore assume valori reali ed è di lunghezza 10 e sarà inizializzato con tutti zeri: [1] 0 0 0 0 0 0 0 0 0 0 Se vogliamo assegnare a questo vettore una sequenza di numeri interi da 1 a 10: > y<-seq(1,10) <-y [1] 1 2 3 4 5 6 7 8 9 10 Per accedere a singoli elementi del vettore si usa il simbolo [ ] all interno del quale si inserisce il numero corrispondente alla posizione desiderata. Ad esempio nel precedente vettore x [4] [1] 4 fornisce a video il valore assunto da x nella posizione 4. Posso così decidere di modificarne il contenuto con: x[4]<-160 [1] 1 2 3 160 5 6 7 8 9 10 Il comando length(x) fornisce la lunghezza del vettore x: > length(x) [1] 10 mentre il comando t() traspone un vettore colonna in un vettore riga. 3
4.2 Matrici Un oggetto di tipo matrice è creato con il comando: > X<-matrix(x, ncol=5, nrow=2) dove in X, di dimensioni (2 5), sono inseriti i dati presenti nel vettore x nel seguente modo: > X [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 Se invece si desidera che i dati siano inseriti per righe: > X<-matrix(x, ncol=5, nrow=2, byrow=t) > X [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 7 8 9 10 La dimensione della matrice è possibile conoscerla con il comando dim(): > dim(x) [1] 2 5 dove il primo numero indica il numero di righe ed il secondo il numero di colonne. Come per i vettori, anche per le matrici la trasposta è ottenuta con il comando t(): > t(x) [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10 mentre l inversa di una matrice quadrata si genera con il comando solve(): > Y<-matrix(c(2, 3, 7, 9, 15, 4, 9,4,1), ncol=3, nrow=3) > solve(y) [1,] 0.001628664-0.04397394 0.161237785 [2,] -0.040716612 0.09934853-0.030944625 [3,] 0.151465798-0.08957655-0.004885993 con c(2, 3, 7, 9, 15, 4, 9,4,1) il vettore dei dati inseriti in tabella. 4.3 Operazioni con Matrici e Vettori La sintassi utilizzata per la somma e la sottrazione di matrici e vettori non si differenzia dagli operatori matematici presentati in precedenza. Quindi la sottrazione usa il simbolo -, ad esempio: 4
> X<-matrix(c(3,1,6,8,10,12,3,11,7), ncol=3, nrow=3) > Y<-matrix(c(2, 3, 7, 9, 15, 4, 9,4,1), ncol=3, nrow=3) > Z<-X-Y > Z [1,] 1-1 -6 [2,] -2-5 7 [3,] -1 8 6 mentre la somma + : > W<-X+Y > W [1,] 5 17 12 [2,] 4 25 15 [3,] 13 16 8 Il prodotto presenta invece delle differenze in quanto l utilizzo del simbolo * non sempre è opportuno. Dati due vettori x<-c(2,5) ed y<-c(1,2), il prodotto x*y dà origine a: *y [1] 1 10 dove la moltiplicazione implica il prodotto membro a membro dei termini del vettore. Se invece si desidera calcolare il loro prodotto scalare, il simbolo di moltiplicazione diventa %*%, infatti: %*%y [,1] [1,] 11 Una simile situazione si ha con le matrici, dove ad esempio date due matrici quadrate X ed Y: > X [1,] 3 8 3 [2,] 1 10 11 [3,] 6 12 7 > Y [1,] 2 9 9 [2,] 3 15 4 [3,] 7 4 1 il prodotto è: > X*Y [1,] 6 72 27 [2,] 3 150 44 [3,] 42 48 7 mentre il prodotto propriamente detto tra le due matrici conformabili X ed Y si effettua con l operatore %*% > X%*%Y [1,] 51 159 62 [2,] 109 203 60 [3,] 97 262 109 5
Infine il prodotto XY 1 si calcola con: > X%*%solve(Y) [1,] 0.1335505 0.39413681 0.2214984 [2,] 1.2605863-0.03583062-0.2019544 [3,] 0.5814332 0.30130293 0.5618893 5 Il dataframe È lo strumento più importante per la gestione e l analisi dei dati. Il dataframe è una matrice di dati propriamente detta in cui le righe corrispondono alle unità di rilevazione e le colonne alle variabili in esame. Un dataframe è costruito utilizzando con il comando data.frame() nel quale possono essere inserite sia variabili che mutabili. Ad esempio, si supponga di disporre dei dati rilevati su 5 individui, ai quali è richiesta la marca di auto posseduta ed il numero di km annui percorsi. Con tali informazioni è possibile costruire il seguente dataframe: > marca<-c("fiat", "Ford", "Lancia", "Citroen", "Lancia") > Km<-c(10000, 14500, 50000, 25000, 18000) > dati.osservati<-data.frame(marca, Km) > dati.osservati marca Km 1 Fiat 10000 2 Ford 14500 3 Lancia 50000 4 Citroen 25000 5 Lancia 18000 al quale si può aggiungere la variabile Professione: prof<-c("insegnante", "Operaio", "Rappresentante", "Impiegato", "Disoccupato") con il comando: dati.osservati$professione<-prof e così ottenere: > dati.osservati marca Km Professione 1 Fiat 10000 Insegnante 2 Ford 14500 Operaio 3 Lancia 50000 Rappresentante 4 Citroen 25000 Impiegato 5 Lancia 18000 Disoccupato Per assegnare ad un nuovo oggetto i valori di una variabile del dataframe si usa il comando mm<-dati.osservati$marca dove il simbolo $ deve precedere il nome della variabile di interesse. Quindi il nuovo oggetto mm sarà: > mm [1] Fiat Ford Lancia Citroen Lancia È inoltre possibile accedere al dataframe per inserire i dati manualmente con il comando fix(). Infatti inserendo nella console il comando fix(dati.ossevati) si accede ad una sorta di foglio elettronico disponibile in scrittura. 6
6 Importazione dei dati da file In molti casi i dati da inserire nel dataframe sono già presenti in un altro file. In tal caso se si tratta di una matrice di dati, sarà possibile importarla con il comando read.table(). Ad esempio se il file nel quale sono disponibili i dati è denominato Turismo.txt ed è presente nella cartella c:\analisideidati, la linea di comando diventerà: X<-read.table("c:\\AnalisiDeiDati\\Turismo.txt", header=true, sep="\t") dove l estensione.txt sta ad indicare che si tratta di un file testo. Gli ulteriori argomenti presenti in read.table() dati da header=true e sep="\t" indicano rispettivamente che la prima riga della matrice di dati contiene i nomi delle variabili (ovvero che le colonne hanno un intestazione) e che le colonne della matrice sono separate da tabulazioni. Osservazione Il sistema R consente di importare i dati da file presenti in fogli elettronici creati con Excel, anche se ne sconsiglia altamente il loro impiego. Infatti la presenza di eventuali formule e/o fogli multipli nel foglio elettronico impedisce l importazione dei dati o comunque può comportare una non corretta lettura dei dati in esso contenuti. Per tale motivo è utile convertire il file.xls contenente la matrice di dati in un altro formato che non supporta fogli multipli come ad exempio i file di tipo.csv (comma separated values) o.txt (testo) e successivamente leggere il contenuto del nuovo file con il comando read.table(). 7 Alcune statistiche descrittive Assumiamo che la matrice di dati importata sia composta da X 1, X 2,..., X p variabili osservate su un collettivo di n unità campionarie. È possibile in tal caso presentare alcuni indici statistici per la loro sintesi. Tra questi: il vettore delle medie e la matrice delle varianze e covarianze. Assumendo che le variabili quantitative osservate siano p = 4 e che la matrice di dati X ha dimensione (10 4) ed ha ad oggetto l assunzione media pro-capite giornaliera di proteine in 10 stati europei: Nazioni Carne Uova Latte Pesce Irlanda 13,5 4,1 17,5 4,5 Olanda 7,8 1,6 8,3 1,2 Francia 9,7 2,8 12,5 2,0 Italia 10,6 3,7 25,0 9,9 German 8,4 3,7 11,1 5,4 Grecia 9,5 2,7 33,7 5,8 Portog 18,0 3,3 19,5 5,7 Spagna 10,2 2,8 17,6 5,9 UK 10,1 0,5 8,9 0,2 Belgio 8,9 4,3 19,9 2,1 dove nella prima colonna sono elencate le denominazioni delle unità statistiche. Assumendo che tali dati siano presenti in c:\analisideidati\proteine.txt, è possibile importarli con la linea di comando: prot.dati<-read.table("c:\\analisideidati\\proteine.txt", header=true, sep="\t", dec=",") dove il comando dec="," è stato inserito per chiarire che nel file origine le cifre decimali sono separate dalla virgola. Per eliminare la prima colonna dal dataframe si scriverà nella console in comando: 7
prot.dati$nazioni=null ottenendo così una matrice di dati esclusivamente quantitativi che è possibile modificare o sottoporre ad elaborazione. Si può calcolare la media delle variabili con il comando mean(), calcolare la matrice di varianze e covarianze con \cov() ad esempio: > mean(prot.dati) Carne Uova Latte Pesce 10.67 2.95 17.40 4.27 > cov(prot.dati) Carne Uova Latte Pesce Carne 9.0134444 0.8283333 4.618889 2.532333 Uova 0.8283333 1.3694444 3.882222 1.859444 Latte 4.6188889 3.8822222 61.435556 14.687778 Pesce 2.5323333 1.8594444 14.687778 8.435667 Si possono standardizzare le variabili in esame sottraendo a ciascuna variabile la media e dividendola per la deviazione standard che è derivabile dagli elementi sulla diagonale principale della matrice di varianze e covarianze. In particolare, utilizzando il comando diag() si estraggono gli elementi della diagonale principale di una matrice, quindi: > varianze<-diag(cov(prot.dati)) > varianze Carne Uova Latte Pesce 9.013444 1.369444 61.435556 8.435667 con l oggetto varianze un vettore di dati in cui sono presenti le varianze delle 4 variabili esaminate, mentre il vettore delle medie è: > medie<-mean(prot.dati) > medie Carne Uova Latte Pesce 10.67 2.95 17.40 4.27 I dati standardizzati saranno inseriti in un nuovo dataframe denominato prot.dati.st nel quale le variabili subiranno la seguente trasformazione: Z i = X i µ i σ i i = 1, 2, 3, 4 e pertanto le variabili standardizzate ed il nuovo dataframe saranno: > Carne<-(prot.dati$Carne-medie[1])/sqrt(varianze[1]) > Uova<-(prot.dati$Uova-medie[2])/sqrt(varianze[2]) > Latte<-(prot.dati$Latte-medie[3])/sqrt(varianze[3]) > Pesce<-(prot.dati$Pesce-medie[4])/sqrt(varianze[4]) > prot.dati.st<-data.frame(carne, Uova, Latte, Pesce) dove il comando sqrt(x) fornisce la radice quadrata di x. 8