set.seed(1)
library(caret)
library(readr)
library(tidyr)
library(dplyr)

Abrimos train.csv

trainSet <- read.csv("C:/Users/DuzzLogic/Google Drive/Cosas/Pendientes/LABSIN/titanic/Archivos/train.csv", stringsAsFactors=FALSE)
trainSet

Ejc 5

En algunos registros del dataset train.csv el campo age se encuentra ausente. Una posible solución consiste en calcular el promedio de la columna age y reemplazar aquellos registros ausentes con dicho promedio.

trainSet$Age[is.na(trainSet$Age)] <- mean(trainSet$Age,na.rm = TRUE)

Luego de remplazar los NA por el promedio el achivo nos queda asi:

trainSet

Ejc 6

Para el caso de los campos Cabin y Embark, no es posible calcular el promedio. Una opción simple consiste en eliminar aquellos registros con dicho campo ausente en vez de eliminar toda la columna.

trainSet1 <- trainSet[!(is.na(trainSet$Cabin) | trainSet$Cabin==""), ]
trainSet1 <- trainSet1[!(is.na(trainSet1$Embarked) | trainSet1$Embarked==""), ]

Observamos el cambio en el archivo

Vemos que al hacer las correcciones del Ejc 6 eliminamos gran parte de los datos.Asi que optamos por eliminar las columnas Cabin y Embarked en vez de eliminar las filas con datos vacios.

trainSet1

Modelo de Machine Learning

Nuestro archivo train.csv es el unico archivo que contiene observaciones, por lo que lo vamos a utilizar para entrenar y evaluar nuestro modelo de machine learning. Primero separamos el archivo train.csv en dos utilizando la funcion createDataPartition. A la función se le indica como parametro la clase (Survive en este caso) y el porcentaje en el que vamos a separar el dataset. En ete caso vamos a separarlo en un 80/20. Es decir 80% del dataset sera para entrenar y un 20% para testear.

Preparamos el archivo

Eliminamos las columnas que no nos interesan.

trainSet<-trainSet %>% select(-Name,-Ticket,-Cabin,-Embarked,-PassengerId,-Fare) #Limpio el archivo de las columnas que no nos interesan

Dividimos el train y armamos con el 80% el train_data (con lo que entrenaremos el modelo) y con el restante 20% el test_data (con quien validaremos el modelo).

train_data_ind <- createDataPartition(trainSet$Survived, p = 0.8, list = FALSE)
train_data <- trainSet[train_data_ind,]
test_data <- trainSet[-train_data_ind,]

train_data

nrow(train_data) #Total para entrenar el modelo
[1] 713
str(train_data)
'data.frame':   713 obs. of  6 variables:
 $ Survived: int  0 1 1 1 0 0 0 0 1 1 ...
 $ Pclass  : int  3 1 3 1 3 3 1 3 3 3 ...
 $ Sex     : chr  "male" "female" "female" "female" ...
 $ Age     : num  22 38 26 35 35 ...
 $ SibSp   : int  1 1 0 1 0 0 0 3 0 1 ...
 $ Parch   : int  0 0 0 0 0 0 0 1 2 1 ...

test_data

nrow(test_data) #Total para validar el model
[1] 178
str(test_data)
'data.frame':   178 obs. of  6 variables:
 $ Survived: int  1 1 0 1 1 1 0 0 0 1 ...
 $ Pclass  : int  2 2 2 3 3 1 2 3 3 1 ...
 $ Sex     : chr  "female" "male" "male" "female" ...
 $ Age     : num  14 29.7 35 15 38 ...
 $ SibSp   : int  1 0 0 0 1 1 0 0 0 1 ...
 $ Parch   : int  0 0 0 0 5 0 0 0 0 0 ...

Correccion de tipos

El campo Survived tiene los valores [0,1], los cuales pueden incorrectamente considerarse como numeros cuando en realidad se trata de categorias. Para esto resulta necesario convertirlos a factores.

Regresion Logistica

Entrenamos el modelo

RLOG <- glm(formula = train_data$Survived~., train_data, family = binomial(link="logit"))
summary(RLOG)

