knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE,
fig.width = 7, fig.height = 4.5)
library(readxl)
library(dplyr)
library(ggplot2)
library(scales)
library(tidyr)
# --- Carga única de los datos para todo el documento ---
datos <- read_excel("Base de datos.xlsx", sheet = "Breast_Cancer")
names(datos) <- trimws(names(datos))
# Tema general para los gráficos del tablero
tema_dashboard <- theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"))
El conjunto de datos utilizado en este tablero corresponde a “Breast Cancer Dataset”, publicado en Kaggle por Reihane Namdari y construido a partir de información del SEER Program (Surveillance, Epidemiology, and End Results) del National Cancer Institute de Estados Unidos. El SEER recopila datos clínicos y demográficos de pacientes diagnosticados con cáncer en distintos registros regionales de EE. UU.
Grade,
con 19 registros sin dato (0,47 % del total).# Dimensiones de la muestra
dim(datos)
## [1] 4024 16
# Vista general de la estructura de las variables
glimpse(datos)
## Rows: 4,024
## Columns: 16
## $ Age <dbl> 68, 50, 58, 58, 47, 51, 51, 40, 40, 69, 68, 4…
## $ Race <chr> "White", "White", "White", "White", "White", …
## $ `Marital Status` <chr> "Married", "Married", "Divorced", "Married", …
## $ `T Stage` <chr> "T1", "T2", "T3", "T1", "T2", "T1", "T1", "T2…
## $ `N Stage` <chr> "N1", "N2", "N3", "N1", "N1", "N1", "N1", "N1…
## $ `6th Stage` <chr> "IIA", "IIIA", "IIIC", "IIA", "IIB", "IIA", "…
## $ differentiate <chr> "Poorly differentiated", "Moderately differen…
## $ Grade <dbl> 3, 2, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 3, 3, 2, …
## $ `A Stage` <chr> "Regional", "Regional", "Regional", "Regional…
## $ `Tumor Size` <dbl> 4, 35, 63, 18, 41, 20, 8, 30, 103, 32, 13, 59…
## $ `Estrogen Status` <chr> "Positive", "Positive", "Positive", "Positive…
## $ `Progesterone Status` <chr> "Positive", "Positive", "Positive", "Positive…
## $ `Regional Node Examined` <dbl> 24, 14, 14, 2, 3, 18, 11, 9, 20, 21, 9, 11, 1…
## $ `Reginol Node Positive` <dbl> 1, 5, 7, 1, 1, 2, 1, 1, 18, 12, 1, 3, 3, 7, 1…
## $ `Survival Months` <dbl> 60, 62, 75, 84, 50, 89, 54, 14, 70, 92, 64, 9…
## $ Status <chr> "Alive", "Alive", "Alive", "Alive", "Alive", …
| # | Variable | Tipo | Descripción | Valores / rango |
|---|---|---|---|---|
| 1 | Age |
Numérica (entera) | Edad del paciente en años al momento del diagnóstico | 30 - 69 años (media ≈ 54) |
| 2 | Race |
Categórica | Raza del paciente | White, Black, Other |
| 3 | Marital Status |
Categórica | Estado civil del paciente | Married, Divorced, Single, Widowed, Separated |
| 4 | T Stage |
Categórica (ordinal) | Estadio del tumor (tamaño/extensión local), clasificación TNM | T1, T2, T3, T4 |
| 5 | N Stage |
Categórica (ordinal) | Estadio ganglionar (nódulos linfáticos afectados), clasificación TNM | N1, N2, N3 |
| 6 | 6th Stage |
Categórica (ordinal) | Estadio combinado del cáncer según la 6ª edición del AJCC | IIA, IIB, IIIA, IIIB, IIIC |
| 7 | differentiate |
Categórica (ordinal) | Grado de diferenciación del tejido tumoral | Well differentiated, Moderately differentiated, Poorly differentiated, Undifferentiated |
| 8 | Grade |
Numérica / ordinal | Grado histológico del tumor (versión numérica de
differentiate) |
1, 2, 3 (19 valores faltantes) |
| 9 | A Stage |
Categórica (binaria) | Extensión anatómica del cáncer | Regional, Distant |
| 10 | Tumor Size |
Numérica (entera) | Tamaño del tumor en milímetros | 1 - 140 mm (media ≈ 30,5) |
| 11 | Estrogen Status |
Categórica (binaria) | Presencia de receptores de estrógeno en el tumor | Positive, Negative |
| 12 | Progesterone Status |
Categórica (binaria) | Presencia de receptores de progesterona en el tumor | Positive, Negative |
| 13 | Regional Node Examined |
Numérica (entera) | Número de ganglios linfáticos regionales examinados | 1 - 61 (media ≈ 14,4) |
| 14 | Reginol Node Positive |
Numérica (entera) | Número de ganglios linfáticos regionales positivos (con cáncer) | 1 - 46 (media ≈ 4,2) |
| 15 | Survival Months |
Numérica (entera) | Meses de supervivencia del paciente desde el diagnóstico hasta el fin del seguimiento | 1 - 107 meses (media ≈ 71,3) |
| 16 | Status |
Categórica (binaria) — variable de interés/desenlace | Estado vital del paciente al final del seguimiento | Alive (3.408 = 84,7 %), Dead (616 = 15,3 %) |
Nota: la variable Status se considera
el desenlace principal del estudio (evento de interés: fallecimiento del
paciente), mientras que el resto de variables corresponden a
características clínicas, demográficas y patológicas que pueden
asociarse con dicho desenlace.
En esta sección se describe la distribución individual de las
variables numéricas y categóricas más relevantes del conjunto de datos
Breast_Cancer (n = 4.024 pacientes).
vars_num <- c("Age", "Tumor Size", "Regional Node Examined",
"Reginol Node Positive", "Survival Months")
resumen_num <- datos %>%
summarise(across(all_of(vars_num),
list(media = ~mean(.x, na.rm = TRUE),
mediana = ~median(.x, na.rm = TRUE),
de = ~sd(.x, na.rm = TRUE),
min = ~min(.x, na.rm = TRUE),
max = ~max(.x, na.rm = TRUE))))
resumen_num
ggplot(datos, aes(x = Age)) +
geom_histogram(binwidth = 3, fill = "red", color = "white") +
labs(title = "Distribución de la edad de las pacientes",
x = "Edad (años)", y = "Frecuencia") +
tema_dashboard
ggplot(datos, aes(x = `Tumor Size`)) +
geom_histogram(binwidth = 5, fill = "#e34a33", color = "white") +
labs(title = "Distribución del tamaño del tumor",
x = "Tamaño del tumor (mm)", y = "Frecuencia") +
tema_dashboard
ggplot(datos, aes(x = `Survival Months`)) +
geom_histogram(binwidth = 6, fill = "#31a354", color = "white") +
labs(title = "Distribución de los meses de supervivencia",
x = "Meses de supervivencia", y = "Frecuencia") +
tema_dashboard
ggplot(datos, aes(x = `Reginol Node Positive`)) +
geom_histogram(binwidth = 2, fill = "#756bb1", color = "white") +
labs(title = "Distribución de ganglios regionales positivos",
x = "N.º de ganglios positivos", y = "Frecuencia") +
tema_dashboard
Interpretación:
ggplot(datos, aes(x = Status, fill = Status)) +
geom_bar() +
geom_text(stat = "count", aes(label = percent(after_stat(count)/sum(after_stat(count)))),
vjust = -0.4) +
scale_fill_manual(values = c("Alive" = "#2c7fb8", "Dead" = "#de2d26")) +
labs(title = "Estado vital de las pacientes", x = "Estado", y = "N.º de pacientes") +
tema_dashboard +
theme(legend.position = "none")
ggplot(datos, aes(x = reorder(Race, Race, function(x) -length(x)))) +
geom_bar(fill = "#41ab5d") +
labs(title = "Distribución por raza", x = "Raza", y = "N.º de pacientes") +
tema_dashboard
ggplot(datos, aes(x = `T Stage`)) +
geom_bar(fill = "#fd8d3c") +
labs(title = "Distribución por estadio del tumor (T Stage)",
x = "T Stage", y = "N.º de pacientes") +
tema_dashboard
library(tidyr)
datos %>%
select(`Estrogen Status`, `Progesterone Status`) %>%
pivot_longer(everything(), names_to = "Receptor", values_to = "Estado") %>%
ggplot(aes(x = Receptor, fill = Estado)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = percent) +
labs(title = "Estado de receptores hormonales",
x = "", y = "Porcentaje de pacientes") +
tema_dashboard
Interpretación:
Status = Alive) al final del seguimiento y el 15,3
% falleció (Status = Dead), lo que refleja una
base de datos con una tasa de mortalidad relativamente baja, típica de
cáncer de mama detectado en estadios tempranos/regionales.En esta sección se exploran relaciones entre pares de variables: correlaciones de Pearson entre variables numéricas y pruebas chi-cuadrado de independencia entre variables categóricas, acompañadas de gráficos bivariados.
library(reshape2) # para dar formato largo a la matriz de correlación
vars_num <- c("Age", "Tumor Size", "Regional Node Examined",
"Reginol Node Positive", "Survival Months")
matriz_cor <- cor(datos[vars_num], method = "pearson", use = "complete.obs")
matriz_cor_larga <- melt(matriz_cor)
ggplot(matriz_cor_larga, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
geom_text(aes(label = round(value, 2)), size = 3.5) +
scale_fill_gradient2(low = "#2166ac", mid = "white", high = "#b2182b",
midpoint = 0, limits = c(-1, 1), name = "r de Pearson") +
labs(title = "Matriz de correlación de Pearson", x = "", y = "") +
tema_dashboard +
theme(axis.text.x = element_text(angle = 40, hjust = 1))
ggplot(datos, aes(x = `Regional Node Examined`, y = `Reginol Node Positive`)) +
geom_jitter(alpha = 0.3, color = "#2c7fb8") +
geom_smooth(method = "lm", color = "#de2d26", se = FALSE) +
labs(title = "Ganglios examinados vs. ganglios positivos",
x = "N.º de ganglios regionales examinados",
y = "N.º de ganglios regionales positivos") +
tema_dashboard
cor.test(datos$`Regional Node Examined`, datos$`Reginol Node Positive`,
method = "pearson")
##
## Pearson's product-moment correlation
##
## data: datos$`Regional Node Examined` and datos$`Reginol Node Positive`
## t = 28.64, df = 4022, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.3855844 0.4369221
## sample estimates:
## cor
## 0.4115797
cor.test(datos$`Tumor Size`, datos$`Reginol Node Positive`, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: datos$`Tumor Size` and datos$`Reginol Node Positive`
## t = 15.84, df = 4022, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2130178 0.2711901
## sample estimates:
## cor
## 0.2423217
cor.test(datos$`Tumor Size`, datos$`Survival Months`, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: datos$`Tumor Size` and datos$`Survival Months`
## t = -5.5321, df = 4022, p-value = 3.365e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.11748466 -0.05615314
## sample estimates:
## cor
## -0.08690124
Interpretación:
tabla1 <- table(datos$Status, datos$`Estrogen Status`)
tabla1
##
## Negative Positive
## Alive 161 3247
## Dead 108 508
chisq.test(tabla1)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla1
## X-squared = 135.16, df = 1, p-value < 2.2e-16
tabla2 <- table(datos$Status, datos$`T Stage`)
chisq.test(tabla2)
##
## Pearson's Chi-squared test
##
## data: tabla2
## X-squared = 103.48, df = 3, p-value < 2.2e-16
tabla3 <- table(datos$Status, datos$`N Stage`)
chisq.test(tabla3)
##
## Pearson's Chi-squared test
##
## data: tabla3
## X-squared = 269.93, df = 2, p-value < 2.2e-16
tabla4 <- table(datos$`Estrogen Status`, datos$`Progesterone Status`)
chisq.test(tabla4)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla4
## X-squared = 1054.8, df = 1, p-value < 2.2e-16
ggplot(datos, aes(x = `Estrogen Status`, fill = Status)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("Alive" = "#2c7fb8", "Dead" = "#de2d26")) +
labs(title = "Estado vital según receptor de estrógeno",
x = "Estado del receptor de estrógeno", y = "Porcentaje de pacientes") +
tema_dashboard
ggplot(datos, aes(x = `N Stage`, fill = Status)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("Alive" = "#2c7fb8", "Dead" = "#de2d26")) +
labs(title = "Estado vital según estadio ganglionar (N Stage)",
x = "N Stage", y = "Porcentaje de pacientes") +
tema_dashboard
Interpretación:
Status y
Estrogen Status (χ² = 135,16; g.l. = 1; p < 0,001): las
pacientes con receptor de estrógeno negativo presentan
una proporción de fallecimiento notablemente mayor que aquellas con
receptor positivo, aunque la fuerza de la asociación (V
de Cramér ≈ 0,18) es moderada-baja.Status también está significativamente asociado con el
estadio del tumor (T Stage) (χ² = 103,48; p < 0,001)
y, de forma más marcada, con el estadio ganglionar (N
Stage) (χ² = 269,93; p < 0,001; V de Cramér ≈ 0,26), siendo
esta última la asociación más fuerte entre las variables categóricas
analizadas: a mayor estadio ganglionar, mayor proporción de pacientes
fallecidas.ggplot(datos, aes(x = Status, y = `Survival Months`, fill = Status)) +
geom_boxplot() +
scale_fill_manual(values = c("Alive" = "#2c7fb8", "Dead" = "#de2d26")) +
labs(title = "Meses de supervivencia según estado vital",
x = "Estado", y = "Meses de supervivencia") +
tema_dashboard +
theme(legend.position = "none")
ggplot(datos, aes(x = `T Stage`, y = `Tumor Size`, fill = `T Stage`)) +
geom_boxplot() +
labs(title = "Tamaño del tumor según estadio T",
x = "T Stage", y = "Tamaño del tumor (mm)") +
tema_dashboard +
theme(legend.position = "none")
Interpretación:
Dead) muestran una
mediana de supervivencia mucho menor (44 meses) que las que continúan
vivas (Alive, mediana de 77 meses), con mayor dispersión en
el grupo de fallecidas, lo cual es coherente con la definición de la
variable.Perfil general de la muestra. La base de datos incluye 4.024 pacientes con cáncer de mama infiltrante, en su mayoría mujeres de raza blanca (84,8 %), casadas (65,7 %), con una edad promedio de 54 años. La mayoría de los diagnósticos corresponde a estadios tempranos del tumor (T1-T2: 84,2 % de los casos) y estadio ganglionar N1 (67,9 %), lo que indica que la base recoge predominantemente casos detectados en etapas relativamente favorables.
Baja mortalidad relativa. El 84,7 % de las
pacientes seguía viva (Alive) al final del periodo de
seguimiento y solo el 15,3 % había fallecido (Dead), con
una mediana de supervivencia de 73 meses para el total de la muestra (77
meses en el grupo Alive vs. 44 meses en el grupo
Dead).
Los receptores hormonales son un factor
relevante. El 93,3 % de los tumores fueron positivos para
receptor de estrógeno y el 82,7 % para receptor de progesterona; ambos
indicadores están fuertemente asociados entre sí (V de Cramér ≈ 0,51) y,
a su vez, significativamente asociados con el estado vital
(Status), con menor mortalidad en pacientes con receptores
positivos. Esto es coherente con la evidencia clínica de que los tumores
hormono-dependientes suelen responder mejor a la terapia
hormonal.
El estadio ganglionar (N Stage) es la variable categórica más asociada al desenlace. La prueba chi-cuadrado mostró la asociación más fuerte entre todas las variables categóricas analizadas (χ² = 269,93; p < 0,001; V de Cramér ≈ 0,26), confirmando que a mayor compromiso ganglionar, mayor proporción de pacientes fallecidas. El estadio del tumor (T Stage) también resultó significativo, aunque con una asociación algo más débil.
Las correlaciones numéricas son de magnitud baja a moderada. La relación más fuerte se dio entre el número de ganglios examinados y el número de ganglios positivos (r = 0,412), seguida por tamaño del tumor y ganglios positivos (r = 0,242). La edad no mostró correlaciones relevantes con ninguna otra variable numérica, lo que sugiere que, en esta muestra, la edad por sí sola no es un buen predictor lineal del pronóstico.
El tamaño del tumor crece de forma consistente con el
estadio T, validando la coherencia interna de la variable
T Stage como reflejo directo del tamaño físico del tumor,
salvo en el estadio T4, donde otros criterios (invasión local) también
entran en juego.
Variables demográficas con asociación débil.
Raza y estado civil mostraron asociaciones estadísticamente
significativas con Status, pero de magnitud muy baja (V de
Cramér < 0,10 en ambos casos), por lo que su valor predictivo
individual sobre el desenlace es limitado en comparación con variables
clínicas como el estadio ganglionar o los receptores
hormonales.