Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Data Processing con R

Una panoramica delle principali funzioni per il processamento e l'analisi statistica dei dati, utilizzando il linguaggio R.
Una panoramica delle principali funzioni per il processamento e l'analisi statistica dei dati, utilizzando il linguaggio R.
Link copiato negli appunti

Il data.frame può essere considerato il tipo principale di struttura presente in R. Si tratta di una tabella in cui ogni colonna, contraddistinta da un nome, contiene valori di una specifica variabile. Tipicamente, nelle elaborazioni, un data.frame viene caricato dall'importazione di dati provenienti da una sorgente esterna. In questo caso, al fine di prendere confidenza con il concetto, ne creeremo uno noi, allineando vettori uno di fianco all'altro:

> persone <- data.frame(nomi=c("Franco", "Eugenio", "Andrea", "Marco", "Lorenzo", "Marco"),
+  cognomi=c("Rossi","Bianchi","Neri","Rossi","Gialli","Bianchi"),
+ eta=c(45,61,18,29,33,54),
+ citta=c("Roma","Milano","Napoli","Roma","Torino","Verona"))
> persone
     nomi cognomi eta  citta
1  Franco   Rossi  45   Roma
2 Eugenio Bianchi  61 Milano
3  Andrea    Neri  18 Napoli
4   Marco   Rossi  29   Roma
5 Lorenzo  Gialli  33 Torino
6   Marco Bianchi  54 Verona

Una volta in possesso di questi dati, possiamo iniziare a vedere come prelevarli:

  • righe o singoli valori:
    > persone[2,] 	# pensiamolo come un record di una classica tabella
         nomi cognomi eta  citta
    2 Eugenio Bianchi  61 Milano
    > persone[2,"eta"]   # praticamente una cella della tabella
    [1] 61

    Si noti che, nella prima ricerca, la virgola è necessaria per far ben intendere che vogliamo ottenere tutti i valori della riga.
  • colonne:
    > persone["eta"]
      eta
    1  45
    2  61
    3  18
    4  29
    5  33
    6  54
    > persone[3]
      eta
    1  45
    2  61
    3  18
    4  29
    5  33
    6  54
    > persone$eta
    [1] 45 61 18 29 33 54
    > persone[["eta"]]
    [1] 45 61 18 29 33 54

    I primi due esempi di prelevamento del campo eta restituiscono un data.frame, mentre il terzo e il quarto producono un vettore di interi.

Le doti di sintesi di R risultano più evidenti quando si applicano dei filtri ai dati. Selezioniamo, ad esempio, tutti i soggetti con più di 29 anni:

> persone[persone$eta>29,]
     nomi cognomi eta  citta
1  Franco   Rossi  45   Roma
2 Eugenio Bianchi  61 Milano
5 Lorenzo  Gialli  33 Torino
6   Marco Bianchi  54 Verona

È stato sufficiente imporre un vincolo tra le parentesi quadre. In alternativa, con una sintassi dall'aspetto più procedurale, si può ricorrere alla funzione subset. La seguente espressione fornirà il medesimo risultato dell'istruzione precedente:

> subset(persone, eta>29)

Si può ricorrere a selezioni sempre più raffinate, come la seguente:

> subset(persone, eta>20 & cognomi=="Bianchi")
     nomi cognomi eta  citta
2 Eugenio Bianchi  61 Milano
6   Marco Bianchi  54 Verona

È stato chiamato in causa l'operatore & (AND logico) ma, in caso di necessità, si potrebbe utilizzare anche il simbolo | per rappresentare l'OR.

Il data.frame da vicino

Il nostro data.frame non è molto esteso, ma solitamente la mole di dati che si vuole processare è piuttosto imponente. Per questo motivo, esiste una funzione denominata summary che ha lo scopo di "riassumere" brevemente, in qualche modo, i dati:

> summary(persone)
      nomi      cognomi       eta           citta
 Andrea :1   Bianchi:2   Min.   :18.00   Milano:1
 Eugenio:1   Gialli :1   1st Qu.:30.00   Napoli:1
 Franco :1   Neri   :1   Median :39.00   Roma  :2
 Lorenzo:1   Rossi  :2   Mean   :40.00   Torino:1
 Marco  :2               3rd Qu.:51.75   Verona:1
                         Max.   :61.00

