K-vecinos más cercanos

Creamos la tabla

Instalamos el conjunto de datos y cambiamos la columna clase a “Factor”

tabla <- read.csv("Propietarios.csv")
tabla$Clase <- as.factor(tabla$Clase)
str(tabla)
## 'data.frame':    24 obs. of  4 variables:
##  $ Hogar  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Ingreso: num  60 85.5 64.8 61.5 87 ...
##  $ Tamaño : num  18.4 16.8 21.6 20.8 23.6 19.2 17.6 22.4 20 20.8 ...
##  $ Clase  : Factor w/ 2 levels "No propietario",..: 2 2 2 2 2 2 2 2 2 2 ...
tabla
##    Hogar Ingreso Tamaño          Clase
## 1      1    60.0   18.4    Propietario
## 2      2    85.5   16.8    Propietario
## 3      3    64.8   21.6    Propietario
## 4      4    61.5   20.8    Propietario
## 5      5    87.0   23.6    Propietario
## 6      6   110.1   19.2    Propietario
## 7      7   108.0   17.6    Propietario
## 8      8    82.8   22.4    Propietario
## 9      9    69.0   20.0    Propietario
## 10    10    93.0   20.8    Propietario
## 11    11    51.0   22.0    Propietario
## 12    12    81.0   20.0    Propietario
## 13    13    75.0   19.6 No propietario
## 14    14    52.8   20.8 No propietario
## 15    15    64.8   17.2 No propietario
## 16    16    43.2   20.4 No propietario
## 17    17    84.0   17.6 No propietario
## 18    18    49.2   17.6 No propietario
## 19    19    59.4   16.0 No propietario
## 20    20    66.0   18.4 No propietario
## 21    21    47.4   16.4 No propietario
## 22    22    33.0   18.8 No propietario
## 23    23    51.0   14.0 No propietario
## 24    24    63.0   14.8 No propietario

Aseguramos que se pueda visualizar la tabla y que la columna sea debidamente cambiada

Muestreo aleatorio y buscar valor óptimo de \(k\)

Mediante un muestreo aleatorio, separamos el conjunto de entrenamiento y en cojunto de prueba. Además, buscaremos el valor óptimo de k, (número de vecinos más cercanos).

set.seed(2020)
library(caret)
folds <- createFolds(tabla$Clase, k = 5)
entrenamiento <- tabla[c(folds$Fold1,folds$Fold2,folds$Fold3,folds$Fold4),]
prueba        <- tabla[folds$Fold5,]
dim(entrenamiento)[1]
## [1] 18
dim(prueba)[1]
## [1] 6

Construimos el modelo ajustado con los datos de entrenamiento.

Utilizaremos la libreria kknn. En esta paquetería se usa la función train.kknn(), a la cual se le debe indicar el valor máximo de k y ella determina el valor óptimo.

library(kknn)
modelo <- train.kknn(Clase ~ ., data = entrenamiento, kmax = 8)
modelo
## 
## Call:
## train.kknn(formula = Clase ~ ., data = entrenamiento, kmax = 8)
## 
## Type of response variable: nominal
## Minimal misclassification: 0.1666667
## Best kernel: optimal
## Best k: 1

Notemos que encuentra como valor óptimo k=1 vecinos.

Corremos el modelo con los datos de entrenamiento

Pres     <- predict(modelo, entrenamiento[,-4])
tt       <- table(entrenamiento[,4],Pres)
tt
##                 Pres
##                  No propietario Propietario
##   No propietario              9           0
##   Propietario                 0           9

Podemos observar en la tabla, en las filas la clasificación real y en las columnas la predicción.

Tasa de aciertos

TA <- (sum(diag(tt)))/sum(tt)
round(TA,2)
## [1] 1

Podemos hablar de una precisión del 100%.

Predicción en el conjunto de prueba

Pred    <- predict(modelo, prueba[,-4])
table   <- table(prueba[,4],Pred)
table
##                 Pred
##                  No propietario Propietario
##   No propietario              3           0
##   Propietario                 1           2
clas    <- (sum(diag(table)))/sum(table)
clas
## [1] 0.8333333

Encontramos que el modelo logra predecir un 83% los datos de prueba.

Árboles de decisión

###Construímos el modelo con los mismos datos

library(C50)
modelo2 <- C5.0(Clase ~ ., data = entrenamiento)
modelo2
## 
## Call:
## C5.0.formula(formula = Clase ~ ., data = entrenamiento)
## 
## Classification Tree
## Number of samples: 18 
## Number of predictors: 3 
## 
## Tree size: 2 
## 
## Non-standard options: attempt to group attributes

Visualizamos el árbol de decisión

plot(modelo2)

Para detallar un nodo en particular, esta visualización permite:

plot(modelo2, subtree=2)  

La predición para los datos de entrenamiento.

pred<- predict(modelo2,entrenamiento[,-4],type="class")
tt<- table(pred,entrenamiento[,4])
tt
##                 
## pred             No propietario Propietario
##   No propietario              9           0
##   Propietario                 0           9

Tasa de aciertos

TA <- (sum(diag(tt)))/sum(tt)
round(TA,2)
## [1] 1

Podemos hablar de una precisión del 100%.

Predicción para el conjunto de prueba.

Pred2    <- predict(modelo2, prueba[,-4],type="class")
table1    <- table(prueba[,4],Pred2)
table1 
##                 Pred2
##                  No propietario Propietario
##   No propietario              3           0
##   Propietario                 0           3

Tasa de aciertos

(sum(diag(table1)))/sum(table1) 
## [1] 1

Encontramos que el modelo logra predecir un 100% los datos de prueba.