La eficacia del sistema de predicción del cáncer ayuda a las personas a conocer su riesgo de cáncer a un bajo costo y también ayuda a las personas a tomar la decisión adecuada en función de su estado de riesgo de cáncer. Los datos se recopilan del sistema de predicción de cáncer de pulmón en línea del sitio web.
Número total de atributos:16 No. de instancias:284 Información del atributo: 1. Género: M(masculino), F(femenino) 2. Edad: Edad del paciente 3. Tabaquismo: SÍ=2, NO=1. 4. Dedos amarillos: SÍ=2, NO, NO=, NO=1. 5. Ansiedad: SI=2, NO=1. 6. Presión de grupo: SÍ=2, NO=1., NO=1. 7. Enfermedad Crónica: SI=2, NO=1. 8. Fatiga: SI=2 , NO=1., NO=1. 9. Alergia: SI=2, NO=1. , NO=1. 10. Sibilancias: SÍ=2, NO=1. 11. Alcohol: SI=2, NO=1. 12. Tos: SÍ=2, NO=1. 13. Dificultad para respirar: SÍ=2, NO=1, NO=1. , NO=1. 14. Dificultad para tragar: SÍ=2, NO=1. , NO=1. , NO=1. , NO=1. 15. Dolor torácico: SI=2, NO=1. 16. Cáncer de Pulmón: SÍ, o, NO.
El cáncer es conocido por su moralidad y naturaleza mortal que daña nuestros tejidos y órganos cercanos de manera efectiva, creando así varios problemas corporales. A nivel mundial, el cáncer de pulmón juega un papel vital en la tasa de mortalidad relacionada con el cáncer y es conocido por su naturaleza mortal, ocurre cuando células anormales comienzan a crecer en nuestros pulmones de manera descontrolada formando un tumor en nuestros pulmones que se infiltra en otros partes de nuestro cuerpo. El cáncer de pulmón es fatal y más peligroso porque no se puede detectar fácilmente en una etapa temprana y se observa cuando ya ha extendido su efecto a la mayor parte del cuerpo, lo que hace que su diagnóstico sea más difícil o casi imposible.
Ideas de investigación
Predecir la probabilidad de que un paciente desarrolle cáncer de pulmón
Identificar factores de riesgo para el cáncer de pulmón
Determinar el tratamiento más eficaz para un paciente con cáncer de pulmón
Breve descripción del conjunto de datos:
GÉNERO: El género del individuo (Hombre o Mujer). M hombre y F mujer
EDAD: La edad del individuo en años.
FUMAR: Indica si el individuo fuma (‘2’ para sí, ‘1’ para no).
YELLOW_FINGERS: Denota la presencia de dedos amarillos (‘2’ para sí, ‘1’ para no), un signo potencial asociado con fumar.
ANSIEDAD: Indica si el individuo experimenta ansiedad (‘2’ para sí, ‘1’ para no).
PEER_PRESSURE: Sugiere si la presión de grupo influye en los hábitos del individuo (‘2’ para sí, ‘1’ para no).
ENFERMEDAD CRÓNICA: Indica la presencia de alguna enfermedad crónica (‘2’ para sí, ‘1’ para no).
FATIGA: Denota si el individuo se siente fatigado frecuentemente (‘2’ para sí, ‘1’ para no).
ALERGIA: Indica si el individuo tiene alergias (‘2’ para sí, ‘1’ para no).
SIBILIDADES: Representa si el individuo experimenta sibilancias (‘2’ para sí, ‘1’ para no).
CONSUMO DE ALCOHOL: Indica hábitos de consumo de alcohol (‘2’ para sí, ‘1’ para no).
TOS: Representa si el individuo tiene tos (‘2’ para sí, ‘1’ para no).
FALTA DE RESPIRACIÓN: Indica si el individuo experimenta dificultad para respirar (‘2’ para sí, ‘1’ para no).
DIFICULTAD PARA TRAGAR: Denota dificultad para tragar (‘2’ para sí, ‘1’ para no).
DOLOR DE PECHO: Indica la presencia de dolor en el pecho (‘2’ para sí, ‘1’ para no).
LUNG_CANCER: La variable objetivo, que indica si el individuo tiene cáncer de pulmón si o no.
CARGA DE BASE DE DATOS:
library(readr)
cancer <- read_csv("C:\\Users\\PC\\Downloads\\survey lung cancer.csv")
## Rows: 309 Columns: 16
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): GENDER, LUNG_CANCER
## dbl (14): AGE, SMOKING, YELLOW_FINGERS, ANXIETY, PEER_PRESSURE, CHRONIC DISE...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
El número de columnas del DataFrame es 16 y el número de muestras es 309, se tomo esta base ya que es muy similiar a las practicas y por lo cual para el aprendizaje y estudio ayudara muccho aunque no tenga tantos datos pero es muy buena opción de relaizar predicciones del cancer de pulmón.
# nombres de las variables
names(cancer)
## [1] "GENDER" "AGE" "SMOKING"
## [4] "YELLOW_FINGERS" "ANXIETY" "PEER_PRESSURE"
## [7] "CHRONIC DISEASE" "FATIGUE" "ALLERGY"
## [10] "WHEEZING" "ALCOHOL CONSUMING" "COUGHING"
## [13] "SHORTNESS OF BREATH" "SWALLOWING DIFFICULTY" "CHEST PAIN"
## [16] "LUNG_CANCER"
# Comprobar el tipo de clase de cada variable
clases <- sapply(cancer, class)
clases
## GENDER AGE SMOKING
## "character" "numeric" "numeric"
## YELLOW_FINGERS ANXIETY PEER_PRESSURE
## "numeric" "numeric" "numeric"
## CHRONIC DISEASE FATIGUE ALLERGY
## "numeric" "numeric" "numeric"
## WHEEZING ALCOHOL CONSUMING COUGHING
## "numeric" "numeric" "numeric"
## SHORTNESS OF BREATH SWALLOWING DIFFICULTY CHEST PAIN
## "numeric" "numeric" "numeric"
## LUNG_CANCER
## "character"
Variable Level Es la unica variable categórica
cancer$GENDER <- factor(cancer$GENDER)
levels(cancer$GENDER) <- c("F", "M")
class(cancer$GENDER)
## [1] "factor"
cancer$LUNG_CANCER <- factor(cancer$LUNG_CANCER)
levels(cancer$LUNG_CANCER) <- c("NO", "YES")
class(cancer$LUNG_CANCER)
## [1] "factor"
# Contar valores nulos en cada columna
na_counts <- colSums(is.na(cancer))
# Mostrar el número de valores nulos en cada columna
print(na_counts)
## GENDER AGE SMOKING
## 0 0 0
## YELLOW_FINGERS ANXIETY PEER_PRESSURE
## 0 0 0
## CHRONIC DISEASE FATIGUE ALLERGY
## 0 0 0
## WHEEZING ALCOHOL CONSUMING COUGHING
## 0 0 0
## SHORTNESS OF BREATH SWALLOWING DIFFICULTY CHEST PAIN
## 0 0 0
## LUNG_CANCER
## 0
Aquí se comprueban los valores faltantes. En este caso no se encontró ningún valor.
cancer1 <- cancer[, c(2:15)]
summary(cancer1)
## AGE SMOKING YELLOW_FINGERS ANXIETY PEER_PRESSURE
## Min. :21.00 Min. :1.000 Min. :1.00 Min. :1.000 Min. :1.000
## 1st Qu.:57.00 1st Qu.:1.000 1st Qu.:1.00 1st Qu.:1.000 1st Qu.:1.000
## Median :62.00 Median :2.000 Median :2.00 Median :1.000 Median :2.000
## Mean :62.67 Mean :1.563 Mean :1.57 Mean :1.498 Mean :1.502
## 3rd Qu.:69.00 3rd Qu.:2.000 3rd Qu.:2.00 3rd Qu.:2.000 3rd Qu.:2.000
## Max. :87.00 Max. :2.000 Max. :2.00 Max. :2.000 Max. :2.000
## CHRONIC DISEASE FATIGUE ALLERGY WHEEZING
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
## Median :2.000 Median :2.000 Median :2.000 Median :2.000
## Mean :1.505 Mean :1.673 Mean :1.557 Mean :1.557
## 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.000
## Max. :2.000 Max. :2.000 Max. :2.000 Max. :2.000
## ALCOHOL CONSUMING COUGHING SHORTNESS OF BREATH SWALLOWING DIFFICULTY
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
## Median :2.000 Median :2.000 Median :2.000 Median :1.000
## Mean :1.557 Mean :1.579 Mean :1.641 Mean :1.469
## 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.000
## Max. :2.000 Max. :2.000 Max. :2.000 Max. :2.000
## CHEST PAIN
## Min. :1.000
## 1st Qu.:1.000
## Median :2.000
## Mean :1.557
## 3rd Qu.:2.000
## Max. :2.000
Interpretación
La muestra abarca un rango de edades considerable, desde 21 hasta 87 años, con una edad promedio de aproximadamente 62.67 años. El análisis del historial de fumadores revela que la mayoría de los participantes son no fumadores, con una media de 1.563. Sin embargo, se observa un número significativo de fumadores, indicado por la asociación del color amarillo en los dedos, característico de los fumadores empedernidos. Además, se identifica un nivel moderado de ansiedad en la muestra, posiblemente atribuido a la presión social para fumar. Aunque existe una presión moderada para que los participantes fumen, la prevalencia de enfermedades crónicas, aparte del cáncer de pulmón, es baja. Sin embargo, se observa una moderada presencia de fatiga y sibilancias en los sujetos. Es importante destacar que la mayoría de los participantes no son consumidores de alcohol, según la media obtenida. Se reporta una moderada presencia de síntomas como tos, dificultad para respirar y dolor en el pecho, mientras que la dificultad para tragar muestra una baja prevalencia en la muestra.
DESVIACIÓN ESTANDAR
La desviación estándar nos dice qué tan dispersos están los valores alrededor de la media. Si la desviación estándar es baja, significa que los valores tienden a estar cerca de la media. Por otro lado, si la desviación estándar es alta, indica que los valores están más dispersos y alejados de la media.
Fórmula
\[\sigma = \sqrt{\frac{\sum_{i=1}^{N}(x_i - \bar{x})^2}{N-1}}\]
desviacion_estandar <- apply(cancer1, 2, sd)
desviacion_estandar
## AGE SMOKING YELLOW_FINGERS
## 8.2103014 0.4968061 0.4959382
## ANXIETY PEER_PRESSURE CHRONIC DISEASE
## 0.5008084 0.5008084 0.5007874
## FATIGUE ALLERGY WHEEZING
## 0.4698268 0.4975880 0.4975880
## ALCOHOL CONSUMING COUGHING SHORTNESS OF BREATH
## 0.4975880 0.4944742 0.4805510
## SWALLOWING DIFFICULTY CHEST PAIN
## 0.4998634 0.4975880
Interpretación
El análisis sugiere que, aunque existe una amplia variabilidad en las edades de los sujetos en el estudio, hay consistencia en la presencia de varios síntomas y comportamientos, como el consumo de tabaco, la presión de grupo, la presencia de enfermedades crónicas, alergias, sibilancias, y el consumo de alcohol. Por otro lado, se observa una variabilidad moderada en síntomas como la fatiga, la tos, la dificultad para respirar y el dolor en el pecho.
library(corrplot)
## corrplot 0.92 loaded
cor <- cor(cancer1); cor
## AGE SMOKING YELLOW_FINGERS ANXIETY
## AGE 1.000000000 -0.084474561 0.005204872 0.053170355
## SMOKING -0.084474561 1.000000000 -0.014584866 0.160266983
## YELLOW_FINGERS 0.005204872 -0.014584866 1.000000000 0.565829293
## ANXIETY 0.053170355 0.160266983 0.565829293 1.000000000
## PEER_PRESSURE 0.018685137 -0.042822324 0.323083238 0.216841223
## CHRONIC DISEASE -0.012642128 -0.141522309 0.041122177 -0.009677825
## FATIGUE 0.012614462 -0.029575460 -0.118057922 -0.188538334
## ALLERGY 0.027990485 0.001912698 -0.144299527 -0.165749538
## WHEEZING 0.055011347 -0.129425926 -0.078515293 -0.191807339
## ALCOHOL CONSUMING 0.058985003 -0.050622751 -0.289024842 -0.165749538
## COUGHING 0.169950348 -0.129471065 -0.012639843 -0.225644074
## SHORTNESS OF BREATH -0.017512737 0.061263759 -0.105944284 -0.144076665
## SWALLOWING DIFFICULTY -0.001269878 0.030717735 0.345903772 0.489402762
## CHEST PAIN -0.018103926 0.120117461 -0.104828987 -0.113633937
## PEER_PRESSURE CHRONIC DISEASE FATIGUE ALLERGY
## AGE 0.01868514 -0.012642128 0.012614462 0.027990485
## SMOKING -0.04282232 -0.141522309 -0.029575460 0.001912698
## YELLOW_FINGERS 0.32308324 0.041122177 -0.118057922 -0.144299527
## ANXIETY 0.21684122 -0.009677825 -0.188538334 -0.165749538
## PEER_PRESSURE 1.00000000 0.048514810 0.078148291 -0.081799569
## CHRONIC DISEASE 0.04851481 1.000000000 -0.110528642 0.106386061
## FATIGUE 0.07814829 -0.110528642 1.000000000 0.003056272
## ALLERGY -0.08179957 0.106386061 0.003056272 1.000000000
## WHEEZING -0.06877067 -0.049967294 0.141936883 0.173866916
## ALCOHOL CONSUMING -0.15997297 0.002150491 -0.191376583 0.344338822
## COUGHING -0.08901867 -0.175286710 0.146856016 0.189524168
## SHORTNESS OF BREATH -0.22017534 -0.026458823 0.441744642 -0.030056438
## SWALLOWING DIFFICULTY 0.36659037 0.075176421 -0.132790075 -0.061507906
## CHEST PAIN -0.09482847 -0.036937848 -0.010831789 0.239433033
## WHEEZING ALCOHOL CONSUMING COUGHING
## AGE 0.05501135 0.058985003 0.16995035
## SMOKING -0.12942593 -0.050622751 -0.12947107
## YELLOW_FINGERS -0.07851529 -0.289024842 -0.01263984
## ANXIETY -0.19180734 -0.165749538 -0.22564407
## PEER_PRESSURE -0.06877067 -0.159972971 -0.08901867
## CHRONIC DISEASE -0.04996729 0.002150491 -0.17528671
## FATIGUE 0.14193688 -0.191376583 0.14685602
## ALLERGY 0.17386692 0.344338822 0.18952417
## WHEEZING 1.00000000 0.265659481 0.37426539
## ALCOHOL CONSUMING 0.26565948 1.000000000 0.20271997
## COUGHING 0.37426539 0.202719970 1.00000000
## SHORTNESS OF BREATH 0.03783420 -0.179415842 0.27738502
## SWALLOWING DIFFICULTY 0.06902742 -0.009293777 -0.15758630
## CHEST PAIN 0.14764047 0.331225598 0.08395775
## SHORTNESS OF BREATH SWALLOWING DIFFICULTY CHEST PAIN
## AGE -0.01751274 -0.001269878 -0.01810393
## SMOKING 0.06126376 0.030717735 0.12011746
## YELLOW_FINGERS -0.10594428 0.345903772 -0.10482899
## ANXIETY -0.14407666 0.489402762 -0.11363394
## PEER_PRESSURE -0.22017534 0.366590371 -0.09482847
## CHRONIC DISEASE -0.02645882 0.075176421 -0.03693785
## FATIGUE 0.44174464 -0.132790075 -0.01083179
## ALLERGY -0.03005644 -0.061507906 0.23943303
## WHEEZING 0.03783420 0.069027417 0.14764047
## ALCOHOL CONSUMING -0.17941584 -0.009293777 0.33122560
## COUGHING 0.27738502 -0.157586304 0.08395775
## SHORTNESS OF BREATH 1.00000000 -0.161014804 0.02425607
## SWALLOWING DIFFICULTY -0.16101480 1.000000000 0.06902742
## CHEST PAIN 0.02425607 0.069027417 1.00000000
corrplot(cor)
Edad (AGE): Tiene una correlación positiva muy débil con la tos (0.17) y una correlación negativa muy débil con el consumo de tabaco (-0.08).
Consumo de tabaco (SMOKING): Muestra una correlación positiva moderada con la ansiedad (0.16) y una correlación negativa moderada con la fatiga (-0.03).
Dedos amarillos (YELLOW_FINGERS): Tiene correlaciones moderadas a fuertes con la ansiedad (0.57) y la presión de grupo (0.32).
Ansiedad (ANXIETY): Está moderadamente correlacionada con la presión de grupo (0.22), la fatiga (-0.19) y la dificultad para tragar (0.49).
Presión de grupo (PEER_PRESSURE): Tiene una correlación moderada con la dificultad para tragar (0.37).
Enfermedad crónica (CHRONIC DISEASE): No muestra correlaciones significativas con otras variables.
Fatiga (FATIGUE): Tiene una correlación moderada con la dificultad para respirar (0.44) y correlaciones débiles con el consumo de alcohol (-0.19) y la tos (0.15).
Alergia (ALLERGY): Está moderadamente correlacionada con el consumo de alcohol (0.34) y débilmente correlacionada con la tos (0.19) y el dolor en el pecho (0.24).
Sibilancias (WHEEZING): Muestra una correlación moderada con la tos (0.37) y el consumo de alcohol (0.27).
Consumo de alcohol (ALCOHOL CONSUMING): Tiene correlaciones moderadas con la alergia (0.34), la tos (0.20) y el dolor en el pecho (0.33).
Tos (COUGHING): Está moderadamente correlacionada con la fatiga (0.15), las sibilancias (0.37) y el consumo de alcohol (0.20).
Dificultad para respirar (SHORTNESS OF BREATH): Muestra una correlación moderada con la fatiga (0.44) y débil con la tos (0.28).
Dificultad para tragar (SWALLOWING DIFFICULTY): Está moderadamente correlacionada con la ansiedad (0.49) y la presión de grupo (0.37).
Dolor en el pecho (CHEST PAIN): Tiene correlaciones moderadas con la alergia (0.24) y el consumo de alcohol (0.33).
Según las correlaciones observadas, parece que la ansiedad está relacionada con varios síntomas y comportamientos en el estudio. Por ejemplo, tiene una correlación moderada con la dificultad para tragar y una correlación negativa moderada con la fatiga. Además, los dedos amarillos, que podrían indicar un comportamiento de fumado, muestran correlaciones moderadas a fuertes con la ansiedad y la presión de grupo. Esto sugiere que el consumo de tabaco podría estar vinculado con la ansiedad y las dinámicas sociales, como la presión de grupo.
Variable Gender El género hombre o mujer.
library(ggplot2)
grafico_Gender = ggplot(cancer,aes(x=GENDER))+
geom_bar(stat="count", width=0.7, fill="green")+
theme_minimal()
print(grafico_Gender)
Se observa que la mayor parte de los pacientes que pueden estar detectados a cancer de pulmón es en hombres, las mujeres. F = con 142 y los M = hombres de 162.
Cáncer de pulmón
grafico_lung = ggplot(cancer,aes(x=LUNG_CANCER))+
geom_bar(stat="count", width=0.7, fill="green")+
theme_minimal()
print(grafico_lung)
Se observa que de todos los pacientes tanto hombres y mujeres, en la detección de cancer de pulmón con un rango de 270 en si presentan cancer y no es de 39. lo cual se deduce que en lo general los pacientes de esta base tienden a tener cancer de pulmón.
Género con Edad
ggplot(cancer, aes(x = AGE, y = GENDER, col = factor(GENDER))) +
geom_point() +
labs(title = "Relación entre edad y el género",
x = "Edad",
y = "Género")
Se observa que con la edad y el género donde F femenino y M masculino lo cual se puede decir que en la mayoria de los pacientes en mujeres va desde los 20 años hasta cerca de los 100, en hombres va desde los 37 hasta los 79 años de edad lo cual se deduce que a temprana y muy avanzada edad, son en mujeres.
Detección de cancer y la edad
ggplot(cancer, aes(x = AGE, y = LUNG_CANCER, col = factor(LUNG_CANCER))) +
geom_point() +
labs(title = "Relación entre edad y la detección",
x = "Edad",
y = "Detección de cancer")
Se observa que la relación de los pacientes en edades que si tienen cancer o no, la mayoria tienen cancer desde los 38 hasta los 81 y mientras que a temprana y avanzada edad dice que no tienen cancer.
Género con Edad (Age)
ggplot(cancer, aes(x=GENDER, y=AGE, color=GENDER))+geom_boxplot()
Se visualiza la distribución de edades para dos categorías de género, Masculino (M) y Femenino (F). Para ambas categorías, la edad media parece ser más o menos la misma, alrededor de los 60 años. Sin embargo, el rango de edad de los hombres es ligeramente menor que el de las mujeres, como lo indica el bigote inferior más largo y la presencia de un valor atípico, lo que sugiere que hay hombres más jóvenes en el conjunto de datos. El rango intercuartil (el cuadro en sí) es similar para ambos sexos, lo que indica una variabilidad similar en la distribución de edades entre el 50% medio de las muestras de ambos sexos.
Detección de cancer y edad
ggplot(cancer, aes(x=LUNG_CANCER, y=AGE, color=LUNG_CANCER))+geom_boxplot()
Se visualiza la detección de cancer para dos categorías de SI y NO. Para ambas categorías, la edad media parece ser más o menos la misma, alrededor de los 60 años. Sin embargo, el rango de edad en NO es ligeramente menor que SI, la presencia de valor atípico, lo que sugiere que no hay detección de cancer a temprana y avanzada edad en el conjunto de datos.
Datos númericos
clases <- sapply(cancer, class)
classes <- sapply(cancer, class)
for (i in 1:ncol(cancer))
if(classes[i]== "integer")
cancer[[i]] =as.numeric(cancer[[i]])
classes = sapply(cancer, class)
classes
## GENDER AGE SMOKING
## "factor" "numeric" "numeric"
## YELLOW_FINGERS ANXIETY PEER_PRESSURE
## "numeric" "numeric" "numeric"
## CHRONIC DISEASE FATIGUE ALLERGY
## "numeric" "numeric" "numeric"
## WHEEZING ALCOHOL CONSUMING COUGHING
## "numeric" "numeric" "numeric"
## SHORTNESS OF BREATH SWALLOWING DIFFICULTY CHEST PAIN
## "numeric" "numeric" "numeric"
## LUNG_CANCER
## "factor"
En este caso hay variables númericas y dos categoricas po lo cual se procede a realizar o tranformar a variables ficticias, por lo cual se da paso para realizar, predicciones y por ende se divide la base.
Por lo tanto, la separación estándar de 3/4 para entrenamiento y 1/4 para pruebas equivale al 75% para entrenamiento y al 25% para pruebas.
# Escalamiento de númericas
numerico <- sapply(cancer, is.numeric)
cancer[, numerico] <- scale(cancer[, numerico])
# head(cancer)
x=model.matrix(LUNG_CANCER~., data=cancer)
head(x)
## (Intercept) GENDERM AGE SMOKING YELLOW_FINGERS ANXIETY
## 1 1 1 0.77060032 -1.1334539 0.8678918 1.0016168
## 2 1 1 1.37959136 0.8794039 -1.1484884 -0.9951548
## 3 1 0 -0.44738177 -1.1334539 -1.1484884 -0.9951548
## 4 1 1 0.03981106 0.8794039 0.8678918 1.0016168
## 5 1 0 0.03981106 -1.1334539 0.8678918 -0.9951548
## 6 1 0 1.50138957 -1.1334539 0.8678918 -0.9951548
## PEER_PRESSURE `CHRONIC DISEASE` FATIGUE ALLERGY WHEEZING
## 1 -1.0016168 -1.0081211 0.695705 -1.1186650 0.8910297
## 2 -1.0016168 0.9887342 0.695705 0.8910297 -1.1186650
## 3 0.9951548 -1.0081211 0.695705 -1.1186650 0.8910297
## 4 -1.0016168 -1.0081211 -1.432739 -1.1186650 -1.1186650
## 5 -1.0016168 -1.0081211 -1.432739 -1.1186650 0.8910297
## 6 -1.0016168 0.9887342 0.695705 0.8910297 0.8910297
## `ALCOHOL CONSUMING` COUGHING `SHORTNESS OF BREATH` `SWALLOWING DIFFICULTY`
## 1 0.8910297 0.850827 0.7475238 1.0617788
## 2 -1.1186650 -1.171523 0.7475238 1.0617788
## 3 -1.1186650 0.850827 0.7475238 -0.9387678
## 4 0.8910297 -1.171523 -1.3334208 1.0617788
## 5 -1.1186650 0.850827 0.7475238 -0.9387678
## 6 -1.1186650 0.850827 0.7475238 -0.9387678
## `CHEST PAIN`
## 1 0.8910297
## 2 0.8910297
## 3 0.8910297
## 4 0.8910297
## 5 -1.1186650
## 6 -1.1186650
Se observa que las variables numéricas reescaladas contienen los mismos valores iniciales. Cada una de las variables nominales ha sido convertida en variables binarias. El número de variables binarias es siempre el número de categorías de la variable nominal. Por ejemplo, la variable GENDER (con dos categorías) ha sido convertida en GENDERM que es una variable numérica que vale 1 cuando el sexo es hombre y 0 cuando es mujer.
Por lo tanto, la separación estándar de 3/4 para entrenamiento y 1/4 para pruebas equivale al 75% para entrenamiento y al 25% para pruebas.
tr <- round(nrow(cancer) * 0.75) # 75% para entrenamiento
set.seed(123)
muestra <- sample.int(nrow(cancer), tr)
Train <- cancer[muestra,]
val <- cancer[-muestra,]
Ahora disponemos de un conjunto de entrenamiento Train. y un conjunto de validación Val.
Regresión Logística
La regresión logística es un algoritmo de aprendizaje automático supervisado que realiza tareas de clasificación binaria al predecir la probabilidad de un resultado, evento u observación. La regresión lógica analiza la relación entre una o más variables independientes y clasifica los datos en clases discretas. Se utiliza ampliamente en modelos predictivos, donde el modelo estima la probabilidad matemática de si una instancia pertenece a una categoría específica o no.
Trataremos de modelar la probabilidad de Nivel positiva en función del resto de las variables.
\[{p_i}=P\left( {Y = 1/x = {x_i}} \right) = {{{e^{{\beta _0} + {\beta_1}{x_{i1}} + \ldots + {\beta_p}{x_{ip}}}}} \over {1 + {e^{{\beta _0} + {\beta _1} {x_{i1}} + \ldots + {\beta _p} {x_{ip}}}}}}\]
gfit1 <- glm(LUNG_CANCER~., data=cancer, family=binomial)# Modelo 2
summary(gfit1)
##
## Call:
## glm(formula = LUNG_CANCER ~ ., family = binomial, data = cancer)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.2685 0.8852 5.952 2.65e-09 ***
## GENDERM -0.5261 0.7090 -0.742 0.458050
## AGE 0.1791 0.2786 0.643 0.520476
## SMOKING 0.8823 0.3487 2.530 0.011396 *
## YELLOW_FINGERS 0.6826 0.3682 1.854 0.063776 .
## ANXIETY 0.4446 0.4070 1.092 0.274671
## PEER_PRESSURE 0.8670 0.3307 2.622 0.008740 **
## `CHRONIC DISEASE` 1.5983 0.4448 3.593 0.000327 ***
## FATIGUE 1.4426 0.3877 3.721 0.000199 ***
## ALLERGY 0.8191 0.3826 2.141 0.032291 *
## WHEEZING 0.4808 0.4151 1.158 0.246736
## `ALCOHOL CONSUMING` 0.7015 0.3975 1.765 0.077615 .
## COUGHING 1.6373 0.5299 3.090 0.002002 **
## `SHORTNESS OF BREATH` -0.3503 0.3652 -0.959 0.337550
## `SWALLOWING DIFFICULTY` 1.5606 0.5648 2.763 0.005722 **
## `CHEST PAIN` 0.2782 0.3429 0.811 0.417212
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 234.299 on 308 degrees of freedom
## Residual deviance: 91.909 on 293 degrees of freedom
## AIC: 123.91
##
## Number of Fisher Scoring iterations: 8
El análisis de los coeficientes del modelo de regresión logística revela varias asociaciones entre las variables predictoras y la probabilidad de desarrollar cáncer de pulmón. En primer lugar, el intercepto indica que cuando todas las demás variables son cero, la probabilidad logarítmica de tener cáncer de pulmón es de 5.2685. Entre las variables predictoras, el género no parece tener un impacto significativo en la predicción del cáncer de pulmón, ya que su coeficiente no difiere significativamente de cero. La edad tampoco muestra una asociación significativa con el cáncer de pulmón. Sin embargo, el hábito de fumar está significativamente relacionado con un mayor riesgo de cáncer de pulmón, donde un aumento de una unidad en el hábito de fumar se asocia con un aumento de 0.8823 en el logaritmo de la razón de probabilidades. La presión de grupo, la presencia de enfermedades crónicas, la fatiga y la dificultad para tragar están todas significativamente asociadas con un mayor riesgo de cáncer de pulmón. Por otro lado, la ansiedad, las sibilancias, el consumo de alcohol y el dolor en el pecho no muestran asociaciones significativas con el cáncer de pulmón. Estos resultados sugieren que múltiples factores, como el tabaquismo y ciertas condiciones médicas, pueden influir en el desarrollo del cáncer de pulmón.
gfit0 <- glm(LUNG_CANCER~1, data = cancer, family = binomial)# Modelo 1
anova(gfit0, gfit1, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: LUNG_CANCER ~ 1
## Model 2: LUNG_CANCER ~ GENDER + AGE + SMOKING + YELLOW_FINGERS + ANXIETY +
## PEER_PRESSURE + `CHRONIC DISEASE` + FATIGUE + ALLERGY + WHEEZING +
## `ALCOHOL CONSUMING` + COUGHING + `SHORTNESS OF BREATH` +
## `SWALLOWING DIFFICULTY` + `CHEST PAIN`
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 308 234.299
## 2 293 91.909 15 142.39 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Modelo 1: Es un modelo simple con solo el intercepto (constante).
Modelo 2: Es un modelo más complejo que incluye todas las variables predictoras: género, edad, hábito de fumar, presencia de dedos amarillos, ansiedad, presión de grupo, enfermedad crónica, fatiga, alergia, sibilancias, consumo de alcohol, tos, dificultad para respirar, dificultad para tragar y dolor en el pecho, la devianza residual del Modelo 2 es 142.39 unidades menor que la del Modelo 1. En este caso, el valor p es extremadamente pequeño (< 2.2e-16), lo que indica que el Modelo 2 explica significativamente más variabilidad en la variable dependiente que el Modelo 1.
El Modelo 2, que incluye todas las variables predictoras, es significativamente mejor que el Modelo 1, que solo incluye el intercepto, para predecir la variable dependiente “LUNG_CANCER”.
anova(gfit1, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: LUNG_CANCER
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 308 234.299
## GENDER 1 1.397 307 232.902 0.2371945
## AGE 1 2.292 306 230.610 0.1300717
## SMOKING 1 1.286 305 229.324 0.2567571
## YELLOW_FINGERS 1 12.196 304 217.128 0.0004789 ***
## ANXIETY 1 0.602 303 216.526 0.4376589
## PEER_PRESSURE 1 9.706 302 206.820 0.0018370 **
## `CHRONIC DISEASE` 1 10.266 301 196.554 0.0013550 **
## FATIGUE 1 11.809 300 184.745 0.0005896 ***
## ALLERGY 1 42.710 299 142.035 6.348e-11 ***
## WHEEZING 1 20.431 298 121.604 6.181e-06 ***
## `ALCOHOL CONSUMING` 1 12.883 297 108.721 0.0003315 ***
## COUGHING 1 4.663 296 104.058 0.0308243 *
## `SHORTNESS OF BREATH` 1 0.001 295 104.057 0.9734705
## `SWALLOWING DIFFICULTY` 1 11.496 294 92.560 0.0006973 ***
## `CHEST PAIN` 1 0.651 293 91.909 0.4196693
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En este caso, las variables significativas incluyen YELLOW_FINGERS, PEER_PRESSURE, CHRONIC DISEASE, FATIGUE, ALLERGY, WHEEZING, ALCOHOL CONSUMING y COUGHING, estas variables tienen un impacto significativo en la probabilidad de desarrollar cáncer de pulmón según el modelo ajustado. Por otro lado, GENDER, AGE, ANXIETY, SHORTNESS OF BREATH y CHEST PAIN no son significativas en este modelo.
gfit2 <- glm(LUNG_CANCER~., data =Train, family = binomial)
cbind(gfit1$coefficients, gfit2$coefficients)
## [,1] [,2]
## (Intercept) 5.2684724 6.76077958
## GENDERM -0.5261092 -1.05055037
## AGE 0.1790521 0.19865353
## SMOKING 0.8823322 0.77723202
## YELLOW_FINGERS 0.6826178 -0.02421182
## ANXIETY 0.4445929 0.94601395
## PEER_PRESSURE 0.8670073 1.08794389
## `CHRONIC DISEASE` 1.5982911 1.89387056
## FATIGUE 1.4425690 1.64218040
## ALLERGY 0.8191018 0.84064798
## WHEEZING 0.4807949 0.91662979
## `ALCOHOL CONSUMING` 0.7015024 -0.07448900
## COUGHING 1.6373421 2.72960993
## `SHORTNESS OF BREATH` -0.3502712 -0.66964639
## `SWALLOWING DIFFICULTY` 1.5606194 1.73210649
## `CHEST PAIN` 0.2781874 0.80478663
Se aplican dos modelos como gfit1 es el modelo que se ajustó con todas las variables predictoras y gfit2 es un nuevo modelo ajustado con las mismas variables, pero se utilza el conjunto de datos de entrenamiento.
Al observar el intercepto es significativamente diferente entre los dos modelos. Esto quiere decir o sugiere que hay diferencias de los datos entre los conjuntos de entrenamiento y prueba.
Algunas variables muestran diferencias en los coeficientes entre los dos modelos. Por ejemplo, YELLOW_FINGERS y ALCOHOL CONSUMING tienen coeficientes que difieren notablemente entre los dos modelos.
Estas diferencias serían a las diferencias en la composición de los conjuntos de datos de entrenamiento y prueba.
library(lattice)
library(caret)
p <- predict(gfit2, val, type = "response")
PredCancer = as.factor(p>0.5)
levels(PredCancer)=c("NO", "YES")
matrizLogis <- confusionMatrix(val$LUNG_CANCER, PredCancer)
matrizLogis
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 5 6
## YES 0 66
##
## Accuracy : 0.9221
## 95% CI : (0.8381, 0.9709)
## No Information Rate : 0.9351
## P-Value [Acc > NIR] : 0.76723
##
## Kappa : 0.5882
##
## Mcnemar's Test P-Value : 0.04123
##
## Sensitivity : 1.00000
## Specificity : 0.91667
## Pos Pred Value : 0.45455
## Neg Pred Value : 1.00000
## Prevalence : 0.06494
## Detection Rate : 0.06494
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.95833
##
## 'Positive' Class : NO
##
Exactitud (Accuracy): La exactitud del modelo es del 92.21%, lo que significa que el modelo clasifica correctamente el 92.21% de todas las muestras.
Intervalo de confianza del 95% (95% CI): Para la exactitud del modelo está entre 83.81% y 97.09%.
Tasa de información nula (No Information Rate): La tasa de información nula es del 93.51%, que representa la proporción de muestras de la clase más común en el conjunto de datos de validación.
Valor de Kappa (Kappa): El valor de Kappa, que mide la concordancia entre las predicciones del modelo y las clases reales, es de 0.5882, indicando una concordancia moderada.
Sensibilidad (Sensitivity): La sensibilidad del modelo es del 100%, lo que significa que identifica correctamente todas las muestras que realmente pertenecen a la clase “NO”.
Especificidad (Specificity): La especificidad del modelo es del 91.67%, lo que indica que identifica correctamente el 91.67% de las muestras que realmente pertenecen a la clase “YES”.
Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo del modelo es del 45.45%, lo que significa que del total de predicciones clasificadas como “NO”, solo el 45.45% realmente pertenecen a la clase “NO”.
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo es del 100%, lo que significa que del total de predicciones clasificadas como “YES”, todas realmente pertenecen a la clase “YES”.
Prevalencia (Prevalence): La prevalencia de la clase “NO” en el conjunto de datos de validación es del 6.94%, lo que indica la proporción de muestras que realmente pertenecen a la clase “NO”.
Tasa de detección (Detection Rate): La tasa de detección del modelo es del 6.94%, lo que indica la proporción de muestras de la clase “NO” que el modelo identifica correctamente.
Prevalencia de Detección (Detection Prevalence): La prevalencia de detección del modelo es del 14.29%, lo que indica la proporción de predicciones clasificadas como “NO” en el conjunto de datos de validación.
Exactitud Balanceada (Balanced Accuracy): La exactitud balanceada del modelo es del 95.83%, que es el promedio de la sensibilidad y la especificidad. Esto indica el rendimiento general del modelo en la clasificación de ambas clases.
El modelo de regresión logística tiene un buen rendimiento en términos de exactitud general y sensibilidad, ya que logra identificar correctamente todas las muestras que realmente pertenecen a la clase “NO” (cáncer de pulmón negativo), dado que la prevalencia de la clase “NO” en el conjunto de datos de validación es relativamente baja (6.94%), podemos concluir que la mayoría de los pacientes en el conjunto de datos tienden a no tener cáncer de pulmón.
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
test_prob <- predict(gfit2, newdata = val, type = "response")
test_roc <- roc(val$LUNG_CANCER ~ test_prob, plot = TRUE, print.auc = TRUE)
## Setting levels: control = NO, case = YES
## Setting direction: controls < cases
La sensibilidad como el comportamiento de los valores positivos y el AUC es de 0.92 que significa que es moderada y el modelo de predición logística de predicción es bueno.
Support Vector Machine o SVM es uno de los algoritmos de aprendizaje supervisado más populares, que se utiliza tanto para problemas de clasificación como de regresión. Sin embargo, principalmente, se utiliza para problemas de clasificación en aprendizaje automático. El objetivo del algoritmo SVM es crear la mejor línea o límite de decisión que pueda agregar el espacio de n dimensiones en clases para que podamos colocar fácilmente el nuevo punto de datos en el categoría correcta en el futuro. Este límite de mejor decisión se llama hiperplano.
library(e1071)
fitsvm1 <- svm(LUNG_CANCER~., data = Train)
summary(fitsvm1)
##
## Call:
## svm(formula = LUNG_CANCER ~ ., data = Train)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 1
##
## Number of Support Vectors: 73
##
## ( 45 28 )
##
##
## Number of Classes: 2
##
## Levels:
## NO YES
# fitsvm1
Se utilizó un kernel radial para transformar los datos en un espacio de características de dimensionalidad superior, es comúnmente utilizado en SVM para problemas de clasificación.
Se encontraron 73 vectores de soporte en el modelo, distribuidos en las clases NO (45) y YES (28).
El modelo clasifica las muestras en dos clases: NO y YES, que representan la ausencia y presencia de cáncer de pulmón.
# Ajustar un modelo SVM con kernel Radial
predictedSVM <- predict(fitsvm1, val)
matrizSVM1 <- confusionMatrix(val$LUNG_CANCER, predictedSVM)
matrizSVM1
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 2 9
## YES 1 65
##
## Accuracy : 0.8701
## 95% CI : (0.7741, 0.9359)
## No Information Rate : 0.961
## P-Value [Acc > NIR] : 0.99981
##
## Kappa : 0.2391
##
## Mcnemar's Test P-Value : 0.02686
##
## Sensitivity : 0.66667
## Specificity : 0.87838
## Pos Pred Value : 0.18182
## Neg Pred Value : 0.98485
## Prevalence : 0.03896
## Detection Rate : 0.02597
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.77252
##
## 'Positive' Class : NO
##
Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 18.18%. Esto significa que solo el 18.18% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 98.48%. Esto indica que el 98.48% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
El modelo SVM con kernel radial muestra un rendimiento aceptable en la clasificación del cáncer de pulmón, aunque la sensibilidad y el valor predictivo positivo son relativamente bajos.
# Ajustar un modelo SVM con kernel polinómico
fitsvm2 <- svm(LUNG_CANCER ~ ., data = Train, kernel = "polynomial")
summary(fitsvm2)
##
## Call:
## svm(formula = LUNG_CANCER ~ ., data = Train, kernel = "polynomial")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: polynomial
## cost: 1
## degree: 3
## coef.0: 0
##
## Number of Support Vectors: 89
##
## ( 61 28 )
##
##
## Number of Classes: 2
##
## Levels:
## NO YES
predictedSVM2 <- predict(fitsvm2, newdata = val)
matrizSVM2 <- confusionMatrix(val$LUNG_CANCER, predictedSVM2)
print(matrizSVM2)
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 2 9
## YES 1 65
##
## Accuracy : 0.8701
## 95% CI : (0.7741, 0.9359)
## No Information Rate : 0.961
## P-Value [Acc > NIR] : 0.99981
##
## Kappa : 0.2391
##
## Mcnemar's Test P-Value : 0.02686
##
## Sensitivity : 0.66667
## Specificity : 0.87838
## Pos Pred Value : 0.18182
## Neg Pred Value : 0.98485
## Prevalence : 0.03896
## Detection Rate : 0.02597
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.77252
##
## 'Positive' Class : NO
##
Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 18.18%. Esto significa que solo el 18.18% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 98.48%. Esto indica que el 98.48% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
El modelo SVM con kernel polinomial muestra un rendimiento similar al modelo SVM con kernel radial en la clasificación del cáncer de pulmón, con una precisión del 87.01%. Sin embargo, al igual que el modelo con kernel radial, la sensibilidad y el valor predictivo positivo son relativamente bajos, lo que sugiere que el modelo podría beneficiarse de una mayor optimización para mejorar su capacidad para identificar casos positivos de cáncer de pulmón.
# Ajustar un modelo SVM con kernel lineal
fitsvm3 <- svm(LUNG_CANCER ~ ., data = Train, kernel = "linear")
summary(fitsvm3)
##
## Call:
## svm(formula = LUNG_CANCER ~ ., data = Train, kernel = "linear")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
##
## Number of Support Vectors: 48
##
## ( 25 23 )
##
##
## Number of Classes: 2
##
## Levels:
## NO YES
predictedSVM3 <- predict(fitsvm3, newdata = val)
matrizSVM3 <- confusionMatrix(val$LUNG_CANCER, predictedSVM3)
print(matrizSVM3)
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 7 4
## YES 0 66
##
## Accuracy : 0.9481
## 95% CI : (0.8723, 0.9857)
## No Information Rate : 0.9091
## P-Value [Acc > NIR] : 0.1601
##
## Kappa : 0.75
##
## Mcnemar's Test P-Value : 0.1336
##
## Sensitivity : 1.00000
## Specificity : 0.94286
## Pos Pred Value : 0.63636
## Neg Pred Value : 1.00000
## Prevalence : 0.09091
## Detection Rate : 0.09091
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.97143
##
## 'Positive' Class : NO
##
Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 63.64%. Esto significa que el 63.64% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 100%. Esto indica que el 100% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
El modelo SVM con kernel lineal muestra un rendimiento notablemente mejor que los modelos SVM con kernels radial y polinomial en la clasificación del cáncer de pulmón, con una precisión del 94.81% y una sensibilidad del 100%. Esto sugiere que el modelo SVM con kernel lineal es más efectivo para identificar casos de cáncer de pulmón en el conjunto de datos de validación.
# Ajustar un modelo SVM con kernel sigmoidal
fitsvm4 <- svm(LUNG_CANCER ~ ., data = Train, kernel = "sigmoid")
summary(fitsvm4)
##
## Call:
## svm(formula = LUNG_CANCER ~ ., data = Train, kernel = "sigmoid")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: sigmoid
## cost: 1
## coef.0: 0
##
## Number of Support Vectors: 58
##
## ( 30 28 )
##
##
## Number of Classes: 2
##
## Levels:
## NO YES
predictedSVM4 <- predict(fitsvm4, newdata = val)
matrizSVM4 <- confusionMatrix(val$LUNG_CANCER, predictedSVM4)
print(matrizSVM4)
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 6 5
## YES 0 66
##
## Accuracy : 0.9351
## 95% CI : (0.8549, 0.9786)
## No Information Rate : 0.9221
## P-Value [Acc > NIR] : 0.43913
##
## Kappa : 0.6729
##
## Mcnemar's Test P-Value : 0.07364
##
## Sensitivity : 1.00000
## Specificity : 0.92958
## Pos Pred Value : 0.54545
## Neg Pred Value : 1.00000
## Prevalence : 0.07792
## Detection Rate : 0.07792
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.96479
##
## 'Positive' Class : NO
##
Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 54.55%. Esto significa que el 54.55% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 100%. Esto indica que el 100% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
El modelo SVM con kernel sigmoide muestra un rendimiento sólido en la clasificación del cáncer de pulmón, con una alta sensibilidad del 100% y una exactitud del 93.51%. Sin embargo, el valor predictivo positivo es relativamente bajo en comparación con el modelo SVM con kernel lineal. Esto sugiere que el modelo puede tener una tendencia a clasificar incorrectamente algunos casos como positivos.
Accuracy <- c(matrizLogis$overall[1], matrizSVM1$overall[1], matrizSVM2$overall[1], matrizSVM3$overall[1], matrizSVM4$overall[1])
names(Accuracy)= c("Logística", "SVM-RADIAL", "SVM-POLYNOMIAL", "SVM-LINEAL", "SVM-SIGMODAL")
Accuracy
## Logística SVM-RADIAL SVM-POLYNOMIAL SVM-LINEAL SVM-SIGMODAL
## 0.9220779 0.8701299 0.8701299 0.9480519 0.9350649
El modelo SVM con kernel lineal tiene la mayor exactitud entre los modelos evaluados, con un 94.81%.
library(neuralnet)
require(neuralnet)
train <- data.frame(Train$LUNG_CANCER, model.matrix(LUNG_CANCER~.,data=Train)[,-1])
colnames(train)[1]="LUNG_CANCER"
nn1 <- neuralnet(LUNG_CANCER~.,data = train,hidden = 3,act.fct="logistic",linear.output = FALSE)
plot(nn1, main="Redes Neuronales")
library(caret)
Validate <- data.frame(val$LUNG_CANCER, model.matrix(LUNG_CANCER~., data = val)[,-1])
colnames(Validate)[1]="LUNG_CANCER"
Predict <- compute(nn1, Validate)
predictedNN1 <- factor(Predict$net.result[,1]>0.5, labels = c("NO", "YES"))
matrizNN1 <- confusionMatrix(val$LUNG_CANCER, predictedNN1)
matrizNN1
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 7 4
## YES 65 1
##
## Accuracy : 0.1039
## 95% CI : (0.0459, 0.1945)
## No Information Rate : 0.9351
## P-Value [Acc > NIR] : 1
##
## Kappa : -0.1053
##
## Mcnemar's Test P-Value : 5.08e-13
##
## Sensitivity : 0.09722
## Specificity : 0.20000
## Pos Pred Value : 0.63636
## Neg Pred Value : 0.01515
## Prevalence : 0.93506
## Detection Rate : 0.09091
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.14861
##
## 'Positive' Class : NO
##
Exactitud (Accuracy): La exactitud del modelo es del 10.39%, lo cual indica que la mayoría de las predicciones son incorrectas.
Kappa: El valor de Kappa es negativo (-0.1053), lo que sugiere que el modelo no está haciendo una clasificación mejor que la clasificación aleatoria.
Sensibilidad y Especificidad: La sensibilidad (capacidad para detectar los casos positivos) es muy baja, solo del 9.72%, mientras que la especificidad (capacidad para detectar los casos negativos) es del 20%. Esto indica que el modelo está teniendo dificultades tanto para identificar los casos positivos como para identificar los casos negativos.
Valor Predictivo Positivo (Pos Pred Value) y Valor Predictivo Negativo (Neg Pred Value): El valor predictivo positivo es del 63.64%, lo que indica que de todas las predicciones que el modelo etiquetó como “SIN CANCER”, solo el 63.64% realmente no tenían cáncer. El valor predictivo negativo es muy bajo, del 1.51%, lo que indica que de todas las predicciones que el modelo etiquetó como “CON CANCER”, solo el 1.51% realmente tenían cáncer.
El modelo de red neuronal que se ha entrenado parece no es efectivo para predecir el cáncer de pulmón en este conjunto de datos.
nn1 <- neuralnet(LUNG_CANCER ~., data = train, hidden = c(5, 3), act.fct = "logistic", linear.output = FALSE)
plot(nn1)
Predict1 <- compute(nn1, Validate)
predictedNN2 <- factor(Predict1$net.result[,1]>0.5, labels = c("NO", "YES"))
matrizNN2 <- confusionMatrix(val$LUNG_CANCER, predictedNN2)
matrizNN2
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 7 4
## YES 64 2
##
## Accuracy : 0.1169
## 95% CI : (0.0549, 0.2103)
## No Information Rate : 0.9221
## P-Value [Acc > NIR] : 1
##
## Kappa : -0.1019
##
## Mcnemar's Test P-Value : 8.379e-13
##
## Sensitivity : 0.09859
## Specificity : 0.33333
## Pos Pred Value : 0.63636
## Neg Pred Value : 0.03030
## Prevalence : 0.92208
## Detection Rate : 0.09091
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.21596
##
## 'Positive' Class : NO
##
Al igual que el primer modelo, este segundo modelo de red neuronal no es efectivo para predecir el cáncer de pulmón en este conjunto de datos.
Naive Bayes es un algoritmo de clasificación probabilístico que se basa en el teorema de Bayes con una suposición “ingenua” de independencia condicional entre las características. En otras palabras, asume que las características son independientes entre sí, lo cual puede no ser cierto en la realidad, pero suele funcionar bien en la práctica.
library(e1071)
fitbayes <- naiveBayes(LUNG_CANCER~., data = Train)
summary(fitbayes)
## Length Class Mode
## apriori 2 table numeric
## tables 15 -none- list
## levels 2 -none- character
## isnumeric 15 -none- logical
## call 4 -none- call
predictedbayes <- predict(fitbayes, val)
matrizNB <- confusionMatrix(val$LUNG_CANCER, predictedbayes)
matrizNB
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 7 4
## YES 3 63
##
## Accuracy : 0.9091
## 95% CI : (0.8216, 0.9627)
## No Information Rate : 0.8701
## P-Value [Acc > NIR] : 0.2015
##
## Kappa : 0.6142
##
## Mcnemar's Test P-Value : 1.0000
##
## Sensitivity : 0.70000
## Specificity : 0.94030
## Pos Pred Value : 0.63636
## Neg Pred Value : 0.95455
## Prevalence : 0.12987
## Detection Rate : 0.09091
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.82015
##
## 'Positive' Class : NO
##
Exactitud (Accuracy): La exactitud del modelo es del 90.91%, lo que indica que la mayoría de las predicciones son correctas.
Kappa: El valor de Kappa es de 0.6142, lo que sugiere que el modelo está haciendo una clasificación mejor que la clasificación aleatoria.
Sensibilidad y Especificidad: La sensibilidad (capacidad para detectar los casos positivos) es del 70%, mientras que la especificidad (capacidad para detectar los casos negativos) es del 94.03%. Esto indica que el modelo tiene una buena capacidad para identificar tanto los casos positivos como los casos negativos.
Valor Predictivo Positivo (Pos Pred Value) y Valor Predictivo Negativo (Neg Pred Value): El valor predictivo positivo es del 63.64%, lo que indica que de todas las predicciones que el modelo etiquetó como “SIN CANCER”, el 63.64% realmente no tenían cáncer. El valor predictivo negativo es del 95.45%, lo que indica que de todas las predicciones que el modelo etiquetó como “CON CANCER”, el 95.45% realmente tenían cáncer.
El modelo de Naive Bayes es una buena opción para predecir el cáncer de pulmón en este conjunto de datos, ya que tiene una buena precisión y un buen equilibrio entre sensibilidad y especificidad.
Los árboles de decisión son modelos predictivos que se construyen utilizando una estructura de árbol donde cada nodo interno representa una característica (atributo), cada rama representa el resultado de una prueba sobre esa característica, y cada hoja representa una etiqueta de clase o un valor numérico.
library(tree)
colnames(Train) <- gsub(" ", "", colnames(Train)) # Elimina todos los espacios en blanco de los nombres de las columnas en el conjunto de datos Train
tree1 <- tree(LUNG_CANCER ~ ., data = Train)
summary(tree1)
##
## Classification tree:
## tree(formula = LUNG_CANCER ~ ., data = Train)
## Variables actually used in tree construction:
## [1] "ALLERGY" "SWALLOWINGDIFFICULTY" "COUGHING"
## [4] "CHRONICDISEASE" "AGE" "SHORTNESSOFBREATH"
## [7] "CHESTPAIN" "FATIGUE" "YELLOW_FINGERS"
## [10] "ALCOHOLCONSUMING"
## Number of terminal nodes: 14
## Residual mean deviance: 0.2972 = 64.8 / 218
## Misclassification error rate: 0.07328 = 17 / 232
El árbol tiene un total de 14 nodos terminales, que son los nodos finales en los que se hacen las clasificaciones, donde la desviación residual media es de 0.2972, lo que indica que el modelo explica aproximadamente el 64.8% de la variabilidad.
plot(tree1)
text(tree1, pretty =1)
colnames(val) <- gsub(" ", "", colnames(val))
predictedtree1 <- predict(tree1, val, type = "class")
matriztree1 <- confusionMatrix(val$LUNG_CANCER, predictedtree1)
matriztree1
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 6 5
## YES 3 63
##
## Accuracy : 0.8961
## 95% CI : (0.8055, 0.9541)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 0.4474
##
## Kappa : 0.541
##
## Mcnemar's Test P-Value : 0.7237
##
## Sensitivity : 0.66667
## Specificity : 0.92647
## Pos Pred Value : 0.54545
## Neg Pred Value : 0.95455
## Prevalence : 0.11688
## Detection Rate : 0.07792
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.79657
##
## 'Positive' Class : NO
##
Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 98.48%. Esto indica que el 98.48% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
El modelo de árbol de decisión tiene un buen rendimiento en la clasificación del cáncer de pulmón en el conjunto de datos de validación, con una alta exactitud y un equilibrio entre sensibilidad y especificidad.
cv.tree1 <- cv.tree(tree1, FUN = prune.misclass)
cv.tree1
## $size
## [1] 14 9 7 1
##
## $dev
## [1] 37 37 34 35
##
## $k
## [1] -Inf 0.000000 0.500000 1.666667
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
plot(cv.tree1)
prune.tree1 <- prune.misclass(tree1, best = 8) # Número de ramas
plot(prune.tree1)
text(prune.tree1, pretty = 0)
Se hizo la poda y se dejo en la mitad que es 8 para sacar conclusionesy ver que pasa con el modelo.
predictedtree2 <- predict(prune.tree1, val, type ="class")
matriztree2 <- confusionMatrix(val$LUNG_CANCER, predictedtree2)
matriztree2
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 6 5
## YES 0 66
##
## Accuracy : 0.9351
## 95% CI : (0.8549, 0.9786)
## No Information Rate : 0.9221
## P-Value [Acc > NIR] : 0.43913
##
## Kappa : 0.6729
##
## Mcnemar's Test P-Value : 0.07364
##
## Sensitivity : 1.00000
## Specificity : 0.92958
## Pos Pred Value : 0.54545
## Neg Pred Value : 1.00000
## Prevalence : 0.07792
## Detection Rate : 0.07792
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.96479
##
## 'Positive' Class : NO
##
El modelo de árbol de decisión con 8 ramas muestra un buen rendimiento en la clasificación del cáncer de pulmón en el conjunto de datos de validación, con una alta exactitud y un equilibrio entre sensibilidad y especificidad, comparado con el modelo anterior.
Random Forest es un algoritmo de aprendizaje automático robusto y versátil, ideal para tareas de clasificación, como predecir el cáncer de pulmón en su conjunto de datos. Su enfoque conjunto, que combina múltiples árboles de decisión, ayuda a reducir el riesgo de sobreajuste, haciéndolo generalmente más preciso y estable en comparación con un único árbol de decisión. Además, Random Forest puede manejar datos tanto categóricos como numéricos, es menos sensible a los valores atípicos y proporciona información útil sobre la importancia de las características, lo que ayuda a comprender qué factores influyen más en la predicción.
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
fitRF <- randomForest(LUNG_CANCER~., data = Train, ntree=150)
summary(fitRF)
## Length Class Mode
## call 4 -none- call
## type 1 -none- character
## predicted 232 factor numeric
## err.rate 450 -none- numeric
## confusion 6 -none- numeric
## votes 464 matrix numeric
## oob.times 232 -none- numeric
## classes 2 -none- character
## importance 15 -none- numeric
## importanceSD 0 -none- NULL
## localImportance 0 -none- NULL
## proximity 0 -none- NULL
## ntree 1 -none- numeric
## mtry 1 -none- numeric
## forest 14 -none- list
## y 232 factor numeric
## test 0 -none- NULL
## inbag 0 -none- NULL
## terms 3 terms call
predictedRF <- predict(fitRF, val)
matrizRF1 <- confusionMatrix(val$LUNG_CANCER, predictedRF)
matrizRF1
## Confusion Matrix and Statistics
##
## Reference
## Prediction NO YES
## NO 3 8
## YES 1 65
##
## Accuracy : 0.8831
## 95% CI : (0.7897, 0.9451)
## No Information Rate : 0.9481
## P-Value [Acc > NIR] : 0.9935
##
## Kappa : 0.3505
##
## Mcnemar's Test P-Value : 0.0455
##
## Sensitivity : 0.75000
## Specificity : 0.89041
## Pos Pred Value : 0.27273
## Neg Pred Value : 0.98485
## Prevalence : 0.05195
## Detection Rate : 0.03896
## Detection Prevalence : 0.14286
## Balanced Accuracy : 0.82021
##
## 'Positive' Class : NO
##
El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 36.36%. Esto significa que solo el 36.36% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 98.48%. Esto indica que el 98.48% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
importance(fitRF)
## MeanDecreaseGini
## GENDER 1.523295
## AGE 5.941354
## SMOKING 1.724422
## YELLOW_FINGERS 2.677424
## ANXIETY 2.397370
## PEER_PRESSURE 2.422339
## CHRONICDISEASE 2.579770
## FATIGUE 2.521149
## ALLERGY 3.805193
## WHEEZING 2.949196
## ALCOHOLCONSUMING 2.917958
## COUGHING 2.757635
## SHORTNESSOFBREATH 1.772201
## SWALLOWINGDIFFICULTY 2.752138
## CHESTPAIN 1.941688
varImpPlot(fitRF)
Los puntos que representan la importancia de cada variable, ordenadas de mayor a menor importancia.
Ya que nos ayuda a identificar qué variables son más relevantes para el modelo.
La variable “AGE” tiene un MeanDecreaseGini de 6.627956, lo que sugiere que es una variable muy importante para la detección de cáncer. Mientras que “CHESTPAIN” tiene un MeanDecreaseGini de 1.729047, lo que sugiere que es menos importante en comparación con otras variables en elmodelo.
Dado todos los modelos de clasificacion se pudo observar que el mejor rendiemiento tanto en valores y predicciones se dio en maquinas de vector de soporte lineal con una exactitud evaluado de 94.81% donde:
El valor predictivo positivo del modelo, que es la proporción de casos predichos como positivos que son verdaderamente positivos, es del 63.64%. Esto significa que el 63.64% de los casos predichos como cáncer de pulmón realmente tienen cáncer de pulmón.
El valor predictivo negativo del modelo, que es la proporción de casos predichos como negativos que son verdaderamente negativos, es del 100%. Esto indica que el 100% de los casos predichos como no cáncer de pulmón realmente no tienen cáncer de pulmón.
Muestra un rendimiento notablemente mejor que los otros modelos.
LINK DE LA BASE DE DATOS DE DONDE SE OBTUVO
Este es el enlace al dataset de detección de cáncer de pulmón en Kaggle
https://www.kaggle.com/datasets/jillanisofttech/lung-cancer-detection/data