Em 15 de abril de 1912, durante sua viagem inaugural, o Titanic afundou após colidir com um iceberg, matando 1502 de 2224 passageiros e tripulação. A tragédia chocou a comunidade internacional e levou a melhores regulamentações de segurança para os navios. Uma das razões que o naufrágio levou a tal perda de vida era que não havia bastantes barcos salva-vidas para os passageiros e tripulação. Embora houvesse algum elemento de sorte envolvido em sobreviver ao afundamento, alguns grupos de pessoas eram mais propensos a sobreviver do que outros, como mulheres, crianças e a classe alta1. Dessa forma, seu papel na conclusão deste trabalho será predizer se existiram passageiros sobreviventes, observando certas características dos mesmos.
Assim, será possível fortificar todo o conhecimento adquirido a partir de cada um dos módulos oferecidos, através de uma prática contínua da mesma base de dados. Você poderá então perceber seus pontos fortes e fracos em cada matéria, podendo assim buscar ajuda revisando o material que lhe foi disponibilizado sempre que necessário.
Vale lembrar que este material é complementar às aulas oferecidas no curso e que o mesmo deve ser desenvolvido em paralelo com as listas de exercícios de cada módulo para que o programa seja totalmente aproveitado.
As bases de dados que serão utilizadas ao longo deste trabalho foram retiradas do desafio da rede Kaggle,2 que é uma das melhores plataformas para cientistas de dados. Esse desafio é o desafio do Titanic, que é o mais utilizado e indicado para pessoas que são iniciantes em ciência de dados. Nele é preciso prever se um passageiro sobreviveu ou não ao naufrágio, sabendo algumas características pessoais do mesmo.
As bases são:
train.csv
test.csv: Essa base, exceto pela coluna survival, contém as mesmas variáveis da base train.csv.
Leia o arquivo train.csv, na pasta datasets, com os dados de alguns passageiros do acidente do Titanic e responda as seguintes questões:
#Primeiro passo é mudar o diretório
setwd("C:\\Users\\anna.barros\\Dropbox\\FGV - Big Data & Data Science - alunos\\01 Big Data & Data Science + Python - Anna\\Turma_3\\datasets")
#Segundo passo é ler o arquivo:
titanic<-read.csv("train.csv")
#variavies
ncol(titanic)
## [1] 12
#observações
nrow(titanic)
## [1] 891
str(titanic)
## '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 ...
## $ Cabin : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
## $ Embarked : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
media<-mean(titanic$Fare)
media
## [1] 32.20421
homens<-titanic[which(titanic$Sex=="male"),]
mulheres<-titanic[which(titanic$Sex=="female"),]
Crie duas listas uma para informações do data frame do gênero feminino e outro para o gênero masculino. Cada lista deve ser composta:
#lista homens
total_passageiros<-nrow(homens)
sobreviventes<-nrow(homens[which(homens$Survived==1),])
primeira_classe<-nrow(homens[which(homens$Pclass==1),])
preco_ticket<-mean(homens$Fare)
parentes<-(sum(homens$SibSp)/nrow(homens))+(sum(homens$parch)/nrow(homens))
lista_homens<-list(total_passageiros=total_passageiros,sobreviventes=sobreviventes,
primeira_classe=primeira_classe,
preco_ticket=preco_ticket,parentes=parentes)
lista_homens
## $total_passageiros
## [1] 577
##
## $sobreviventes
## [1] 109
##
## $primeira_classe
## [1] 122
##
## $preco_ticket
## [1] 25.52389
##
## $parentes
## [1] 0.4298094
#lista mulheres
total_passageiros<-nrow(mulheres)
sobreviventes<-nrow(mulheres[which(mulheres$Survived==1),])
primeira_classe<-nrow(mulheres[which(mulheres$Pclass==1),])
preco_ticket<-mean(mulheres$Fare)
parentes<-(sum(mulheres$SibSp)/nrow(mulheres))+(sum(mulheres$parch)/nrow(mulheres))
lista_mulheres<-list(total_passageiros=total_passageiros,sobreviventes=sobreviventes,
primeira_classe=primeira_classe,
preco_ticket=preco_ticket,parentes=parentes)
lista_mulheres
## $total_passageiros
## [1] 314
##
## $sobreviventes
## [1] 233
##
## $primeira_classe
## [1] 94
##
## $preco_ticket
## [1] 44.47982
##
## $parentes
## [1] 0.6942675
Com base nas listas criadas, responda:
ifelse(lista_mulheres$total_passageiros>lista_homens$total_passageiros,
"Mulhereses embarcaram mais","Homens Embarcaram mais")
## [1] "Homens Embarcaram mais"
ifelse(lista_mulheres$sobreviventes>lista_homens$sobreviventes,
"Mulheres sobreviveram mais","Homens sobreviveram mais")
## [1] "Mulheres sobreviveram mais"
ifelse(lista_mulheres$parentes>lista_homens$parentes,
"Mulheres tiveram mais parentes","Homens tiveram mais parentes")
## [1] "Mulheres tiveram mais parentes"
Usando somente a base de dados test.csv faça os exercícios abaixo:
#primeiramente carregamos a base de dados
train <- read.csv2('./train.csv',sep = ',',stringsAsFactors = F)
Podemos utilizar o comando summary para resumir as estatísticas descritivas
summary(as.numeric(train$Age))
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.42 20.12 28.00 29.70 38.00 80.00 177
summary(as.numeric(train$Fare))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 7.91 14.45 32.20 31.00 512.33
Calculamos também o desvio padrão
sd(as.numeric(train$Age),na.rm = T)
## [1] 14.5265
sd(as.numeric(train$Fare),na.rm = T)
## [1] 49.69343
Histogramas
par(mfrow=c(1,2))
hist(as.numeric(train$Age),xlab = 'Age',main = 'Hist Age')
hist(as.numeric(train$Fare),xlab = 'Fare', main = 'Hist Fare')
Boxplot
par(mfrow=c(1,2))
boxplot(as.numeric(train$Age),xlab = '',main = 'Age')
points(mean(as.numeric(train$Age),na.rm = T),col = 2, pch = 20)
boxplot(as.numeric(train$Fare),xlab = '', main = 'Fare')
points(mean(as.numeric(train$Fare),na.rm = T),col = 2, pch = 20)
t.test( # realizo um teste bicaudal
train$Survived[
train$Sex == 'male' # seleciono os homens que sobreviveram
]
,
train$Survived[
train$Sex == 'female' # seleciono as mulheres que sobreviveram
]
)
##
## Welch Two Sample t-test
##
## data: train$Survived[train$Sex == "male"] and train$Survived[train$Sex == "female"]
## t = -18.672, df = 584.43, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.6113121 -0.4949481
## sample estimates:
## mean of x mean of y
## 0.1889081 0.7420382
O restultado do teste é que podemos rejeitar a hipótese nula que a proporção de homens e mulheres que sobreviveram é igual. O que corrobora os resultados encontrados no exercício anterior onde vimos que \(18.89\%\) dos homens sobreviveram e \(74.20\%\) das mulheres.
Primeiramente definimos as variáveis de interesse em vetores.
survived <- train$Survived
sex <- train$Sex
age <- as.numeric(train$Age)
fare <- as.numeric(train$Fare)
class <- train$Pclass
Com as variáveis definidas aplico a regressão logística
reg <- glm(formula = survived ~ sex + age + fare + class)
head(reg$fitted.values,10)
## 1 2 3 4 5 7
## 0.11811490 0.91515888 0.57512295 0.93019914 0.04763639 0.34836384
## 8 9 10 11
## 0.22756724 0.56991553 0.84215355 0.69508309
tail(reg$fitted.values,10)
## 881 882 883 884 885 886
## 0.78219502 0.05847712 0.59700164 0.28619953 0.10182447 0.50603176
## 887 888 890 891
## 0.29179515 1.01543796 0.49879411 0.06389281
O resultado de fitted.values é exatamente a probabilidade calculada de sobrevivência.
test.csv.#para isso devo carregar a base test.csv
test <- read.csv2('./test.csv',sep = ',',stringsAsFactors = F)
Em seguida basta utilizar o comando predict para predizer a probabilidade de sobrevivência de cada indivíduo da base test.
new <- data.frame(
sex = test$Sex,
age = as.numeric(test$Age),
fare = as.numeric(test$Fare),
class = test$Pclass
)
prob_of_survive <- predict(object = reg,newdata = new)
head(prob_of_survive,10)
## 1 2 3 4 5 6
## 0.05033418 0.46112227 0.10167358 0.09108291 0.59712206 0.16165408
## 7 8 9 10
## 0.55340040 0.29830884 0.61848050 0.12468980
Note que para alguns valores da base o resultado é NA. Isso ocorre pois a informação das variáveis dependentes não está completa na base test. Com essa técnica são somente calculados os valores com a base completa.
titanic. Selecione esta base como default.create database titanic ;
use titanic ;
Crie uma tabela chamada passengers dentro da base titanic, contendo os seguintes campos:
create table passengers ( id integer,
survived char(1),
class integer,
name varchar(100),
sex char(6),
age float,
sib_sp integer,
par_ch integer,
ticket_num varchar(20),
fare float,
cabin varchar(50),
embarked char(1),
CONSTRAINT PassPK PRIMARY KEY (id)
);
train.csv quanto do arquivo test.csv para a tabela passengers, usando o comando LOAD DATA INFILE.LOAD DATA LOCAL INFILE "C:\\Users\\Talitha\\Dropbox\\FGV\\Big Data\\Alunos\\Banco de Dados\\Titanic\\train.csv"
INTO TABLE passengers
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
LOAD DATA LOCAL INFILE "C:\\Users\\Talitha\\Dropbox\\FGV\\Big Data\\Alunos\\Banco de Dados\\Titanic\\test.csv"
INTO TABLE passengers
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
SELECT*FROM.select * from passengers ;
.csv.Parte 2: Consulta à Tabela
SELECT:Atenção: Para construir suas consultas (querys), você deve examinar cuidadosamente a maneira que os dados foram registrados. Este tipo de atividade faz parte do dia a dia de qualquer bom cientista de dados.
(a) O passageiro de ID 395 sobreviveu? E o Sr. Thomas O’Brien?
select survived, name from passengers where id = 395 ;
select survived, name from passengers where name like '%Brien%Thomas%' ;
(b) Qual é o nome da Sra. Thomas O’Brien? Ela sobreviveu?
select survived, name from passengers where name like '%Brien%Thomas%' ;
(c) Qual é o número do bilhete e o nome do passageiro de ID 13?
select ticket_num, name from passengers where id = 13 ;
(d) Quantas mulheres havia no barco?
select count(*) from passengers where sex = 'female' ;
(e) Quantas mulheres acima de 30 anos havia no barco?
select count(*) from passengers where sex = 'female' and age > 30 ;
(f) Qual foi a tarifa mais cara do Titanic? Quem pagou?
select max(fare) from passengers ;
select name from passengers where fare = '512.3292236328125';
(g) Calcule a média das tarifas pagas por cada classe.
select class, avg(fare) from passengers group by class ;
(h) Há mais homens ou mulheres na 1ª classe?
select sex, count(id) from passengers where class = 1 group by sex ;
embarked. Modifique S para Southampton, Q para Queenstown e C para Cherbourg. Você deve perceber que, antes, precisa mudar o tipo da coluna.passo 1:
alter table passengers modify column embarked char(11) ;
passo 2:
update passengers set embarked = 'Southampton' where embarked = 'S' ;
update passengers set embarked = 'Cherbourg' where embarked = 'C' ;
update passengers set embarked = 'Queenstown' where embarked = 'Q' ;
Parte 1: Disponibilizando dados no HDFS
Questões de 1 a 3 via interface gráfica
Através do Ambari, crie uma pasta chamada kaggle no HDFS.
Certifique-se que a pasta tem a permissão de leitura, escrita e execução.
Faça o upload do arquivo train.csv para a pasta kaggle que você acabou de criar no HDFS.
Pela linha de comando, verifique se a pasta e o arquivo criado estão realmente disponíveis.
hadoop fs -ls /tmp/kaggle
hadoop fs -tail /tmp/kaggle/train.csv
hadoop fs -cat /tmp/kaggle/train.csv
Colunas delimitadas por vírgulas, linhas delimitadas por tab e coluna Name possui qualificador aspas duplas.
Parte 2: Trabalhando com dados no HIVE
Agora que você já explorou um pouco os dados, podemos estruturá-los e possibilitar a exploração analítica dos mesmos. Para isso, precisamos associar schemas para esses dados de forma que possamos fazer consultas nos dados e consigamos ter insights sobre quem estava presente naquela viagem. Vamos utilizar o Hive para construirmos esse raciocínio.
Se você olhou com cuidado os dados, percebeu que o nome dos passageiros no campos Name está dentro de aspas e separado por vírgulas da forma “Sobrenome,Nome”. No entanto, o separador dos dados também é vírgula. Teremos que lidar com isso para conseguirmos analisar adequadamente nossos dados.
De forma a não termos problemas na hora de fazermos consultas nos dados, vamos precisar dizer para o Hive que o campo Nome possui essa estrutura para que ele possa interpretá-lo de forma correta. Sendo assim, precisamos da ajuda de um SerDe. Ele é um Serializador/Deserializador que permite dizer ao Hive como um campo deve ser processando. No nosso caso, o SerDe vai receber uma string Nome e vai traduzí-la para um objeto Java que o Hive pode manipular.
Vamos baixar o SerDe referente a CSV através da linha de comando:
$ wget https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar
$ cp csv-serde-0.9.1.jar $HIVE_HOME/lib
$ hive
Kaggle.create database kaggle;
use kaggle;
add jar csv-serde-0.9.1.jar
CREATE TABLE kaggle.titanic(
PassengerIdDOUBLE,
SurvivedDOUBLE,
PclassINT,
NameSTRING,
SexSTRING,
AgeDOUBLE,
SibSpDOUBLE,
ParchDOUBLE,
TicketSTRING,
FareDOUBLE,
CabinSTRING,
EmbarkedSTRING
)
row format serde ’com.bizo.hive.serde.csv.CSVSerde’
with serdeproperties (
“separatorChar”=“,”,
“quoteChar”=“n”“,
”escapeChar“=”nn“
)
stored as textfile tblproperties (’skip.header.line.count’=’1’);
train.csv para a tabela que você acabou de criar.LOAD DATA INPATH '/tmp/titanic/train.csv' INTO TABLE train_tmp;
select * from kaggle.titanic limit 10;
select sex,survived,count(*)
from kaggle.titanic
group by dex,survived
order by sex,survived;
select sex,age,survived,count(*)
from kaggle.titanic
group by sex,age
order by age;
select sex,age,survived,count(*)
from kaggle.titanic
where survived = 1
group by sex,age
order by age;
select avg(fare)
from kaggle.titanic
where survived=1;
Os exercícios a seguir devem ser feitos utilizando a base de dados train.csv disponível em https://www.kaggle.com/c/titanic/data que apresenta informaçõs sobre os passageiros do Titanic. O objetivo do exercício é fazer uma análise descritiva da base utilizando os recursos vistos nessa apostila. Essa análise é importantíssima para o conhecimento dos dados e será útil nos módulos seguintes do curso.
# leitura da base
base <- read.csv("train.csv")
base$Sex <- as.character(base$Sex)
base$Sex[base$Sex == "female"] <- "Feminino"
base$Sex[base$Sex == "male"] <- "Masculino"
# pacotes usados
library(plotly)
library(RColorBrewer)
freq <- table(base$Sex)
prop <- round(prop.table(freq),2)
# gráfico básico
pie(prop, labels = paste0(prop*100,"%"), col = c('#CD5555', '#CDC9C9'), main = "Composição dos passageiros do Titanic\n por sexo")
# legenda
legend(-2,1, legend = c("Feminino", "Masculino"), fill = c('#CD5555', '#CDC9C9'), bty = "n")
# fonte
text(0,-1, labels = "Fonte: Kaggle", cex = 0.8, col = "#828282")
# via plotly
data <- data.frame(prop)
plot_ly(data, values = ~Freq, labels = ~Var1, type = 'pie',
textposition = 'inside',
textinfo = 'percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'none',
marker = list(colors = c('#CD5555', '#CDC9C9'),
line = list(color = '#FFFFFF', width = 1)),
showlegend = T) %>%
layout(title = 'Composição dos passageiros do Titanic por sexo',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
hist(base$Age, main = "Distribuição da idade dos passageiros do Titanic",
col = "#FFCC99", border = "#EE7600", ylim= c(0,0.035), freq = F)
plot_ly(base, x = ~Age, type = "histogram", name = "Idade",
marker = list(color = "#FFCC99", line = list(color = "#EE7600", width = 1))) %>%
layout(title = 'Distribuição da idade dos passageiros do Titanic',
xaxis = list(range = c(-5,85)))
plot_ly(base, x = ~Age, type = "box", name = "Idade",
fillcolor = "#C5E3BF", marker = list(outliercolor = "#7BBF6A"), line = list(color = "#7BBF6A")) %>%
layout(title = 'Distribuição da idade dos passageiros do Titanic')
freq <- table(base$Survived)
prop <- round(prop.table(freq),2)*100
data <- data.frame(prop)
data$Var1 <- c("Não-sobreviventes", "Sobreviventes")
plot_ly(data = data, x = ~Var1, y = ~Freq, type = "bar",
marker = list(color = c("#F87531","#86C67C")), showlegend = F) %>%
layout(title = "Proporção de Sobreviventes do Titanic <br> (Kaggle)",
font = list(color = 'black', family = 'verdana', size = 11),
margin = list(b = 90, l = 90, r = 90, t = 90),
xaxis = list(title = ""),
yaxis = list(title = "Proporção (%)"),
annotations = list(x = ~Var1, y = ~Freq, text = ~paste0(Freq,"%"),
xanchor = 'center', showarrow = F, yanchor = 'bottom'))
freq <- table(base$Survived, base$Sex)
prop <- round(prop.table(freq, margin = 2),2)*100
data <- data.frame(prop)
data$Var1 <- c("Não sobreviveu","Sobreviveu","Não sobreviveu","Sobreviveu")
plot_ly(data, x = ~Var2, y = ~Freq, color = ~Var1, type = 'bar', colors = c("#F87531","#86C67C")) %>%
layout(title = "Situação de sobrevivência dos passageiros do Titanic de acordo com Sexo <br> (Kaggle)",
yaxis = list(title = 'Proporção (%)'), barmode = 'group',
xaxis = list(title = "Sexo"))
# Idade vs. Sobreviventes
base$classe_idade <- NA
base$classe_idade[base$Age <= 11] <- "Criança"
base$classe_idade[base$Age > 11 & base$Age <= 18] <- "Adolescente"
base$classe_idade[base$Age > 18 & base$Age <= 59] <- "Adulto"
base$classe_idade[base$Age >= 60] <- "Idoso"
base$classe_idade <- factor(base$classe_idade, levels = c("Criança", "Adolescente", "Adulto", "Idoso"))
freq <- table(base$Survived, base$classe_idade)
prop <- round(prop.table(freq, margin = 2),2)*100
data <- data.frame(prop)
data$Var1 <- rep(c("Não sobreviveu","Sobreviveu"),4)
plot_ly(data, x = ~Var2, y = ~Freq, color = ~Var1, type = 'bar', colors = c("#EE6363","#ADD8E6"),
marker = list(line = list(color = "#AF4035", width = 0.5))) %>%
layout(title = "Sobreviventes do Titanic de acordo com Classe Etária <br> (Kaggle)",
yaxis = list(title = 'Proporção (%)'), barmode = 'group',
xaxis = list(title = "Classe Etária"))
# Idade vs. Sexo vs. Sobreviventes
freq <- table(base$Survived, base$classe_idade, base$Sex)
sobr <- freq[2,,] # sobreviveram
prop <- round(prop.table(sobr, margin = 2),2)*100 # sobreviveram
data <- data.frame(prop) # sobreviveram
# Apenas os sobreviventes
plot_ly(data, x = ~Var2, y = ~Freq, color = ~Var1, type = 'bar', colors = c("#A6D785","#61B329")) %>%
layout(title = "Sobreviventes do Titanic de acordo com Classe Etária e Sexo <br> (Kaggle)",
yaxis = list(title = 'Proporção (%)'), barmode = 'group',
xaxis = list(title = "Sexo"))
Desenvolva um documento em R Markdown que apresente e analise os gráficos elaborados nos itens anteriores (utilize seus códigos e comentários). Adicione um título e seu nome ao documento.
Desenvolva um aplicativo Shiny que contenha os gráficos e alguns comentários dos itens 1 a 5. Em algum local do aplicativo, adicione informações sobre você, o desenvolvedor. Publique o aplicativo na plataforma http://www.shinyapps.io/.
A base de dados train.csv contém \(891\) observações, incluindo a informação se o passageiro sobreviveu ou não ao desastre. Para testar os modelos de classificação, precisamos separar essa base em dois subconjuntos. Um conjunto de treino e outro de teste.
library(readr)
#carrega a base train.csv
train <- read_csv("train.csv")
#tratamento inicial de variáveis importantes outliers missing de age recebe -1
train$Age[is.na(train$Age)]<- -1
#missing de embarker recebe "S"
train$Embarked[is.na(train$Embarked)]<-"S"
#variaveis categoricas
train$Survived<-as.factor(train$Survived)
train$Sex<-as.factor(train$Sex)
train$Embarked<-as.factor(train$Embarked)
train$Pclass<-as.factor(train$Pclass)
treino amostrando aleatoriamente \(713\) observações, o que corresponde a aproximadamente \(80%\) da população.#fixa a semente para efeitos de reprodutibilidade
set.seed(100)
#seleciona aleatoriamente 713 observações
obs.treino<-sample(1:891,713)
#filtra apenas as 713 observações de treino
treino<-train[obs.treino,]
teste_1 com as \(178\) observações restantes.#filtra apenas as 178 observações restantes como teste
teste_1<-train[-obs.treino,]
teste_0, apagando a informação se o indivíduo sobreviveu ou não do data frame teste_1.#cria o dataframe teste_0
teste_0<-teste_1
teste_0$Survived<-NULL
O objetivo do exercício é utilizar os algoritmos aprendidos no módulo de Machine Learning para determinar se um determinado passageiro sobreviveu ou não ao desastre. Nesse sentido, utilize o conjunto treino para ajustar os seguintes algoritmos:
# Regressão logística
ajuste.logistico<-glm(Survived~Pclass+Age+Sex+Parch+SibSp+Fare+Embarked,
data=treino,family = binomial)
## randomForest 4.6-12
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
# Árvore de classificação
ajuste.arvore <- tree(Survived~Pclass+Age+Sex+Parch+SibSp+Fare+Embarked,
data=treino)
# Bagging
library(randomForest)
set.seed(100)
ajuste.bagging<-randomForest(Survived~Pclass+Age+Sex+Parch+SibSp+Fare+Embarked,
data=treino,mtry=7)
# Random Forest
library(randomForest)
set.seed(100)
ajuste.rf<-randomForest(Survived~Pclass+Age+Sex+Parch+SibSp+Fare+Embarked,
data=treino,mtry=3)
# Boosting
library(gbm)
#atencao pois a funcao gbm nao trabalha direito com factor na variavel resposta
set.seed(100)
ajuste.boosting<-gbm(as.character(Survived)~Pclass+Age+Sex+Parch+SibSp+Fare+Embarked,
data=treino,
distribution = "bernoulli",
n.trees=10000,
interaction.depth = 4)
teste_0 sobrevive ou não.#predição logistico
probs.glm <- predict(ajuste.logistico,newdata=teste_0,type="response")
pred.glm <- ifelse(probs.glm >0.5,"1","0")
#predição árvore
probs.arvore<-predict(ajuste.arvore,newdata=teste_0)
pred.arvore <- ifelse(probs.arvore[,2] >0.5,"1","0")
#predição Bagging
probs.bagging<-predict(ajuste.bagging,newdata=teste_0,type="prob")
pred.bagging <- ifelse(probs.bagging[,2]>0.5,"1","0")
#predição Random Forest
probs.rf<-predict(ajuste.rf,newdata=teste_0,type="prob")
pred.rf <- ifelse(probs.rf[,2]>.5,"1","0")
#predição Boosting
probs.boosting<-predict(ajuste.boosting,newdata=teste_0,n.trees=10000,type="response")
pred.boosting <- ifelse(probs.boosting>0.5,"1","0")
teste_1. Verifique a taxa de acerto de cada algoritmo.mat.logistico<-table(pred.glm,teste_1$Survived)
sum(diag(mat.logistico))/sum(mat.logistico)
## [1] 0.8314607
# árvore
mat.arvore<-table(pred.arvore,teste_1$Survived)
sum(diag(mat.arvore))/sum(mat.arvore)
## [1] 0.8370787
# Bagging
mat.bagging<-table(pred.bagging,teste_1$Survived)
sum(diag(mat.bagging))/sum(mat.bagging)
## [1] 0.8202247
# Random Forest
mat.rf<-table(pred.rf,teste_1$Survived)
sum(diag(mat.rf))/sum(mat.rf)
## [1] 0.8764045
# Boosting
mat.boosting<-table(pred.boosting,teste_1$Survived)
sum(diag(mat.boosting))/sum(mat.boosting)
## [1] 0.8539326
# COMO VOCÊ PODERIA MELHORAR OS RESULTADOS? EXISTE AINDA ESPAÇO PARA MELHORIAS!
Como esse modelo logit se compara com o desenvolvido no módulo de estatística.
Use os dados disponíveis no arquivo train.csv para treinar uma Rede Neural Artificial FeedForward (FNN) com saída binária com a finalidade de classificar os passageiros e tripulação do navio nas categorias mortos e sobreviventes, em função de suas respectivas características pessoais.
Construa a matriz de confusão e calcule a taxa de erro do classificador.
Aplique a RNA treinada aos dados do conjunto de teste (train.csv). Os desfechos das pessoas no conjunto de teste estão no arquivo test.csv.
library(keras)
library(ggplot2)
library(dplyr)
# Carrego dados de treino
dt <- read.csv("./train.csv",header = 1)
head(dt)
#contagem de missing
apply(dt,2,function(x)mean(is.na(x)))
# split 75% treino e 25% teste
# as variaveis categ'oricas precisam ser convertidas para dummy
# a funcao to_categorical do keras faz isso para n'os
ind <- sample(1:nrow(dt),round(0.75*nrow(dt)))
x <- cbind(to_categorical(dt$Pclass-1),
to_categorical(dt$Sex),
to_categorical(dt$Embarked),
dt$SibSp,
dt$Parch,
dt$Fare)#,dt$age)
y <- dt$Survived
y_train <- y[ind]
y_test <- y[-ind]
x_train <- x[ind,]
x_test <- x[-ind,]
# normalizo AGE [16] e FARE [15]
cols <- c(14,15)#,16)
means <- apply(x_train[,cols],2,function(x) mean(x,na.rm = T))
sds <- apply(x_train[,cols],2,function(x) sd(x,na.rm = T))
x_train[,cols] <- scale(x_train[,cols],center = means, scale = sds )
x_test[,cols] <- scale(x_test[,cols],center = means, scale = sds )
# build neural network
model <- keras_model_sequential()
model %>%
layer_dense( units = 15, activation = "relu", input_shape = ncol(x_train)) %>%
layer_activity_regularization(l2 = 0.001) %>%
layer_dense(units = 10, activation = "relu") %>%
layer_activity_regularization(l2 = 0.001) %>%
layer_dense(units = 1, activation = "sigmoid")
summary(model)
# configuro parametros para o treinamento do modelo
model %>% compile(
loss = 'binary_crossentropy',
metrics = c('accuracy'),
optimizer = optimizer_adam()
)
# Treino modelo
history <- model %>% fit(
x_train, y_train,
batch_size = 5,
epochs = 500,
verbose = 1,
validation_split = 0.2
)
plot(history)
# fit test data
score <- model %>% evaluate(x_test, y_test)
score
A linguagem R é amplamente utilizada entre mineradores de dados e estatísticos, para análise de dados e desenvolvimento de software estatístico. Com uma comunidade grande e ativa de usuários na internet, o R tornou-se uma solução de análise de dados de tecnologia de ponta muito usado nas grandes empresas. São muitas as vantagens e qualidades do software, dentre elas, podemos destacar:
O R é open source: dessa forma, nada impede de você baixar e utilizar o programa, diferentemente de outros softwares estatísticos que necessitam de licenças pagas.
Integração com o LaTex: o R integra-se facilmente com o sistema de publicação de documentos LaTeX, o que significa que os resultados estatísticos e gráficos a partir do R podem ser incorporados em documentos com qualidade de publicação.3
O software R é uma ferramenta importante para o desenvolvimento em ambientes de análises numéricas e aprendizado de máquina. Com conceitos como Big Data e Internet das Coisas (IoT), vem ganhando cada vez mais importância como geradoras de dados e a popularidade da plataforma só tende a crescer.
Em relação à ciência de dados, podemos afirmar que você passou por uma ótima introdução. Parabéns por ter chegado até aqui!
Por que não aproveita essa energia gerada a partir do seu próprio esforço e não submete ao Kaggle o melhor modelo de classificação que foi capaz de encontrar em toda base teste.csv? Fazendo isso, você dará seu primeiro passo na comunidade internacional Data Science.
Esperamos que a partir de agora, você já seja capaz de seguir sozinho nesse estudo interminável dessa nova e desafiadora disciplina. Bons estudos!