Comentários iniciais

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.

Objetivos

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.

Descrição da base

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:

  1. train.csv

    • survival: variável binária que representa se o indivíduo sobreviveu (1) ou não (0);
    • pclass: em qual classe ele estava alojado;
    • name: nome do passageiro;
    • sex: gênero do passageiro;
    • age: idade do passageiro;
    • sibsp: número de esposos e/ou irmãos à bordo;
    • parch: número de pais ou filhos à bordo;
    • ticket: número da passagem;
    • fare: preço pago pela passagem;
    • cabin: número da cabine em que estava alojado;
    • embarked: cidade em que embarcou.
  2. test.csv: Essa base, exceto pela coluna survival, contém as mesmas variáveis da base train.csv.

Primeiros passos

Módulo introdução ao R - Anna Carolina

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")
  1. Quantas variáveis possui o arquivo? Quantas observações o arquivo tem?
#variavies
ncol(titanic)
## [1] 12
#observações
nrow(titanic)
## [1] 891
  1. Quais são as classes das variáveis?
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 ...
  1. Qual é a média das dos preços dos tickets?
media<-mean(titanic$Fare)

media
## [1] 32.20421
  1. Faça um filtro na tabela e crie dois outros data frames. Um para o gênero masculino e o outro para o genero feminino.
homens<-titanic[which(titanic$Sex=="male"),]

mulheres<-titanic[which(titanic$Sex=="female"),]
  1. 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:

    • número total de passageiros;
    • número de sobreviventes;
    • número de passageiros na primeira classe;
    • preço do ticket;
    • número de parentes∖filhos.
#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:

  1. Qual gênero teve o maior número de pessoas embarcadas?
ifelse(lista_mulheres$total_passageiros>lista_homens$total_passageiros,
       "Mulhereses embarcaram mais","Homens Embarcaram mais")
## [1] "Homens Embarcaram mais"
  1. Qual gênero sobreviveu mais?
ifelse(lista_mulheres$sobreviventes>lista_homens$sobreviventes,
       "Mulheres sobreviveram mais","Homens sobreviveram mais")
## [1] "Mulheres sobreviveram mais"
  1. Qual gênero teve a maior média do número de parentes?
ifelse(lista_mulheres$parentes>lista_homens$parentes,
       "Mulheres tiveram mais parentes","Homens tiveram mais parentes")
## [1] "Mulheres tiveram mais parentes"

 

Estatística - Guilherme Gomes

Usando somente a base de dados test.csv faça os exercícios abaixo:

  1. Faça uma análise das estatísticas descritivas dos dados referentes às tarifas e às idades, explicitando as medidas de centralidade e dispersão. Além disso, construa um histograma e um boxplot para essas duas variáveis;
#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)

  1. Teste se a média de sobreviventes é estatisticamente diferente entre homens e mulher e se a média de sobreviventes é estatisticamente diferente entre crianças e adultos. Este resultado faz sentido? Compare com a questão 7 do módulo de introdução ao R;
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.

  1. Utilizando como variáveis independentes gênero, idade, tarifa e classe, estime a probabilidade dos passageiros sobreviverem por meio de um modelo Logit;

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.

  1. Utilizando os mesmos coeficientes encontrados no exercício anterior, calcule a probabilidade de sobrevivência de cada passageiro na base 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.

 

Armazenamento

Data Management e Nuvem - Talitha Speranza

  1. Crie uma base de dados vazia chamada titanic. Selecione esta base como default.
create database titanic ; 
use titanic ;
  1. Crie uma tabela chamada passengers dentro da base titanic, contendo os seguintes campos:

    • id, do tipo integer (chave primária);
    • class, do tipo integer;
    • name, do tipo varchar(100);
    • sex, do tipo char(6);
    • age, do tipo float;
    • sib_sp, do tipo integer;
    • par_ch, do tipo integer;
    • ticket_num, do tipo varchar(20);
    • fare, do tipo float;
    • cabin, do tipo varchar(50);
    • embarked, do tipo char(1).
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)
                        );
  1. Carregue os dados tanto do arquivo 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;
  1. Verifique se a tabela foi corretamente preenchida e se conta com \(1309\) linhas. Você pode fazer usando um simples SELECT*FROM.
select * from passengers ;
  1. Exporte a tabela para um arquivo externo. Você pode escolher qualquer formato que não seja .csv.

Parte 2: Consulta à Tabela

  1. Responda a todas as perguntas abaixo usando consultas do tipo 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 ;
  1. Suponha que você queira melhorar a legibilidade dos campos da coluna 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' ;

 

Hadoop e NoSQL - Fernanda Bruno

Parte 1: Disponibilizando dados no HDFS

Questões de 1 a 3 via interface gráfica

  1. Através do Ambari, crie uma pasta chamada kaggle no HDFS.

  2. Certifique-se que a pasta tem a permissão de leitura, escrita e execução.

  3. Faça o upload do arquivo train.csv para a pasta kaggle que você acabou de criar no HDFS.

  4. Pela linha de comando, verifique se a pasta e o arquivo criado estão realmente disponíveis.

hadoop fs -ls /tmp/kaggle
  1. Pela linha de comando, visualize as últimas linhas do arquivo, de forma a entender se ele está corrompido ou não.
hadoop fs -tail /tmp/kaggle/train.csv
  1. Pela linha de comando, visualize o arquivo como um tudo, entendendo sua estrutura, separadores e data types.
hadoop fs -cat /tmp/kaggle/train.csv
  1. O que você perceber de diferente na estrutura dos dados?

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.

  1. 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.

  2. 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.

  3. 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

  1. Vamos copiá-lo para a pasta de bibliotecas do Hive através da linha de comando:

$ cp csv-serde-0.9.1.jar $HIVE_HOME/lib

  1. Agora vamos chamar a CLI do Hive para que possamos associar as tabelas aos dados do HDFS.
$ hive
  1. Crie um database chamado Kaggle.
create database kaggle;
use kaggle;
  1. Chame o SerDe que você baixou e moveu para a biblioteca do Hive através da CLIdo Hive:

add jar csv-serde-0.9.1.jar

  1. Crie uma tabela Titanic dentro do database kaggle que você acabou de criar:

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’);

  1. Agora carregue os dados do arquivo train.csv para a tabela que você acabou de criar.
LOAD DATA INPATH '/tmp/titanic/train.csv' INTO TABLE train_tmp;
  1. Selecione \(10\) registros da tabela para verificar se correu tudo certo.
select * from kaggle.titanic limit 10;
  1. Veja quantas pessoas sobreviveram e não sobreviveram por sexo. Sexo foi um determinante para se salvar?
select sex,survived,count(*)
from kaggle.titanic
group by dex,survived
order by sex,survived;
  1. Veja a idade média das pessoas baseadas no sexo.
select sex,age,survived,count(*)
from kaggle.titanic
group by sex,age
order by age;
  1. Qual foi a idade média dos sobreviventes por sexo e idade?
select sex,age,survived,count(*)
from kaggle.titanic
where survived = 1
group by sex,age
order by age;
  1. Qual era o preço médio do ticket dos sobreviventes?
select avg(fare)
from kaggle.titanic
where survived=1;
  1. Com base nessas análises, qual seria a melhor chance de sobreviver?

 

Visualização

Visualização de dados - Daiane Marcolino

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)
  1. Esboce um gráfico de pizza para verificar a proporção de passageiros do sexo feminino e masculino. Comente o resultado.
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))
  1. Faça um histograma e um boxplot para a idade dos passageiros. Que informação você consegue tirar desses gráficos?
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')

 

  1. Crie um gráfico de barras para o número de sobreviventes no navio. Quantos sobreviveram?
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'))
  1. Crie um gráfico de barras que relacione o sexo dos passageiros e a situação de sobrevivência. Comente o resultado.
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"))

 

  1. Crie um gráfico de barras que relacione a classe etária dos passageiros e a situação de sobrevivência com base na tabela a seguir.

 

# 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"))

 

  1. 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.

  2. 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/.

 

Classificação

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)
  • Crie o data frame com o nome de 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,]
  • Crie o data frame teste_1 com as \(178\) observações restantes.
#filtra apenas as 178 observações restantes como teste
teste_1<-train[-obs.treino,] 
  • Crie o data frame 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

Machine Learning - Tiago Dantas

  1. 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
    • Árvore de classificação
    • Bagging
    • Random Forest
    • Boosting
# 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)
  1. Utilize os ajustes realizados no exercício 1 para predizer se cada passageiro do conjunto de dados 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")
  1. Calcule a matriz de confusão utilizando os predições calculadas no exercício 2 e o conjunto de dados 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.

 

Inteligência Artificial - Eduardo Mendes

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

Por que escolher o R?

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.

Conclusão

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!

Referências