3. Justificación
El análisis de sexo y edad en contextos de desastre es crucial para
entender las dinámicas sociales y los sesgos en protocolos de
emergencia. En el caso del Titanic, este enfoque permite verificar la
aplicación real de la norma no escrita de “mujeres y niños primero”.
Desde una perspectiva formativa, trabajar con estas variables ofrece una
base clara para practicar análisis univariantes y bivariantes, útiles en
estadística descriptiva y ciencias sociales.
# Cargar dataset del Titanic
titanic_data <- read.csv("https://raw.githubusercontent.com/anyicastillo/Analisis_Titanic/refs/heads/main/Titanic-Dataset.csv", stringsAsFactors = FALSE)
# Ver estructura inicial
cat("Dimensiones del dataset:", dim(titanic_data), "\n")
## Dimensiones del dataset: 891 12
cat("Variables disponibles:", names(titanic_data), "\n\n")
## Variables disponibles: PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
# Mostrar primeras filas
head(titanic_data) %>% kable() %>% kable_styling(bootstrap_options = "striped")
|
PassengerId
|
Survived
|
Pclass
|
Name
|
Sex
|
Age
|
SibSp
|
Parch
|
Ticket
|
Fare
|
Cabin
|
Embarked
|
|
1
|
0
|
3
|
Braund, Mr. Owen Harris
|
male
|
22
|
1
|
0
|
A/5 21171
|
7.2500
|
|
S
|
|
2
|
1
|
1
|
Cumings, Mrs. John Bradley (Florence Briggs Thayer)
|
female
|
38
|
1
|
0
|
PC 17599
|
71.2833
|
C85
|
C
|
|
3
|
1
|
3
|
Heikkinen, Miss. Laina
|
female
|
26
|
0
|
0
|
STON/O2. 3101282
|
7.9250
|
|
S
|
|
4
|
1
|
1
|
Futrelle, Mrs. Jacques Heath (Lily May Peel)
|
female
|
35
|
1
|
0
|
113803
|
53.1000
|
C123
|
S
|
|
5
|
0
|
3
|
Allen, Mr. William Henry
|
male
|
35
|
0
|
0
|
373450
|
8.0500
|
|
S
|
|
6
|
0
|
3
|
Moran, Mr. James
|
male
|
NA
|
0
|
0
|
330877
|
8.4583
|
|
Q
|
# Información básica del dataset
str(titanic_data)
## '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 : chr "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
## $ Sex : chr "male" "female" "female" "female" ...
## $ 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 : chr "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
## $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
## $ Cabin : chr "" "C85" "" "C123" ...
## $ Embarked : chr "S" "C" "S" "S" ...
## PassengerId Survived Pclass Name
## Min. : 1.0 Min. :0.0000 Min. :1.000 Length:891
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000 Class :character
## Median :446.0 Median :0.0000 Median :3.000 Mode :character
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Sex Age SibSp Parch
## Length:891 Min. : 0.42 Min. :0.000 Min. :0.0000
## Class :character 1st Qu.:20.12 1st Qu.:0.000 1st Qu.:0.0000
## Mode :character Median :28.00 Median :0.000 Median :0.0000
## Mean :29.70 Mean :0.523 Mean :0.3816
## 3rd Qu.:38.00 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :80.00 Max. :8.000 Max. :6.0000
## NA's :177
## Ticket Fare Cabin Embarked
## Length:891 Min. : 0.00 Length:891 Length:891
## Class :character 1st Qu.: 7.91 Class :character Class :character
## Mode :character Median : 14.45 Mode :character Mode :character
## Mean : 32.20
## 3rd Qu.: 31.00
## Max. :512.33
##
# Crear copia del dataset para análisis
df <- titanic_data
# Renombrar variables en español
df <- df %>%
rename(
Sobrevivio = Survived,
Sexo = Sex,
Edad = Age,
Clase = Pclass
)
# Convertir variables categóricas
df <- df %>%
mutate(
Sobrevivio = factor(Sobrevivio, levels = c(0, 1), labels = c("No", "Sí")),
Sexo = factor(Sexo, levels = c("male", "female"), labels = c("Hombre", "Mujer")),
Clase = factor(Clase, levels = c(1, 2, 3), labels = c("Primera", "Segunda", "Tercera"))
)
# Crear grupos etarios
df <- df %>%
mutate(
Grupo_Edad = case_when(
Edad < 12 ~ "Niño (0-11)",
Edad >= 12 & Edad < 18 ~ "Adolescente (12-17)",
Edad >= 18 & Edad < 60 ~ "Adulto (18-59)",
Edad >= 60 ~ "Adulto Mayor (60+)",
is.na(Edad) ~ "Edad Desconocida"
),
Grupo_Edad = factor(Grupo_Edad,
levels = c("Niño (0-11)", "Adolescente (12-17)", "Adulto (18-59)",
"Adulto Mayor (60+)", "Edad Desconocida"))
)
# Verificar transformaciones
cat("Resumen después del preprocesamiento:\n")
## Resumen después del preprocesamiento:
table(df$Sobrevivio) %>% kable() %>% kable_styling()
# Análisis de supervivencia global
superv_global <- df %>%
count(Sobrevivio) %>%
mutate(Porcentaje = round(n/sum(n)*100, 2))
cat("Distribución de Supervivencia Global:\n")
## Distribución de Supervivencia Global:
superv_global %>% kable() %>% kable_styling()
|
Sobrevivio
|
n
|
Porcentaje
|
|
No
|
549
|
61.62
|
|
Sí
|
342
|
38.38
|
# Gráfico de supervivencia global
ggplot(superv_global, aes(x = Sobrevivio, y = n, fill = Sobrevivio)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0(n, " (", Porcentaje, "%)")), vjust = -0.5) +
labs(title = "Distribución de Supervivencia en el Titanic",
x = "Sobrevivió", y = "Número de Pasajeros") +
theme_minimal() +
scale_fill_manual(values = c("No" = "#e74c3c", "Sí" = "#2ecc71"))

