Inicio

Profesor:

Patricio Araneda García

Introducción

mediante un conjunto de datos recolectados con las características de células ,realizaremos un análisis predictivo para identificar cual es la probabilidad de que las masas sean benignas o malignas.

Datos

Breast Cancer Wisconsin (Diagnostic) Data Set

Predict whether the cancer is benign or malignant:

https://www.kaggle.com/uciml/breast-cancer-wisconsin-data

https://repository.udistrital.edu.co/bitstream/handle/11349/25070/RoblesFajardoJaimeBrandon2020.pdf?sequence=1

Variables y numero de observaciones

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.2     v dplyr   1.0.6
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(rpart)
library(rpart.plot)
library(readr)
library(ggcorrplot)

lectura de datos

Cargamos los datos, lo importamos a un dataframe, con col_names informaremos que los nombres de cada columna corresponden a la primera fila del set de datos, con skip_empty_rows las filas que estén vacías serán reemplazadas con NA, con trim_ws eliminaremos espacios en blanco que se encuentren en el inicio y el final de cada columna, con cols definiremos las columnas por defecto como tipo double con excepcion de la columna diagnosis que será de tipo character.

Luego seleccionamos las variables que nos interesan

cancer<- read_csv("C:/datos/data.csv",col_names = TRUE,
                   skip_empty_rows = FALSE,
                   trim_ws = TRUE,
                   na = c("", "NA"),
                   cols( .default = col_double(),
                          diagnosis = col_character())
                   )
## Warning: Missing column names filled in: 'X33' [33]
## Warning: 569 parsing failures.
## row col   expected     actual                file
##   1  -- 33 columns 32 columns 'C:/datos/data.csv'
##   2  -- 33 columns 32 columns 'C:/datos/data.csv'
##   3  -- 33 columns 32 columns 'C:/datos/data.csv'
##   4  -- 33 columns 32 columns 'C:/datos/data.csv'
##   5  -- 33 columns 32 columns 'C:/datos/data.csv'
## ... ... .......... .......... ...................
## See problems(...) for more details.
cancerigeno <- select(cancer, diagnosis, radius_worst, radius_mean , `concave points_worst`, `concave points_mean`, texture_worst, texture_mean)

*importamos los datos al dataframe

*Se informa que la primera fila es el nombre de la columna

*Si alguna fila se encuentra vacia se reemplazara por valor NA

*Si algun espacio de columna esta vacio se reemplaza por valor NA

*Se eliminan espacios blancos en el inicio y el final de cada columna

*Se definen todas las columnas por defecto como tipo datos double (numero decimal) y define la columna diagnosis como tipo dato character (caracteres)

*Se selecciona las variables mas relevantes

Clasificacion de datos

El Sistema de enfoque de visión por computadora extrae caracteríısticas diferentes de los líımites del núcleo celular generado en los snakes. Todas las características se modelan numéricamente de modo que los valores más grandes generalmente indican una mayor probabilidad de malignidad. Las características extraídas son las siguientes:

  • Radio (Radius): El radio de un núcleo individual se mide promediando la longitud de los segmentos lineales radiales definidos por el centroide y los puntos individuales de la snake.

  • Perímetro (Perimeter): El perímetro nuclear es la distancia total entre los puntos de la snake.

  • Area (Area): ´ El área nuclear se mide contando el n´umero de píxeles en el interior de la snake y agregando la mitad de los píxeles en el perímetro.

  • Textura(Texture): La textura del núcleo celular se mide al encontrar la varianza de las intensidades de escala de grises en los píxeles encontrados en la digitalización de la muestra.

  • Lisura (Smoothness): La lisura de un contorno nuclear se cuantifica midiendo la diferencia entre la longitud de una línea radial y la longitud media de las líneas que lo rodean.

  • Concavidad (Concavity): Se obtiene al medir el número y la gravedad de las concavidades o hendiduras en un núcleo celular. Para ellos se dibujan puntos no adyacentes en la snake y se mide el grado en que el límite real del núcleo se encuentra en el interior de cada linea.

  • Puntos Cóncavos (Concave Points): Esta característica es similar a la Concavidad, pero mide solo el número, en lugar de la magnitud, de las concavidades del contorno.

  • Simetría(Symmetry): Para medir la simetría, se encuentra el eje principal, o la linea más larga a través del centro. Luego se mide la diferencia de longitud entre líneas perpendiculares del eje principal al límite de la celda en ambas direcciones.

  • Compacidad (Compactness): El perímetro y el área se combinan para obtener una medida del espacio compacto de los núcleos celulares. Este número adimensional se minimiza mediante un disco circular y aumenta con la irregularidad del límite. Sin embargo, esta medida de forma también aumenta para los núcleos celulares alargados, que no necesariamente indican una mayor probabilidad de malignidad. La característica también está sesgada hacia arriba para las celdas pequeñas debido a la menor precisión impuesta por la digitalización de la muestra.

  • Dimensión Fractal(Fractal Dimension): La dimensión fractal de una célula se calcula utilizando el método de la Paradoja de la línea de costa de Benoít Mandel-brot.En ella el perímetro del núcleo se mide utilizando intervalos de escala cada vez más grandes. A medida que aumenta el tamaño de la escala, disminuyendo la precisión de la medición, disminuye el perímetro observado. Al trazar estos valores en una escala logarítmica y medir la pendiente descendente se obtiene una aproximación a la dimensión fractal. Al igual que con todas las características de forma, un valor más alto corresponde a un contorno menos regular y, por lo tanto, a una mayor probabilidad de malignidad.

