INTRODUCCIÓN

El objetivo del presente programa…

1. Carga de datos

arroz<- read_excel("C:/Users/marco/Documents/Rscripts/arroz.xlsx")
## New names:
## • `` -> `...1`

2. Clases de datos en función de cada variable

# Convertir la variable de respuesta en factor
arroz$Class <- as.factor(arroz$Class)

# Seleccionar las variables numéricas para el gráfico
variables_grafico <- arroz[, c("Area", "MajorAxisLength", "MinorAxisLength", "Eccentricity", "ConvexArea", "Perimeter")]

# Crear una paleta de colores para cada clase
colores <- c("blue", "red")  # Usar 'blue' para la Clase 1 y 'red' para la Clase 2

# Crear el gráfico de pares con colores diferenciados para cada clase
pairs(variables_grafico, 
      col = colores[arroz$Class],  # Asignar colores según la clase
      pch = 19, 
      main = "Gráfico de dispersión de variables de arroz por clase")

Obs: podemos ver que los datos se encuentran uniformemente distribuidos por clases, sin embargo puntos de dos clases distintas comparten las mismas áreas, es decir no son heterogéneos en su totalidad.

3. Método KNN

# Fijar la semilla para reproducibilidad
set.seed(123)

# Separar los datos en conjuntos de entrenamiento y prueba (70% entrenamiento, 30% prueba)
variables_grafico <- arroz[, c("Area", "MajorAxisLength", "MinorAxisLength", "Eccentricity", "ConvexArea", "Perimeter", "Class")]
trainIndex <- createDataPartition(variables_grafico$Class, p = 0.7, list = FALSE)
entrenamiento <- variables_grafico[trainIndex, ]
test <- variables_grafico[-trainIndex, ]

# Dividir en variables predictoras y de respuesta
train_x <- entrenamiento[, -which(names(entrenamiento) == "Class")]
train_y <- entrenamiento$Class
test_x <- test[, -which(names(test) == "Class")]
test_y <- test$Class

# Inicializar los valores de k y vectores para almacenar los resultados
k_values <- 2:10
ecm_values <- numeric(length(k_values))
accuracy_values <- numeric(length(k_values))
sensitivity_values <- numeric(length(k_values))
specificity_values <- numeric(length(k_values))
cost_values <- numeric(length(k_values))  # Vector para almacenar los costos

# Inicializar una lista para almacenar las matrices de confusión
confusion_matrices <- list()

# Matriz de costo proporcionada
cost_matrix <- matrix(c(1000, -30, -50, 2000), nrow = 2, byrow = TRUE)

# Iterar sobre cada valor de k
for (i in seq_along(k_values)) {
  k <- k_values[i]
  
  # Aplicar el modelo KNN para el valor actual de k
  predicciones <- knn(train = train_x, test = test_x, cl = train_y, k = k)
  
  # Evaluar la clasificación mediante una matriz de confusión
  t <- table(Predicted = predicciones, Actual = test_y)
  
  # Almacenar la matriz de confusión en la lista
  confusion_matrices[[i]] <- t
  
  # Calcular el Error Cuadrático Medio (ECM) para el valor actual de k
  ecm_values[i] <- mean((as.numeric(predicciones) - as.numeric(test_y))^2)
  
  # Calcular la precisión (accuracy) para el valor actual de k
  accuracy_values[i] <- sum(diag(t)) / sum(t)
  
  # Calcular la sensibilidad (recall) para el valor actual de k
  TP <- t[2, 2]  # Verdaderos positivos
  FN <- t[2, 1]  # Falsos negativos
  sensitivity_values[i] <- TP / (TP + FN)
  
  # Calcular la especificidad para el valor actual de k
  TN <- t[1, 1]  # Verdaderos negativos
  FP <- t[1, 2]  # Falsos positivos
  specificity_values[i] <- TN / (TN + FP)
  
  # Calcular el costo total para el valor actual de k
  total_cost <- (TN * cost_matrix[1, 1]) + (FP * cost_matrix[1, 2]) + (FN * cost_matrix[2, 1]) + (TP * cost_matrix[2, 2])
  cost_values[i] <- total_cost
}

# Graficar ECM, Precisión, Sensibilidad, Especificidad y Costo en función de k
par(mfrow = c(3, 2))  # Dividir el área de gráficos en tres filas y dos columnas

# Graficar ECM
plot(k_values, ecm_values, type = "o", col = "blue", pch = 16, 
     xlab = "Valor de k", ylab = "Error Cuadrático Medio (ECM)", 
     main = "ECM en función de k")

# Graficar Precisión
plot(k_values, accuracy_values, type = "o", col = "green", pch = 16, 
     xlab = "Valor de k", ylab = "Precisión (Accuracy)", 
     main = "Precisión en función de k")

# Graficar Sensibilidad
plot(k_values, sensitivity_values, type = "o", col = "red", pch = 16, 
     xlab = "Valor de k", ylab = "Sensibilidad", 
     main = "Sensibilidad en función de k")

# Graficar Especificidad
plot(k_values, specificity_values, type = "o", col = "purple", pch = 16, 
     xlab = "Valor de k", ylab = "Especificidad", 
     main = "Especificidad en función de k")

# Mostrar las matrices de confusión para cada k
for (i in seq_along(k_values)) {
  cat("Matriz de Confusión para k =", k_values[i], "\n")
  print(confusion_matrices[[i]])
  cat("\n")
}
## Matriz de Confusión para k = 2 
##          Actual
## Predicted    0    1
##         0 2347   45
##         1  113 2950
## 
## Matriz de Confusión para k = 3 
##          Actual
## Predicted    0    1
##         0 2345   29
##         1  115 2966
## 
## Matriz de Confusión para k = 4 
##          Actual
## Predicted    0    1
##         0 2331   33
##         1  129 2962
## 
## Matriz de Confusión para k = 5 
##          Actual
## Predicted    0    1
##         0 2330   27
##         1  130 2968
## 
## Matriz de Confusión para k = 6 
##          Actual
## Predicted    0    1
##         0 2313   25
##         1  147 2970
## 
## Matriz de Confusión para k = 7 
##          Actual
## Predicted    0    1
##         0 2305   27
##         1  155 2968
## 
## Matriz de Confusión para k = 8 
##          Actual
## Predicted    0    1
##         0 2308   28
##         1  152 2967
## 
## Matriz de Confusión para k = 9 
##          Actual
## Predicted    0    1
##         0 2307   27
##         1  153 2968
## 
## Matriz de Confusión para k = 10 
##          Actual
## Predicted    0    1
##         0 2298   28
##         1  162 2967

Costo total en función de K

# Graficar Costo Total
plot(k_values, cost_values, type = "o", col = "orange", pch = 16, 
     xlab = "Valor de k", ylab = "Costo Total", 
     main = "Costo Total en función de k")

7

7

8

8

9

9

10

10

11

11

12

12

RESULTADOS

CONCLUSIÓN