Predicción del cáncer de pulmón mediante aprendizaje automático (Métodos de clasificación)


CONJUNTO DE DATOS

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.


INTRODUCCIÓN

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


DESCRIPCIÓN DE VARIABLES

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.


DESAROLLO

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.


NOMBRE DE LAS VARIABLES DE LA BASE DE DATOS

# 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"

TIPO DE CLASE DE LAS VARIABLES DE LA BASE DE DATOS

# 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"

CAMBIAR EL TIPO DE CLASE DE LAS VARIBLES CATEGORICAS

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"

LIMPIEZA DE LA BASE DE DATOS

# 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.


ANÁLISIS DESCRIPTIVO

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.


MATRIZ DE CORRELACIÓN

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.


GRÁFICA DE BARRAS

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.


GRÁFICO DE DISPERSIÓ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.


GRÁFICO DE BOXPLOT

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"

VARIABLES FICTICIAS

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.


MODELOS DE CLASIFICACIÓN

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.


TABLA ANOVA

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”.


SEGUNDO ANOVA

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.


PREDICCIÓN DEL 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.


CURVA ROC

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.


MAQUINA DE VECTOR SOPORTE (SVM)

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.


PREDECCIÓN DEL VECTOR DE SOPORTE (SVM) RADIAL

# 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.


PREDECCIÓN DEL VECTOR DE SOPORTE (SVM) POLINÓMICO

# 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.


PREDECCIÓN DEL VECTOR DE SOPORTE (SVM) LINEAL

# 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.


PREDECCIÓN DEL VECTOR DE SOPORTE (SVM) SIGMOIDAL

# 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.


COMPARACIÓN

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%.


REDES NEURONALES

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")

PREDICCIÓN

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

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.


ARBOLES DE DECISIÓN

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)


PREDICCIÓN

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.


PODAR

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.


RAMDON FOREST

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.


CONCLUSIÓN

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.


BIBLIOGRAFÍA

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