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.