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 elaboratiReportistica
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 → Organizzazione → Sedi UOS → Ancona → Formazionewww.ismar.cnr.it
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 ( 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 x i 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.