# Análisis de distribución por sexo
dist_sexo <- df %>%
count(Sexo) %>%
mutate(Porcentaje = round(n/sum(n)*100, 2))
cat("Distribución por Sexo:\n")
## Distribución por Sexo:
dist_sexo %>% kable() %>% kable_styling()
|
Sexo
|
n
|
Porcentaje
|
|
Hombre
|
577
|
64.76
|
|
Mujer
|
314
|
35.24
|
# Gráfico de distribución por sexo
ggplot(dist_sexo, aes(x = Sexo, y = n, fill = Sexo)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0(n, " (", Porcentaje, "%)")), vjust = -0.5) +
labs(title = "Distribución de Pasajeros por Sexo",
x = "Sexo", y = "Número de Pasajeros") +
theme_minimal() +
scale_fill_manual(values = c("Hombre" = "#3498db", "Mujer" = "#e91e63"))

# Análisis descriptivo de edad
estadisticas_edad <- df %>%
summarise(
Media = mean(Edad, na.rm = TRUE),
Mediana = median(Edad, na.rm = TRUE),
Desviacion = sd(Edad, na.rm = TRUE),
Minimo = min(Edad, na.rm = TRUE),
Maximo = max(Edad, na.rm = TRUE),
NA_count = sum(is.na(Edad))
)
cat("Estadísticas Descriptivas de la Edad:\n")
## Estadísticas Descriptivas de la Edad:
estadisticas_edad %>% kable() %>% kable_styling()
|
Media
|
Mediana
|
Desviacion
|
Minimo
|
Maximo
|
NA_count
|
|
29.69912
|
28
|
14.5265
|
0.42
|
80
|
177
|
# Histograma de edades
ggplot(df, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "#9b59b6", alpha = 0.7, color = "white") +
labs(title = "Distribución de Edades en el Titanic",
x = "Edad", y = "Frecuencia") +
theme_minimal()

# Análisis de grupos etarios
dist_etaria <- df %>%
count(Grupo_Edad) %>%
mutate(Porcentaje = round(n/sum(n)*100, 2))
cat("Distribución por Grupos Etarios:\n")
## Distribución por Grupos Etarios:
dist_etaria %>% kable() %>% kable_styling()
|
Grupo_Edad
|
n
|
Porcentaje
|
|
Niño (0-11)
|
68
|
7.63
|
|
Adolescente (12-17)
|
45
|
5.05
|
|
Adulto (18-59)
|
575
|
64.53
|
|
Adulto Mayor (60+)
|
26
|
2.92
|
|
Edad Desconocida
|
177
|
19.87
|
# Gráfico de grupos etarios
ggplot(dist_etaria, aes(x = Grupo_Edad, y = n, fill = Grupo_Edad)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0(n, " (", Porcentaje, "%)")), vjust = -0.5, size = 3) +
labs(title = "Distribución de Pasajeros por Grupos Etarios",
x = "Grupo de Edad", y = "Número de Pasajeros") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Tabla de contingencia: Supervivencia vs Sexo
tabla_sexo <- table(df$Sexo, df$Sobrevivio)
prop_sexo <- prop.table(tabla_sexo, margin = 1) * 100
cat("Tabla de Contingencia: Supervivencia por Sexo\n")
## Tabla de Contingencia: Supervivencia por Sexo
tabla_sexo %>% kable() %>% kable_styling()
|
|
No
|
Sí
|
|
Hombre
|
468
|
109
|
|
Mujer
|
81
|
233
|
cat("\nPorcentajes por Fila (Sexo):\n")
##
## Porcentajes por Fila (Sexo):
prop_sexo %>% round(2) %>% kable() %>% kable_styling()
|
|
No
|
Sí
|
|
Hombre
|
81.11
|
18.89
|
|
Mujer
|
25.80
|
74.20
|
# Gráfico de supervivencia por sexo
df %>%
count(Sexo, Sobrevivio) %>%
group_by(Sexo) %>%
mutate(Porcentaje = n/sum(n)*100) %>%
ggplot(aes(x = Sexo, y = Porcentaje, fill = Sobrevivio)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Tasa de Supervivencia por Sexo",
x = "Sexo", y = "Porcentaje", fill = "Sobrevivió") +
theme_minimal() +
scale_fill_manual(values = c("No" = "#e74c3c", "Sí" = "#2ecc71"))

