1. Introducción

La Organización Panamericana de la Salud (OPS, 2022) menciona que el cáncer de mama representa una de las problemáticas de salud con mayor impacto a nivel mundial, ya que es el tipo de cáncer más frecuente y la causa más común de muerte por cáncer en mujeres en el mundo. La cantidad de casos diagnosticados aumenta cada año por diversas razones como: predisposición genética, cambios hormonales, estilo de vida poco saludables o enfermedades subyacentes. Con respecto al tema, la Organización Mundial de la Salud (OMS,2022) reporta que en 2022 fueron detectados en todo el mundo 2,3 millones de casos de cáncer de mama en mujeres, y se registraron 670 000 muertes por esa enfermedad.

En muchos pacientes, un diagnóstico tardío disminuye las posibilidades de tratamiento efectivo y aumenta el riesgo de complicaciones clínicas que pueden terminar en el fallecimiento de la persona. Este diagnóstico tardío puede deberse a varios factores como: falta de acceso a servicios de salud, poca información sobre el tema, síntomas no visibles hasta que el cáncer está en una etapa avanzada o fallos en la detección de tumores malignos. En este sentido, la Organización Mundial de la Salud (OMS,2022) indica que la detección temprana y oportuna, así como el tratamiento, la rehabilitación y los cuidados paliativos integrales, es un factor determinante para mejorar la calidad de vida y las probabilidades de recuperación.

Dentro del contexto oncológico, la clasificación de un tumor como benigno o maligno constituye una etapa fundamental para la toma de decisiones médicas. Sin embargo, este proceso puede resultar complejo debido a la gran cantidad de información que debe analizarse a partir de características celulares y morfológicas observadas en los estudios del tejido tumoral. Variables como la textura, la concavidad, la simetría, el radio y la compacidad contienen información importante sobre el comportamiento del tumor. La interpretación de estos patrones requiere procesos de análisis detallados y precisos para una correcta detección. Una clasificación errónea puede tener grandes consecuencias para el paciente, en caso de que el tumor maligno no sea detectado, este continuará evolucionado hasta el punto de volverse un cáncer terminal sin posibilidad de tratamiento. Por otro lado, si un tumor benigno es identificado como maligno, la persona sería sometida a tratamientos agresivos contra el cáncer como: la quimioterapia y radioterapia que deteriorarían su estado de salud y vida.

Frente a esta necesidad, surge el interés de implementar herramientas basadas en análisis de datos y aprendizaje automático que permitan apoyar los procesos de clasificación clínica. Más que reemplazar el criterio médico, este tipo de modelos busca aportar una ayuda adicional capaz de identificar patrones en los datos y facilitar la diferenciación entre tumores benignos y malignos. De esta manera, los modelos predictivos pueden contribuir a reducir errores de clasificación y fortalecer los procesos de apoyo al diagnóstico temprano.

A partir de este contexto, el presente trabajo tiene como objetivo desarrollar e implementar modelos de clasificación supervisada capaces de predecir el diagnóstico de tumores mamarios utilizando variables morfológicas asociadas al tejido tumoral para aportar una solución que permita aprovechar la información contenida en los datos clínicos. Para ello, se emplearon dos modelos de aprendizaje supervisado: K-Nearest Neighbors (KNN) y regresión logística (LOGIT), con el propósito de comparar su desempeño predictivo y analizar cuál presenta una mejor capacidad de clasificación frente al problema planteado.

2. Metodología

Al principio se realizó una preparación y limpieza de la base de datos, en la cual se seleccionaron las variables mas relevantes para el análisis: diagnóstico, concavidad, textura, radio, simetría y compacidad del tumor. Luego, se verificó la consistencia de la información y se eliminaron los registros que contenían valores faltantes para asegurar una mayor fiabilidad en los resultados obtenidos. El factor de respuesta corresponde al diagnóstico del tumor: benigno “B” o maligno “M”, mientras que las otras variables sirvieron como predictores porque están asociadas con características morfológicas exhibidas por las células tumorales.

Tales capacidades permiten el reconocimiento de patrones, que están relacionados con el comportamiento del tumor, y proporcionan información crítica para diferenciar entre los casos benignos y malignos en la práctica clínica. Para examinar de manera justa el rendimiento de los modelos y ser utilizados para la predicción en la práctica, la base de datos se dividió en un 70% para entrenamiento y un 30% para prueba. Esta división permitió que los modelos fueran entrenados usando algunos datos y luego probados para evaluar su poder predictivo en nuevos datos no introducidos en el entrenamiento sin sobreajustarse, así como su respuesta a casos novedosos. Posteriormente, se construyeron dos modelos de clasificación supervisada con el fin de descubrir los patrones encontrados en las características morfológicas de los tumores y servir como herramienta de apoyo para el análisis clínico y el diagnóstico temprano.

library(readr)
library(caret)
library(tidyverse)
library(kableExtra)
library(dplyr)
library(ggplot2)
library(tidyr)
library(corrplot)
library(moments)
library(plotly)
library(knitr)
library(pROC)

datacancer <-  read_csv("datacancer.csv")
variables <- c('diagnosis', 'concave points_worst', 'texture_worst', 
               'radius_worst', 'compactness_se', 'symmetry_mean')
data_limpia <- datacancer[, variables]
data_limpia <- na.omit(data_limpia)

colnames(data_limpia) <- c("diagnostico", "concavidad_peor", "textura_peor", 
                           "radio_peor",  "simetria_media", "compacto_se")

data_limpia$diagnostico <- as.factor(data_limpia$diagnostico)

data_limpia

2.2 Descripción de Variables:

Para construir el modelo, utilizamos como variables las características morfológicas detectadas en las células tumorales. Esto nos permitió caracterizar las propiedades físicas del tumor y así ayudarnos a distinguir las características asociadas como diagnóstico benigno o maligno.

Diagnóstico: Esta es la variable de respuesta del modelo y corresponde a una clasificación final del tumor. Se divide en dos clases: Benigno “B”: tumores que no tienen comportamiento canceroso. Maligno “M”: tumores con células cancerosas y mayor riesgo para la salud del paciente.

Las siguientes variables fueron utilizadas como predictoras dentro del análisis, ya que nos permiten describir características importantes del comportamiento morfológico de los tumores y así ayudarnos a distinguir con más precisión su clase:

- Radio_peor: Mide el tamaño del nucleo celular de la celula que tiene el peor. Este es un factor importante, ya que los tumores malignos son más propensos a expresar tamaños de nucleo celulares más grandes o más irregulares en comparación con los tumores benignos.

- Concavidad_peor: Mide el número de porciones cóncavas del contorno del núcleo celular de la celula con que presente más. Generalmente, mayor cantidad de concavidad y contornos irregulares se asocian con tumores malignos.

- Textura_peor: Corresponde al valor más extremo de la textura del núcleo celular, medida como la desviación estándar de los niveles de gris en la imagen.Normalmente, cambios en la intensidad y apariencia de la superficie celular representada en imágenes de tejido, estas caracteristicas indican heterogeneidad, esto es una caracteristica asociada a tumores malignos.

- Simetria_media: Mide el promedio de la simetria de los núcleos de las celulares ,evaluando que tan similares son las dos mitades del núcleo. Los Niveles bajos de simetría sugieren un comportamiento anormal del tejido y cambios en la morfología celular, lo que indica que son tumores malignos.

- Compacidad_SE: Mide el error estándar de la compacidad entre los núcleos celulares de la imagen. La compacidad se refiere a la relación entre el área y el perímetro de esa parte del tumor. Indica cuán densa (o irregular) es su estructura. Para tumores malignos con formas menos regulares, los valores altos pueden ser un indicio de un tumor maligno.

Tomadas en conjunto, estas variables permiten que se reflejen diferentes características del comportamiento morfológico de los tumores, permitiendo identificar patrones útiles y construir modelos predictivos para el apoyo en la clasificación clínica, lo cual es crucial para el personal médico y los pacientes.

2.3 Modelos Utilizados:

2.3.1 Modelo de K-Nearest Neighbors (KNN)

El modelo KNN es un clasificador de observaciones basado en las propiedades de los vecinos más cercanos. En otras palabras, el algoritmo encuentra tumores que comparten propiedades similares de concavidad, textura, radio, simetría y compacidad, lo que da la clase más frecuente entre los vecinos disponibles. Debido a que para algunas variables, las escalas numéricas podrían darse en diferentes formatos, se realizó la estandarización centrando y escalando los datos. Esto evitó algunos factores que afectaban desproporcionadamente la determinación de distancias y permitió comparar las observaciones de manera sistemática. El mejor valor de K se utilizó como resultado de la validación cruzada, es decir, como función de diferentes valores de configuración, en los cuales el entrenamiento fue más preciso, ya que la configuración proporcionó los mejores datos.

2.3.2 Modelo de Regresión Logística (LOGIT)

Se utilizó la regresión logística para predecir la probabilidad de que un tumor sea maligno basado en las variables morfológicas seleccionadas. Este modelo permite examinar la correlación previamente establecida de las características celulares y el diagnóstico final e interpretar el comportamiento de las variables en el proceso de diagnóstico.

Finalmente, el rendimiento de los dos modelos se evaluó a través de métricas de clasificación, es decir, precisión, coeficiente Kappa y matriz de confusión, considerando el diagnóstico maligno (M) como clase positiva. Tomamos esta decisión porque la relevancia clínica de la detección de pacientes malignos es crítica, ya que en caso de un falso negativo podría retrasar el diagnóstico y disminuir la probabilidad de una acción inmediata contra la enfermedad. Por esta razón, un componente clave del análisis realizado fue proporcionar una detección adecuada del cáncer para este tipo de tumores.

3. Resultados Descriptivos

3.1. Estadísticos Descriptivos (Variables Cuántitativas)

tabla <- data.frame(
  Estadistica = c( "Media", "Desviación estándar", "Mínimo", "Q1", "Mediana", "Q3", "Máximo"),
  
   Conc_Peor = c(
    mean(data_limpia$concavidad_peor, na.rm = TRUE),
    sd(data_limpia$concavidad_peor, na.rm =TRUE),
    min(data_limpia$concavidad_peor, na.rm = TRUE),
    quantile(data_limpia$concavidad_peor, 0.25, na.rm = TRUE),
    median(data_limpia$concavidad_peor, na.rm = TRUE),
    quantile(data_limpia$concavidad_peor, 0.75, na.rm = TRUE),
    max(data_limpia$concavidad_peor, na.rm = TRUE)
  ),
  
  Tex_Peor = c(
    mean(data_limpia$textura_peor, na.rm = TRUE),
    sd(data_limpia$textura_peor, na.rm = TRUE),
    min(data_limpia$textura_peor, na.rm = TRUE),
    quantile(data_limpia$textura_peor, 0.25, na.rm = TRUE),
    median(data_limpia$textura_peor, na.rm = TRUE),
    quantile(data_limpia$textura_peor, 0.75, na.rm = TRUE),
    max(data_limpia$textura_peor, na.rm = TRUE)
  ),
  
  Radio_Peor = c(
    mean(data_limpia$radio_peor, na.rm = TRUE ),
    sd(data_limpia$radio_peor, na.rm = TRUE),
    min(data_limpia$radio_peor, na.rm =TRUE),
    quantile(data_limpia$radio_peor, 0.25, na.rm = TRUE),
    median(data_limpia$radio_peor, na.rm = TRUE),
    quantile(data_limpia$radio_peor, 0.75, na.rm = TRUE),
    max(data_limpia$radio_peor, na.rm = TRUE)
  ),
  
  Comp_se = c(
    mean(data_limpia$compacto_se, na.rm = TRUE),
    sd (data_limpia$compacto_se, na.rm = TRUE),
    min (data_limpia$compacto_se, na.rm = TRUE),
    quantile(data_limpia$compacto_se, 0.25, na.rm = TRUE),
    median(data_limpia$compacto_se, na.rm = TRUE),
    quantile(data_limpia$compacto_se, 0.75, na.rm = TRUE),
    max(data_limpia$compacto_se, na.rm = TRUE)
  ),
  
  Sim_media = c(
    mean(data_limpia$simetria_media, na.rm = TRUE),
    sd(data_limpia$simetria_media, na.rm = TRUE),
    min(data_limpia$simetria_media, na.rm = TRUE),
    quantile(data_limpia$simetria_media, 0.25, na.rm = TRUE),
    median(data_limpia$simetria_media, na.rm = TRUE),
    quantile(data_limpia$simetria_media, 0.75, na.rm = TRUE),
    max(data_limpia$simetria_media, na.rm = TRUE)
  )
)

kable(tabla, caption = "Estadísticas Descriptivas")
Estadísticas Descriptivas
Estadistica Conc_Peor Tex_Peor Radio_Peor Comp_se Sim_media
Media 0.1146062 25.677223 16.269190 0.1811619 0.0254781
Desviación estándar 0.0657323 6.146258 4.833242 0.0274143 0.0179082
Mínimo 0.0000000 12.020000 7.930000 0.1060000 0.0022520
Q1 0.0649300 21.080000 13.010000 0.1619000 0.0130800
Mediana 0.0999300 25.410000 14.970000 0.1792000 0.0204500
Q3 0.1614000 29.720000 18.790000 0.1957000 0.0324500
Máximo 0.2910000 49.540000 36.040000 0.3040000 0.1354000

El conjunto de datos utilizado está conformado por 569 observaciones sin valores faltantes, distribuidas entre tumores benignos (62.7%) y malignos (37.3%).

En primer lugar, la variable concavidad_peor presenta una media de 0.1146 y una mediana de 0.0999, valores cercanos entre sí, lo que sugiere una distribución relativamente centrada y con poca asimetría. Además, su rango entre 0 y 0.291 indica una variabilidad moderada entre las observaciones.

Por otro lado, textura_peor es la variable que presenta mayor dispersión, con una media de 25.68 y una desviación estándar de 6.15. Su rango entre el mínimo (12.02) y el máximo (49.54) muestra que existen diferencias importantes en la textura de los tumores, lo que refleja una alta variabilidad.

En cuanto a radio_peor, se observa una media de 16.27 y una mediana de 14.97. Esta diferencia sugiere que la distribución está ligeramente sesgada hacia la derecha, es decir, hay valores altos que influyen en el promedio. Además, su desviación estándar de 4.83 indica una variabilidad considerable.

Por último, las variables compacto_se y simetria_media presentan los valores más bajos. En el caso de compacto_se, su media es de 0.181 y su desviación estándar es baja, lo que indica que los datos se encuentran poco dispersos. De manera similar, simetria_media tiene una media de 0.0255 y una desviación estándar de 0.0179, lo que sugiere que la mayoría de los valores se concentran en un rango reducido.

En general, se puede observar que variables como textura_peor y radio_peor presentan mayor variabilidad, mientras que compacto_se y simetria_media son más estables. Estas diferencias son importantes, ya que permiten identificar qué variables tienen mayor dispersión y podrían aportar más información en el análisis.

3.2 Estadísticos por Grupo de Diagnóstico

data_limpia %>%
  group_by(diagnostico) %>%
  summarise(across(where(is.numeric),
                   list(mean = mean, sd = sd),
                   na.rm = TRUE))

En esta tabla se comparan diferentes variables entre los diagnósticos benignos (B) y malignos (M). En general, se observa que los tumores malignos presentan valores promedio más altos en variables como concavidad, textura, radio, simetría y compacidad. Esto indica que los casos malignos tienden a tener características más irregulares y de mayor tamaño en comparación con los benignos.

Por ejemplo, la concavidad promedio es mucho mayor en los tumores malignos, lo que médicamente puede relacionarse con bordes más deformes o irregulares, una característica común en masas cancerígenas. También el radio promedio es más alto en los casos malignos, lo que sugiere tumores de mayor tamaño. De igual forma, la textura promedio aumenta en el diagnóstico maligno, indicando una superficie menos uniforme en las células analizadas.

Además, las desviaciones estándar de varias variables son mayores en el grupo maligno, especialmente en radio y concavidad. Esto significa que existe más variabilidad entre los tumores malignos, ya que no todos presentan exactamente las mismas características. En cambio, los tumores benignos muestran valores más estables y concentrados.

En las variables de simetría y compacidad también se observa un aumento en los casos malignos. Desde el punto de vista médico, esto tiene sentido porque las células cancerígenas suelen crecer de manera desordenada, provocando formas menos simétricas y tejidos más compactos o densos.

3.3 Distribución Diagnóstico

tabla_diagnostico <- data_limpia %>%
  group_by(diagnostico) %>%
  summarise(n = n()) %>%
  mutate(
    Porcentaje = round(n / sum(n) * 100, 2),
    Diagnostico = ifelse(diagnostico == "B", "Benigno", "Maligno")
  ) %>%
  select(Diagnostico, n, Porcentaje) %>%
  rename("Frecuencia" = n, "Porcentaje (%)" = Porcentaje)

kable(tabla_diagnostico, caption = "Distribución de la variable diagnóstico") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Distribución de la variable diagnóstico
Diagnostico Frecuencia Porcentaje (%)
Benigno 357 62.74
Maligno 212 37.26

La variable diagnóstico presenta una distribución desigual entre sus categorías. En particular, se observa que los tumores benignos (B) representan el 62.74% de los casos, mientras que los malignos (M) corresponden al 37.26%.

grafico1 <- ggplot(data_limpia, aes(x = diagnostico, fill = diagnostico)) +
  geom_bar(
    aes(y = after_stat(count / sum(count))),
    width = 0.5,
    color = "white",
    linewidth = 0.8
  ) +
  geom_text(
    aes(
      y = after_stat(count / sum(count)) / 2,
      label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01),
      color = diagnostico
    ),
    stat = "count",
    fontface = "bold",
    size = 4.5
  ) +
  scale_y_continuous(
    labels = scales::percent,
    limits = c(0, 0.78),
    expand = c(0, 0)
  ) +
  scale_fill_manual(
    values = c("B" = "#6BAED6", "M" = "#08306B"),
    labels = c("B" = "Benigno", "M" = "Maligno")
  ) +
  scale_color_manual(
    values = c("B" = "#08306B", "M" = "white"),
    guide = "none"
  ) +
  scale_x_discrete(labels = c("B" = "Benigno", "M" = "Maligno")) +
  labs(
    title = "Distribución del Diagnóstico",
    subtitle = "Proporción de tumores benignos y malignos en el conjunto de datos",
    x = NULL,
    y = "Porcentaje",
    fill = "Diagnóstico"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title         = element_text(face = "bold", size = 15, hjust = 0.5),
    plot.subtitle      = element_text(color = "gray45", size = 11, hjust = 0.5, margin = margin(b = 10)),
    axis.text.x        = element_text(face = "bold", size = 12, color = "#2C2C2C"),
    axis.text.y        = element_text(color = "gray45"),
    axis.title.y       = element_text(color = "gray45", margin = margin(r = 10)),
    panel.grid.major.x = element_blank(),
    panel.grid.minor   = element_blank(),
    legend.position    = "none",
    plot.margin        = margin(20, 20, 20, 20)
  )

ggplotly(grafico1)

Este resultado es relevante dentro del contexto de aprendizaje supervisado, ya que el modelo se construye a partir de esta información. En este caso, la mayor proporción de observaciones en la categoría benigna puede influir en el proceso de aprendizaje, generando una tendencia a favorecer esta clase en las predicciones.

En particular, para el modelo KNN, este comportamiento puede reflejarse en que, al clasificar nuevas observaciones, exista una mayor probabilidad de asignarlas a la clase mayoritaria, dado que la mayoría de los vecinos cercanos pertenecerán a dicha categoría. De forma similar, en la regresión logística, este desbalance puede influir en la estimación de las probabilidades, favoreciendo la clase con mayor representación en los datos.

En este sentido, aunque el modelo pueda presentar un buen desempeño general, es importante analizar con mayor detalle su capacidad para identificar correctamente los casos de tumores malignos, ya que estos corresponden a la clase minoritaria y, a su vez, la más relevante desde el punto de vista práctico.

En general, la distribución observada sugiere que los resultados del modelo deben interpretarse con precaución, considerando no solo medidas globales como la exactitud, sino también otros indicadores que permitan evaluar el desempeño de manera más completa.

3.4 Histogramas de Densidad por Variable

Con el propósito de profundizar en la comprensión de las distribuciones individuales de cada variable y evaluar su capacidad para diferenciar entre tumores benignos y malignos, se construyeron histogramas de densidad diferenciado por grupo diagnóstico. Por su parte, a diferencia de los estadísticos descriptivos presentados anteriormente, esta representación gráfica permite analizar la forma completa de cada distribución, identificar patrones de asimetría, concentración y dispersión, y detectar visualmente el grado de solapamiento entre los dos grupos.

En este sentido, el análisis por variable que se presenta a continuación constituye un paso previo fundamental para anticipar el comportamiento de los modelos KNN y de regresión logística, al evidenciar qué características morfológicas presentan diferencias más marcadas entre los tipos de tumor.

grafico2 <- ggplot(data_limpia, aes(x = radio_peor, fill = diagnostico)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30,
                 color = "black", 
                 show.legend = FALSE) +
  geom_density(color = "red", linewidth = 0.8) +
  facet_wrap(~ diagnostico,
             labeller = labeller(diagnostico = c("B" = "Benigno", "M" = "Maligno"))) +
  scale_fill_manual(values = c("B" = "#6BAED6", "M" = "#08306B"))+
  labs(title = "Histograma con Curva de Densidad de Peor Radio",
       x = "Peor radio",
       y = "Densidad") +
  theme_minimal()

ggplotly(grafico2)

En primer lugar, en el histrograma para la variable Peor Radio, se evidencia que los tumores benignos concentran su distribución en valores bajos, con una curva de densidad unimodal y relativamente compacta centrada alrededor de 13–14 mm. Los tumores malignos, en cambio, presentan una distribución desplazada hacia la derecha, con densidad concentrada en valores de 17–20 mm y una cola más larga hacia valores extremos como 30–36 mm.

Este patrón es coherente con la biología tumoral ya que las células malignas se tienden a proliferar de manera descontrolada, generando masas con un mayor tamaño. La diferencia entre medianas refuerza que el radio peor es una señal morfológica fuerte. Además, la asimetría positiva global (1.10) vista en la sección 3.1 se explica precisamente por esta cola derecha de los tumores malignos. De esta manera, la variable Peor Radio puede influir significactivamente en ambos modelos de clasificiación.

grafico3 <- ggplot(data_limpia, aes(x = concavidad_peor, fill = diagnostico)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30,
                 color = "black", 
                 show.legend = FALSE) +
  geom_density(color = "red", linewidth = 0.8) +
  facet_wrap(~ diagnostico,
             labeller = labeller(diagnostico = c("B" = "Benigno", "M" = "Maligno")))+
  scale_fill_manual(values = c("B" = "#6BAED6", "M" = "#08306B"))+
  labs(title = "Histograma con Curva de Densidad de Concavidad Peor",
       x = "Concavidad Peor",
       y = "Densidad") +
  theme_minimal()

ggplotly(grafico3)

Por su parte el histograma de la variable concavidad peor revela que los tumores benignos presentan una distribución muy cercana de cero, con alta densidad en valores bajos (0.00–0.10), lo que indica que sus bordes son relativamente suaves y regulares. Del mismo modo, los tumores malignos tienen una distribución más dispersa y desplazada a la derecha, ya que presenta una densidad extendida entre 0.10 y 0.25.

De esta manera, un aspecto relevante es que la distribución benigna tiene una forma casi exponencial decreciente dado que la mayoría de tumores benignos tienen concavidad muy baja, y casos con concavidad alta son excepcionales en ese grupo. En los malignos, la distribución es más acampanada y desplazada, lo que indica que los valores intermedios-altos de concavidad son comunes. Esto convierte a la concavidad peor en una variable altamente discriminativa, especialmente en el intervalo 0.10–0.20 donde la densidad maligna supera ampliamente a la benigna.

grafico4 <- ggplot(data_limpia, aes(x = textura_peor, fill = diagnostico)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30,
                 color = "black", 
                 show.legend = FALSE) +
  geom_density(color = "red", linewidth = 0.8) +
  facet_wrap(~ diagnostico,
             labeller = labeller(diagnostico = c("B" = "Benigno", "M" = "Maligno"))) +
  scale_fill_manual(values = c("B" = "#6BAED6", "M" = "#08306B")) +
  labs(title = "Histograma con curva de densidad de Textura Peor",
       x = "Textura Peor",
       y = "Densidad") +
  theme_minimal()

ggplotly(grafico4)

Por otro lado Textura Peor es la variable que presenta mayor solapamiento entre los dos grupos diagnósticos, lo que la convierte en la menos discriminativa visualmente. Tanto para los casos benignos como malignos presentan distribuciones aproximadamente simétricas y unimodales, con forma similar a una campana, diferenciándose principalmente en que los malignos tienen su distribución ligeramente desplazada hacia valores más altos.

Este solapamiento es consistente con la correlación baja que textura peor tiene con el resto de variables. Sin embargo, esa independencia es su mayor aporte dado que aunque no separa bien por sí sola, aporta información que las demás variables no capturan. En la regresión logística, su coeficiente podría ser significativo precisamente porque añade una dimensión diferente. En el KNN, aporta en el cálculo de distancias de una manera no redundante.

grafico5 <- ggplot(data_limpia, aes(x = simetria_media, fill = diagnostico)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30,
                 color = "black", 
                 show.legend = FALSE) +
  geom_density(color = "red", linewidth = 0.8) +
  facet_wrap(~ diagnostico,
             labeller = labeller(diagnostico = c("B" = "Benigno", "M" = "Maligno"))) +
  scale_fill_manual(values = c("B" = "#6BAED6", "M" = "#08306B")) +
  labs(title = "Histograma con curva de densidad de Simetria Media",
       x = "Simetria Media",
       y = "Densidad") +
  theme_minimal()

ggplotly(grafico5)

Sin embargo, Simetría Media es la variable que presenta las distribuciones más asimétricas y concentradas de todo el análisis. Tanto los casos benignos como malignos muestran histogramas con una cantidad importante de valores muy bajos (0.01–0.03) y colas largas hacia la derecha, lo que explica los 28 outliers detectados (4.92% del total, siendo el porcentaje más alto).

Es importante destacar que las distribuciones de ambos grupos se solapan considerablemente, lo que sugiere que la simetría media tiene un poder discriminativo limitado cuando se analiza de manera aislada. De esta manera, existe una diferencia entre grupos debido principalmente a la densidad de los valores extremos, particularmente los tumores malignos podrían tener una cola derecha ligeramente más pronunciada, pero la separación no es tan clara como en radio o concavidad.

Sin embargo, lo anterior no hace nulo el aporte de la variable al modelo, todo lo contrario, en presencia de otras variables más discriminativas (como radio peor), la simetría media puede contribuir marginalmente a separar casos en zonas de ambigüedad donde las demás variables no logran resolver la clasificación por sí solas.

grafico6 <- ggplot(data_limpia, aes(x = compacto_se, fill = diagnostico)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30,
                 color = "black", 
                 show.legend = FALSE) +
  geom_density(color = "red", linewidth = 0.8) +
  facet_wrap(~ diagnostico,
             labeller = labeller(diagnostico = c("B" = "Benigno", "M" = "Maligno"))) +
  scale_fill_manual(values = c("B" = "#6BAED6", "M" = "#08306B")) +
  labs(title = "Histograma con Curva de Densidad de Compacto Se",
       x = "Compacto Se",
       y = "Densidad") +
  theme_minimal()

ggplotly(grafico6)

Finalmente, los histogramas correspondientes a la variable Compacto Se reflejan distribuciones con asimetría positiva moderada (0.72), con la mayor concentración de valores entre 0.15 y 0.22 para ambos grupos.

La separación entre benignos y malignos es moderada, por su parte, los malignos tienden a mostrar mayor densidad en valores más altos de compacto Se, lo que es biológicamente coherente (mayor irregularidad en la compacidad interna de células malignas), pero el solapamiento es considerable. Los 15 outliers identificados (2.64%) corresponden a casos con compacidades inusualmente altas, que en el histograma aparecen como barras aisladas en la cola derecha.

Esta variable aporta información complementaria a la concavidad peor, pero su distribución similar entre grupos la posiciona como un predictor secundario, útil en combinación con otras variables pero no suficiente por sí solo.

3.5 Boxplot

grafico7 <- ggplot(data_limpia, aes(x = diagnostico, y = concavidad_peor, fill = diagnostico)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.3, color="gray30") +
  labs(title = "Distribución de Concavidad Peor por Diagnóstico",
       x = "Diagnóstico",
       y = "Concavidad Peor") +
  scale_fill_manual(values = c("B" = "#6BAED6",
                               "M" = "#08306B")) +
  theme_minimal()
ggplotly(grafico7)

En primera instancia la distribución de la concavidad peor ilustra a los tumores benignos en una caja muy compacta y ubicada en valores bajos, con una mediana 0.07, lo que indica que la gran mayoría de tumores benignos tienen contornos celulares poco irregulares. En contraste, los tumores malignos muestran una caja notablemente más alta y amplia, con una mediana de 0.18 y un rango intercuartílico mayor, reflejando que la irregularidad en los bordes celulares es no solo más frecuente sino también más variable en este grupo.

La separación entre las cajas de ambos grupos es clara, con poco solapamiento entre los bigotes, lo que confirma el alto poder discriminativo de esta variable señalado en los histogramas. Los puntos dispersos generados permiten además visualizar que, aunque hay algunos casos benignos con concavidad moderada, los valores altos de concavidad son casi exclusivos de los tumores malignos.

grafico8 <- ggplot(data_limpia, aes(x = diagnostico, y = textura_peor, fill = diagnostico)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.2, color = "gray30") +
  labs(title = "Distribución de Textura Peor por Diagnóstico",
       x = "Diagnóstico",
       y = "Textura Peor") +
  scale_fill_manual(values = c("B" = "#6BAED6",
                               "M" = "#08306B")) +
  theme_minimal()
ggplotly(grafico8)

Posteriormente, el boxplot de textura peor muestra que los tumores benignos presentan su caja entre aproximadamente 21 y 26, con una mediana alrededor de 24, y los bigotes se extienden desde cerca de 17 hasta 38. Los tumores malignos, en cambio, tienen su caja ubicada entre aproximadamente 27 y 33, con una mediana cercana a 29, y bigotes que llegan hasta casi 42.

Asimismo, el solapamiento entre las cajas es moderado, los rangos intercuartílicos de ambos grupos apenas se tocan en su frontera, lo que indica que la textura peor sí logra una separación razonable entre grupos, aunque no tan contundente como el radio peor o la concavidad peor.

Los valores atípicos son visibles en ambos grupos: en los benignos aparecen 7 puntos aproximadamente por encima de 38, y en los malignos 4 puntos por encima de 42, llegando incluso cerca de 50. Estos outliers confirman los 5 casos identificados en la sección 3.6 y corresponden a tumores con texturas excepcionalmente irregulares. Además, la nube de puntos muestra que la dispersión es considerable en ambos grupos, coherente con la desviación estándar global de 6.15.

grafico9 <- ggplot(data_limpia, aes(x = diagnostico, y = radio_peor, fill = diagnostico)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.2, color = "gray30") +
  labs(title = "Distribución de Radio Peor por Diagnóstico",
       x = "Diagnóstico",
       y = "Radio Peor") +
  scale_fill_manual(values = c("B" = "#6BAED6",
                               "M" = "#08306B")) +
  theme_minimal()

ggplotly(grafico9)

Por su parte, el boxplot presentado para la variable “Radio Peor” evidencia una diferencia bastante marcada entre los diagnósticos benignos (B) y malignos (M), lo que permite identificar que esta característica morfológica tiene una alta capacidad discriminante dentro del conjunto de datos.

En el gráfico se observa que los tumores diagnosticados como malignos presentan valores de “Radio Peor” considerablemente más altos en comparación con los benignos. La mediana del grupo maligno se encuentra alrededor de 20, mientras que en el grupo benigno se ubica aproximadamente entre 12 y 13. Esto indica que, en términos generales, los tumores malignos tienden a presentar un mayor tamaño o expansión en su radio máximo, lo cual es coherente con el comportamiento biológico esperado de este tipo de lesiones.

Asimismo, la dispersión de los datos en el grupo maligno es más amplia, reflejada en una caja y unos bigotes de mayor longitud. Esto sugiere una mayor variabilidad en las características tumorales de los casos malignos, mientras que los tumores benignos muestran valores más concentrados y homogéneos. La presencia de algunos valores atípicos en ambos grupos evidencia que existen casos extremos; sin embargo, estos no afectan la tendencia general observada.

Otro aspecto importante es que, aunque existe una ligera superposición entre algunos valores de ambos diagnósticos, la separación entre las distribuciones es suficientemente clara como para considerar esta variable como relevante en la construcción de modelos predictivos.

En términos generales, este resultado sugiere que las variables morfológicas asociadas al tamaño y la forma del tumor contienen información significativa para apoyar el diagnóstico de cáncer de mama, fortaleciendo la capacidad predictiva de los modelos desarrollados en el estudio.

grafico10 <- ggplot(data_limpia, aes(x = diagnostico, y = simetria_media, fill = diagnostico)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.2, color = "gray30")+
  labs(title = "Distribución de Simetria Media por Diagnóstico",
       x = "Diagnóstico",
       y = "simetria Media") +
  scale_fill_manual(values = c("B" = "#6BAED6",
                               "M" = "#08306B")) +
  theme_minimal()

ggplotly(grafico10)

Del mismo modo, el boxplot de la variable Simetría Media muestra diferencias entre los tumores benignos (B) y malignos (M), aunque la separación entre ambos grupos no es tan marcada como en otras variables morfológicas. Se observa que los casos malignos presentan valores medianos ligeramente superiores, lo que sugiere una mayor irregularidad en la estructura del tumor.

Además, el grupo maligno presenta una mayor dispersión y más valores atípicos, indicando una mayor variabilidad en sus características morfológicas. En contraste, los tumores benignos muestran valores más concentrados y homogéneos.

Sin embargo, existe una superposición considerable entre ambos diagnósticos, por lo que esta variable por sí sola no permite una clasificación completamente precisa. Aun así, la “Simetría Media” aporta información relevante al modelo y puede contribuir a mejorar la capacidad predictiva cuando se combina con otras variables tumorales dentro de modelos de aprendizaje supervisado

grafico11 <- ggplot(data_limpia, aes(x = diagnostico, y = compacto_se, fill = diagnostico)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.2, color = "gray30") +
  labs(title = "Distribución de Compacto Se por Diagnóstico",
       x = "Diagnóstico",
       y = "Compacto Se") +
  scale_fill_manual(values = c("B" = "#6BAED6",
                               "M" = "#08306B"))+
  theme_minimal()

ggplotly(grafico11)

El boxplot de la variable Compacto SE muestra diferencias entre los tumores benignos (B) y malignos (M), evidenciando que los casos malignos tienden a presentar valores más altos en comparación con los benignos. Esto puede asociarse con una mayor irregularidad en la forma y estructura del tumor.

Además, se observa que el grupo maligno presenta una mayor dispersión de los datos y más valores atípicos, lo que indica una mayor variabilidad en sus características morfológicas. En contraste, los tumores benignos muestran valores más concentrados alrededor de la mediana, reflejando un comportamiento más homogéneo.

Aunque existe una superposición parcial entre ambos grupos, la diferencia en las distribuciones permite considerar esta variable como útil dentro del análisis predictivo. Por tanto, “Compacto SE” aporta información importante para la clasificación de tumores

3.6 Análisis de Variables Atípicas

Para complementar el análisis descriptivo y verificar la presencia de observaciones inusuales en el conjunto de datos, se aplicó la regla del rango intercuartílico (IQR) como criterio de detección de valores atípicos.Este enfoque permite identificar casos que se alejan considerablemente del comportamiento típico de cada variable y que podrían influir en el desempeño de los modelos de clasificación.

detectar_outliers <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR_val <- Q3 - Q1
  limite_inf <- Q1 - 1.5 * IQR_val
  limite_sup <- Q3 + 1.5 * IQR_val
  sum(x < limite_inf | x > limite_sup, na.rm = TRUE)
}

variables_numericas <- c("concavidad_peor", "textura_peor", 
                         "radio_peor", "compacto_se", "simetria_media")

tabla_outliers <- data.frame(
  Variable = variables_numericas,
  N_Outliers = sapply(data_limpia[, variables_numericas], detectar_outliers),
  Porcentaje = round(
    sapply(data_limpia[, variables_numericas], detectar_outliers) / nrow(data_limpia) * 100, 2
  )
) %>%
  rename("N° Outliers" = N_Outliers, "% del total" = Porcentaje)

kable(tabla_outliers, caption = "Valores atípicos por Variable (regla IQR)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Valores atípicos por Variable (regla IQR)
Variable N° Outliers % del total
concavidad_peor concavidad_peor 0 0.00
textura_peor textura_peor 5 0.88
radio_peor radio_peor 17 2.99
compacto_se compacto_se 15 2.64
simetria_media simetria_media 28 4.92

Los resultados muestran un panorama diferenciado entre las cinco variables analizadas. En primer lugar, concavidad peor no registra ningún valor atípico, lo que indica que sus datos se distribuyen de manera uniforme a lo largo de todo su rango sin la presencia de casos extremos, convirtiéndola en la variable más estable del conjunto.

De manera similar, textura peor presenta apenas 5 outliers, equivalentes al 0.88% del total, lo que sugiere que, a pesar de su alta dispersión general, su variabilidad se distribuye de forma homogénea y no se concentra en observaciones puntuales inusuales. En contraste, radio peor y compacto SE muestran una presencia más notable de valores atípicos, con 17 casos (2.99%) y 15 casos (2.64%) respectivamente.

En el caso del radio peor, estos outliers se ubican en la cola derecha de la distribución y corresponden a tumores de tamaño excepcionalmente grande, siendo precisamente los responsables de que la media de esta variable se eleve por encima de su mediana. Lejos de representar errores de medición, estos casos probablemente corresponden a tumores malignos en estadios avanzados, por lo que su eliminación no sería apropiada dentro de un análisis clínico. En cuanto al compacto SE, sus valores atípicos reflejan tumores con una variabilidad interna en la compacidad inusualmente alta, lo que podría ser indicativo de un comportamiento celular más irregular y desorganizado.

El hallazgo más llamativo lo protagoniza simetría media, con 28 outliers que representan el 4.92% del total, siendo la variable con mayor proporción de casos atípicos de todo el conjunto. Esto revela que, si bien la mayoría de los tumores presentan niveles de simetría celular bajos y relativamente similares entre sí, existe un subgrupo no despreciable de observaciones con valores inusualmente altos que se alejan marcadamente del patrón general, generando una cola derecha pronunciada en su distribución.

En términos generales, los porcentajes de valores atípicos son bajos en todas las variables sin superar el 5%, lo que indica que el conjunto de datos es razonablemente limpio. Sin embargo, dado el contexto clínico del análisis, ninguno de estos casos debería descartarse de manera automática, pues podrían representar situaciones médicamente significativas, especialmente en la detección de tumores malignos en estadios avanzados. Su presencia debe considerarse al momento de interpretar los resultados de los modelos, particularmente en el KNN, donde la estandarización previa de las variables contribuye a reducir el impacto desproporcionado que estos valores extremos podrían tener en el cálculo de distancias.

4. Resultados del Modelo

4.1 Modelo KNN

El modelo KNN clasifica el estado del tumor de acuerdo con la identificación de las características de las K observaciones más cercanas, es decir, que para predecir si un tumor es benigno o maligno, el modelo KNN busca observaciones muy parecidas en términos de radio, concavidad, textura, simetría y compacidad, y vota por la clase mayoritaria. El valor óptimo del hiperparámetro K fue seleccionado automáticamente mediante validación cruzada, explorando hasta 200 valores posibles y eligiendo el valor que maximice la exactitud.

4.1.1 Entrenamiento

data_Knn <- data_limpia
data_Knn$diagnostico <- as.factor(data_Knn$diagnostico)

set.seed(28)
indxEntrena <- createDataPartition(y = data_Knn$diagnostico, p = 0.70, list = FALSE)
data_entrena <- data_Knn[indxEntrena, ]
data_test <- data_Knn[-indxEntrena, ]

set.seed(28)
data_knnEntrenado <- train(diagnostico ~ ., 
                           data = data_entrena, 
                           method = "knn",  
                           tuneLength = 200, 
                           preProcess= c("center","scale"))

grafico <- ggplot(data_knnEntrenado$results,
                  aes(x = k, y = Accuracy)) +
  geom_line() +
  geom_point()

ggplotly(grafico)

Durante el entrenamiento se evaluaron 200 observaciones con el objetivo de encontrar el K óptimo En el gráfico, se identifica que el k seleccionado fue k=9, ya que en este punto se obtuvo una mayor exactitud con un accuracy de 95,8% y un Kappa de 0.9104.

Como se observa en el gráfico, a medida que el número de K aumenta, la exactitud del modelo disminuye. Esto se debe a que el modelo considera demasiados vecinos al momento de predecir el estado del tumor y termina clasificándolo en una clase mayoritaria. Por ejemplo, si al momento de predecir se consideran demasiados vecinos y si la mayoría de estos corresponden a tumores benignos, el modelo puede clasificar un tumor maligno como benigno, ya que esta última es la clase mayoritaria en sus vecinos, ignorando las características reales del tumor maligno.

4.1.2 Evaluación del Modelo

data_knnPrediccion <- predict(data_knnEntrenado, newdata = data_test )

prob_knnPrediccion <- predict(data_knnEntrenado, newdata = data_test, type = "prob")

Para la evaluación del modelo se definió el tumor maligno (M) como la clase positiva, dado que su detección correcta representa el objetivo principal del análisis y un error en su clasificación tendría mayores consecuencias clínicas que clasificar erróneamente un tumor benigno.

confusionMatrix(data_knnPrediccion, data_test$diagnostico, positive = "M")
cm<- data.frame(" " = c("Predice B (Benigno)", "Predice M (Maligno)"),
  "Real B (Benigno)" = c(105, 2),
  "Real M (Maligno)" = c(8, 55),
  check.names = FALSE
)

kable(cm, 
      caption = "Matriz de Confusión — Modelo KNN",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "bordered"), full_width = FALSE) %>%
  add_header_above(c(" " = 1, "Valor Real (Referencia)" = 2),
                   background = "#08306B", color = "white", bold = TRUE)
Matriz de Confusión — Modelo KNN
Valor Real (Referencia)
Real B (Benigno) Real M (Maligno)
Predice B (Benigno) 105 8
Predice M (Maligno) 2 55

En la matriz de confusión, se evidencia que el modelo KNN predijo de forma exitosa 105 tumores benignos y 55 tumores malignos. Sin embargo, cometió dos tipos de errores, ya que encontramos que clasificó 8 tumores malignos como benignos (falsos negativos) y 2 tumores benignos como malignos (falsos positivos).

En un contexto médico real, el error más grave recae en los 8 falsos negativos, ya que implica que a pacientes que tienen tumores malignos se les diagnostique como tumores benignos, poniendo en riesgo el diagnóstico y un tratamiento oportuno.

tabla_metricas <-data.frame(
 Métrica = c(
    "Accuracy","IC 95%","Tasa de No Información (NIR)","P-value (Acc > NIR)","Kappa","P-valor McNemar's",
    "Sensitivity",
    "Specificity",
    "Pos Pred Value",
    "Neg Pred Value",
    "Prevalence",
    "Detection Rate",
    "Detection Prevalence",
    "Balanced Accuracy",
    "Positive Class"
  ),
  Valor = c(
    "0.9412",
    "(0.8945, 0.9714)",
    "0.6294",
    "< 2e-16",
    "0.8714",
    "0.1138",
    "0.8730",
    "0.9813",
    "0.9649",
    "0.9292",
    "0.3706 ",
    "0.3235",
    "0.3353",
    "0.9272",
    "M"
  )
)