Call:
glm(formula = train_data$Survived ~ ., family = binomial(link = "logit"), 
    data = train_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.6047  -0.6346  -0.4203   0.6185   2.4018  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  5.294468   0.541555   9.776  < 2e-16 ***
Pclass      -1.190073   0.133926  -8.886  < 2e-16 ***
Sexmale     -2.749109   0.221407 -12.417  < 2e-16 ***
Age         -0.039924   0.008818  -4.528 5.96e-06 ***
SibSp       -0.308058   0.121235  -2.541   0.0111 *  
Parch       -0.179254   0.129768  -1.381   0.1672    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 953.57  on 712  degrees of freedom
Residual deviance: 637.54  on 707  degrees of freedom
AIC: 649.54

Number of Fisher Scoring iterations: 5

Validamos el modelo

glmClass <- predict(RLOG,test_data)
#View(glmClass)
tabla <- table(test_data$Survived, glmClass > 0.5)
tabla
   
    FALSE TRUE
  0   106    8
  1    28   36

Confusion Matrix

confusionMatrix(as.factor(test_data$Survived), as.factor(ifelse(glmClass > 0.5,1,0)))
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 106   8
         1  28  36
                                          
               Accuracy : 0.7978          
                 95% CI : (0.7312, 0.8541)
    No Information Rate : 0.7528          
    P-Value [Acc > NIR] : 0.094289        
                                          
                  Kappa : 0.5285          
                                          
 Mcnemar's Test P-Value : 0.001542        
                                          
            Sensitivity : 0.7910          
            Specificity : 0.8182          
         Pos Pred Value : 0.9298          
         Neg Pred Value : 0.5625          
             Prevalence : 0.7528          
         Detection Rate : 0.5955          
   Detection Prevalence : 0.6404          
      Balanced Accuracy : 0.8046          
                                          
       'Positive' Class : 0               
                                          
LS0tDQp0aXRsZTogIlRpdGFuaWNOb3RlYm9vayINCmF1dGhvcjogIkR1enpMb2dpYyINCmRhdGU6ICJBcHJpbCA3LCAyMDIwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpzZXQuc2VlZCgxKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQojIEFicmltb3MgdHJhaW4uY3N2DQoNCmBgYHtyfQ0KdHJhaW5TZXQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvUGVuZGllbnRlcy9MQUJTSU4vdGl0YW5pYy9BcmNoaXZvcy90cmFpbi5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KdHJhaW5TZXQNCmBgYA0KDQoNCiMgRWpjIDUNCg0KRW4gYWxndW5vcyByZWdpc3Ryb3MgZGVsIGRhdGFzZXQgdHJhaW4uY3N2IGVsIGNhbXBvIGFnZSAgc2UgZW5jdWVudHJhIGF1c2VudGUuIFVuYSBwb3NpYmxlIHNvbHVjacOzbiBjb25zaXN0ZSBlbiBjYWxjdWxhciBlbCBwcm9tZWRpbyBkZSBsYSBjb2x1bW5hIGFnZSB5IHJlZW1wbGF6YXIgYXF1ZWxsb3MgcmVnaXN0cm9zIGF1c2VudGVzIGNvbiBkaWNobyBwcm9tZWRpby4NCg0KYGBge3J9DQp0cmFpblNldCRBZ2VbaXMubmEodHJhaW5TZXQkQWdlKV0gPC0gbWVhbih0cmFpblNldCRBZ2UsbmEucm0gPSBUUlVFKQ0KYGBgDQoNCkx1ZWdvIGRlIHJlbXBsYXphciBsb3MgTkEgcG9yIGVsIHByb21lZGlvIGVsIGFjaGl2byBub3MgcXVlZGEgYXNpOg0KDQpgYGB7cn0NCnRyYWluU2V0DQpgYGANCg0KDQojIEVqYyA2DQoNClBhcmEgZWwgY2FzbyBkZSBsb3MgY2FtcG9zIENhYmluIHkgRW1iYXJrLCBubyBlcyBwb3NpYmxlIGNhbGN1bGFyIGVsIHByb21lZGlvLiBVbmEgb3BjacOzbiBzaW1wbGUgY29uc2lzdGUgZW4gZWxpbWluYXIgYXF1ZWxsb3MgcmVnaXN0cm9zIGNvbiBkaWNobyBjYW1wbyBhdXNlbnRlIGVuIHZleiBkZSBlbGltaW5hciB0b2RhIGxhIGNvbHVtbmEuDQoNCmBgYHtyfQ0KdHJhaW5TZXQxIDwtIHRyYWluU2V0WyEoaXMubmEodHJhaW5TZXQkQ2FiaW4pIHwgdHJhaW5TZXQkQ2FiaW49PSIiKSwgXQ0KYGBgDQoNCmBgYHtyfQ0KdHJhaW5TZXQxIDwtIHRyYWluU2V0MVshKGlzLm5hKHRyYWluU2V0MSRFbWJhcmtlZCkgfCB0cmFpblNldDEkRW1iYXJrZWQ9PSIiKSwgXQ0KYGBgDQoNCg0KIyMjIE9ic2VydmFtb3MgZWwgY2FtYmlvIGVuIGVsIGFyY2hpdm8gDQpWZW1vcyBxdWUgYWwgaGFjZXIgbGFzIGNvcnJlY2Npb25lcyBkZWwgRWpjIDYgZWxpbWluYW1vcyBncmFuIHBhcnRlIGRlIGxvcyBkYXRvcy5Bc2kgcXVlIG9wdGFtb3MgcG9yIGVsaW1pbmFyIGxhcyBjb2x1bW5hcyBDYWJpbiB5IEVtYmFya2VkIGVuIHZleiBkZSBlbGltaW5hciBsYXMgZmlsYXMgY29uIGRhdG9zIHZhY2lvcy4NCg0KYGBge3J9DQp0cmFpblNldDENCmBgYA0KDQojIE1vZGVsbyBkZSBNYWNoaW5lIExlYXJuaW5nDQoNCk51ZXN0cm8gYXJjaGl2byB0cmFpbi5jc3YgZXMgZWwgdW5pY28gYXJjaGl2byBxdWUgY29udGllbmUgb2JzZXJ2YWNpb25lcywgcG9yIGxvIHF1ZSBsbyB2YW1vcyBhIHV0aWxpemFyIHBhcmEgZW50cmVuYXIgeSBldmFsdWFyIG51ZXN0cm8gbW9kZWxvIGRlIG1hY2hpbmUgbGVhcm5pbmcuDQpQcmltZXJvIHNlcGFyYW1vcyBlbCBhcmNoaXZvIGB0cmFpbi5jc3ZgIGVuIGRvcyB1dGlsaXphbmRvIGxhIGZ1bmNpb24gY3JlYXRlRGF0YVBhcnRpdGlvbi4gDQpBIGxhIGZ1bmNpw7NuIHNlIGxlIGluZGljYSBjb21vIHBhcmFtZXRybyBsYSBjbGFzZSAoU3Vydml2ZSBlbiBlc3RlIGNhc28pIHkgZWwgcG9yY2VudGFqZSBlbiBlbCBxdWUgdmFtb3MgYSBzZXBhcmFyIGVsIGRhdGFzZXQuIEVuIGV0ZSBjYXNvIHZhbW9zIGEgc2VwYXJhcmxvIGVuIHVuIDgwLzIwLiBFcyBkZWNpciA4MCUgZGVsIGRhdGFzZXQgc2VyYSBwYXJhIGVudHJlbmFyIHkgdW4gMjAlIHBhcmEgdGVzdGVhci4NCg0KIyMjIFByZXBhcmFtb3MgZWwgYXJjaGl2bw0KDQpFbGltaW5hbW9zIGxhcyBjb2x1bW5hcyBxdWUgbm8gbm9zIGludGVyZXNhbi4NCg0KYGBge3J9DQp0cmFpblNldDwtdHJhaW5TZXQgJT4lIHNlbGVjdCgtTmFtZSwtVGlja2V0LC1DYWJpbiwtRW1iYXJrZWQsLVBhc3NlbmdlcklkLC1GYXJlKSAjTGltcGlvIGVsIGFyY2hpdm8gZGUgbGFzIGNvbHVtbmFzIHF1ZSBubyBub3MgaW50ZXJlc2FuDQpgYGANCg0KRGl2aWRpbW9zIGVsIHRyYWluIHkgYXJtYW1vcyBjb24gZWwgODAlIGVsIHRyYWluX2RhdGEgKGNvbiBsbyBxdWUgZW50cmVuYXJlbW9zIGVsIG1vZGVsbykgeSBjb24gZWwgcmVzdGFudGUgMjAlIGVsIHRlc3RfZGF0YSAoY29uIHF1aWVuIHZhbGlkYXJlbW9zIGVsIG1vZGVsbykuIA0KDQpgYGB7cn0NCnRyYWluX2RhdGFfaW5kIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24odHJhaW5TZXQkU3Vydml2ZWQsIHAgPSAwLjgsIGxpc3QgPSBGQUxTRSkNCnRyYWluX2RhdGEgPC0gdHJhaW5TZXRbdHJhaW5fZGF0YV9pbmQsXQ0KdGVzdF9kYXRhIDwtIHRyYWluU2V0Wy10cmFpbl9kYXRhX2luZCxdDQpgYGANCg0KIyMjIyB0cmFpbl9kYXRhDQoNCmBgYHtyfQ0KbnJvdyh0cmFpbl9kYXRhKSAjVG90YWwgcGFyYSBlbnRyZW5hciBlbCBtb2RlbG8NCnN0cih0cmFpbl9kYXRhKQ0KYGBgDQoNCiMjIyMgdGVzdF9kYXRhDQoNCmBgYHtyfQ0KbnJvdyh0ZXN0X2RhdGEpICNUb3RhbCBwYXJhIHZhbGlkYXIgZWwgbW9kZWwNCnN0cih0ZXN0X2RhdGEpDQpgYGANCg0KDQojIyMgQ29ycmVjY2lvbiBkZSB0aXBvcw0KDQpFbCBjYW1wbyBTdXJ2aXZlZCB0aWVuZSBsb3MgdmFsb3JlcyBbMCwxXSwgbG9zIGN1YWxlcyBwdWVkZW4gaW5jb3JyZWN0YW1lbnRlIGNvbnNpZGVyYXJzZSBjb21vIG51bWVyb3MgY3VhbmRvIGVuIHJlYWxpZGFkIHNlIHRyYXRhIGRlIGNhdGVnb3JpYXMuIFBhcmEgZXN0byByZXN1bHRhIG5lY2VzYXJpbyBjb252ZXJ0aXJsb3MgYSBmYWN0b3Jlcy4NCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KdHJhaW5fZGF0YSRTdXJ2aXZlZCA8LSBhcy5mYWN0b3IodHJhaW5fZGF0YSRTdXJ2aXZlZCkNCnRlc3RfZGF0YSRTdXJ2aXZlZCA8LSBhcy5mYWN0b3IodGVzdF9kYXRhJFN1cnZpdmVkKQ0KYGBgDQoNCiMjIFJlZ3Jlc2lvbiBMb2dpc3RpY2ENCg0KIyMjIyBFbnRyZW5hbW9zIGVsIG1vZGVsbw0KDQpgYGB7cn0NClJMT0cgPC0gZ2xtKGZvcm11bGEgPSB0cmFpbl9kYXRhJFN1cnZpdmVkfi4sIHRyYWluX2RhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbms9ImxvZ2l0IikpDQpzdW1tYXJ5KFJMT0cpDQpgYGANCg0KIyMjIyBWYWxpZGFtb3MgZWwgbW9kZWxvDQoNCmBgYHtyfQ0KZ2xtQ2xhc3MgPC0gcHJlZGljdChSTE9HLHRlc3RfZGF0YSkNCiNWaWV3KGdsbUNsYXNzKQ0KdGFibGEgPC0gdGFibGUodGVzdF9kYXRhJFN1cnZpdmVkLCBnbG1DbGFzcyA+IDAuNSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxhDQpgYGANCg0KDQojIyMjIENvbmZ1c2lvbiBNYXRyaXgNCg0KYGBge3J9DQpjb25mdXNpb25NYXRyaXgoYXMuZmFjdG9yKHRlc3RfZGF0YSRTdXJ2aXZlZCksIGFzLmZhY3RvcihpZmVsc2UoZ2xtQ2xhc3MgPiAwLjUsMSwwKSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQo=