Resumen
El cáncer de mama constituye una de las principales causas de mortalidad femenina a nivel mundial. En este estudio se presenta un análisis cuantitativo reproducible utilizando R y R Markdown, con el objetivo de demostrar la aplicación de técnicas estadísticas descriptivas, correlacionales (Pearson y Spearman) y comparativas (ANOVA) sobre un conjunto de datos tabular público utilizado como prueba de concepto metodológica. Este enfoque permite integrar la redacción científica con el análisis estadístico, facilitando la transparencia, trazabilidad y replicabilidad de los resultados.
Palabras clave: cáncer de mama, análisis estadístico, Pearson, Spearman, ANOVA, R Markdown.
Introducción
El diagnóstico oportuno del cáncer de mama es un factor clave para mejorar tasas de supervivencia y reducir la mortalidad. En los últimos años, la investigación cuantitativa ha incorporado herramientas computacionales para analizar datos de manera reproducible, transparente y verificable. En este contexto, R y R Markdown permiten integrar en un solo documento la preparación de datos, el análisis estadístico, la visualización y la discusión de resultados, fortaleciendo la calidad metodológica y la comunicación científica.
En el marco del Módulo de Seminario de Investigación I del Doctorado en Ciencias de Datos, se elabora un artículo científico reproducible que incorpora la metodología FINER–PICOT previamente desarrollada. Debido a limitaciones de tiempo y recursos computacionales, el análisis empírico se realiza sobre un conjunto tabular público (Breast Cancer Wisconsin Diagnostic), dejando como trabajo futuro la extensión a imágenes de mamografía (CBIS-DDSM o MIAS) con aprendizaje por transferencia.
Metodología FINER–PICOT y pregunta de investigación
La pregunta guía (Tarea 3) es:
¿Cuál es el nivel de eficacia diagnóstica, en términos de sensibilidad y especificidad, de un modelo basado en aprendizaje por transferencia con redes neuronales convolucionales (CNN) para la clasificación de lesiones benignas y malignas en mamografías digitales?
Nota metodológica: En esta prueba de concepto, la variable de diagnóstico (benigno/maligno) se analiza utilizando variables morfológicas tabulares como aproximación cuantitativa.
Diseño del estudio
Enfoque: cuantitativo.
Tipo: correlacional y comparativo.
Técnicas: estadística descriptiva, correlación de Pearson, correlación de Spearman y ANOVA.
Fuente de datos: conjunto público Breast Cancer Wisconsin (Diagnostic) (tabular).
Resultados Carga y preparación de los datos
# Fuente pública en CSV
url <- "https://raw.githubusercontent.com/Shikhadubey123/Breast-Cancer-Wisconsin-Diagnostic-R-Language/master/Breast%20Cancer%20Dataset.csv"
datos <- read.csv(url)
# Normalizar nombres de columnas
names(datos) <- tolower(gsub("\\.", "_", names(datos)))
# Ver nombres para confirmar que existen diagnosis y radius_mean
names(datos)[1:15]
## [1] "id" "diagnosis" "radius_mean"
## [4] "texture_mean" "perimeter_mean" "area_mean"
## [7] "smoothness_mean" "compactness_mean" "concavity_mean"
## [10] "concave_points_mean" "symmetry_mean" "fractal_dimension_mean"
## [13] "radius_se" "texture_se" "perimeter_se"
# Preparación: convertir diagnosis a factor y crear variable numérica para correlación
datos <- datos %>%
mutate(
diagnosis = as.factor(diagnosis),
diagnosis_num = ifelse(diagnosis == "M", 1, 0)
)
# Vista rápida
glimpse(datos)
## Rows: 569
## Columns: 34
## $ id <int> 842302, 842517, 84300903, 84348301, 84358402, …
## $ diagnosis <fct> M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M…
## $ radius_mean <dbl> 17.990, 20.570, 19.690, 11.420, 20.290, 12.450…
## $ texture_mean <dbl> 10.38, 17.77, 21.25, 20.38, 14.34, 15.70, 19.9…
## $ perimeter_mean <dbl> 122.80, 132.90, 130.00, 77.58, 135.10, 82.57, …
## $ area_mean <dbl> 1001.0, 1326.0, 1203.0, 386.1, 1297.0, 477.1, …
## $ smoothness_mean <dbl> 0.11840, 0.08474, 0.10960, 0.14250, 0.10030, 0…
## $ compactness_mean <dbl> 0.27760, 0.07864, 0.15990, 0.28390, 0.13280, 0…
## $ concavity_mean <dbl> 0.30010, 0.08690, 0.19740, 0.24140, 0.19800, 0…
## $ concave_points_mean <dbl> 0.14710, 0.07017, 0.12790, 0.10520, 0.10430, 0…
## $ symmetry_mean <dbl> 0.2419, 0.1812, 0.2069, 0.2597, 0.1809, 0.2087…
## $ fractal_dimension_mean <dbl> 0.07871, 0.05667, 0.05999, 0.09744, 0.05883, 0…
## $ radius_se <dbl> 1.0950, 0.5435, 0.7456, 0.4956, 0.7572, 0.3345…
## $ texture_se <dbl> 0.9053, 0.7339, 0.7869, 1.1560, 0.7813, 0.8902…
## $ perimeter_se <dbl> 8.589, 3.398, 4.585, 3.445, 5.438, 2.217, 3.18…
## $ area_se <dbl> 153.40, 74.08, 94.03, 27.23, 94.44, 27.19, 53.…
## $ smoothness_se <dbl> 0.006399, 0.005225, 0.006150, 0.009110, 0.0114…
## $ compactness_se <dbl> 0.049040, 0.013080, 0.040060, 0.074580, 0.0246…
## $ concavity_se <dbl> 0.05373, 0.01860, 0.03832, 0.05661, 0.05688, 0…
## $ concave_points_se <dbl> 0.015870, 0.013400, 0.020580, 0.018670, 0.0188…
## $ symmetry_se <dbl> 0.03003, 0.01389, 0.02250, 0.05963, 0.01756, 0…
## $ fractal_dimension_se <dbl> 0.006193, 0.003532, 0.004571, 0.009208, 0.0051…
## $ radius_worst <dbl> 25.38, 24.99, 23.57, 14.91, 22.54, 15.47, 22.8…
## $ texture_worst <dbl> 17.33, 23.41, 25.53, 26.50, 16.67, 23.75, 27.6…
## $ perimeter_worst <dbl> 184.60, 158.80, 152.50, 98.87, 152.20, 103.40,…
## $ area_worst <dbl> 2019.0, 1956.0, 1709.0, 567.7, 1575.0, 741.6, …
## $ smoothness_worst <dbl> 0.1622, 0.1238, 0.1444, 0.2098, 0.1374, 0.1791…
## $ compactness_worst <dbl> 0.6656, 0.1866, 0.4245, 0.8663, 0.2050, 0.5249…
## $ concavity_worst <dbl> 0.71190, 0.24160, 0.45040, 0.68690, 0.40000, 0…
## $ concave_points_worst <dbl> 0.26540, 0.18600, 0.24300, 0.25750, 0.16250, 0…
## $ symmetry_worst <dbl> 0.4601, 0.2750, 0.3613, 0.6638, 0.2364, 0.3985…
## $ fractal_dimension_worst <dbl> 0.11890, 0.08902, 0.08758, 0.17300, 0.07678, 0…
## $ x <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ diagnosis_num <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
Estadística descriptiva
# Resumen de variables seleccionadas
datos %>%
select(diagnosis, radius_mean, texture_mean, perimeter_mean, area_mean) %>%
summary()
## diagnosis radius_mean texture_mean perimeter_mean area_mean
## B:357 Min. : 6.981 Min. : 9.71 Min. : 43.79 Min. : 143.5
## M:212 1st Qu.:11.700 1st Qu.:16.17 1st Qu.: 75.17 1st Qu.: 420.3
## Median :13.370 Median :18.84 Median : 86.24 Median : 551.1
## Mean :14.127 Mean :19.29 Mean : 91.97 Mean : 654.9
## 3rd Qu.:15.780 3rd Qu.:21.80 3rd Qu.:104.10 3rd Qu.: 782.7
## Max. :28.110 Max. :39.28 Max. :188.50 Max. :2501.0
# Tabla de medias y desviación estándar por diagnóstico
tabla_desc <- datos %>%
group_by(diagnosis) %>%
summarise(
n = n(),
radius_mean_media = mean(radius_mean, na.rm = TRUE),
radius_mean_sd = sd(radius_mean, na.rm = TRUE),
area_mean_media = mean(area_mean, na.rm = TRUE),
area_mean_sd = sd(area_mean, na.rm = TRUE)
)
tabla_desc
## # A tibble: 2 × 6
## diagnosis n radius_mean_media radius_mean_sd area_mean_media area_mean_sd
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 B 357 12.1 1.78 463. 134.
## 2 M 212 17.5 3.20 978. 368.
Correlación (Pearson y Spearman)
# Correlación entre una variable morfológica y el diagnóstico (codificado 0/1)
cor_pearson <- cor.test(datos$radius_mean, datos$diagnosis_num, method = "pearson")
cor_spearman <- cor.test(datos$radius_mean, datos$diagnosis_num, method = "spearman")
cor_pearson
##
## Pearson's product-moment correlation
##
## data: datos$radius_mean and datos$diagnosis_num
## t = 25.436, df = 567, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6891867 0.7662463
## sample estimates:
## cor
## 0.7300285
cor_spearman
##
## Spearman's rank correlation rho
##
## data: datos$radius_mean and datos$diagnosis_num
## S = 8204367, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.732785
ANOVA (comparación de medias)
# Comparar radius_mean entre grupos (B vs M)
anova_model <- aov(radius_mean ~ diagnosis, data = datos)
summary(anova_model)
## Df Sum Sq Mean Sq F value Pr(>F)
## diagnosis 1 3759 3759 647 <2e-16 ***
## Residuals 567 3295 6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Visualización
# Boxplot por diagnóstico
ggplot(datos, aes(x = diagnosis, y = radius_mean)) +
geom_boxplot() +
labs(
title = "Distribución de radius_mean según diagnóstico",
x = "Diagnóstico (B = Benigno, M = Maligno)",
y = "Radius Mean"
)
Discusión
Los resultados sugieren asociaciones estadísticamente significativas entre variables morfológicas y el diagnóstico. La correlación (Pearson y Spearman) indica una relación consistente entre el radio medio del tumor y la malignidad (diagnosis codificado). Además, el análisis de varianza (ANOVA) evidencia diferencias en las medias de radius_mean entre los grupos benigno y maligno, reforzando la utilidad de estas variables como indicadores cuantitativos en el análisis de cáncer de mama.
Este trabajo, aunque basado en datos tabulares, valida un flujo metodológico reproducible y coherente para investigación cuantitativa en salud, integrando análisis y redacción en un solo documento.
Conclusiones
La analítica reproducible en R Markdown permite integrar datos, métodos, resultados y redacción científica en un flujo transparente.
Pearson y Spearman permiten evaluar asociaciones entre variables numéricas y el diagnóstico (codificado).
ANOVA confirma diferencias en medias entre grupos diagnósticos, aportando evidencia cuantitativa.
Como trabajo futuro, se plantea extender el análisis hacia mamografías digitales mediante aprendizaje por transferencia con CNN.
Referencias
UCI Machine Learning Repository. Breast Cancer Wisconsin (Diagnostic).
Documentación de R Markdown / knitr.