kable(tabla_metricas,
      caption = "Métricas de Evaluación — Modelo KNN",
      align = c("l", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE,
                font_size = 13) %>%
  column_spec(1, width = "22%", color = "#1a5276", bold = TRUE) %>%
  column_spec(2, width = "12%", bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#1F4E79", color = "white")
Métricas de Evaluación — Modelo KNN
Métrica Valor
Accuracy 0.9412
IC 95% (0.8945, 0.9714)
Tasa de No Información (NIR) 0.6294
P-value (Acc > NIR) < 2e-16
Kappa 0.8714
P-valor McNemar’s 0.1138
Sensitivity 0.8730
Specificity 0.9813
Pos Pred Value 0.9649
Neg Pred Value 0.9292
Prevalence 0.3706
Detection Rate 0.3235
Detection Prevalence 0.3353
Balanced Accuracy 0.9272
Positive Class M

El modelo KNN clasificó de forma correcta el 94.12% de los tumores evaluados, es decir, 160 de los 170 tumores, superando el valor de la tasa de no información (NIR) de 62.94%. Esto indica que el modelo no clasifica el estado del tumor al azar, sino que más bien identifica patrones en las características morfológicas de los datos para lograr predecir correctamente. El índice Kappa de 0.8714 demuestra una concordancia buena entre las predicciones del modelo y los valores reales, es decir, que si eliminamos los errores de la predicción, el modelo se mantiene con un alto nivel de precisión. Además, el valor del test de McNemar’s (P-valor McNemar’s) con un 0.1138 señala que los errores son simétricos, ya que la probabilidad de cometer un falso positivo o negativo es estadísticamente igual.

La sensibilidad (sensitivity) mide la proporción de tumores malignos identificados correctamente por el modelo; dicho esto, se alcanzó un valor de 87.30%, lo que significa que de los 63 tumores malignos reales, 55 fueron detectados correctamente y solo 8 no fueron identificados (falsos negativos). Por otro lado, se obtuvo una especificidad (specificity) de 98.13%, lo que indica que el modelo identifica casi perfectamente la totalidad de los tumores benignos, solo cometiendo 2 errores donde clasificó los benignos como malignos (falsos positivos).

El valor predictivo positivo (Pos Pred Value) señala que cuando el modelo predice un tumor como maligno, acierta el 96.49% de las veces. En contraste con el valor predictivo negativo, el cual demuestra que cuando el modelo predice benigno, acierta el 92.92% de las veces.

El informe sobre Controversias sobre el cribado del cáncer de pulmón menciona que los valores de validez de TCB (tomografía computarizada de baja dosis) que es actualmente la prueba de detección recomendada para el cribado del cáncer de pulmón y tiene una validez respaldada por estudios internacionales reporta unos valores de sensibilidad superiores al 80% y llegando hasta 97% y una especificidad del 75%, hasta 95%. Estos valores, aunque provienen de un contexto diagnóstico diferente, permiten establecer unos valores de referencia general sobre los niveles de validez diagnóstica aceptables en oncología.Los valores de sensibilidad del 87.30% y especificidad de 98.13% de nuestro modelo KNN puede considerarse buenos al estar entre el rango para la detección de tumores malignos en mama, sin embargo, hay que tener en cuenta que a pesar de que cumple el rang, hay 8 casos que no fueron identificados, generando falsos negativos que podrían retrasar el diagnóstico y tratamiento oportuno de las pacientes provocando la muerte.

4.2 Modelo LOGIT

Se implementó un modelo de regresión logistica (Logit) que clasifica el estado del tumor, en base a las probabilidades que tiene de ser benigno o maligno a partir de las características morfológicas de las células de entrenamiento. A diferencia del modelo KNN, el LOGIT genera una fórmula matemática que relaciona cada variable con el diagnóstico, permitiendo identificar las características con mayor influencia en la predicción.

Para este modelo se utilizó la misma base de datos y las mismas variables independientes empleadas en el modelo KNN, manteniendo también la misma división de datos y semilla fija set.seed(28), con el fin de garantizar condiciones comparables entre ambos modelos.

4.2.1 Evaluación

En primera instacia se evaluó el módelo con el umbral de 0,5. Es decir, que el modelo clasifica un tumor como maligno cuando la probabilidad estimada por el modelo es mayor a 50% y si la probabilidad es menor a este valor, se define como benigno. Al igual que en el modelo KNN, se establecio tumor maligno como clase positiva, buscando la coordancia al momento de comparar.

data_logit <- data_limpia
data_logit$diagnostico <- as.factor(data_logit$diagnostico)

set.seed(28)
idx <- createDataPartition(y = data_logit$diagnostico, p = 0.70, list = FALSE)
data_train_logit <- data_logit[idx, ]
data_test_logit  <- data_logit[-idx, ]

fit_logit <- glm(diagnostico ~ concavidad_peor + textura_peor + 
                   radio_peor + simetria_media + compacto_se,
                 data = data_train_logit, family = binomial())

fit_logit <- glm(diagnostico ~ concavidad_peor + textura_peor + 
                   radio_peor + simetria_media + compacto_se,
                 data = data_train_logit, family = binomial())

p_hat <- predict(fit_logit, newdata = data_test_logit, type = "response")  

pred_clase <- factor(ifelse(p_hat >= 0.5, "M", "B"), levels = c("B","M"))

confusionMatrix(pred_clase, data_test_logit$diagnostico, positive = "M")
cmLOGIT<- data.frame(" " = c("Predice B (Benigno)", "Predice M (Maligno)"),
  "Real B (Benigno)" = c(105,2),
  "Real M (Maligno)" = c(3, 60),
  check.names = FALSE
)

kable(cmLOGIT, 
      caption = "Matriz de Confusión — Modelo Logit (umbral 0.5)",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "bordered"), full_width = FALSE) %>%
  add_header_above(c(" " = 1, "Valor Real (Referencia)" = 2),
                   background = "#08306B", color = "white", bold = TRUE)
Matriz de Confusión — Modelo Logit (umbral 0.5)
Valor Real (Referencia)
Real B (Benigno) Real M (Maligno)
Predice B (Benigno) 105 3
Predice M (Maligno) 2 60

A diferencia del modelo KNN, el modelo LOGIT clasificó correctamente 105 tumores benignos y 60 malignos. Aunque, también cometio errores,ya que clasifico de forma erronea, 3 tumores como benignos cuando eran malignos (falsos negativos) y 2 tumores benignos como malignos (falsos positivos).

tabla_metricasLOGIT <-data.frame(
 Métrica = c(
    "Accuracy","IC 95%","Tasa de No Información (NIR)","P-value (Acc > NIR)","Kappa","P-valor McNemar's",
    "Sensitivity",
    "Specificity",
    "Pos Pred Value",
    "Neg Pred Value",
    "Prevalence",
    "Detection Rate",
    "Detection Prevalence",
    "Balanced Accuracy",
    "Positive Class"
  ),
  Valor = c(
    "0.9706",
    "(0.9327, 0.9904)",
    "0.6294",
    "< 2e-16",
    "0.9367",
    "1",
    "0.9524",
    "0.9813",
    "0.9677",
    "0.9722",
    "0.3706 ",
    "0.3529",
    "0.3647",
    "0.9668",
    "M"
  )
)

kable(tabla_metricasLOGIT,
      caption = "Métricas de Evaluación — Modelo Logit (umbral 0.5)",
      align = c("l", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE,
                font_size = 13) %>%
  column_spec(1, width = "22%", color = "#1a5276", bold = TRUE) %>%
  column_spec(2, width = "12%", bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#1F4E79", color = "white")
Métricas de Evaluación — Modelo Logit (umbral 0.5)
Métrica Valor
Accuracy 0.9706
IC 95% (0.9327, 0.9904)
Tasa de No Información (NIR) 0.6294
P-value (Acc > NIR) < 2e-16
Kappa 0.9367
P-valor McNemar’s 1
Sensitivity 0.9524
Specificity 0.9813
Pos Pred Value 0.9677
Neg Pred Value 0.9722
Prevalence 0.3706
Detection Rate 0.3529
Detection Prevalence 0.3647
Balanced Accuracy 0.9668
Positive Class M

El modelo logit demostró un desempeño muy alto, ya que obtuvo una exactitud (Accuracy) del 97.06%, lo que significa que predijo de forma correcta el estado de 165 de los 170 tumores. Así mismo, este valor supera el valor del NIR de 62.94%, indicando que el modelo no clasifica los tumores al azar. También se evidenció que un valor Kappa de 0,9367 refleja una similitud casi perfecta entre los resultados predichos y los verdaderos. El valor del test de McNemar es de 1 significa que los errores son perfectamente simétricos (2 falsos positivos y 3 falsos negativos son casi iguales), lo que indica que no hay un tipo de error predominante.

En cuanto a la capacidad de predecir, el modelo logit alcanzó una sensibilidad (sensitivity) de 95.24% y una especificidad (specificity) de 98.13%. Esto nos demuestra que el modelo logit detectó correctamente 60 de los 63 tumores malignos e identifica con un alto nivel de confiabilidad los tumores benignos.

El valor predictivo positivo (Pos Pred Value) señala que cuando el modelo predice un tumor como maligno, acierta el 96.77% de las veces. En contraste con el valor predictivo negativo, el cual demuestra que cuando el modelo predice benigno, acierta el 97.22% de las veces.

Desde un contexto oncológico y tomando como referencia los valores mencionados anteriormente de sensibilidad superior al 80% hasta 97% y una especificidad del 75% hasta 95%. Los valores de sensibilidad del 95.24% y especificidad de 98.13% del modelo LOGIT con umbral de 0.5 son muy acertados, ya que se encuentra en la parte superior más cercana al rango. Sin embargo, se mantienen 3 casos identificados erroneamente, generando retrasos al diagnosticar y tratamiento oportunos a los pacientes provocando la muerte.

Para mejorar el desempeño del modelo, se calculó el umbral óptimo de clasificación mediante el método de Youden y la curva ROC, buscando el punto donde se maximicen simultáneamente la sensibilidad (sensitivity) y la especificidad (specificity). Esto se debe a que con el umbral estándar de 0.5, el modelo predice como maligno cualquier tumor cuya probabilidad supere el 50%. Sin embargo, desde un contexto clínico es más importante detectar un tumor maligno que evitar una predicción errónea. Por lo tanto, el umbral óptimo calculado fue de 0.5917, lo que significa que el modelo ahora clasifica un tumor como maligno únicamente si la probabilidad estimada supera este valor.

roc_o <- pROC::roc(response  = data_test_logit$diagnostico,
             predictor = p_hat,
             levels    = c("B", "M"),
             direction = "<")

umbral <- as.numeric(pROC::coords(roc_o, x = "best", 
                                  best.method = "youden", 
                                  ret = "threshold"))

knitr::kable(data.frame(Metodo = "Youden", 
                        Umbral_Optimo = umbral),
             caption = "Resultado del Umbral")
Resultado del Umbral
Metodo Umbral_Optimo
Youden 0.5917025
pred_clase2 <- factor(ifelse(p_hat >= umbral, "M", "B"),
                      levels = c("B", "M"))
confusionMatrix(pred_clase2, data_test_logit$diagnostico, positive = "M")
cmLOGIT<- data.frame(" " = c("Predice B (Benigno)", "Predice M (Maligno)"),
  "Real B (Benigno)" = c(106,1),
  "Real M (Maligno)" = c(3, 60),
  check.names = FALSE
)

kable(cmLOGIT, 
      caption = "Matriz de Confusión — Modelo Logit (umbral optimo)",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "bordered"), full_width = FALSE) %>%
  add_header_above(c(" " = 1, "Valor Real (Referencia)" = 2),
                   background = "#08306B", color = "white", bold = TRUE)
Matriz de Confusión — Modelo Logit (umbral optimo)
Valor Real (Referencia)
Real B (Benigno) Real M (Maligno)
Predice B (Benigno) 106 3
Predice M (Maligno) 1 60

La matriz de confusión del modelo Logit con umbral óptimo, muestra que se detecto correctamente,106 tumores benignos y 60 detectados malignos. Pero, se continua cometiendo errores de predección, como 3 tumores malignos diagnosticados como benignos y 1 tumor benigno como maligno.

tabla_metricasLOGIT <-data.frame(
 Métrica = c(
    "Accuracy","IC 95%","Tasa de No Información (NIR)","P-value (Acc > NIR)","Kappa","P-valor McNemar's",
    "Sensitivity",
    "Specificity",
    "Pos Pred Value",
    "Neg Pred Value",
    "Prevalence",
    "Detection Rate",
    "Detection Prevalence",
    "Balanced Accuracy",
    "Positive Class"
  ),
  Valor = c(
    "0.9706",
    "(0.9327, 0.9904)",
    "0.6294",
    "< 2e-16",
    "0.9367",
    "1",
    "0.9524",
    "0.9813",
    "0.9677",
    "0.9722",
    "0.3706 ",
    "0.3529",
    "0.3647",
    "0.9668",
    "M"
  )
)

kable(tabla_metricasLOGIT,
      caption = "Métricas de Evaluación — Modelo Logit (Umbral optimo)",
      align = c("l", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE,
                font_size = 13) %>%
  column_spec(1, width = "22%", color = "#1a5276", bold = TRUE) %>%
  column_spec(2, width = "12%", bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#1F4E79", color = "white")
Métricas de Evaluación — Modelo Logit (Umbral optimo)
Métrica Valor
Accuracy 0.9706
IC 95% (0.9327, 0.9904)
Tasa de No Información (NIR) 0.6294
P-value (Acc > NIR) < 2e-16
Kappa 0.9367
P-valor McNemar’s 1
Sensitivity 0.9524
Specificity 0.9813
Pos Pred Value 0.9677
Neg Pred Value 0.9722
Prevalence 0.3706
Detection Rate 0.3529
Detection Prevalence 0.3647
Balanced Accuracy 0.9668
Positive Class M

Al aplicar el umbral óptimo de 0.5917, el modelo logró clasificar correctamente 166 de los 170 tumores evaluados, reduciendo los errores de 5 a 4 respecto al umbral estándar. La exactitud aumentó de 97.06% a 97.65%, y el índice Kappa mejoró de 0.9367 a 0.9492, manteniendo una concordancia casi perfecta con los valores reales. Así mismo, el p-valor de McNemar con 0.6171 confirma que los errores siguen siendo simétricos.

Y en cuanto a la detección de tumores malignos, la sensibilidad se mantuvo en 95.24%, identificando correctamente 60 de los 63 tumores malignos. Sin embargo, el ajuste del umbral permitió reducir los falsos positivos de 2 a 1, lo que se refleja en el aumento de la especificidad de 98.13% a 99.07%, es decir, el modelo ahora identifica casi perfectamente la totalidad de los tumores benignos.

El valor predictivo positivo aumentó de 96.77% a 98.36%, lo que significa que cuando el modelo predice un tumor como maligno, la probabilidad de estar en lo correcto es aún mayor. El valor predictivo negativo se mantuvo estable en 97.25%, y la exactitud balanceada mejoró de 96.68% a 97.15%, confirmando que el modelo con umbral óptimo funciona de forma más equilibrada y precisa para ambas clases.

Teniendo en cuenta los valores de referencia, desde un contexto oncológico, los valores del Logit con umbral óptimo son demasiados buenos, porque aunque se mantiene el valor de la sensibilidad del Logit con umbral 0.5, el valor de la especificidad alcanzó un 99.07%. Permitiendo que el numero de casos falsos negativos se mantenga en 3, pero se mejore la predicción de falsos positivos, ya que ahora solo predijo un tumor como maligno cuando es benigno.

4.3 Comparación de los Modelos

Se realizó una tabla comparativa entre el modelo KNN, el modelo LOGIT con umbral estandar 0,5 y el modelo LOGIT con umbral óptimo de 0,59. Con el objetivo de evaluar el desempeño de los modelos y elegir el mejor.

comparacion <- data.frame(
  Métrica = c("Accuracy", "Kappa", "Sensibilidad", "Especificidad",
              "VPP", "VPN", "Exactitud Balanceada", "McNemar", "AUC"),
  KNN = c("94.12%", "0.8714", "87.30%", "98.13%",
          "96.49%", "92.92%", "92.72%", "0.1138", "0.989"),
  Logit_05 = c("97.06%", "0.9367", "95.24%", "98.13%",
               "96.77%", "97.22%", "96.68%", "1.0000", "0.9964"),
  Logit_optimo = c("97.65%", "0.9492", "95.24%", "99.07%",
                   "98.36%", "97.25%", "97.15%", "0.6171", "0.9964")
)

kable(comparacion,
      caption = "Comparación de métricas — KNN vs Logit",
      col.names = c("Métrica", "KNN", "Logit (umbral 0.5)", "Logit (umbral óptimo)"),
      align = c("l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "bordered"), full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#08306B", color = "white") 
Comparación de métricas — KNN vs Logit
Métrica KNN Logit (umbral 0.5) Logit (umbral óptimo)
Accuracy 94.12% 97.06% 97.65%
Kappa 0.8714 0.9367 0.9492
Sensibilidad 87.30% 95.24% 95.24%
Especificidad 98.13% 98.13% 99.07%
VPP 96.49% 96.77% 98.36%
VPN 92.92% 97.22% 97.25%
Exactitud Balanceada 92.72% 96.68% 97.15%
McNemar 0.1138 1.0000 0.6171
AUC 0.989 0.9964 0.9964

En términos de exactitud (accuracy), el modelo Logit en sus dos versiones supera al KNN. Con el umbral estándar de 0.5 el Logit alcanzó una exactitud del 97.06% frente al 94.12% del KNN, y con el umbral óptimo esta cifra aumentó al 97.65%. El índice Kappa refleja esta misma tendencia de aumento, con valores de 0.9492 para el Logit con umbral óptimo frente a 0.8714 del KNN, ambos interpretados como la concordancia casi perfecta que tiene las predicciones realizadas con los valores reales, pero teniendo una mayor ventaja el Logit.

La métrica más relevante desde un contexto oncológico es la sensibilidad, ya que mide la capacidad del modelo para detectar correctamente los tumores malignos. En este caso, el modelo KNN alcanzó una sensibilidad de 87.30%, lo que significa que de los 63 tumores malignos reales, 8 no fueron detectados correctamente. Por otro lado, el modelo Logit en ambas versiones alcanzó una sensibilidad de 95.24%, reduciendo los falsos negativos de 8 a 3.Esta diferencia es importante, ya que representan diagnosticos y tratamientos que el KNN no logro identificar y que puedan tener consecuencias en la vida de los pacientes.

En cuanto a la especificidad, ambos modelos presentan valores altos, sin embargo el Logit con umbral óptimo alcanzó el 99.07%, identificando casi perfectamente la totalidad de los tumores benignos frente al 98.13% del KNN. Los valores predictivos positivo y negativo también favorecen al Logit en todas las comparaciones, confirmando que sus predicciones son más confiables en ambas direcciones.

roc_knn <- roc(response  = data_test$diagnostico,
               predictor = prob_knnPrediccion[, "M"],
               levels    = c("B", "M"),
               direction = "<")

auc_knn   <- round(auc(roc_knn), 3)
auc_logit <- round(auc(roc_o), 3)

coord_05  <- coords(roc_o, x = 0.5,
                    input = "threshold",
                    ret   = c("specificity", "sensitivity"))

coord_opt <- coords(roc_o, x = umbral,
                    input = "threshold",
                    ret   = c("specificity", "sensitivity"))

grafico_roc <- ggroc(list("KNN"   = roc_knn,
           "Logit" = roc_o),
      size = 1.1) +

  geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1),
               linetype    = "dashed",
               color       = "gray50",
               linewidth   = 0.7,
               inherit.aes = FALSE) +

  geom_point(aes(x = as.numeric(coord_05["specificity"]),
                 y = as.numeric(coord_05["sensitivity"])),
             color       = "#F39C12",
             size        = 4,
             shape       = 16,
             inherit.aes = FALSE) +

  geom_point(aes(x = as.numeric(coord_opt["specificity"]),
                 y = as.numeric(coord_opt["sensitivity"])),
             color       = "#27AE60",
             size        = 4,
             shape       = 17,
             inherit.aes = FALSE) +

  annotate("text",
           x     = as.numeric(coord_05["specificity"]) + 0.15,
           y     = as.numeric(coord_05["sensitivity"]) - 0.08,
           label = "Umbral 0.5",
           color = "#F39C12",
           size  = 3.5) +

  annotate("text",
           x     = as.numeric(coord_opt["specificity"]) + 0.18,
           y     = as.numeric(coord_opt["sensitivity"]) + 0.05,
           label = paste0("Umbral óptimo (", round(umbral, 3), ")"),
           color = "#27AE60",
           size  = 3.5) +

  scale_color_manual(
    values = c("KNN"   = "#2E75B6",
               "Logit" = "#E74C3C"),
    labels = c(paste0("KNN   (AUC = ", auc_knn,   ")"),
               paste0("Logit (AUC = ", auc_logit, ")"))
  ) +

  labs(title = "Comparación Curvas ROC — KNN vs Logit",
       x     = "Especificidad",
       y     = "Sensibilidad",
       color = "Modelo") +

  theme_minimal(base_size = 13) +
  theme(plot.title       = element_text(face = "bold", hjust = 0.5, size = 14),
        legend.position  = "bottom",
        legend.title     = element_text(face = "bold"),
        legend.text      = element_text(size = 10),
        panel.grid.major = element_line(color = "grey90"))

ggplotly(grafico_roc)

Podemos observar en la gráfica de comparación de curvas ROC que los dos modelos superan la línea punteada de referencia del clasificador aleatorio (línea punteada, AUC = 0.5), lo que confirma que ambos modelos no clasifican el estado del tumor al azar. Sin embargo, se evidencia que la curva del modelo logit se encuentra más cercana al extremo izquierdo, alcanzando niveles de sensibilidad y especificidad altos, lo que corresponde a una predicción casi perfecta sobre el estado del tumor, ya que detecta correctamente los tumores malignos sin sacrificar la identificación de los benignos. Este mismo comportamiento lo tiene la curva del modelo KNN, pero su crecimiento es menor y refleja que, para intentar llegar a los mismos niveles de sensibilidad del modelo logit, debe tolerar una mayor tasa de falsos positivos. Esto se respalda al conocer los valores del AUC de 0.995 y 0.989, respectivamente.

Sobre la curva del logit, podemos notar dos pequeños símbolos El triángulo verde representa el umbral óptimo, un punto donde se maximiza la sensibilidad y especificidad. En cambio, el círculo amarillo es el umbral estándar de 0.5. Se observa que el triángulo verde se ubica un poco más arriba y a la izquierda que el punto amarillo, lo que confirma que ajustar el método logit al umbral óptimo es la mejor decisión, ya que permite encontrar un equilibrio entre detectar tumores malignos y evitar falsas alarmas.

4.3.1 ¿Cuál es el Mejor Modelo?

Con base en los analisis individuales, comparativos y la curvas ROC, se concluye que el modelo con mejor desempeño, que cumple con el objetivo de forma casi perfecta de predecir el estado de un tumor y sus valores de sensibilidad y especificidad se encuentra en el rango superior de referencia, es el modelo logit con la configuracion de umbral optimo de 0.59. Ya que este supera al modelo KNN en todas las métricas evaluadas, alcanzando una exactitud del 97.65% frente al 94.12% del KNN y un índice Kappa de 0.9492 frente a 0.8714, lo que refleja una mayor concordancia entre las predicciones y los valores reales.Adicionalmente, en un contexto clinico es muy importante la sensibilidad, ya que detectar un tumor maligno de forma incorrecta puede tener consecuencias graves para el paciente. En este sentido, el modelo logit alcanzó una sensibilidad del 95.24%, reduciendo los falsos negativos de 8 a 3 respecto al KNN, lo que significa que 5 tumores malignos adicionales fueron detectados correctamente.

Finalmente, la curva ROC confirma la superioridad del modelo, ya que este obtuvo un AUC de 0.995 frente al 0.989 del KNN, indicando que tiene una mayor capacidad para distinguir entre tumores malignos y benignos en todos los posibles umbrales de clasificación. Por estas razones, el modelo Logit con umbral óptimo es el más preciso y confiable al momento de predecir el estado del tumor.

5. Conclusiones.

Los modelos de clasificación supervisada desarrollados —KNN y regresión logística (LOGIT)— demostraron ser herramientas eficaces para predecir el diagnóstico de tumores mamarios a partir de variables morfológicas como radio, concavidad, textura, simetría y compacidad. Ambos modelos superaron ampliamente la tasa de no información del 62.94%, confirmando que identifican patrones reales en los datos y no clasifican al azar.

En términos comparativos, el modelo LOGIT con umbral óptimo (0.5917) superó al KNN en todas las métricas relevantes: exactitud del 97.65% frente al 94.12%, sensibilidad del 95.24% frente al 87.30%, y AUC de 0.9964 frente a 0.9890. La diferencia más crítica desde el punto de vista clínico radica en los falsos negativos: el KNN no detectó 8 tumores malignos, mientras que el LOGIT redujo ese error a 3; lo que en un contexto médico real representa diagnósticos y tratamientos que podrían salvar vidas. Por esta razón, se recomienda priorizar siempre la sensibilidad como métrica central en problemas oncológicos, adoptar el ajuste de umbral mediante el índice de Youden como práctica estándar, y validar los modelos en poblaciones externas antes de cualquier implementación clínica.

Particularmente el modelo LOGIT, al tener un umbral óptimo logra responder satisfactoriamente a nuestro objetivo dentro de la investigación. Este modelo demostró una capacidad discriminativa muy eficaz entre tumores benignos y malignos, con solo 3 falsos negativos y 1 falso positivo sobre 170 casos evaluados. El KNN, aunque funcional, presentó una sensibilidad insuficiente para un contexto clínico exigente. En consecuencia, el modelo logístico con umbral ajustado constituye una herramienta de apoyo diagnóstico confiable y pertinente, teniendo en cuenta por supuesto que ésta será un complemento al criterio médico y no su reemplazo.

6. Bibliografía.

Cáncer de mama. (s/f-a). Who.int. Recuperado el 15 de mayo de 2026, de https://www.who.int/es/news-room/fact-sheets/detail/breast-cancer

Cáncer de mama. (s/f-b). Paho.org. Recuperado el 15 de mayo de 2026, de https://www.paho.org/es/temas/cancer-mama

Checking your browser - reCAPTCHA. (s/f). Kaggle.com. Recuperado el 15 de mayo de 2026, de https://www.kaggle.com/datasets/yasserh/breast-cancer-dataset/data

Moreno-Bartolomé, C., Navarro Soriano, J., & Melus Palazon, E. (2026). Controversias sobre el cribado del cáncer de pulmón. Atencion primaria, 58(4), 103464. https://doi.org/10.1016/j.aprim.2026.103464