Escolar Documentos
Profissional Documentos
Cultura Documentos
Os pacotes
Acrescentei este trecho de código R a fim de faciliar na instalação dos pacotes utilizados nesta análise.
# Verificar e instalar o(s) pacote(s) a utilizar na analise.
pacotes_analise <- c("leaps")
suppressMessages(library("rmarkdown"))
library(dplyr)
library(ggplot2) # visualizacao
library(scales) # visualizacao
library(caTools) # previsao - dividindo o conjunto de dados
library(car) # previsao - multicolinearidade e vif
library(leaps) # para regsubsets
1
options(avisar = -1) # Se definir como 0 indica ativar as opções de aviso
# combina dataset
titanic <- bind_rows(train, test)
Primeiro carreguei os pacotes e combinei o conjunto de dados do dataset com o conjunto de dados de teste.
No conjunto de dados de teste não há coluna de variável de resultado associada a sobrevivência, portanto, o
resultado da mesclagem retornará NA.
str(titanic) # mostra a descricao
2
## 4 4 1 1
## 5 5 0 3
## 6 6 0 3
## 7 7 0 1
## 8 8 0 3
## 9 9 1 3
## 10 10 1 2
## Name Sex Age SibSp
## 1 Braund, Mr. Owen Harris male 22 1
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1
## 3 Heikkinen, Miss. Laina female 26 0
## 4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1
## 5 Allen, Mr. William Henry male 35 0
## 6 Moran, Mr. James male NA 0
## 7 McCarthy, Mr. Timothy J male 54 0
## 8 Palsson, Master. Gosta Leonard male 2 3
## 9 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27 0
## 10 Nasser, Mrs. Nicholas (Adele Achem) female 14 1
## Parch Ticket Fare Cabin Embarked
## 1 0 A/5 21171 7.2500 S
## 2 0 PC 17599 71.2833 C85 C
## 3 0 STON/O2. 3101282 7.9250 S
## 4 0 113803 53.1000 C123 S
## 5 0 373450 8.0500 S
## 6 0 330877 8.4583 Q
## 7 0 17463 51.8625 E46 S
## 8 1 349909 21.0750 S
## 9 2 347742 11.1333 S
## 10 0 237736 30.0708 C
Aqui está um resumo dos dez dados para o conjunto de trens. Os pontos que podem ser deduzidos são
de primeira classe a terceira classe porque a tarifa é maior quando a pclass é menor. A próxima melhor
informação é que você pode usar o SibSp e o Parch para descobrir o relacionamento familiar de cada passageiro.
Talvez possamos distinguir pelo sobrenome. Eu não sei o que significa a classificação de cabine.
Finalmente, há uma seção de C, Q, S em relação ao Embarked, a área de embarque, e parece estar faltando.
# colSums(is.na(titanic)|titanic=='')
sapply(train, function(x) sum(is.na(x))) # encontrar valores ausentes
3
## SibSp Parch Ticket Fare Cabin Embarked
## 7 7 681 248 148 4
Em seguida, foi encontrada exclusividade para cada variável. Eu acho que é possível pensar por nível de dados.
No conjunto de dados atual do trem, o PassengerID consiste em 891 níveis. E como o nome é classificado de
acordo com esse número, os nomes das pessoas também podem ser deduzidos da ausência do mesmo nome.
Realizamos temporariamente a análise logit com base nos dados do trem.
# verifique a regressão logística
train$Pclass2 <- as.factor(train$Pclass)
glm_train <- glm(Survived ~ factor(Pclass2)+factor(Sex)+factor(Embarked)+Age+SibSp+Parch+Fare, data=trai
summary(glm_train)
##
## Call:
## glm(formula = Survived ~ factor(Pclass2) + factor(Sex) + factor(Embarked) +
## Age + SibSp + Parch + Fare, family = binomial(link = "logit"),
## data = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.7220 -0.6455 -0.3770 0.6293 2.4461
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 16.691979 607.920015 0.027 0.978095
## factor(Pclass2)2 -1.189637 0.329197 -3.614 0.000302 ***
## factor(Pclass2)3 -2.395220 0.343356 -6.976 3.04e-12 ***
## factor(Sex)male -2.637859 0.223006 -11.829 < 2e-16 ***
## factor(Embarked)C -12.259048 607.919885 -0.020 0.983911
## factor(Embarked)Q -13.082427 607.920088 -0.022 0.982831
## factor(Embarked)S -12.661895 607.919868 -0.021 0.983383
## Age -0.043308 0.008322 -5.204 1.95e-07 ***
## SibSp -0.362925 0.129290 -2.807 0.005000 **
## Parch -0.060365 0.123944 -0.487 0.626233
## Fare 0.001451 0.002595 0.559 0.576143
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 964.52 on 713 degrees of freedom
## Residual deviance: 632.34 on 703 degrees of freedom
## (177 observations deleted due to missingness)
## AIC: 654.34
##
## Number of Fisher Scoring iterations: 13
No conjunto de dados do trem A idade está ausente no modelo porque há 177 valores ausentes. Sugerir que
devemos fazer previsões sobre o valor ausente da Idade no futuro. A idade é uma variável muito importante
porque possui considerável poder explicativo. Com este modelo,
(1) os homens são mais propensos a morrer do que as mulheres
(2) os passageiros de passageiros de primeira classe são mais propensos a sobreviver
(3) Quanto mais jovem quanto mais jovem, maior a probabilidade de sobreviver
4
(4) Quanto menor o SibSp, menor o irmão / irmã, maior a probabilidade de sobreviver.
Se assim for, vamos tentar medir quais variáveis explicativas têm o maior poder preditivo.
regsub <- regsubsets(Survived ~ factor(Pclass)+factor(Sex)+factor(Embarked)+Age+SibSp+Parch+Fare, data=t
summary(regsub)
##
5
## Call:
## glm(formula = Survived ~ factor(Sex) + Age + SibSp + Parch +
## Fare, family = binomial(link = "logit"), data = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.5661 -0.6868 -0.5385 0.7323 2.3106
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.557319 0.286161 5.442 5.27e-08 ***
## factor(Sex)male -2.533418 0.205163 -12.348 < 2e-16 ***
## Age -0.021514 0.007182 -2.996 0.002739 **
## SibSp -0.408306 0.122608 -3.330 0.000868 ***
## Parch -0.232515 0.117337 -1.982 0.047523 *
## Fare 0.017247 0.003143 5.487 4.08e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 964.52 on 713 degrees of freedom
## Residual deviance: 695.26 on 708 degrees of freedom
## (177 observations deleted due to missingness)
## AIC: 707.26
##
## Number of Fisher Scoring iterations: 5
Como esperado, Fare explicou que o * em Pclass surgiu. Em seguida, analisamos quão alto é o poder
explicativo relativo a esses cinco fatores.
regsub2 <- regsubsets(Survived ~ factor(Sex)+Age+SibSp+Parch+Fare, data=train)
summary(regsub2)
6
sapply(titanic, function(x) sum(is.na(x))) # finding missing values
60
factor(Sex)
Age
40 female
male
20
female male
Sex
ggplot(titanic,aes(Pclass,Age)) +
geom_boxplot(aes(fill=factor(Pclass)),alpha=0.5) +
ggtitle("Age distribution based on Pclass")
7
Age distribution based on Pclass
80
60
factor(Pclass)
1
Age
40
2
3
20
1 2 3
Pclass
Eu tirei a distribuição de idade por gênero. Não há grande diferença entre os sexos. Eu desenhei a classe P, a
distribuição de idade de acordo com a classe da sala. A certeza é que os passageiros dos quartos de classe
alta são mais velhos.
FYI: Atualmente o Rggplot não está rodando no ambiente do Juypter Notebook. Como resultado, recebi a
imagem através do R Studio e anexei a imagem. (Eu corrigi o erro depois de instalar o pacote que roda no
notebook Jupyter no R depois)
# Imputação de idade com base em Pclass
impute.age <- function(age,class){
vector <- age
for (i in 1:length(age)){
if (is.na(age[i])){
if (class[i] == 1){
vector[i] <- round(mean(filter(titanic,Pclass==1)$Age, na.rm=TRUE),0)
}else if (class[i] == 2){
vector[i] <- round(mean(filter(titanic,Pclass==2)$Age, na.rm=TRUE),0)
}else{
vector[i] <- round(mean(filter(titanic,Pclass==3)$Age, na.rm=TRUE),0)
}
}else{
vector[i]<-age[i]
}
}
return(vector)
}
imputed.age <- impute.age(titanic$Age,titanic$Pclass)
8
titanic$Age <- imputed.age
Trainset e testset são diferenciados. Em seguida, amostramos aleatoriamente novamente para determinar
a precisão do treinamento no conjunto de trens. Geralmente, a estratificação (amostragem de camada) é
realizada (Raschka, 2016). No entanto, aqui nós amostramos aleatoriamente as amostras com números
aleatórios.
set.seed(123)
split = sample.split(trainset$Survived, SplitRatio = 0.8)
train_split = subset(trainset, split == TRUE)
test_split = subset(trainset, split == FALSE)
cor(train_split[,unlist(lapply(train_split,is.numeric))], use="pairwise.complete.obs")
##
## Call:
## glm(formula = Survived ~ factor(Sex) + Age + SibSp + Parch +
## Fare, family = binomial(link = "logit"), data = train_split)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
9
## -2.3610 -0.6504 -0.5480 0.7148 2.3136
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.612388 0.304442 5.296 1.18e-07 ***
## factor(Sex)male -2.696001 0.208182 -12.950 < 2e-16 ***
## Age -0.019058 0.008071 -2.361 0.018213 *
## SibSp -0.363280 0.107162 -3.390 0.000699 ***
## Parch -0.204586 0.125485 -1.630 0.103025
## Fare 0.012680 0.002757 4.599 4.24e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 949.90 on 712 degrees of freedom
## Residual deviance: 684.33 on 707 degrees of freedom
## AIC: 696.33
##
## Number of Fisher Scoring iterations: 4
vif(classifier)
##
## FALSE TRUE
## 0 91 19
## 1 21 47
# print accuracy
error <- mean(test_split$Survived != y_pred) # Misclassification error
paste('Accuracy of this model is',round(1-error,4))
10
Finalmente, a precisão do meu modelo atual foi medida em 77,53%.
11