knitr::opts_chunk$set(echo = TRUE)

# Conversão do dataset Titanic (tabela de contingência) para data frame
df = as.data.frame(Titanic)

# Cálculo do total de sobreviventes e não sobreviventes
totais_survived = aggregate(Freq ~ Survived, data = df, sum)

Tabelas Apresentadas no Trabalho

Distribuição global de sobrevivência. A tabela seguinte apresenta o número total de passageiros que sobreviveram e que não sobreviveram ao naufrágio do Titanic.

knitr::kable(
  totais_survived,
  col.names = c("Sobreviveu", "Total de Passageiros"),
  caption = "Distribuição total de sobreviventes e não sobreviventes"
)
Distribuição total de sobreviventes e não sobreviventes
Sobreviveu Total de Passageiros
No 1490
Yes 711
# ---------------------------------------------------------------------------
# Análise apenas dos passageiros (exclui a tripulação)

# Filtragem das classes 1ª, 2ª e 3ª (remoção da tripulação)
df_filtrado_classe = df[df$Class != "Crew" & df$Freq > 0, ]

# Frequência total de passageiros por classe (1ª, 2ª e 3ª)
freq_filtrado_classe = aggregate(Freq ~ Class, data = df_filtrado_classe, sum)

# Total de passageiros (sem tripulação)
num_passageiros_non_crew = sum(freq_filtrado_classe$Freq)

# Cálculo das percentagens de passageiros por classe
freq_filtrado_classe$Percentagem = round(
  (freq_filtrado_classe$Freq / num_passageiros_non_crew) * 100
)

# Frequências por classe e estado de sobrevivência
freq_filtrado_classe_s = aggregate(Freq ~ Class + Survived,
                                    data = df_filtrado_classe, sum)

freq_filtrado_classe_s$Percentagem = round(
  (freq_filtrado_classe_s$Freq / num_passageiros_non_crew) * 100
)

# ---------------------------------------------------------------------------
# Máximos e mínimos de sobreviventes e não sobreviventes por classe

soma_por_classe = aggregate(Freq ~ Class + Survived,
                             data = df_filtrado_classe, sum)

soma_sobrev = soma_por_classe[soma_por_classe$Survived == "Yes", ]
soma_nao    = soma_por_classe[soma_por_classe$Survived == "No", ]

max_sobrev = soma_sobrev[soma_sobrev$Freq == max(soma_sobrev$Freq), ]
min_sobrev = soma_sobrev[soma_sobrev$Freq == min(soma_sobrev$Freq), ]

max_nao = soma_nao[soma_nao$Freq == max(soma_nao$Freq), ]
min_nao = soma_nao[soma_nao$Freq == min(soma_nao$Freq), ]

# Cálculo das percentagens relativamente ao total de passageiros
max_sobrev$Percentagem = round(100 * max_sobrev$Freq / num_passageiros_non_crew, 1)
min_sobrev$Percentagem = round(100 * min_sobrev$Freq / num_passageiros_non_crew, 1)
max_nao$Percentagem    = round(100 * max_nao$Freq / num_passageiros_non_crew, 1)
min_nao$Percentagem    = round(100 * min_nao$Freq / num_passageiros_non_crew, 1)

# Tabela resumo de máximos e mínimos
tabela_max_min = data.frame(
  Observação = c("Máximo de sobreviventes", "Mínimo de sobreviventes",
                 "Máximo de não sobreviventes", "Mínimo de não sobreviventes"),
  Quantidade = c(max_sobrev$Freq, min_sobrev$Freq, max_nao$Freq, min_nao$Freq),
  Classe     = c(max_sobrev$Class, min_sobrev$Class, max_nao$Class, min_nao$Class),
  Percentagem = c(max_sobrev$Percentagem, min_sobrev$Percentagem,
                  max_nao$Percentagem, min_nao$Percentagem)
)

# ---------------------------------------------------------------------------

Sobrevivência da tripulação. Nesta secção analisa‑se a sobrevivência da tripulação, comparando o número de tripulantes que sobreviveram com os que não sobreviveram.

# Análise da sobrevivência da tripulação

# Número total de tripulantes a bordo
crew_abordo = sum(df[df$Class == "Crew", ]$Freq)