Come si vede, summary esplora la tabella per colonne, offrendo un conteggio della distribuzione dei valori per città, nomi e cognomi mentre sull'età, trattandosi di numeri interi, ne approfitta per svolgere qualche operazione statistica tipo calcolo di media e mediana, massimo, minimo e quartili.

Altra funzione che ci permette di approfondire la nostra conoscenza del data.frame è str, in grado di indagarne la struttura.

> str(persone)
'data.frame':   6 obs. of  4 variables:
 $ nomi   : Factor w/ 5 levels "Andrea","Eugenio",..: 3 2 1 5 4 5
 $ cognomi: Factor w/ 4 levels "Bianchi","Gialli",..: 4 1 3 4 2 1
 $ eta    : num  45 61 18 29 33 54
 $ citta  : Factor w/ 5 levels "Milano","Napoli",..: 3 1 2 3 4 5

Il risultato in output propone una descrizione di ogni colonna: quella relativa al campo eta non ci sorprende, riferendo di elementi numerici, ma nelle altre si nomina un elemento che non abbiamo ancora incontrato: il Factor.

Un Factor è la forma che assume in R ciò che in Statistica viene chiamata variabile categoriale, non frutto di misurazioni ma indicante spesso la qualità di qualcosa. I livelli (o Levels) che vengono nominati sono i valori che la variabile assume.

Applicazione di funzioni

Sebbene in questa sede non ci si voglia addentrare nei meandri delle Scienze Statistiche, ci sono funzioni che un informatico comunemente usa nell'ambito dei database, e per le quali esiste un corrispondente in R.

Ad esempio, se volessimo conoscere l'età media, massima o minima delle persone presenti nel data.frame, potremmo procedere come segue:

> mean(persone$eta)
[1] 40
> min(persone$eta)
[1] 18
> max(persone$eta)
[1] 61
> sum(persone$eta)
[1] 240

Anche se non ha molto senso calcolare la somma delle età dei soggetti presenti nella tabella, l'abbiamo fatto ugualmente nell'esempio al fine di menzionare l'utilizzo della funzione sum.

Le funzioni aggregative possono risultare utili nella composizione di tabelle di contingenza che ricordano l'uso di funzioni di aggregazione in casi di raggrupamento dei dati. Uno dei modi per poter svolgere ciò in R consiste nell'impiego della funzione tapply, tramite la quale potremo manovrare l'utilizzo delle funzioni appena citate. Seguono alcuni esempi.

Si può effettuare, ad esempio, il calcolo dell'età media per città:

> X<-tapply(persone$eta, persone$citta,max)
> X
Milano Napoli   Roma Torino Verona
    61     18     45     33     54

Il primo argomento dice su quale campo vogliamo applicare la funzione indicata al terzo parametro, mentre il secondo indica in base a quale colonna di valori effettueremo l'aggregazione. L'utilizzo della funzione class ci permetterà di esplorare i tipi di dato dei risultati ottenuti:

> class(X)
[1] "array"
> d<-X["Milano"]
> class(d)
[1] "numeric"

Notiamo così che ogni elemento è stato reso come un array composto da valori numerici.

L'aggregazione può essere condotta anche sfrutttando più campi contemporaneamente:

> tapply(persone$eta, list(persone$citta,persone$nomi),mean)
       Andrea Eugenio Franco Lorenzo Marco
Milano     NA      61     NA      NA    NA
Napoli     18      NA     NA      NA    NA
Roma       NA      NA     45      NA    29
Torino     NA      NA     NA      33    NA
Verona     NA      NA     NA      NA    54

In pratica, ciò ci permetterebbe di calcolare l'età media delle persone con lo stesso nome, in una stessa città.

Script e librerie

Abbiamo visto una serie di utili strumenti di R, nonchè una dimostrazione della sinteticità dei suoi comandi. La console interattiva risulta utile per il suo utilizzo immediato, ma costringe spesso a ripetere le medesime operazioni (cosa, a volte, evitabile salvando l'area di lavoro al termine della sessione). Per ovviare a ciò, si possono utilizzare script costituiti da normali file di testo che potranno essere passati in lettura all'interprete. Inoltre, il progetto CRAN mette a disposizione molti package che possono essere integrati nel nostro ambiente di lavoro: ciò risulterà molto utile per lavori specifici.

Ti consigliamo anche