Problema 2 Considere los datos “titanic.csv”, sobre la tragedia del Titanic. Una descripción detallada de las variables puede ser consultada en el siguiente link: https://www.kaggle.com/c/titanic/data.
tabla<-read.csv("titanic.csv")
tabla<-data.frame(tabla)
summary(tabla)
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 Min. : 0.00
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 1st Qu.: 7.91
## Median :0.000 Median :0.0000 CA. 2343: 7 Median : 14.45
## Mean :0.523 Mean :0.3816 3101295 : 6 Mean : 32.20
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 3rd Qu.: 31.00
## Max. :8.000 Max. :6.0000 CA 2144 : 6 Max. :512.33
## (Other) :852
## Embarked Title
## C :168 Master : 40
## Q : 77 Miss :185
## S :644 Mr :517
## NA's: 2 Mrs :126
## Rare Title: 23
##
##
#según mi consideración, la familia esta contemplada por "sibsp+parch", y para lograr incluir al pasajero se sumará 1
#sibsp # de hermanos / cónyuges a bordo del Titanic
#parch # de padres / hijos a bordo del Titanic
#PASAJERO = 1
#CREAREMOS LA NUEVA VARIABLE TTF= TAMAÑO TOTAL FAMILIA
names(tabla) #observar los nombres de las variables
## [1] "PassengerId" "Survived" "Pclass" "Name" "Sex"
## [6] "Age" "SibSp" "Parch" "Ticket" "Fare"
## [11] "Embarked" "Title"
str(tabla) #ver el contenido con mas detalle
## 'data.frame': 891 obs. of 12 variables:
## $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
## $ Survived : int 0 1 1 1 0 0 0 0 1 1 ...
## $ Pclass : int 3 1 3 1 3 3 1 3 3 2 ...
## $ Name : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
## $ Sex : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
## $ Age : num 22 38 26 35 35 NA 54 2 27 14 ...
## $ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
## $ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
## $ Ticket : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
## $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
## $ Embarked : Factor w/ 3 levels "C","Q","S": 3 1 3 3 3 2 3 3 3 1 ...
## $ Title : Factor w/ 5 levels "Master","Miss",..: 3 4 2 4 3 3 3 1 4 4 ...
hermanosconyuges<-head(tabla$SibSp)
padreshijos<-head(tabla$Parch)
tabla$TTF<- tabla$SibSp+tabla$Parch+1
#la nueva variable
head(tabla$TTF, 20) #MUESTRA LOS PRIMEROS 20 VALORES DE LA VARIABLE TTF
## [1] 2 2 1 2 1 1 1 5 3 2 3 1 1 7 1 1 6 1 2 1
summary(tabla$TTF)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.905 2.000 11.000
#donde STTF= RELACION ENTRE SOBREVIVIENTES Y TAMAÑO DE FAMILIA
#STTF$proporcion = (tabla$TTF, tabla$Survived)=0/((tabla$TTF, tabla$Survived)=1+(tabla$TTF, tabla$Survived)=0)
STTF<-table(tabla$TTF, tabla$Survived)
STTF<-data.frame("0"=STTF[,1],"1"=STTF[,2])
STTF$proporcion<-(STTF$X1/(STTF$X1+STTF$X0))
MUERE<-(STTF$X0)
VIVE<-(STTF$X1)
MUEREVIVE<-data.frame(MUERE,VIVE)
summary(STTF)
## X0 X1 proporcion
## Min. : 6 Min. : 0 Min. :0.0000
## 1st Qu.: 8 1st Qu.: 3 1st Qu.:0.1364
## Median : 12 Median : 4 Median :0.3035
## Mean : 61 Mean : 38 Mean :0.3143
## 3rd Qu.: 43 3rd Qu.: 59 3rd Qu.:0.5528
## Max. :374 Max. :163 Max. :0.7241
plot(MUERE, type = "o", ylim = c(0, max(MUERE, VIVE)), col = "RED") ## EL PLOT IMPRIME CON UNA VARIABLE "MUERE" Y LA UNE CON LA VARIABLE "VIVE"
lines(VIVE, type = "o", lty = 2, col = "BLUE") ## ESTA VARIABLE SE SUMA AL PLOT ANTERIOR, AGREGANDO ASI LA VARIABLE "VIVE"
#SEGÚN EL GRÁFICO ANTERIOR PODEMOS CONCLUIR QUE, LOS GRUPOS FAMILIARES COMPUESTOS DE 2 A 4 INTEGRANTES TIENEN MAYOR PROBABILIDAD DE SOBREVIVIR A LA CATASTROFE.
#SE DIVIDIRÁN POR CATEGORIAS 1= PROB ALTA DE MUERE, [2,4]= PROB DE SOBREVIVIR, >=5 PROB DE MUERTE
#SE CREA EL NUEVO DATA.FRAME CON LAS TRES CATEGORIAS QUE SE OBSERVARON EN EL PUNTO ANTERIOR
tabla$DISfamilia[tabla$TTF == 1] <- 1
tabla$DISfamilia[tabla$TTF < 5 & tabla$TTF > 1] <- 2
tabla$DISfamilia[tabla$TTF > 4] <- 3
v<-data.frame(tabla$DISfamilia,tabla$TTF, MUEREVIVE$MUERE, MUEREVIVE$VIVE) #NUEVO DATA.FRAME CON DISCRETIZACION
#GRAFICAMENTE SE PUEDE MOSTRAR LA DISCRETIZACIÓN POR EL MÉTODO DEL ÁRBOL
library(rpart) # performing regression trees
library(rpart.plot) # plotting regression trees
library(ipred) # bagging
library(caret) # bagging
## Loading required package: lattice
## Loading required package: ggplot2
m1 <- rpart(
formula = tabla$DISfamilia ~ .,
data = v,
method = "anova"
)
rpart.plot(m1)
######CASO 1 = EMBARKED SE OBSERVAN SOLO 2 DATOS CON NA, POR LO QUE SE PODRÍAN ELIMINAR DE LA TABLA.
na_embarked <- tabla[is.na(tabla$Embarked),]
#proceso para eliminar filas NA
na_embarked2<-data.frame(na_embarked)
na_embarked2[!is.na(na_embarked$Embarked),]
######CASO 2 = "AGE" SE OBSERVA GRAN CANTIDAD DE NA, EXISTEN DOS OPCIONES LA PRIMERA ES ELIMINAR LA VAIABLE EN CASO DE NO PRESENTAR GRAN UTILIDAD, LA SEGUNDA ES USAR ALGÚN MÉTODO PARA DAR UN VALOR A NA.
na_age <- tabla[is.na(tabla$Age),]
#PRIMERO CONTAREMOS LOS NULOS POR COLUMNA
sapply(na_age, function(x) sum(is.na(x))) #se encuentran 177 nulos de 891 datos
## PassengerId Survived Pclass Name Sex Age
## 0 0 0 0 0 177
## SibSp Parch Ticket Fare Embarked Title
## 0 0 0 0 0 0
## TTF DISfamilia
## 0 0
summary(na_age$Age)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## NA NA NA NaN NA NA 177
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
# NA NA NA NaN NA NA 177
#Existen demasiados NA 177, se debe ver otro método que simplemente repetir la media.
tablaage<-tabla$Age
tg<-data.frame(tablaage)
#ahora se eliminaran todas las filas con valor nulo para limpiar los datos y que sirvan para realizar calculos
datostg <- na.omit(tg)
summary(datostg)
## tablaage
## Min. : 0.42
## 1st Qu.:20.12
## Median :28.00
## Mean :29.70
## 3rd Qu.:38.00
## Max. :80.00
# tablaage
#Min. : 0.42
#1st Qu.:20.12 ***
#Median :28.00 ****
#Mean1 :29.70 ****
#3rd Qu.:38.00 ***
#Max. :80.00
valorgenerado<-sample(20:38,177,replace=T) #SE GENERAN NUMEROS ALEATORIOS ENTRE EL 1ER Y 3ER QUINTIL QUE LUEGO SE REEEMPLAZARÁN POR LOS NA
tg[is.na(tg)] <- valorgenerado #OPERATORIA DE REEMPLAZO DE NA POR VALORES GENERADOS
TABLAAGE_ARREGLADA<-data.frame(tg)
summary(TABLAAGE_ARREGLADA)
## tablaage
## Min. : 0.42
## 1st Qu.:22.00
## Median :29.00
## Mean :29.58
## 3rd Qu.:36.00
## Max. :80.00
# tablaage
#Min. : 0.42
#1st Qu.:22.00 ***
#Median :28.00 ****
#Mean2 :29.45 ****
#3rd Qu.:36.00 ***
#Max. :80.00
#CONCLUSIÓN CASO 2, EL MÉTODO ANTERIOR ES ACEPTADO YA QUE LAS MEDIAS SON CASI IGUALES MEAN1=29.7 Y MEAN2=29.45
te<-data.frame(tabla$Embarked) #generamos data.frame para mayor comodidad de operación.
sapply(te, function(x) sum(is.na(x))) # contamos el numero de NA que es NA=2
## tabla.Embarked
## 2
te[is.na(te)] <- "C"
Cte<-data.frame(te)
sapply(Cte, function(x) sum(is.na(x))) # contamos el numero de NA que es NA=0 , ASI SE COMPRUEBA QUE LA OPERACIÓN ESTÁ BIEN REALIZADA.
## tabla.Embarked
## 0
#PARA LA EDAD CONSIDERAMOS LA VARIABLE CREADA EN EL PUNTO (6) TABLAAGE_ARREGLADA, YA QUE ESTÁ REEMPLAZÓ LOS NA EN BASE A LOS CUARTILES, INCLUYENDO UN RANGO ENTRE 20 Y 38 AÑOS, CON UNA MEDIA DE 29.45, MEDIA CERCANA A LA MEDIA INICIAL.
tabla$Age<-TABLAAGE_ARREGLADA
tabla$Embarked<-Cte
View(tabla) #ESTA ES LA NUEVA TABLA CON LOS CAMBIOS REALIZADOS.