Elementi di statistica con R
e i database
Rocco De Marco
rocco.demarco(a)an.ismar.cnr.it
Ancona, 19 Aprile 2012
Lezione 4
Il flusso dei dati
Produzione dati
(misurazione,
campionamento,
etc.)
Archiviazione dati grezzi
Validazione dei dati
Elaborazione
Archiviazione dati elaborati
Reportistica
Perché usare i database
• Archivio centralizzato =
•
•
•
•
•
Minore rischio di perdita dei dati
Maggiore disponibilità
Nuove possibilità di elaborazione
Condivisione dei dati a livello di gruppo
Possibilità di creare applicazioni ad hoc per il
flusso dei dati
• Interoperabilità
Vantaggi di R
• Utilizzo di strumenti e librerie di calcolo più
evolute
• Distinzione dei ruoli e delle fasi di elaborazione
• Possibilità di utilizzare un determinato
programma indefinite volte
• Possibilità di sviluppo del programma in team
Vantaggi con R e Database
• Automatizzazione dei processi
• Possibilità di stabilire delle regole di accesso, di
rappresentazione e di utilizzo dei dati
• Riusabilità dei lavori pregressi
• Interoperabilità in progetti in cui partecipano
altri soggetti
Menù del giorno
• Usare R per importare dati in formato CSV su
Database, condito con esempi
• Un esempio di validazione dei dati
• Selezionare i dati da importare
• Generazione automatica di una relazione
partendo da dati archiviati su database
Nota: gli esempi sono disponibili sul sito www.ismar.cnr.it
→ Organizzazione → Sedi UOS → Ancona → Formazione
Importare i dati su db
• Esempio della scuola
– Registro scolastico che abbraccia più studenti, con
voti su distinte materie nell'arco di più anni
– I dati sono in origine presenti su un foglio excel, poi
salvato in formato csv
(voti_scuola.csv)
– I dati saranno importati su db, in seguito faremo
ulteriori elaborazioni
Fasi Operative

Predisporre una connessione ODBC
→ Lezione 2

Installare il pacchetto RODBC
install.packages() → cerco Rodbc

Caricare la libreria RODBC in R
library(RODBC)

A questo punto siamo pronti per iniziare
csv2db (da csv a db)
1) Leggo il csv e lo carico su un data.frame
2) Avvio la libreria RODBC
3) Apro la connessione con il db
4) Salvo il data.frame su DB
5) Chiudo la connessione con il db (importante)
t<-read.table("voti_scuola.csv",header=T,sep=";",dec=".")
library(RODBC)
db<-odbcConnect("source1",case="postgresql")
sqlSave(db, t, tablename="registro_scuola")
close(db)
Un esempio di validazione
• Il modello di riferimento prevede che:
• I dati sono già disponibili in una tabella del db
• I dati vengono elaborati con R
• I dati validati vengono memorizzati su una nuova tabella
del db
• Nel nostro esempio:
• Abbiamo una tabella con due colonne: x e deviazione
standard di x
• Fissata una soglia per la deviazione standard, andremo a
filtrare i dati e a memorizzare i risultati su una nuova
tabella
L'esempio
• L'esempio viene generato usando direttamente
R, usando la funzione rnorm() → vedi
help(rnorm)
library(RODBC)
x<-rnorm(500,5,4)
dati<-data.frame(x=x)
dati$distMean=abs(abs(x)-mean(x))
db<-odbcConnect(“source1”,case=”postgresql”)
sqlSave(db,dati,tablename=”da_validare”)
close(db)
• Con phppgadmin verifichiamo l'avvenuto caricamento
dei dati
(http://dev.an.ismar.cnr.it/phppgadmin/)
• Per leggere i dati dal database e memorizzarli su un
data.frame:
db<-odbcConnect(“source1”,case=”postgresql”)
dati_letti<-sqlFetch(db,”da_validare”)
close(db)
• I passi per il filtraggio:
• I nostri dati sono caricati sul dataframe
dati_letti
• Al momento, con i dati a disposizione, la deviazione
standard è circa 4.
• La colonna “distMean” contiene la distanza assoluta
dell'elemento xi dalla media
• Fissiamo un valore massimo di questa distanza soglia
• Creiamo un nuovo data.frame con i dati che superano il
filtro
• Salviamo il data.frame su una nuova tabella nel database
(dati_Validati)
Il listato completo
library(ODBC)
db<-odbcConnect(“source1”,case=”postgresql”)
# leggo i dati:
dati_letti<-sqlFetch(db,”da_validare”)
# filtraggio:
distanza_max<-3
soglia<-mean(dati_letti$x)+distanza_max
validati<-subset(dati_letti,dati_letti$distMean<soglia)
# salvo i dati su db:
sqlSave(db,validati,tablename=”validati”)
close(db)
Selezionare dati con sql
• La funzione sqlFetch non va utilizzata con
tabelle eccessivamente grandi
• Quello che finora è stato fatto con la funzione
subset di R può essere fatto con l'istruzione
SELECT del linguaggio SQL
• Con la SELECT è possibile mettere in
correlazione più tabelle, con sqlFetch NO
SELECT con R
• Comando equivalente di sqlFetch:
v<-sqlQuery(db,”select * from registro_scuola”)
• Selezionare specifiche colonne:
v<-sqlQuery(db,”select cognome, nome, italiano from
registro_scuola”)
• Selezionare righe con condizioni:
v<-sqlQuery(db,”select * from registro_scuola where anno=2008”)
• Possibilità di ordinamento:
v<-sqlQuery(db,”select * from registro_scuola order by cognome,
nome”)
Relazione con db
• Riutilizziamo l'esempio finale della lezione 3:
• Importiamo, con una sqlSave, il foglio cdv chiamato
“dati2.csv”
• Memorizziamo i dati sul database, in una tabella
chiamata dati_relazione
• Modifichiamo il programma distribuzione.r
in modo da prelevare i dati da db
La modifica
• La modifica necessaria per far funzionare il
programma è minima.
Al posto della read.table vanno inserite le
seguenti righe:
library (RODBC)
db<-odbcConnect(“source1”,case=”postgresql”)
tabella<-sqlFetch(db,”dati_relazione”)
close(db)
...
Nota sui documenti word
• I documenti word generati da file html NON
includono le immagini nel file
• Ricordarsi di copiare nella stessa cartella del
documento word tutte le immagini necessarie,
generate dal programma R
Spunti per il futuro
• Realizzazione struttura database di istituto, con
ridondanza
• Definizione di un percorso
formativo/informativo a livello di sede
• Utilizzo di strumenti informatici di supporto:
– Piattaforma redmine
– Subversion
– Wiki, etc.