Ver la dimensión del data set

dim(cancerigeno)
## [1] 569   7

El dataset contiene 569 registros y 7 variables

Realizamos una exploración del tipo columnas que tiene este dataset

str(cancerigeno)
## tibble [569 x 7] (S3: tbl_df/tbl/data.frame)
##  $ diagnosis           : chr [1:569] "M" "M" "M" "M" ...
##  $ radius_worst        : num [1:569] 25.4 25 23.6 14.9 22.5 ...
##  $ radius_mean         : num [1:569] 18 20.6 19.7 11.4 20.3 ...
##  $ concave points_worst: num [1:569] 0.265 0.186 0.243 0.258 0.163 ...
##  $ concave points_mean : num [1:569] 0.1471 0.0702 0.1279 0.1052 0.1043 ...
##  $ texture_worst       : num [1:569] 17.3 23.4 25.5 26.5 16.7 ...
##  $ texture_mean        : num [1:569] 10.4 17.8 21.2 20.4 14.3 ...
##  - attr(*, "problems")= tibble [569 x 5] (S3: tbl_df/tbl/data.frame)
##   ..$ row     : int [1:569] 1 2 3 4 5 6 7 8 9 10 ...
##   ..$ col     : chr [1:569] NA NA NA NA ...
##   ..$ expected: chr [1:569] "33 columns" "33 columns" "33 columns" "33 columns" ...
##   ..$ actual  : chr [1:569] "32 columns" "32 columns" "32 columns" "32 columns" ...
##   ..$ file    : chr [1:569] "'C:/datos/data.csv'" "'C:/datos/data.csv'" "'C:/datos/data.csv'" "'C:/datos/data.csv'" ...

Observamos que todas las variables excepto diagnosis son de tipo numérico

Analisis Exploratorio

Muestra la tabla resumen compuesta por los datos de las columnas del dataframe

summary(cancerigeno)
##   diagnosis          radius_worst    radius_mean     concave points_worst
##  Length:569         Min.   : 7.93   Min.   : 6.981   Min.   :0.00000     
##  Class :character   1st Qu.:13.01   1st Qu.:11.700   1st Qu.:0.06493     
##  Mode  :character   Median :14.97   Median :13.370   Median :0.09993     
##                     Mean   :16.27   Mean   :14.127   Mean   :0.11461     
##                     3rd Qu.:18.79   3rd Qu.:15.780   3rd Qu.:0.16140     
##                     Max.   :36.04   Max.   :28.110   Max.   :0.29100     
##  concave points_mean texture_worst    texture_mean  
##  Min.   :0.00000     Min.   :12.02   Min.   : 9.71  
##  1st Qu.:0.02031     1st Qu.:21.08   1st Qu.:16.17  
##  Median :0.03350     Median :25.41   Median :18.84  
##  Mean   :0.04892     Mean   :25.68   Mean   :19.29  
##  3rd Qu.:0.07400     3rd Qu.:29.72   3rd Qu.:21.80  
##  Max.   :0.20120     Max.   :49.54   Max.   :39.28

Detección de datos

sapply(cancerigeno, function(x) sum(is.na(x)))
##            diagnosis         radius_worst          radius_mean 
##                    0                    0                    0 
## concave points_worst  concave points_mean        texture_worst 
##                    0                    0                    0 
##         texture_mean 
##                    0

Se realiza conteo de datos nulos en cada columna.

Mostramos los 6 primeros registros del dataframe.

head(cancerigeno)
## # A tibble: 6 x 7
##   diagnosis radius_worst radius_mean `concave points_worst` `concave points_mea~
##   <chr>            <dbl>       <dbl>                  <dbl>                <dbl>
## 1 M                 25.4        18.0                  0.265               0.147 
## 2 M                 25.0        20.6                  0.186               0.0702
## 3 M                 23.6        19.7                  0.243               0.128 
## 4 M                 14.9        11.4                  0.258               0.105 
## 5 M                 22.5        20.3                  0.162               0.104 
## 6 M                 15.5        12.4                  0.174               0.0809
## # ... with 2 more variables: texture_worst <dbl>, texture_mean <dbl>