# Tabla de contingencia: Supervivencia vs Grupo de Edad
tabla_edad <- table(df$Grupo_Edad, df$Sobrevivio)
prop_edad <- prop.table(tabla_edad, margin = 1) * 100
cat("Tabla de Contingencia: Supervivencia por Grupo de Edad\n")
## Tabla de Contingencia: Supervivencia por Grupo de Edad
tabla_edad %>% kable() %>% kable_styling()
|
|
No
|
Sí
|
|
Niño (0-11)
|
29
|
39
|
|
Adolescente (12-17)
|
23
|
22
|
|
Adulto (18-59)
|
353
|
222
|
|
Adulto Mayor (60+)
|
19
|
7
|
|
Edad Desconocida
|
125
|
52
|
cat("\nPorcentajes por Fila (Grupo de Edad):\n")
##
## Porcentajes por Fila (Grupo de Edad):
prop_edad %>% round(2) %>% kable() %>% kable_styling()
|
|
No
|
Sí
|
|
Niño (0-11)
|
42.65
|
57.35
|
|
Adolescente (12-17)
|
51.11
|
48.89
|
|
Adulto (18-59)
|
61.39
|
38.61
|
|
Adulto Mayor (60+)
|
73.08
|
26.92
|
|
Edad Desconocida
|
70.62
|
29.38
|
# Gráfico de supervivencia por grupos etarios
df %>%
count(Grupo_Edad, Sobrevivio) %>%
group_by(Grupo_Edad) %>%
mutate(Porcentaje = n/sum(n)*100) %>%
ggplot(aes(x = Grupo_Edad, y = Porcentaje, fill = Sobrevivio)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
labs(title = "Tasa de Supervivencia por Grupo de Edad",
x = "Grupo de Edad", y = "Porcentaje", fill = "Sobrevivió") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_manual(values = c("No" = "#e74c3c", "Sí" = "#2ecc71"))

# Análisis combinado de sexo y grupos etarios
analisis_combinado <- df %>%
group_by(Sexo, Grupo_Edad) %>%
summarise(
Total = n(),
Sobrevivientes = sum(Sobrevivio == "Sí"),
Tasa_Supervivencia = round(Sobrevivientes/Total * 100, 2),
.groups = 'drop'
)
cat("Análisis Combinado: Sexo y Grupo de Edad\n")
## Análisis Combinado: Sexo y Grupo de Edad
analisis_combinado %>% kable() %>% kable_styling()
|
Sexo
|
Grupo_Edad
|
Total
|
Sobrevivientes
|
Tasa_Supervivencia
|
|
Hombre
|
Niño (0-11)
|
36
|
20
|
55.56
|
|
Hombre
|
Adolescente (12-17)
|
22
|
3
|
13.64
|
|
Hombre
|
Adulto (18-59)
|
373
|
67
|
17.96
|
|
Hombre
|
Adulto Mayor (60+)
|
22
|
3
|
13.64
|
|
Hombre
|
Edad Desconocida
|
124
|
16
|
12.90
|
|
Mujer
|
Niño (0-11)
|
32
|
19
|
59.38
|
|
Mujer
|
Adolescente (12-17)
|
23
|
19
|
82.61
|
|
Mujer
|
Adulto (18-59)
|
202
|
155
|
76.73
|
|
Mujer
|
Adulto Mayor (60+)
|
4
|
4
|
100.00
|
|
Mujer
|
Edad Desconocida
|
53
|
36
|
67.92
|
# Heatmap de supervivencia
ggplot(analisis_combinado, aes(x = Sexo, y = Grupo_Edad, fill = Tasa_Supervivencia)) +
geom_tile(color = "white") +
geom_text(aes(label = paste0(Tasa_Supervivencia, "%")), color = "white", size = 4) +
scale_fill_gradient(low = "#e74c3c", high = "#2ecc71", name = "Tasa de\nSupervivencia (%)") +
labs(title = "Mapa de Calor: Tasa de Supervivencia por Sexo y Grupo de Edad",
x = "Sexo", y = "Grupo de Edad") +
theme_minimal()

# Estadísticas de edad por grupo de supervivencia
estadisticas_edad_superv <- df %>%
group_by(Sobrevivio) %>%
summarise(
n = n(),
Media_Edad = mean(Edad, na.rm = TRUE),
Mediana_Edad = median(Edad, na.rm = TRUE),
SD_Edad = sd(Edad, na.rm = TRUE),
Min_Edad = min(Edad, na.rm = TRUE),
Max_Edad = max(Edad, na.rm = TRUE),
.groups = 'drop'
)
cat("Estadísticas de Edad por Estado de Supervivencia:\n")
## Estadísticas de Edad por Estado de Supervivencia:
estadisticas_edad_superv %>% kable(digits = 2) %>% kable_styling()
|
Sobrevivio
|
n
|
Media_Edad
|
Mediana_Edad
|
SD_Edad
|
Min_Edad
|
Max_Edad
|
|
No
|
549
|
30.63
|
28
|
14.17
|
1.00
|
74
|
|
Sí
|
342
|
28.34
|
28
|
14.95
|
0.42
|
80
|
# Boxplot de edades por supervivencia
ggplot(df, aes(x = Sobrevivio, y = Edad, fill = Sobrevivio)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Distribución de Edades por Estado de Supervivencia",
x = "Sobrevivió", y = "Edad") +
theme_minimal() +
scale_fill_manual(values = c("No" = "#e74c3c", "Sí" = "#2ecc71"))

# Definir grupo "mujeres y niños"
df <- df %>%
mutate(
Mujer_Niño = ifelse(Sexo == "Mujer" | Grupo_Edad == "Niño (0-11)", "Mujer o Niño", "Hombre Adulto/Adolescente"),
Mujer_Niño = factor(Mujer_Niño)
)
# Análisis del protocolo
analisis_protocolo <- df %>%
group_by(Mujer_Niño) %>%
summarise(
Total = n(),
Sobrevivientes = sum(Sobrevivio == "Sí"),
Tasa_Supervivencia = round(Sobrevivientes/Total * 100, 2),
.groups = 'drop'
)
cat("Análisis del Protocolo 'Mujeres y Niños Primero':\n")
## Análisis del Protocolo 'Mujeres y Niños Primero':
analisis_protocolo %>% kable() %>% kable_styling()
|
Mujer_Niño
|
Total
|
Sobrevivientes
|
Tasa_Supervivencia
|
|
Hombre Adulto/Adolescente
|
541
|
89
|
16.45
|
|
Mujer o Niño
|
350
|
253
|
72.29
|
# Gráfico comparativo
ggplot(analisis_protocolo, aes(x = Mujer_Niño, y = Tasa_Supervivencia, fill = Mujer_Niño)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0(Tasa_Supervivencia, "%")), vjust = -0.5) +
labs(title = "Tasa de Supervivencia: Protocolo 'Mujeres y Niños Primero'",
x = "Categoría", y = "Tasa de Supervivencia (%)") +
theme_minimal() +
ylim(0, 100) +
scale_fill_manual(values = c("Mujer o Niño" = "#2ecc71", "Hombre Adulto/Adolescente" = "#e74c3c"))
<img src=“index_files/figure-html/Análisis de”Mujeres y Niños
Primero”-1.png” width=“672” />
# Cálculo de métricas clave
resumen_final <- list(
"Tasa Supervivencia Global" = paste0(round(mean(df$Sobrevivio == "Sí") * 100, 1), "%"),
"Tasa Supervivencia Mujeres" = paste0(round(prop_sexo[2,2], 1), "%"),
"Tasa Supervivencia Hombres" = paste0(round(prop_sexo[1,2], 1), "%"),
"Tasa Supervivencia Niños" = paste0(round(prop_edad[1,2], 1), "%"),
"Tasa Supervivencia Mujeres/Niños" = paste0(analisis_protocolo$Tasa_Supervivencia[1], "%"),
"Ratio Mujeres/Hombres" = paste0(round(prop_sexo[2,2] / prop_sexo[1,2], 1), ":1")
)
cat("RESUMEN EJECUTIVO - ANÁLISIS DE SUPERVIVENCIA TITANIC\n\n")
## RESUMEN EJECUTIVO - ANÁLISIS DE SUPERVIVENCIA TITANIC
for(i in seq_along(resumen_final)) {
cat(names(resumen_final)[i], ":", resumen_final[[i]], "\n")
}
## Tasa Supervivencia Global : 38.4%
## Tasa Supervivencia Mujeres : 74.2%
## Tasa Supervivencia Hombres : 18.9%
## Tasa Supervivencia Niños : 57.4%
## Tasa Supervivencia Mujeres/Niños : 16.45%
## Ratio Mujeres/Hombres : 3.9:1