Instalação e Carregamento de Pacotes

# install.packages(c("shiny", "dplyr", "ggplot2", "titanic", "scales", "treemapify"))

library(dplyr)
## 
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     filter, lag
## Os seguintes objetos são mascarados por 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(titanic)
library(scales)
library(treemapify)

Carregamento e Limpeza dos Dados

df <- titanic_train

df$Survived <- factor(df$Survived, levels = c(0, 1), labels = c("Não Sobreviveu", "Sobreviveu"))
df$Pclass <- factor(df$Pclass, levels = c(1, 2, 3), labels = c("1ª Classe", "2ª Classe", "3ª Classe"))
df$Embarked <- recode(df$Embarked, "C" = "Cherbourg", "Q" = "Queenstown", "S" = "Southampton")
df$Sex <- recode(df$Sex, "male" = "Masculino", "female" = "Feminino")
df$Sex <- tools::toTitleCase(as.character(df$Sex))

Tratamento de Valores Faltantes

sum(is.na(df$Age))
## [1] 177
idade_por_sexo <- df %>%
  group_by(Sex) %>%
  summarize(media_idade = mean(Age, na.rm = TRUE))

df <- df %>%
  mutate(Age = ifelse(is.na(Age),
                      ifelse(Sex == "Masculino", idade_por_sexo$media_idade[idade_por_sexo$Sex == "Masculino"],
                             idade_por_sexo$media_idade[idade_por_sexo$Sex == "Feminino"]),
                      Age))

Transformações e Renomeações

df <- df %>% select(-SibSp, -Parch, -Cabin)

colnames(df)[colnames(df) == "PassengerId"] <- "Id Passageiro"
colnames(df)[colnames(df) == "Survived"] <- "Sobreviventes"
colnames(df)[colnames(df) == "Pclass"] <- "Classe"
colnames(df)[colnames(df) == "Name"] <- "Nome"
colnames(df)[colnames(df) == "Sex"] <- "Sexo"
colnames(df)[colnames(df) == "Age"] <- "Idade"
colnames(df)[colnames(df) == "Ticket"] <- "Cod Ticket"
colnames(df)[colnames(df) == "Fare"] <- "Preço Ticket"
colnames(df)[colnames(df) == "Embarked"] <- "Saída"

df$Idade <- round(df$Idade, 0)

df$'Preço Ticket R$' <- round(df$'Preço Ticket' * 6, 0)

df <- df %>% mutate(FaixaIdade = cut(Idade, breaks = c(0, 12, 18, 30, 50, 80),
                                     labels = c("Criança", "Adolescente", "Jovem", "Adulto", "Idoso")))

df <- df %>% select(-`Id Passageiro`, -`Preço Ticket`, -`Cod Ticket`)

df <- df[, c("Nome", "Sexo", "Idade", "FaixaIdade", "Classe", "Saída", "Preço Ticket R$", "Sobreviventes")]

Análises Exploratórias

table(df$Sobreviventes)
## 
## Não Sobreviveu     Sobreviveu 
##            549            342
round(prop.table(table(df$Sobreviventes)) * 100, 1)
## 
## Não Sobreviveu     Sobreviveu 
##           61.6           38.4
round(prop.table(table(df$Sexo, df$Sobreviventes), 1) * 100, 1)
##            
##             Não Sobreviveu Sobreviveu
##   Feminino            25.8       74.2
##   Masculino           81.1       18.9
round(prop.table(table(df$Classe, df$Sobreviventes), 1) * 100, 1)
##            
##             Não Sobreviveu Sobreviveu
##   1ª Classe           37.0       63.0
##   2ª Classe           52.7       47.3
##   3ª Classe           75.8       24.2
round(prop.table(table(df$FaixaIdade, df$Sobreviventes), 1) * 100, 1)
##              
##               Não Sobreviveu Sobreviveu
##   Criança               42.6       57.4
##   Adolescente           57.1       42.9
##   Jovem                 59.4       40.6
##   Adulto                67.5       32.5
##   Idoso                 65.6       34.4

Distribuição por Sexo

sexo_pizza <- df %>%
  count(Sexo) %>%
  mutate(percent = n / sum(n) * 100,
         label = paste0(Sexo, ": ", round(percent, 1), "%"))

ggplot(sexo_pizza, aes(x = "", y = percent, fill = Sexo)) +
  geom_col(width = 1) +
  coord_polar("y") +
  geom_text(aes(label = label), position = position_stack(vjust = 0.5)) +
  labs(title = "Distribuição por Sexo") +
  theme_void()

Proporção de Sobrevivência por Sexo

ggplot(df, aes(x = Sexo, fill = factor(Sobreviventes))) +
  geom_bar(position = "fill") +
  geom_text(
    stat = "count",
    aes(label = scales::percent(..count../tapply(..count.., ..x.., sum)[..x..])),
    position = position_fill(vjust = 0.5),
    color = "white",
    size = 4
  ) +
  labs(
    title = "Proporção de Sobrevivência por Sexo",
    y = "Proporção",
    fill = "Legenda"
  ) +
  scale_y_continuous(labels = scales::percent_format())
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Sobrevivência por Idade

ggplot(df, aes(x = Idade, fill = factor(Sobreviventes))) +
  geom_histogram(position = "identity", alpha = 0.8, bins = 30) +
  labs(title = "Distribuição de Idade por Sobrevivência", fill = "Legenda")

Sobrevivência por Classe e Sexo

ggplot(df, aes(x = Classe, fill = factor(Sobreviventes))) +
  geom_bar(position = "fill") +
  geom_text(
    stat = "count",
    aes(label = scales::percent(..count../tapply(..count.., interaction(..x.., ..PANEL..), sum)[interaction(..x.., ..PANEL..)])),
    position = position_fill(vjust = 0.5),
    color = "white",
    size = 3
  ) +
  facet_wrap(~Sexo) +
  labs(
    title = "Proporção de Sobrevivência por Classe e Sexo",
    y = "Proporção",
    fill = "Legenda"
  ) +
  scale_y_continuous(labels = scales::percent_format())

Boxplot de Idade por Sobrevivência

ggplot(df, aes(x = factor(Sobreviventes), y = Idade, fill = factor(Sobreviventes))) +
  geom_boxplot() +
  labs(title = "Distribuição da Idade por Sobrevivência", x = "Sobreviveu", y = "Idade", fill = "Legenda") +
  scale_x_discrete(labels = c("Não", "Sim")) +
  theme_minimal()

Barras Empilhadas: Classe × Sobrevivência

ggplot(df, aes(x = factor(Classe), fill = factor(Sobreviventes))) +
  geom_bar(position = "stack") +
  geom_text(stat = "count",
            aes(label = ..count..),
            position = position_stack(vjust = 0.5),
            color = "white", size = 4) +
  labs(title = "Número de Sobreviventes por Classe", 
       x = "Classe", 
       y = "Quantidade Total", 
       fill = "Legenda") +
  scale_fill_manual(values = c("red", "darkgreen")) +
  theme_minimal()

Facet Grid: Sexo × Faixa Etária:

ggplot(df, aes(x = FaixaIdade, fill = factor(Sobreviventes))) +
  geom_bar(position = "fill") +
  geom_text(stat = "count",
            aes(label = scales::percent(..count../tapply(..count.., interaction(..x.., ..PANEL..), sum)[interaction(..x.., ..PANEL..)])),
            position = position_fill(vjust = 0.5),
            color = "white", size = 3) +
  facet_wrap(~Sexo) +
  labs(title = "Sobrevivência por Faixa Etária e Sexo", y = "Proporção", fill = "Legenda") +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent_format())

Gráfico Combinado: Barras e Linha

idade_por_classe <- df %>%
  group_by(Classe) %>%
  summarise(media_idade = mean(Idade, na.rm = TRUE),
            total = n())

ggplot(idade_por_classe, aes(x = factor(Classe))) +
  geom_col(aes(y = total), fill = "lightblue") +
  geom_line(aes(y = media_idade * 10, group = 1), color = "red") +
  geom_point(aes(y = media_idade * 10), color = "red") +
  scale_y_continuous(
    name = "Total de Passageiros",
    sec.axis = sec_axis(~./10, name = "Média de Idade")
  ) +
  labs(title = "Total de Passageiros vs Média de Idade por Classe") +
  theme_minimal()

Histograma da Idade

ggplot(df, aes(x = Idade)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "white") +
  geom_text(
    stat = "bin",
    aes(label = ..count..),
    bins = 30,
    vjust = -0.5,
    size = 3
  ) +
  labs(
    title = "Distribuição de Idade",
    x = "Idade",
    y = "Frequência"
  ) +
  theme_minimal()

Treemap: Classe e Sexo

df_plot <- df %>% count(Classe, Sexo)

ggplot(df_plot, aes(area = n, fill = Classe, label = paste(Sexo, n))) +
  geom_treemap() +
  geom_treemap_text(colour = "white") +
  labs(title = "Distribuição de Passageiros por Classe e Sexo")

Total pago por Classe

total_pago_classe <- df %>%
  group_by(Classe) %>%
  summarise(Total_Pago = sum(`Preço Ticket R$`, na.rm = TRUE))

# Gráfico de barras com legenda
ggplot(total_pago_classe, aes(x = Classe, y = Total_Pago, fill = Classe)) +
  geom_col() +
  geom_text(aes(label = paste0("R$ ", format(Total_Pago, big.mark = ".", decimal.mark = ","))),
            vjust = -0.5, size = 4, color = "black") +
  labs(
    title = "Total Pago por Classe",
    x = "Classe",
    y = "Total Pago (R$)",
    fill = "Classe"
  ) +
  scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) +
  theme_minimal()

Resumo das Análises

## Resumo e Insights da Análise

# Taxa de sobrevivência: Aproximadamente 38% dos passageiros sobreviveram ao naufrágio.
  
# A sobrevivência entre as mulheres foi significativamente maior do que entre os homens. Enquanto a maioria dos homens não sobreviveu, a maioria das mulheres foi salva, o que indica uma política de evacuação com prioridade para mulheres e crianças.

# Passageiros da 1ª classe tiveram maiores taxas de sobrevivência, seguidos pela 2ª classe, enquanto a 3ª classe apresentou os menores índices. Isso reflete desigualdades de acesso aos botes salva-vidas e localização das cabines.

# Crianças e adolescentes tiveram maiores chances de sobreviver, especialmente do sexo feminino. Já passageiros idosos ou adultos jovens do sexo masculino tiveram taxas de sobrevivência menores.

#Passageiros que pagaram valores mais altos (geralmente associados à 1ª classe) tiveram maiores chances de sobreviver, reforçando o impacto da classe social na tragédia.