Factorización

Factorizamos la variable categórica diagnosis en 2 valores posibles (“benigno”, “Maligno”)

factor <- factor(cancer$diagnosis, levels = c("B", "M"), labels = c("Benigno", "Maligno"))

Variable Factorizada

cancer$diagnosis <- factor
head(cancer$diagnosis)
## [1] Maligno Maligno Maligno Maligno Maligno Maligno
## Levels: Benigno Maligno

muestra si los primeros 6 registros con la variable factorizada es de tipo “benigno” o “Maligno”, tambien muestra los dos tipos de valores que existen en la variable.

Recuento de Variable

table(cancer$diagnosis)
## 
## Benigno Maligno 
##     357     212

contabiliza la cantidad de datos de de la variable tipo “benigno” y “Maligno”.

*la cantidad de datos con variable de tipo "Benigno corresponde a :357

*la cantidad de datos con variable de tipo “Maligno” corresponde a :212

Grafico de Proporción

En este gráfico se muestra la proporción que existe entre los datos de tipo “benigno y datos de tipo”Maligno".

cancerigeno %>%


ggplot(aes(diagnosis, fill =  diagnosis) ) +
  geom_bar(color="black") + scale_fill_manual(values = c("#009E73","#CC0000"))

  theme(legend.position = 'none') 
## List of 1
##  $ legend.position: chr "none"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE

Proporción de Variable

Corresponde a Proporción de datos de variable “Benigno” y “Maligno”

round(prop.table(table(cancer$diagnosis)),3)
## 
## Benigno Maligno 
##   0.627   0.373

el resultado de la proporción arroja que existe un 62,7% de datos de tipo Benigno y un 37,3% de datos de tipo Maligno

Estimación de la distribución

Revisamos en los histogramas de que manera está distribuidas las mediciones de cada carácteristica de las células

cancerigeno %>%
  keep(is.numeric) %>%
  gather() %>%
  ggplot() +
  geom_histogram(mapping = aes(x=value, fill=key), color='black') +
  facet_wrap( ~ key, scales = "free" ) +
  theme_light() +
  theme(legend.position = 'none')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Matriz de Correlación

se puede apreciar que existe que en la matriz las variables que está coloreadas con rojo, muestran una correlación lineal fuerte, mientras que las que están con color narajo tienen una correlación intermedia a fuerte, y las que están en color ocre carne a rosado sus correlaciones lineales son débiles.

matriz <- names(which(sapply( cancerigeno, is.numeric)))
corr <- cor(cancerigeno[,matriz], use = 'pairwise.complete.obs')
ggcorrplot(corr, lab = TRUE)

arbol de clasificación

Muestra el arbol que hace las preguntas a los valores covariables del dataframe para que de forma probabilistica reconocer en que porcentajes podrían llegar a ser de tipo Benigno o Maligno

set.seed(123)
tamano.total <- nrow(cancerigeno)
tamano.entrenado <- round(tamano.total*0.8)
cancer_km.indices <- sample(2:tamano.total , size=tamano.entrenado)
cancer_km.entrenado <- cancerigeno[cancer_km.indices,]
cancer_km.test    <- cancerigeno[-cancer_km.indices,]
arbol <-  rpart(formula = diagnosis ~ ., cancer_km.entrenado, method = "class", cp = 0.01 )
rpart.plot(arbol)

Este arbol nos indica que : si el peor rádio de la célula es inferior a 17 tiene una probabilidad de un 68% de que sea benigna y solo un 32% que sea maligna. Pero en ese 68% de rádio benigno existe tambien una probabilidad de que el peor punto de concavidad en el núcleo celular tenga una probabilidad de un 64% de que sea benigno si su peor punto de concavidad es inferior a 0.16 sino ocurre ello tendrá un 4% de probabilidad de que sea maligna.

Por último el 32 % de que sea maligno el rádio, indicará que al revisar su peor textura del núcleo celular exista un 2% de que sea benigno si es menor que 18, por el contrario si es mayor a 18 existe un 31% de probabilidad de que sea maligno.

Se aprecia que existe mayor probabilidades de que la célula sea Benigna por sobre que sea Maligna.

Conclusión

Mientras la célula se mantenga en un cierto margen de tamaño con respecto a sus carácterísticas, la probabilidad de voverse maligna será muy baja mientras que si va aumentando de tamaño con el tiempo, la probabilidad de que sea maligna será cada vez mayor.