# Número de tripulantes sobreviventes e não sobreviventes
crew_s  = sum(df[df$Class == "Crew" & df$Survived == "Yes", ]$Freq)
crew_ns = sum(df[df$Class == "Crew" & df$Survived == "No", ]$Freq)

# Tabela com frequências e percentagens da tripulação
crew_s_tabela = data.frame(
  Estado = c("Não sobreviveu", "Sobreviveu"),
  Frequência = c(crew_ns, crew_s),
  Percentagem = c(
    round(crew_ns / crew_abordo * 100),
    round(crew_s  / crew_abordo * 100)
  )
)

knitr::kable(
  crew_s_tabela,
  caption = "Sobrevivência da tripulacao"
)
Sobrevivência da tripulacao
Estado Frequência Percentagem
Não sobreviveu 673 76
Sobreviveu 212 24
# Tabela de máximos e mínimos de sobreviventes e não sobreviventes por classe
knitr::kable(
  tabela_max_min,
  caption = "Máximos e mínimos de sobreviventes e não sobreviventes por classe"
)
Máximos e mínimos de sobreviventes e não sobreviventes por classe
Observação Quantidade Classe Percentagem
Máximo de sobreviventes 203 1st 15.4
Mínimo de sobreviventes 118 2nd 9.0
Máximo de não sobreviventes 528 3rd 40.1
Mínimo de não sobreviventes 122 1st 9.3
# Preparação da tabela de distribuição de passageiros por classe
freq_filtrado_classe_tab = freq_filtrado_classe
names(freq_filtrado_classe_tab) = c("Classe", "N.º de Passageiros", "Percentagem")

knitr::kable(
  freq_filtrado_classe_tab,
  caption = "Distribuição de passageiros por classe (sem tripulação)"
)
Distribuição de passageiros por classe (sem tripulação)
Classe N.º de Passageiros Percentagem
1st 325 25
2nd 285 22
3rd 706 54
Tabela de análise comparativa dos grupos de passageiros
Classe Grupo Demográfico N.º de Passageiros Sobreviventes Taxa de sobrevivência
Homens 175 57 33
Mulheres e Crianças 150 146 97
Mulheres e Crianças 117 104 89
Mulheres e Crianças 244 103 42

Gráficos

Nesta secção apresentam‑se vários gráficos de barras e de sectores que ilustram a sobrevivência por género, classe e grupo demográfico, mantendo as cores originais do trabalho.

# ---------------------------------------------------------------------------
# Percentagem de sobrevivência da tripulação por género

crew_sM = sum(df[df$Class == "Crew" & df$Survived == "Yes" & df$Sex == "Female", ]$Freq)
crewM   = sum(df[df$Class == "Crew" & df$Sex == "Female", ]$Freq)

crew_sH = sum(df[df$Class == "Crew" & df$Survived == "Yes" & df$Sex == "Male", ]$Freq)
crewH   = sum(df[df$Class == "Crew" & df$Sex == "Male", ]$Freq)

pcrewM  = round(crew_sM / crewM * 100)
pcrewH  = round(crew_sH / crewH * 100)

pcrew_MH = c(pcrewH, pcrewM)

crewHM = barplot(
  pcrew_MH,
  main = "Percentagem de sobrevivência\nda tripulação por género",
  ylab = "Percentagem (%)",
  col = "lightblue",
  ylim = c(0, 100),
  names.arg = c("Homens", "Mulheres")
)

