Profesor:
Patricio Araneda García
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.
Breast Cancer Wisconsin (Diagnostic) Data Set
Predict whether the cancer is benign or malignant:
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)
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
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.
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
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
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>
Factorizamos la variable categórica diagnosis en 2 valores posibles (“benigno”, “Maligno”)
factor <- factor(cancer$diagnosis, levels = c("B", "M"), labels = c("Benigno", "Maligno"))
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.
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
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
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
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`.
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)
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.
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.