Anteprima parziale del testo
Scarica dispensa R studio-Statistica e più Dispense in PDF di Statistica solo su Docsity!
5/15/25, 9:42 PM ‘about:blank Dispensa Rx Introduzione all’analisi statistica con R Riccardo Massari riccardo massariihmiromal.it 1 Introduzione 1.1 Generalità 1.1.1 Che cos'è R R è un “ambiente” basato sul linguaggio S, per la gestione e l’analisi statistica di dati e la produzione di grafici, disponibile gratuitamente sotto i vincoli della GPL (General Public Licence). Informazioni, risorse e molto altro sono disponibili al sito: nttp://cran.r-project.org/ La versione più recente di R può essere scaricata dalla pagina: nttp://eran.r-project.org/bin/windows/base/ Una volta scaricato il file .exe sul proprio computer è sufficiente lanciare il programma di installazione. Sono comunque presenti dettagliate spiegazioni sul sito di distribuzione del programma. In R l’analisi è fatta attraverso una serie di passi, con risultati intermedi che sono im- Rispetto a programmi come SAS o SPSS, R fornisce un output minimo. I rimanenti risultati possono essere successivamente richiamati tramite opportuni comandi Per approfondimenti su aspetti che non sono trattati in queste dispense si rimanda a: 1. lacus, Masarotto Laboratorio di Statistica con R, McGraw-Hill Italia, 2003. 2. Crivellari Analisi statistica dei dati con R, Apogeo, 2006. oltre alle numerose dispense per approfondire diversi aspetti di R disponibili in rete. In par- ticolare, nel sito http://cran.r-project.org/other-docs htm], si possono trovare anche numerose dispense in italiano (sezione “Other languages”) 1.1.2 Primi passi Avviato il programma R, apparirà una finestra (Console) con il simbolo di prompt > 1/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx che indica che l’ambiente è pronto per ricevere delle istruzioni, che vengono immesse scrivendo il comando sulla riga che comincia dal simbolo di prompt (detta linea di comando), Una volta concluso il comando si digita il tasto di “Invio”. Se il comando è completo, comparirà una nuova linea di comando con il simbolo di prompt. Altrimenti comparirà una nuova riga con îl simbolo che sta a significare che il comando deve essere completato. La console di R può essere utilizzata come semplice calcolatrice. E’ un ambiente interat- tivo, ossia i comandi producono una risposta immediata. Ad esempio, se scriviamo 2 + 2, comparirà nella riga successiva il risultato. Alcuni esempi: > #somma >2+2 ti 4 > #moltiplicazione >2*2 li] 4 > #sottrazione e divisione > (2 - 3)/6 L1] -0.167 > #ATTENZIONE: è diverso da scrivere > 2- 3/6 [1] 1.5 > #elevamento a potenza > 272 Di] 4 Osservazione Tutto quello che viene scritto su una riga di comando dopo # non viene letto dal programma. In tale modo, è possibile inserire dei commenti alle operazioni che vengono effettuate. Esistono poi diverse “funzioni” (vedi più avanti) per le principali operazioni matematiche e trigonometriche. Per dare solo qualche esempio, sqrt serve per estrarre la radice quadrata da un numero, log calcola il logaritmo naturale ed exp l’esponenziale: > sqrt(9) 2/50 5/15/25, 9:42 PM Dispensa Rx l1] 6 > #è possibile effettuare delle operazioni con gli oggetti salvati >x*y (1) 24 > #e creare nuovi oggetti da salvare con un nome da (9-2) +2 da Ct 4 I nomi degli oggetti che vengono creati e salvati dall'utente possono contenere un qualunque carattere alfa-numerico. Non devono mai iniziare con un numero, non ci devono essere spazi vuoti, né gli operatori per le operazioni matematiche. Sarebbe opportuno, inoltre, che non coincidano con nomi di funzioni utilizzate dal programma. > #i nomi degli oggetti non devono contenere spazi vuoti > pro va = 2 Error: unexpected symbol în "pro va" > fnon devono contenere simboli matematici > #icreano confusione > xy = 2 Error in x - y = 2 : could not find function " > mon devono iniziare con un numero > 2x=2 Error: unexpected symbol in "2x" > #alcuni nomi sono "protetti" da R > for = 3 Error: unexpected '»' in "for > break = 5 Error in break = 5 : invalid (NULL) left side of assignnent Si osservi che, anche se i nomi degli oggetti non devono iniziare con un numero, possono essere composti anche da numeri: > a2= > 22 li] 5 Occorre fare attenzione al fatto che R è case sensitive, nel senso che distingue tra maius- cole e minuscole. Ad esempio, Y e y sì riferiscono ad oggetti diversi. 4 ‘about:blank 4/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx >y Di] 6 >Y Error: object Y' not found Infine, se si attribuisce a due oggetti diversi lo stesso nome, R cancellerà il primo dei due oggetti e manterrà in memoria solo il secondo: >a=2 > a 01) 2 dad da tu] 4 1.2. Gli oggetti inR 1.2.1 Spazio di lavoro Gli oggetti creati dall'utente vengono temporaneamente salvati nello spazio di lavoro (workspace). Per sapere qual è lo spazio di lavoro di default, ossia quello utilizzato dal programma nel momento in cui viene lanciato, si utilizza il comando getwd(), che mostr- erà il path della cartella nel computer che è stata automaticamente selezionata al momento dell'installazione del programma. Si può lavorare nel workspace di default, ma è consigliabile utilizzare spazi di lavoro diversi, e quindi cartelle diverse, per lavori diversi. Per modificare lo spazio di lavoro, si utilizza il comando setud(). Ad esempio, se è stata creata una directory dal nome “lezioniR” nella directory "C:”, per salvare tutto il lavoro in questa cartella, all’inizio della sessione di lavoro si scriverà! setud("C:/lezioniR") In alternativa, dal menu “File”, si sceglie l'opzione “Cambia directory” e si sceglie la la cartella. In questa cartella devono essere inseriti tutti i dati, provenienti da file esterni ad R che si vogliono impiegare nella sessione di lavoro. Inoltre, in questa cartella verranno salvate le figure, le matrici di dati e, più in generale, tutti gli oggetti che vengono creati durante la sessione di lavoro. A quest’ultimo riguardo, come già accennato, gli oggetti vengono salvati solo temporanea- mente nello spazio di lavoro, fino alla fine della sessione, e non sono visibili “fisicamente” nella cartella selezionata come workspace. Per salvare tutto lo spazio di lavoro in maniera definitiva, si utilizza il comando save.image(), che crea un file senza nome nella cartella Fate attenzione all'orientamento dello slash, che è opposto da quello impiegato, ad esempio, sotto Win- dos. i 5/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx 1.2.2 Funzioni Tra gli oggetti in R, un ruolo di particolare rilevanza è rivestito dalle funzioni, insiemi di comandi elementari, che permettono di effettuare dalle più comuni operazioni matematiche, alle più sofisticate tecniche statistiche, e altro ancora. I comandi incontrati fino ad ora, come save.image, ls, o sqrt, sono esempi di funzioni. La sintassi di una generica funzione è del tipo: nomefunzione (argomento1, argomento?, argonento8,...) dove gli argomenti di una funzione, separati da una virgola, possono essere oggetti come vettori, matrici, altre funzioni, parametri o operatori logici. Alcuni argomenti possono avere dei valori di default, se sono posti uguali ad un valore, 0 ad una condizione, ecc. Non è sempre necessario specificare tutti gli argomenti di una funzione. Anche l'ordine degli argomenti non è importante. E' necessario ricordare che, qualora gli argomenti della funzione siano inseriti in un ordine diverso da quello definito, si deve sempre richiamare il nome dell'argomento che si vuole impiegare. Per richiamare l’help în linea su una funzione, e quindi avere informazioni sulla sintassi della funzione, oltre a esempi pratici di impiego, si scrive: ‘’nomefunzione. Osservazione Quali argomenti vadano sempre specificati e quali solo in base alle finalità dell'analisi è un argomento complesso da trattare in astratto, senza esempi pratici. Nel seguito verranno introdotte numerose funzioni, con esempi che permetteranno di chiarire, di volta in volta, quali argomenti vadano specificati e quali no. 1.2.3 Pacchetti Le funzioni di R. sono organizzate in pacchetti, i più importanti dei quali sono già disponi- bili quando si accede al programma. Alcuni pacchetti, pur essendo presenti nella release di base di R, devono essere caricati durante la sessione di lavoro, mediante il comando: require(nomepacchetto) Per sapere quali sono i pacchetti già presenti nella release di R con cui si sta lavorando, basta scrivere: library() In alternativa, dal menu “Pacchetti” si sceglie l'opzione “Carica pacchetto”. In tal caso apparirà una finestra con la lista dei pacchetti già installati. Sarà quindi sufficiente selezionare il nome del pacchetto da caricare con il mouse e poi cliccare su "OK”. Per avere informazioni sul pacchetto e sulle funzioni în esso contenute: help(package = "nomepacchetto") Alcuni pacchetti non sono invece presenti nella release di base di R. Per installare un pacchetto non presente, è sufficiente scrivere: install. packages ("nomepacchetto") 7/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx Table 1: Esempio di matrice di dati i ETA PESO ALTEZZA SESSO PROV 119 50 165 F RM 2 27 1.78 M RM 321° 80 191 M TO 4 23 56 172 F NA 5 2 7 TSI M TO 6 20 58 1.68 F NA La prima volta che si usa questa funzione durante una sessione di lavoro si dovrà anche selezionare da una lista il sito mirror da cui scaricare il pacchetto. In alternativa, nel menu “Pacchetti” si seleziona “Installa pacchetti” e, successivamente, si seleziona il pacchetto dalla lista di tutti i pacchetti. 2 Tipologie di dati inR lavora con dati strutturati. Le strutture di dati contemplate sono: numeri contengono un singolo dato; vettori insieme lineare di elementi omogenei per tipologia, tutti numeri, tutte stringhe, ecc.; fattori vettore utilizzato per classificare 0 suddividere in livelli gli elementi di un altro vettore; arraye matrici vettori multidimensionali. Le matrici hanno due dimensioni: righe e colonne. Gli array sono insiemi di numeri con p dimensioni. Ovviamente, per p = 1 si ottiene un vettore, per p = 2 una matrice. Il caso più generale, con p > 2 non verrà trattato; data frame sono matrici bidimensionali dove ogni colonna può avere una tipo di dato diverso dalle altre; liste insieme di elementi non omogenei tra loro. Prima di andare a vedere i singoli tipi di dati, consideriamo il seguente esempio. Supponi- amo di avere rilevato su sei unità, cinque variabili, tre numeriche, l’età, il peso e l'altezza, e due categoriche, il sesso e la provincia di nascita. I dati sono riportati nella Tabella 1. La prima colonna della matrice contiene le “etichette” con cui vengono identificate le unità. Ciascuna delle rimanenti colonne rappresenta una variabile osservata sul campione. La riga i-ma della Tabella 1 riporta i valori osservati per le cinque variabili sull'unità i. In R, le variabili vengono rappresentate sotto forma di vettori. Ciascun vettore rappre- senta una distribuzione unitaria semplice. La matrice dei dati, che contiene le colonne rappresentanti le variabili osservate sul campione è una distribuzione unitaria multipla. Nel seguito, andremo a vedere dapprima come costruire i singoli vettori che compongono la Tabella 1 e, successivamente, la matrice dei dati. Nel far questo, verranno illustrate le principali proprietà di vettori e matrici di dati in R. 8 8/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx > SESSO = c("F", "go, ngn, ngn, nyn, np") > SESSO CA] Spe ge agi pa agi spo > SESSO = factor(SESSO) > SESSO Ci] FMMFMF Levels: FM > PROV = c("RM", "RM", "TO", "NA", "To", "Na") > PROV = factor (PROV) > PROV [1] RM RM TO NA TO NA Levels: NA RM TO Per selezionare gli elementi di un vettore si deve inserire tra parentesi quadre, succes- sivamente al nome del vettore, un indice, 0 un vettore di indici, che indichi la posizione degli elementi del vettore da estrarre. Se davanti all'indice c'è il segno "-", il corrispondente elemento viene eliminato dal vettore: > #iseleziona il peso della prima unità > PESO[1] [1] 50 > #della sesta e della terza unità > PESO[c(6, 3)] [1] 58 80 > #elimina l'altezza della quarta unità > ALTEZZA[- 4] [1] 1.65 1.78 1.91 1.81 1.68 > #estrae l'età di chi ha un peso minore o uguale a 70 kg > ETA[PESO <= 70] [1] 19 23 20 > #estrae il peso di che ha un'altezza maggiore di 1.70 > PESOLALTEZZA > 1.70] [1] 75 80 56 75 10/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx > #estrae l'altezza di chi ha 22 anni > ALTEZZA[ETA == 22] [1] 1.78 1.81 > #estrae il peso delle unità di sesso femminile > PESO[SESSO == "F"] [1] 50 56 58 > #estrae l'altezza delle unità che hanno meno di 22 anni > #e che non sono nate nella provincia di Napoli > ALTEZZA[ETA < 22 & PROV != "NA"] [1] 1.65 1.91 Osservazione Le variabili di classificazione possono essere, a loro volta trasformate in variabili numeriche, tramite la funzione as.integer. Si osservi che, nel caso i livelli siano definiti da caratteri, o stringhe di caratteri, la trasformazione in numeri rispetta l'ordine alfabetico delle componenti del vettore. > as. integer(SESSO) 01122121 2.1.1 Tipologie particolari di vettori: le funzioni seq e rep La funzione seq genera un vettore che contiene una sequenza regolare di numeri, in base a determinate regole. La sintassi della funzione è: seg(from = 1, to, by, length) L'argomento from, che va sempre specificato, indica il primo numero della sequenza di numeri, che, di default, è posto pari ad 1. Il secondo, to, è il numero finale della sequenza. by indica il “passo” della sequenza, ossia l'incremento tra un numero e quello successivo. Se non specificato, è pari ad 1. Infine, Length è la lunghezza della sequenza. Non è necessario specificaro tutti gli argomenti, dal momento che, ad esempio, una volta specificato valore di inizio, valore finale e passo, la lunghezza è automaticamente definita. Ad esempio, per ottenere una sequenza da 3 a 15, di passo 3 e, quindi, di lunghezza pari a 5, si può scrivere indifferentemente: > #due diversi modi di ottenere la stessa sequenza > x = seg(from = 3, to = 15, by = 3) > x1 = seg(from = 3, to = 15, length = 5) da IS osservi che non sono stati riportati tutti gli argomenti della funzione, ma solo quelli di uso più comune. Questo verrà fatto anche per le funzioni che verranno successivamente illustrate, per non appesantire la spiegazione delle varie funzioni. Per approfondimenti, si può sempre fare ricorso all’help. 1 11/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx 2.2 Dataframe Le matrici in R. possono essere definite tramite oggetti di “classe” matrix e data. frame. La differenza principale, è che gli oggetti di classe matrix sono matrici i cui elementi devono essere tutti della stessa natura, ad esempio vettori numerici, mentre gli oggetto di classe data. frame sono matrici in cui le colonne possono essere di natura differente. Per questo motivo, questi ultimi oggetti sono impiegati per trattare matrici di dati. D'ora in avanti quando si parlerà di matrice di dati ci si riferirà ad un data frame, se non altrimenti specificato. Si osservi, infine, che la maggior parte delle funzioni che possono essere applicate ad oggetti di classe matrix sono applicabili anche ai data frame, ma non è sempre vero il viceversa. La funzione per generare un data frame è data. frame, che permette di unire più vettori di uguale lunghezza come colonne del data frame, ognuno dei quali si riferisce ad una diversa variabile. Costruiamo quindi la matrice dei dati della Tabella 1: > Dati = data.frame(ETA, PESO, ALTEZZA, SESSO, PROV) > Dati ETA PESO ALTEZZA SESSO PROV 1 19 50 1.66 F RM 222 75 1.78 M_ RM 321 80 1.91 M_ TO 423 56 1.72 F_NA 822 758 181 M_ TO 6 20 58 1.68 F_NA Si osservi che viene automaticamente generata la colonna delle etichette. La funzione str permette di analizzare la struttura di un oggetto. In particolare, nel caso della matrice di dati appena ricavata si ha: > str(Dati) ‘data. frame! 6 obs. of 5 variables: $ ETÀ num 19 22 21 23 22 20 $ PESO: num 50 75 80 56 75 58 $ ALTEZZA: num 1.65 1.78 1.91 1.72 1.81 1.68 $ SESSO : Factor w/ 2 levels "F","M": 122121 $ PROV: Factor w/ 3 levels "NA","RM","T0": 223131 La funzione nanes applicata alla matrice dei dati, restituisce il nome delle variabili della ‘matrice: > names(Dati) Ci] "ETA" "PESO" "ALTEZZA" "SESSO" "PROV" 18 13/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx L’estrazione di dati da un data frame può essere effettuata in maniera simile a quanto avviene per i vettori. Va però tenuto conto che, trattandosi di una matrice, ha due dimensioni. Quindi, scrivendo Dati i, j], si estrae l'elemento che si trova nell’èma riga e nella $ma colonna della matrice A. Quindi, l’indice prima della virgola si riferisce alle righe, mentre quello dopo la virgola riguarda le colonne: > #estrae l'elemento che si trova nella prima riga e nella seconda colonna > Dati[1, 2] [1] 50 > #estrae il secondo ed il quarto elemento della prima riga > Dati[1, c(2, 4)] PESO SESSO 150 F > #estrae la sotto-matrice formata dalle prime due righe > #e dalla seconda e terza colonna > Dati[1:2, 2:4] PESO ALTEZZA SESSO 1 50 1.66 F 2758 178 M Si osservi che se non si scrive nulla prima della virgola, l'estrazione riguarderà tutte le righe; se non si serive nulla dopo la virgola, lo stesso avverrà per le colonne. In altri termini, scrivendo Dati [, j] si estrarrà tutta la colonna ma, ossia tutte le righe della colonna; scrivendo Dati (i, ] si vuole estratte tutta la riga èma: > #estrae la seconda riga > Dati[2, ] ETA PESO ALTEZZA SESSO PROV 222 75 1.78 M_ RM > #estrae la terza colonna > Dati[ , 3] [1] 1.65 1.78 1.91 1.72 1.81 1.68 > festrae la terza e quarta colonna > Dati[, 3:4] 14/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx 2.2.1 Liste Le liste sono insiemi di oggetti di natura e dimensione diversa. Per questo motivo, sono spesso usate per raccogliere i risultati di un'analisi. Per generare una lista sì impiega la funzione list. Costruiamo una lista, i cui elementi sono la nostra matrice dei dati, ed il vettore x, generato nell'esempio delle sequenze di numeri. > Lista = list(Dati, x) > Lista [0] ETA PESO ALTEZZA SESSO PROV 1 19 50 1.68 F RM 222 75 1.78 M RM 3 2180 1.91 M_ TO 4/23 56 1.72 F_NA 8 22 758 1.81 M_ TO 6 2058 1.68 F_NA [2]] [i] 3 6 91215 Di default gli oggetti in una lista non sono identificati con un nome, ma solo con un numero. Per assegnare un nome a ciascun oggetto della lista si usa la funzione names, imputando un vettore di stringhe della stessa lunghezza del numero di oggetti* > names(Lista) = c("Dati", "sequenza") > Lista $Dati ETA PESO ALTEZZA SESSO PROV 1 19 50 1.65 F_RM 222 75 1.78 MUORM 3 21 80 1.91 MH TO 4 23 56 1.72 FNM 5 22 75 1.81 H TO 6 20 58 1.68 FM $soquenza 1] 3 6 91215 Per estrarre un oggetto da una lista si può scrivere nomelista[[numerooggetto]] Qualora ai diversi oggetti sîa stato assegnato un nome, si può anche scrivere nonelista$nomeoggetto, - Quindi, per estrarre il secondo elemento della lista si può scrivere, alternativamente: La stessa funzione può essere impiegata per modificare i nomi degli oggetti di una lista, delle colonne di una matrice di dati. 16 16/50 5/15/25, 9:42 PM ‘about:blank Dispensa Rx > Lista[(2]] [1] 3 6 91215 > Lista$sequenza [1] 3 6 91215 2.3 Caricare dati da fonti esterne E? raro che i dati vengano inseriti “a mano”, come negli esempi precedenti. La situazione più comune è che vengano inseriti a partire da file esterni. R è in grado di leggere dati in praticamente qualsiasi formato®. In questa sezione vedremo come caricare in R dati che sono stati salvati sotto forma di testo, soluzione molto comune, con estensioni .txt 0 .csv. Per caricare questo tipo di dati si impiega la funzione read. table(), che, con le opportune specificazioni, è in grado di leggere file salvati con queste ed altre estensioni. Consideriamo il file “exams.txt”, che contiene i voti riportati in cinque materie da sei studenti. In questa matrice di dati le variabili sono gli esami e gli studenti sono le unità. Nella prima riga ci sono i nomi delle variabili, ossia gli esami sostenuti dagli studenti Perché R sia in grado di caricare questi dati, occorre indicare al programma dove si trova il file. Qualora il file si trovasse in un'altra cartella diversa dal workspace occorre indicare tutto il percorso, per permettere al programma di individuare la cartella. Ad esempio, se la cartella dove si trovano i dati fosse "D:/my documents/data", si dovrebbe scrivere: read.table("D:/my documents/data/exams.txt", header = TRUE) dove l'argomento header posto uguale a TRUE sta a significare che la prima riga della matrice di dati contiene i nomi delle variabili. Se, invece, la cartella in cui si trovano i dati è quella definita come spazio di lavoro, non serve indicarla. La soluzione più semplice è, quindi, copiare il file nella nostra cartella "C:/lezioniR", in modo che il programma sia in grado di individuare i dati immediatamente, e scrivere: > exams = read.table("exams.txt", header = TRUE) > str(exams) 'data. frame! : 6 obs. of 5 variables: $ Economia! 18 30 23 21 30.27 $ EconomiaII 20 30 25 22 30 30 $ Statistical 21 30 22 25 30 26 $ StatisticalI: int 19 30 22 24 30 28 $ Marketing: int 26 30 28 28 26 24 > exans FTramite il pacchetto foreign, R è in grado di leggere e salvare dati in formati provenienti da altri programmi di analisi statistica, come Stata, SPSS e SAS. 17 17/50 5/15/25, 9:42 PM Dispensa Rx ‘about:blank 19/50 5/15/25, 9:42 PM Dispensa Rx ‘about:blank 20/50