set.seed(1)
library(caret)
library(readr)
library(tidyr)
library(dplyr)
trainSet <- read.csv("C:/Users/DuzzLogic/Google Drive/Cosas/Pendientes/LABSIN/titanic/Archivos/train.csv", stringsAsFactors=FALSE)
trainSet
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
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==""), ]
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
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.
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,]
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 ...
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 ...
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.
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
glmClass <- predict(RLOG,test_data)
#View(glmClass)
tabla <- table(test_data$Survived, glmClass > 0.5)
tabla
FALSE TRUE
0 106 8
1 28 36
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