library('abind') library('relimp') source('http://knuth.uca.es/repos/R-contribuciones/animated.graphics/R/animated.pie.R') source('http://knuth.uca.es/repos/R-contribuciones/animated.graphics/R/animated.barplot.R') colPercents <- function(tab, digits=1){ dim <- length(dim(tab)) if (is.null(dimnames(tab))){ dims <- dim(tab) dimnames(tab) <- lapply(1:dim, function(i) 1:dims[i]) } sums <- apply(tab, 2:dim, sum) per <- apply(tab, 1, function(x) x/sums) dim(per) <- dim(tab)[c(2:dim,1)] per <- aperm(per, c(dim, 1:(dim-1))) dimnames(per) <- dimnames(tab) per <- round(100*per, digits) result <- abind(per, Total=apply(per, 2:dim, sum), Count=sums, along=1) names(dimnames(result)) <- names(dimnames(tab)) result } rowPercents <- function(tab, digits=1){ dim <- length(dim(tab)) if (dim == 2) return(t(colPercents(t(tab), digits=digits))) tab <- aperm(tab, c(2,1,3:dim)) aperm(colPercents(tab, digits=digits), c(2,1,3:dim)) } cat('\nAnálisis de los datos titanic\n\n') cat('\n En la base de datos titanic.dat se encuentran recogidas las variables Class, Sex, Survived y Age de los pasajeros del famoso transatlántico. Se desea conocer si existe relación entre las personas que sobreviviron y la clase a la que pertenecían.\n') ################################################### ### chunk number 1: ################################################### #data(titanic) titanic<-read.table("http://knuth.uca.es/repos/ebrcmdr/bases_datos/titanic.dat", header=TRUE, sep="", na.strings="NA", dec=".", strip.white=TRUE) ################################################### ### chunk number 2: ################################################### cat('\nDatos titanic cargados. ¿Desea visualizarlos? [y/n]') res<-scan(nmax=1,what='character',quiet=T) if(res=='y') showData(titanic) cat('\nEs interesante para nuestro estudio construir la tabla de doble entrada con las variables Class y Survived\n\n') ################################################### ### chunk number 3: ################################################### tabla<-xtabs(~Survived+Class, data=titanic) print(tabla) cat('\n\nSe observa según esta tabla que el número de supervivientes de primera clase y de la tripulación es aproximadamente el mismo en valor absoluto. Pero esto no indica que la supervivencia fuese independiente de la clase pues el número de personas de primera clase era muy inferior al de la tripulación. Para establecer si existe relación entre la clase y la supervivencia recurrimos al test de la Chi-cuadrado:') cat('\nPulse intro para continuar...') scan(nmax=1,what='character',quiet=T) ################################################### ### chunk number 4: ################################################### print(chisq.test(tabla,correct=FALSE)) cat('\nEl valor del estadístico Chi-cuadrado cuantifica la relación existente entre la variable Class y Survived. En este caso indica cierta relación pero no se puede afirmar qué intensidad existe entre ambas variables, para ello se utiliza el coeficiente de contingencia, que está acotado entre 0 y 1.\n\n') ################################################### ### chunk number 5: ################################################### chisq<-190.4011 n<-length(titanic$Class) cat(' C =',sqrt(chisq/(chisq+n)));cat('\n') cat('\nEl valor de C indica una cierta relación entre ambos atributos. Para poder visualizar la relación entre las variables puede ser muy útil la realización de un diagráma de barras de la variable Survived según la clase de los pasajeros Class.\n') cat('\nPulse intro para continuar...') scan(nmax=1,what='character',quiet=T) ################################################### ### chunk number 6: ################################################### animated.barplot(tabla,steps=100,xlab='Clase',ylab='Frecuencia',legend.text=c('No superviviente','Superviviente'),beside=TRUE,col=cm.colors(2)) cat('\nObservando el diagrama de barras de valores absolutos se aprecia lo deducido en su tabla de contingencia, i. e. el número de supervivientes de primera clase es muy similar al de la tripulación.\n') cat('\nAntes de seguir con el análisis de los datos titanic observamos que la etiqueta de las barras se solapa con el gráfico.\n Para crear una etiqueta en la posición adecuada pulse con el botón izquierdo del ratón en dicha posición.\n\nPulse intro para comenzar...') scan(nmax=1,quiet=T) r<-'y' while(r=='y'){ barplot(tabla,xlab="Clase",ylab="Frecuencia",beside=TRUE,col=cm.colors(2)) a<-locator(1) legend(x=a[1],y=a[2],legend=c("No superviviente","Superviviente"),fill=cm.colors(2)) cat('\n¿Desea cambiar la etiqueta? [y/n]: ') r<-scan(nmax=1,what='character',quiet=T) } cat('\nProsigamos con el estudio de titanic...\n') cat('\nUna alternativa para apreciar la relación existente entre los dos atributos es construir el diagrama de barras de las frecuencias relativas, o porcentajes de supervivencia respecto a cada clase, en lugar de utilizar las frecuencias absolutas.\n') cat('\nPulse intro para continuar...') scan(nmax=1,what='character',quiet=T) ################################################### ### chunk number 7: ################################################### tablaux<-colPercents(tabla) tablarel<-tablaux[1:2,1:4] animated.barplot(tablarel,steps=100,xlab='Clase',ylab='Frecuencia relativa',legend.text=c('No superviviente','Superviviente'),beside=TRUE,col=cm.colors(2)) cat('\nSe puede observar como las barras de supervivencia disminuyen a medida que pasamos de primera clase a tripulación, como muestra la tabla de contingencia en porcentajes respecto de cada clase.\n Otro gráfico que puede ayudar a entender la supervivencia por clases es el diagrama de sectores de las personas no supervivientes agrupados por clases.\n') cat('\nPulse intro para continuar...') scan(nmax=1,what='character',quiet=T) ################################################### ### chunk number 8: ################################################### cat('\n\n') print(tablaux) ################################################### ### chunk number 9: ################################################### tablafila<-rowPercents(tabla) animated.pie(tablafila[1,1:4],main='No supervivientes') cat('\nPor último se construirá un gráfico de mosaico con todos los atributos del fichero titanic.\n') cat('\nPulse intro para continuar...') scan(nmax=1,what='character',quiet=T) ################################################### ### chunk number 10: ################################################### mosaicplot(table(titanic),main='Supervivientes del Titanic',color=c('red','green'))