# Adicionar rótulos com percentagens
text(
  x = crewHM,
  y = pcrew_MH,
  labels = paste0(pcrew_MH, "%"),
  pos = 3
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Comparação da percentagem de sobreviventes: tripulação vs passageiros

crew_s          = round(((crew_sM + crew_sH) / crew_abordo) * 100)
total_pass_sobre = round((sum(soma_sobrev$Freq) / num_passageiros_non_crew) * 100)

pCrew_Pass = c(crew_s, total_pass_sobre)

bp_crew_pass = barplot(
  pCrew_Pass,
  names.arg = c("Tripulação", "Passageiros"),
  col = c("red", "skyblue"),
  ylab = "Percentagem (%)",
  main = "Percentagem de sobreviventes:\nTripulação vs Passageiros",
  ylim = c(0, max(pCrew_Pass) * 1.2)
)

# Rótulos das percentagens
text(
  x = bp_crew_pass,
  y = pCrew_Pass + 2,
  labels = paste0(pCrew_Pass, "%"),
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Percentagem de sobreviventes do total de sobreviventes, por classe

soma_sobrev$Freq_relativa = round(
  soma_sobrev$Freq / sum(soma_sobrev$Freq) * 100
)

bp_soma_sobrev = barplot(
  soma_sobrev$Freq_relativa,
  names.arg = soma_sobrev$Class,
  col = "skyblue",
  ylab = "Percentagem",
  xlab = "Classe",
  main = "Percentagem de sobreviventes\ndo total de passageiros sobreviventes, por classe",
  ylim = c(0, max(soma_sobrev$Freq_relativa) * 1.2)
)

# Rótulos de percentagem
text(
  x = bp_soma_sobrev,
  y = soma_sobrev$Freq_relativa + 2,
  labels = paste0(soma_sobrev$Freq_relativa, "%"),
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Percentagem de sobreviventes relativamente ao total de passageiros, por classe

soma_sobrev$Freq_relativa_p = round(
  (soma_sobrev$Freq / num_passageiros_non_crew) * 100
)

bp_soma_sobrev_p = barplot(
  soma_sobrev$Freq_relativa_p,
  names.arg = soma_sobrev$Class,
  col = "black",
  ylab = "Percentagem",
  xlab = "Classe",
  main = "Percentagem de sobreviventes\ndo total de passageiros, por classe",
  ylim = c(0, max(soma_sobrev$Freq_relativa_p) * 1.2)
)

text(
  x = bp_soma_sobrev_p,
  y = soma_sobrev$Freq_relativa_p + 2,
  labels = paste0(soma_sobrev$Freq_relativa_p, "%"),
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Percentagem de sobrevivência por classe (tabelas cruzadas)

# Coluna de frequência relativa no data frame cruzado classe x sobrevivência
soma_por_classe$Freq_relativa = (soma_por_classe$Freq / num_passageiros_non_crew)

# Novo data frame cruzado com percentagens
tabela_classes = xtabs(
  round(Freq_relativa * 100) ~ Survived + Class,
  data = soma_por_classe
)

graf_barras_class = barplot(
  tabela_classes[, 1:3],
  col = c("black", "skyblue"),
  main = "Percentagem de sobrevivência por classe",
  ylab = "Percentagem",
  xlab = "Classes",
  ylim = c(0, max(colSums(tabela_classes)) * 1.5)
)

legend(
  "topright",
  legend = c("Não sobreviveu", "Sobreviveu"),
  fill   = c("black", "skyblue"),
  bty    = "n",
  cex    = 0.8
)

# Código para colocar as percentagens dentro de cada rectângulo do gráfico (Assistência da IA)
altura_acum = apply(tabela_classes, 2, cumsum)

for (i in 1:nrow(tabela_classes)) {
  for (j in 1:ncol(tabela_classes)) {
    text(
      x = graf_barras_class[j],
      y = if (i == 1) tabela_classes[i, j] / 2
          else altura_acum[i, j] - tabela_classes[i, j] / 2,
      labels = paste0(round(tabela_classes[i, j], 1), "%"),
      col = "white",
      cex = 0.8
    )
  }
}

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Gráficos de sectores (pie charts) para cada classe

# Totais por classe
totais_classe = freq_filtrado_classe[, 1:2]

# Nomes das classes (caracter)
classes = as.character(totais_classe$Class)

# Títulos dos gráficos em português
titulos_pt = c("1ª Classe", "2ª Classe", "3ª Classe")

par(mfrow = c(1, 3), mar = c(1, 1, 1, 1), oma = c(0, 0, 2, 0), xpd = TRUE)

for (i in 1:3) {
  cl    = classes[i]
  total = totais_classe$Freq[totais_classe$Class == cl]

  val_graf = round(
    (soma_por_classe$Freq[soma_por_classe$Class == cl] / total) * 100,
    1
  )

  pie(
    val_graf,
    col    = c("black", "skyblue"),
    labels = paste0(val_graf, "%"),
    radius = 1
  )

  title(titulos_pt[i], line = -5)

  legend(
    "bottom",
    legend = c("Não sobreviveu", "Sobreviveu"),
    fill   = c("black", "skyblue"),
    horiz  = TRUE,
    bty    = "n",
    inset  = c(0, 0.20),
    xpd    = TRUE,
    cex    = 0.8
  )
}

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Gráfico de barras – 1ª classe: Homens vs Mulheres e Crianças

pH1  = round(nro_passageiros_class1_homens_S / nro_passageiros_class1_homens * 100)
pMC1 = round(nro_passageiros_class1_MC_S    / nro_passageiros_class1_MC    * 100)

pH1MC1 = c(pH1, pMC1)

H1CM1 = barplot(
  pH1MC1,
  names.arg = c("Homens 1ª Classe", "Mulheres e Crianças 1ª Classe"),
  xlab = "Grupo Demográfico",
  ylab = "Taxa de sobrevivência (%)",
  main = "1ª Classe",
  col  = "lightblue",
  ylim = c(0, max(pH1MC1) * 1.2)
)

text(
  x = H1CM1,
  y = pH1MC1,
  labels = paste0(pH1MC1, "%"),
  pos = 3,
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Gráfico de barras – Homens 1ª classe vs Mulheres e Crianças 2ª classe

pMC2 = round(nro_passageiros_class2_MC_S / nro_passageiros_class2_MC * 100)

pH1MC2 = c(pH1, pMC2)

H1MC2 = barplot(
  pH1MC2,
  names.arg = c("Homens 1ª Classe", "Mulheres e Crianças 2ª Classe"),
  xlab = "Grupo Demográfico",
  ylab = "Taxa de sobrevivência (%)",
  main = "1ª Classe vs 2ª Classe",
  ylim = c(0, 100),
  col  = "lightblue"
)


text(
  x = H1MC2,
  y = pH1MC2,
  labels = paste0(pH1MC2, "%"),
  pos = 3,
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Gráfico de barras – Homens 1ª classe vs Mulheres e Crianças 3ª classe

pMC3 = round(nro_passageiros_class3_MC_S / nro_passageiros_class3_MC * 100)

pH1MC3 = c(pH1, pMC3)

H1MC3 = barplot(
  pH1MC3,
  names.arg = c("Homens 1ª Classe", "Mulheres e Crianças 3ª Classe"),
  xlab = "Grupo Demográfico",
  ylab = "Taxa de sobrevivência (%)",
  main = "1ª Classe vs 3ª Classe",
  ylim = c(0, 100),
  col  = "lightblue"
)

text(
  x = H1MC3,
  y = pH1MC3,
  labels = paste0(pH1MC3, "%"),
  pos = 3,
  col = "black",
  cex = 0.8
)

# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Comparação geral da taxa de sobrevivência entre grupos e classes

# Matriz de taxas de sobrevivência:
# - 1ª linha: homens 1ª classe
# - 2ª linha: mulheres e crianças das 3 classes

all_comparation = matrix(
  c(
    pH1MC1,  # 1ª classe
    pH1MC2,  # 2ª classe
    pH1MC3   # 3ª classe
  ),
  nrow = 2,
  byrow = FALSE
)

# Nomes das linhas e colunas
rownames(all_comparation) = c("Homens 1ª Classe", "Mulheres e Crianças")
colnames(all_comparation) = c("1ª Classe", "2ª Classe", "3ª Classe")

# Gráfico de barras lado a lado
H1MCG = barplot(
  all_comparation,
  beside = TRUE,
  xlab = "Classes",
  ylab = "Taxa de sobrevivência (%)",
  main = "Comparação da taxa de sobrevivência",
  ylim = c(0, 120),
  col  = c("lightblue", "black")
)

# Legenda
legend(
  "topright",
  legend = rownames(all_comparation),
  bty    = "n",
  fill   = c("lightblue", "black")
)

# Adicionar percentagens acima de cada barra
for (i in 1:nrow(all_comparation)) {
  text(
    x = H1MCG[i, ],
    y = all_comparation[i, ],
    labels = paste0(all_comparation[i, ], "%"),
    pos = 3,
    col = "black",
    cex = 0.8
  )
}

# ---------------------------------------------------------------------------