# [ sono riprodotte solo alcune immagini; per le altre uscite grafiche # e alfanumeriche eseguire i comandi ] # Vediamo come analizzare i dati raccolti in una tabella come questa, in cui, # per 20 individui, è indicato con 1/2 il sesso maschile/femminile, con 1,2,3 # la fascia (crescente) di reddito, con 0,1, il numero di auto possedute dal # nucleo familiare, con 0/1 se non si è/si è fumatori. # I dati sono stati raccolti nel file "sraf" (gli 'a capo' sono stati messi # per facilitare la lettura: R "capisce" che il comnado è su più righe) sraf <- c( 1,1,1,0, 1,3,1,0, 2,3,2,0, 2,2,0,1, 2,3,3,0, 2,1,1,0, 1,2,1,0, 2,1,2,1, 2,2,1,1, 2,1,0,0, 1,2,1,1, 1,1,2,0, 1,1,2,1, 1,2,0,0, 2,3,3,0, 1,1,1,0, 1,3,2,0, 2,1,2,1, 2,2,0,1, 2,3,3,0) # Ora voglio metterli in una tabella 20×4. Provo: sraf1 <- matrix(sraf, nrow=20, ncol=4); sraf1 # Dalle uscite capisco che il programma ha letto i dati colonna per colonna. # Per farglieli leggere riga per riga dovevo introdurre i dati diversamente: # sraf <- c( # 1,1,2,2,2,2,1,2,2,2,1,1,1,1,2,1,1,2,2,2, # 1,3,3,2,3,1,2,1,2,1,2,1,1,2,3,1,3,1,2,3, # 1,1,2,0,3,1,1,2,1,0,1,2,2,0,3,1,2,2,0,3, # 0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,1,1,0) # Questo sarebbe il modo standard da impiegare. # Oppure posso fare così: sraf1 <- matrix(sraf, nrow=20, ncol=4, byrow=TRUE) sraf1 # OK. Posso aggiungere i "nomi": i numeri da 1 a 20 per le righe, i nomi # che rappresentano che cosa sono i vari dati per le colonne: nomi <- list(1:20,c("sesso","reddito","n.auto","fumo")) sraf1 <- matrix(sraf, nrow=20, ncol=4, byrow=TRUE, dimnames=nomi) sraf1 # La tabellina sopra raffigurata posso visulizzarla col comando seguente # ( poi la chiudo cliccando [x] ) edit(sraf1) # # Voglio estrarre ed esaminare i dati della prima colonna (sesso) sesso <- sraf1[,1]; sesso # e farne l'istogramma hist(sesso) # Mi conviene scegliere gli estremi degli intervalli, centrati in 1 e 2: hist(sesso,c(0.5,1.5,2.5),col="yellow") # Aggiungo una griglia, tracciando delle rette orizzontali tratteggiate abline(h=1:11,lty=3) # Tracciamo l'istogramma con le densità invece che con le frequenze assolute. hist(sesso,c(0.5,1.5,2.5),freq=FALSE,col="yellow") abline(h=seq(0.1,0.6,0.1),lty=3) # Posso stabilire la scala verticale in modo da leggere meglio l'istogramma: hist(sesso,c(0.5,1.5,2.5),freq=FALSE,col="yellow",ylim=c(0,0.6)) abline(h=seq(0.1,0.6,0.1),lty=3) # Posso colorare diversamente le colonne e mettere un titolo alternativo: hist(sesso,c(0.5,1.5,2.5),freq=FALSE,ylim=c(0,0.6),col=c("cyan","pink"),main="M/F") abline(h=seq(0.1,0.6,0.1),lty=3) # # Posso affiancare i due istogrammi in finestre diverse, col comando dev.new: dev.new(width=3,height=3,xpos=100,ypos=30) # dimensiono la prima finestra hist(sesso,c(0.5,1.5,2.5),col="yellow") dev.new(width=3,height=3,xpos=500,ypos=30) # dimensiono l'altra ugualmente ma la sposto a destra hist(sesso,c(0.5,1.5,2.5),freq=FALSE,col="yellow") # Chiudiamo le due finestre grafiche. # # Posso impiegare il comando dev.new tutte le volte che voglio conservare # i grafici precedenti. # # Posso mettere i due istogrammi in un'unica finestra suddivisa in parti: dev.new(width=5,height=3); par(mfrow=c(1,2)) # Ho aperto una finestra grafica, che poi posso ridimensionare col mouse # (potevo anche non aprirla: lo avrebbe fatto automaticamente il programma). # Predispongo R a suddividerla in due parti: 1 riga e 2 colonne hist(sesso,c(0.5,1.5,2.5),col="yellow"); abline(h=axTicks(2),lty=3) hist(sesso,c(0.5,1.5,2.5),freq=FALSE,col="yellow"); abline(h=axTicks(2),lty=3) # Chiudiamo la finestra. # # Un modo "testo" per ottenere gli istogrammi è il comando stem che traccia # il diagramma stem-and-leaf. Vediamolo del reddito (3ª colonna): stem(sraf1[,3]) # [,n] indica l'n-ma colonna, [n,] l'n-ma riga # # Come analizzare congiuntamente reddito e numero di auto possedute? ra <- sraf1[,2:3]; ra # traccio i punti "reddito, n.auto": plot(ra) # o, meglio: plot(ra,pch=19) abline(h=axTicks(2),v=axTicks(1),col="red",lty=3) # Ci sono molti punti sovrapposti. Potremmo fare un istogramma tridimensionale. # Vediamo un modo più semplice, costruendo una tabella. # Potrei farlo direttamente, classificando i dati: # 0A 1A 2A 3A # R1 1 3 4 0 # R2 3 3 0 0 # R3 0 1 2 3 # (ricordiamo che tabelle a 2 entrate come questa vengono dette "di contingenza") # Facciamolo fare ad R (per avere idea di come farlo in situazioni più complesse) # # Classifichiamo le coppie "reddito, n.auto" # Il numero di "righe" con reddito=i & n.auto=j: fissato (i,j) # conto le righe in cui la prima colonna vale i e la seconda j nra <- function(i,j) {n <- 0; for(h in 1:20) n <- n + ifelse(ra[h,1]==i & ra[h,2]==j,1,0); n} # La matrice "reddito, n.auto" tcra <- c( nra(1,0),nra(2,0),nra(3,0), nra(1,1),nra(2,1),nra(3,1), nra(1,2),nra(2,2),nra(3,2), nra(1,3),nra(2,3),nra(3,3)) nomir <- list(c("R1","R2","R3"),c("0A","1A","2A","3A")) tcra1 <- matrix(tcra,ncol=4,nrow=3,dimnames=nomir) tcra1 # Eccola: # # Rappresentiamo graficamente la tabella con due diagrammi a barre # che traccio nella medesima finestra: dev.new(width=6,height=3); par(mfrow=c(1,2)) barplot(tcra1); abline(h=axTicks(2),lty=3) # Metto come "titolo laterale" i "nomi" title(ylab="R1 R2 R3") # # Nell'altra finestra traccio l'altro diagramma coi dati trasposti # (scambio righe con colonne) tcra2 <- t(tcra1) barplot(tcra2); abline(h=axTicks(2),lty=3) title(ylab="0a 1a 2a 3a") # Nel primo diagramma vedo che, nel nostro piccolo campione, sono di più le # famiglie con un'auto sola e seguono quelle con due. Vedo anche che solo # le famiglie con alto reddito hanno 3 auto. Nel secondo diagramma vedo ...