El objetivo del presente programa…
arroz<- read_excel("C:/Users/marco/Documents/Rscripts/arroz.xlsx")
## New names:
## • `` -> `...1`
# 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.
# 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
# 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
8
9
10
11
12