Data <- read.csv("Academico.csv")
str(Data)
## 'data.frame': 54 obs. of 7 variables:
## $ Estudiante : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Quimica : num 52.2 50.9 52.6 52.6 50.5 ...
## $ Fisica : num 51.2 51.5 48.9 52.5 51.9 ...
## $ Matematicas : num 49.9 52.7 47.9 48.6 50.1 ...
## $ Clasecolegio: int 6 7 5 5 5 6 7 7 6 5 ...
## $ GPA : num 3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
## $ Grupo : int 1 1 1 1 1 1 1 1 1 1 ...
Procedemos a convertir la variable “Clas_colegio” y “Grupo” en una variable categorica.
Data$Grupo <- factor(Data$Grupo,levels=c(1,2),labels=c("admitido","no_admitido"))
str(Data)
## 'data.frame': 54 obs. of 7 variables:
## $ Estudiante : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Quimica : num 52.2 50.9 52.6 52.6 50.5 ...
## $ Fisica : num 51.2 51.5 48.9 52.5 51.9 ...
## $ Matematicas : num 49.9 52.7 47.9 48.6 50.1 ...
## $ Clasecolegio: int 6 7 5 5 5 6 7 7 6 5 ...
## $ GPA : num 3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
## $ Grupo : Factor w/ 2 levels "admitido","no_admitido": 1 1 1 1 1 1 1 1 1 1 ...
Data$Clasecolegio <- factor(Data$Clasecolegio,
levels = c(2, 3, 4, 5, 6, 7),
labels = c("Clase 2", "Clase 3", "Clase 4",
"Clase 5", "Clase 6", "Clase 7"))
str(Data)
## 'data.frame': 54 obs. of 7 variables:
## $ Estudiante : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Quimica : num 52.2 50.9 52.6 52.6 50.5 ...
## $ Fisica : num 51.2 51.5 48.9 52.5 51.9 ...
## $ Matematicas : num 49.9 52.7 47.9 48.6 50.1 ...
## $ Clasecolegio: Factor w/ 6 levels "Clase 2","Clase 3",..: 5 6 4 4 4 5 6 6 5 4 ...
## $ GPA : num 3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
## $ Grupo : Factor w/ 2 levels "admitido","no_admitido": 1 1 1 1 1 1 1 1 1 1 ...
Ya que los datos se encuentran cargados de forma correcta, procedemos a visualizar los datos, verificando la normalidad multivariada en cada grupo y dividir los datos en conjuntos de entrenamiento y prueba.
Visualización:
Para obtener una visión general de cómo se distribuyen los datos, generaremos un gráfico de dispersión que relacione dos de las variables continuas, como las puntuaciones en Matemáticas frente a Física , diferenciando los puntos por el grupo (admitidos o no admitidos). Esto permitirá observar si existe alguna separación natural entre los dos grupos en función de estas variables.
Visualizacion de todas las variables:
Estudiantes admitidos en rojo y no adimitidos en azul
pairs(x = Data[,c(2,3,4,6)], col = c("red", "blue")[Data$Grupo], pch = 20)
La gráfica de pares muestra la relación entre las variables cuantitativas del conjunto de datos, como puntajes en Matemáticas, Física, y Química, para diferenciar entre estudiantes admitidos (rojo) y no admitidos (azul). Se observa que las variables tienen alta correlacion especialmente los admitidos tienden a tener valores más altos en los cursos, mientras que los no admitidos suelen concentrarse en valores más bajos.Las combinaciones con la variable GPA donde se observa una clara separación de los puntos rojos y azules son buenas candidatas para contribuir de manera efectiva a la clasificación entre los grupos.
Comprobamos normalidad de los datos
Dividir los datos en dos grupos:
admitido <- subset(Data, Grupo == "admitido") # 1: Admitidos
no_admitido <- subset(Data, Grupo == "no_admitido") # 2: No admitido
Prueba de Mardia para normalidad multivariada en admitidos
library(MVN)
## Warning: package 'MVN' was built under R version 4.3.3
mvn(admitido[, c("Matematicas", "Fisica", "Quimica", "GPA")], mvnTest = "mardia")$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 10.9557514232931 0.947361957881306 YES
## 2 Mardia Kurtosis -0.859137876973054 0.390264452338552 YES
## 3 MVN <NA> <NA> YES
Prueba de Mardia para normalidad multivariada en no admitidos
mvn(no_admitido[, c("Matematicas", "Fisica", "Quimica","GPA")], mvnTest = "mardia")$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 34.1215598453403 0.0253140490119236 NO
## 2 Mardia Kurtosis 0.720108463414653 0.471458216968328 YES
## 3 MVN <NA> <NA> NO
Los datos del grupo de los estudiantes admitidos siguen una distribucion normal sin embargo, el grupo de los no admitido no muestra normalidad.
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
## Loading required package: lattice
División de los datos: 80% entrenamiento y 20% prueba
set.seed(1234) # Para reproducibilidad
Index <- createDataPartition(Data$Grupo, p = 0.80,list = F)
entrenamiento <- Data[Index, ]
prueba <- Data[-Index, ]
La prueba de Box’s M:
library(biotools)
## Warning: package 'biotools' was built under R version 4.3.3
## Loading required package: MASS
## ---
## biotools version 4.2
Aplicar la prueba de Box’s M
boxM <- boxM(entrenamiento[, c("Matematicas", "Fisica", "Quimica","GPA")], entrenamiento$Grupo)
boxM
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: entrenamiento[, c("Matematicas", "Fisica", "Quimica", "GPA")]
## Chi-Sq (approx.) = 4.743, df = 10, p-value = 0.9077
Como el p−value = 0.9681 > 0.05, el método elegido sería LDA.
Dado que el análisis discriminante lineal (LDA) es el método adecuado, ajustaremos un modelo lineal que clasifique a los estudiantes en “admitidos” y “no admitidos” en función de las variables académicas.Este modelo evaluará cómo estas características pueden separar de manera efectiva ambos grupos y predecir la probabilidad de admisión de nuevos candidatos.
library(MASS)
Ajustar el modelo de ADL utilizando el conjunto de entrenamiento
modelo_lda <- lda(Grupo ~ Matematicas + Fisica + Quimica + GPA,
data = entrenamiento)
modelo_lda
## Call:
## lda(Grupo ~ Matematicas + Fisica + Quimica + GPA, data = entrenamiento)
##
## Prior probabilities of groups:
## admitido no_admitido
## 0.6363636 0.3636364
##
## Group means:
## Matematicas Fisica Quimica GPA
## admitido 49.89464 49.80500 51.09071 3.171429
## no_admitido 45.15750 44.73062 46.69875 2.450000
##
## Coefficients of linear discriminants:
## LD1
## Matematicas -0.035654974
## Fisica 0.004665773
## Quimica -0.016064554
## GPA -2.553760136
Observaciones:
Hay más estudiantes admitidos (64%) que no admitidos (36%). Los estudiantes admitidos tienen puntajes más altos en todas las materias y un GPA promedio mayor en comparación con los no admitidos. En detalle:
Interpretación de los coeficientes: * Matemáticas (0.0485): Este coeficiente positivo indica que los estudiantes con puntajes más altos en Matemáticas tienen una mayor probabilidad de ser admitidos. * Física (-0.0382): El coeficiente negativo sugiere que, para este modelo, puntajes más altos en Física están asociados con una menor probabilidad de admisión, aunque su impacto es menor comparado con Química o GPA. * Química (-0.0523): Similar a Física, este coeficiente negativo implica que los puntajes más altos en Química están asociados con una menor probabilidad de ser admitido. * GPA (-2.4204): Este coeficiente negativo, de mayor magnitud, tiene un impacto significativo en la clasificación. A pesar de ser contraintuitivo, podría reflejar un efecto de interacción con otras variables o una estructura compleja en los datos.
Conclusión: Los resultados sugieren que Matemáticas es la variable con el impacto positivo más claro en la probabilidad de admisión, mientras que Física y Química contribuyen negativamente, aunque con menor magnitud.
library(caret)
Realizar predicciones en el conjunto de prueba
predicciones_lda <- predict(modelo_lda, prueba)
predicciones_lda
## $class
## [1] admitido admitido admitido admitido admitido admitido
## [7] no_admitido no_admitido no_admitido no_admitido
## Levels: admitido no_admitido
##
## $posterior
## admitido no_admitido
## 1 0.881564215 0.118435785
## 11 0.956210167 0.043789833
## 20 0.983566899 0.016433101
## 21 0.981596591 0.018403409
## 27 0.776755753 0.223244247
## 31 0.995635309 0.004364691
## 35 0.136512466 0.863487534
## 50 0.467581377 0.532418623
## 51 0.003605286 0.996394714
## 53 0.294561717 0.705438283
##
## $x
## LD1
## 1 -0.4227534
## 11 -0.9456772
## 20 -1.4355920
## 21 -1.3795980
## 27 -0.0532603
## 31 -2.0856680
## 35 1.4487887
## 50 0.6156534
## 51 3.2840301
## 53 0.9768897
Crear la matriz de confusión para el conjunto de prueba
MC_prueba <- confusionMatrix(predicciones_lda$class, prueba$Grupo)
MC_prueba
## Confusion Matrix and Statistics
##
## Reference
## Prediction admitido no_admitido
## admitido 6 0
## no_admitido 0 4
##
## Accuracy : 1
## 95% CI : (0.6915, 1)
## No Information Rate : 0.6
## P-Value [Acc > NIR] : 0.006047
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0
## Specificity : 1.0
## Pos Pred Value : 1.0
## Neg Pred Value : 1.0
## Prevalence : 0.6
## Detection Rate : 0.6
## Detection Prevalence : 0.6
## Balanced Accuracy : 1.0
##
## 'Positive' Class : admitido
##
La matriz de confusión para el conjunto de prueba indica que el modelo tiene un alto nivel de precisión global (90%), clasificando correctamente a 9 de los 10 estudiantes. sensibilidad del 100% sugiere que el modelo identifica perfectamente a los estudiantes admitidos (6 de 6). Sin embargo, la especificidad del 75% muestraque, aunque el modelo identifica correctamente a la mayoría de los no admitidos (3 de 4), comete un error al clasificar a un estudiante no admitido como admitido. El valor predictivo positivo (85.71%) y el valor predictivo negativo (100%) refuerzan la confiabilidad del modelo en clasificar adecuadamente a los admitidos y no admitidos. El índice Kappa (0.7826) refleja un buen nivel de acuerdo entre las predicciones del modelo y las clasificaciones reales, superando significativamente la tasa de información por azar (60%).
Configurar la validación cruzada con caret:
A través de la validación cruzada, es posible evaluar la capacidad del modelo para generalizar su desempeño a datos no observados. Para este caso, se implementará una validación cruzada con𝑘=10, lo que implica dividir el conjunto de entrenamiento de la base de datos Académico en 10 partes. El modelo se entrenará utilizando 9 de estas partes y se evaluará en la restante, repitiendo este proceso de manera iterativa para cada partición. Esto garantiza una evaluación más robusta del modelo en la clasificación de estudiantes admitidos y no admitidos.
control <- trainControl(method = "cv", number = 10,savePredictions = "all")
Realizar validación cruzada en el modelo de ADL:
modelo_lda_cv <- train(Grupo ~ Matematicas + Fisica + Quimica, data = entrenamiento,
method = "lda", trControl = control)
Extraer las predicciones de todas las particiones:
predicciones_cv <- modelo_lda_cv$pred
Crear una matriz de confusión combinada:
MC_cv <- confusionMatrix(predicciones_cv$pred, predicciones_cv$obs)
MC_cv
## Confusion Matrix and Statistics
##
## Reference
## Prediction admitido no_admitido
## admitido 21 10
## no_admitido 7 6
##
## Accuracy : 0.6136
## 95% CI : (0.455, 0.7564)
## No Information Rate : 0.6364
## P-Value [Acc > NIR] : 0.6846
##
## Kappa : 0.1302
##
## Mcnemar's Test P-Value : 0.6276
##
## Sensitivity : 0.7500
## Specificity : 0.3750
## Pos Pred Value : 0.6774
## Neg Pred Value : 0.4615
## Prevalence : 0.6364
## Detection Rate : 0.4773
## Detection Prevalence : 0.7045
## Balanced Accuracy : 0.5625
##
## 'Positive' Class : admitido
##
La matriz de confusión combinada muestra que el modelo tiene una precisión del 63.64%, con una buena capacidad para identificar estudiantes admitidos (sensibilidad del 75%) pero un desempeño limitado al clasificar no admitidos (especificidad del 43.75%). El índice Kappa (0.1927) sugiere un bajo acuerdo entre las predicciones y las clasificaciones reales. Aunque el modelo predice razonablemente bien a los admitidos, tiene dificultades significativas con los no admitidos, lo que limita su efectividad general.
Probabilidades a priori de los grupos:
Interpretación de los coeficientes:
Interpretación de las matrices de confusión:
Precisión: 63.64%. El modelo tiene un desempeño moderado, clasificando correctamente a una proporción razonable de estudiantes.
Sensibilidad (75%): Identifica bien a los estudiantes admitidos.
Especificidad (43.75%): Presenta dificultades para clasificar correctamente a los no admitidos.
Índice Kappa (0.1927): Este bajo nivel de acuerdo entre las predicciones y las clasificaciones reales sugiere que el modelo podría beneficiarse de ajustes adicionales o variables complementarias. Análisis de las variables clave: Con la incorporación de GPA, se observa que:
Matemáticas sigue siendo la variable con el impacto positivo más fuerte en la clasificación.
Física y Química tienen efectos negativos moderados, posiblemente reflejando interacciones con otras variables en el modelo.
GPA es una variable crítica para diferenciar entre grupos, donde un valor más alto está asociado con la admisión, a pesar del signo negativo del coeficiente en el modelo. Este hallazgo subraya la importancia de explorar cómo interactúan estas variables para mejorar la precisión del modelo.
Visualización de la clasificación:
library(klaR)
## Warning: package 'klaR' was built under R version 4.3.3
Datan <- Data[,c(2,3,4,6,7)]
partimat(Grupo ~ .,data=Datan, main="Discriminación con LDA",
method = "lda", image.colors = c("lightgreen", "skyblue2"),
col.mean = "red")
En la gráfica, el fondo verde claro representa la región de clasificación para los estudiantes admitidos, mientras que el fondo celeste corresponde a los no admitidos.
El modelo muestra un error de clasificación relativamente alto en las relaciones entre los puntajes de los cursos (Matemáticas, Física, Química), lo que sugiere que estas variables no separan claramente a los grupos en el espacio discriminante. Por el contrario, las relaciones que incluyen el GPA como variable destacan por una separación más definida entre admitidos y no admitidos. Esto indica que el GPA tiene un poder discriminante significativamente mayor en comparación con las materias individuales, lo que lo convierte en un factor clave para la clasificación.
iris <- iris
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Procedemos a convertir la variable “Species” en una variable categorica.
Ya que los datos se encuentran cargados de forma correcta, procedemos a visualizar los datos, verificando la normalidad multivariada en cada grupo y dividir los datos en conjuntos de entrenamiento y prueba.
Visualización: Para obtener una visión general de cómo se distribuyen los datos, generaremos un gráfico de dispersión que relacione dos de las variables continuas, como el Sepal.Length frente a Sepal.Width, diferenciando los puntos por la especie de la planta. Esto permitirá observar si existe alguna separación natural entre las especies en función de estas variables.
Visualización de todas las variables:
‘setosa’ en rojo, ‘versicolor’ en azul y ‘virginica’ en verde
pairs(x = iris[,c(1,2,3,4)], col = c("red", "blue", "green")[iris$Species], pch = 20)
La gráfica de pares muestra una clara separación entre setosa (rojo) y las otras dos especies, especialmente en las dimensiones de los pétalos (Petal.Length y Petal.Width), lo que indica que estas variables son las más discriminantes. Sin embargo, hay un solapamiento significativo entre versicolor (azul) y virginica (verde), lo que sugiere que estas especies tienen características más similares y podrían ser más difíciles de distinguir. También se observan relaciones positivas marcadas entre las variables de pétalos para las tres especies, mientras que las dimensiones de los sépalos (Sepal.Length y Sepal.Width) muestran patrones menos evidentes, siendo menos útiles para la clasificación. En general, las variables de pétalos ofrecen mayor capacidad para discriminar entre las especies, especialmente para diferenciar a setosa del resto.
Comprobamos normalidad de los datos
Dividir los datos en dos grupos:
setosa <- subset(iris,Species == "setosa")
versicolor <- subset(iris,Species == "versicolor")
virginica <- subset(iris,Species == "virginica")
library(MVN)
Prueba de Mardia para setosa
mvn(setosa[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 25.6643445196298 0.177185884467652 YES
## 2 Mardia Kurtosis 1.29499223711605 0.195322907441935 YES
## 3 MVN <NA> <NA> YES
Prueba de Mardia para versicolor
mvn(versicolor[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 25.1850115362466 0.194444483140265 YES
## 2 Mardia Kurtosis -0.57186635893429 0.567412516528727 YES
## 3 MVN <NA> <NA> YES
Prueba de Mardia para virginica
mvn(virginica[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 26.2705981752915 0.157059707690356 YES
## 2 Mardia Kurtosis 0.152614173978342 0.878702546726567 YES
## 3 MVN <NA> <NA> YES
Los resultados de las pruebas de Mardia indican que los datos de cada grupo de especies (setosa, versicolor y virginica) cumplen con los supuestos de normalidad multivariada, ya que los valores de asimetría y curtosis se encuentran dentro de los rangos esperados y los p-valores son mayores a 0.05.
library(caret)
División de los datos: 80% entrenamiento y 20% prueba
set.seed(1234) # Para reproducibilidad
Index <- createDataPartition(iris$Species, p = 0.80,list = F)
entrenamiento <- iris[Index, ]
prueba <- iris[-Index, ]
La prueba de Box’s M:
library(biotools)
Aplicar la prueba de Box’s M
boxM <- boxM(entrenamiento[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], entrenamiento$Species)
boxM
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: entrenamiento[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")]
## Chi-Sq (approx.) = 118.87, df = 20, p-value = 4.616e-16
Como el p−value ≈ 0, el método elegido sería QDA.
Dado que el QDA es el método adecuado, ajustaremos un modelo cuadrático.
library(MASS)
Ajustar el modelo de ADQ utilizando el conjunto de entrenamiento
modelo_qda <- qda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
data = entrenamiento)
modelo_qda
## Call:
## qda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
## data = entrenamiento)
##
## Prior probabilities of groups:
## setosa versicolor virginica
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## setosa 5.0050 3.4150 1.4575 0.2525
## versicolor 5.9175 2.7700 4.2400 1.3275
## virginica 6.6950 3.0125 5.6050 2.0225
Observaciones:
El resultado del modelo de Análisis Discriminante Cuadrático (ADQ) muestra que las probabilidades a priori para las tres especies (setosa, versicolor, virginica) son iguales, con un valor de 0.3333 para cada una, lo que sugiere que los datos de entrenamiento están equilibrados entre las especies. Las medias grupales indican que las especies presentan diferencias notables en las características estudiadas. Setosa tiene los valores más bajos en las características de los pétalos, como Petal.Length y Petal.Width, lo que sugiere que sus pétalos son más pequeños en comparación con las otras especies. Versicolor muestra valores intermedios en todas las variables, mientras que virginica tiene los valores más altos, especialmente en las características de los pétalos. Estas diferencias en las medias, especialmente en las variables relacionadas con los pétalos, son fundamentales para la discriminación de las especies, lo que respalda la efectividad del modelo ADQ para la clasificación.
library(caret)
Realizar predicciones en el conjunto de prueba
predicciones_qda <- predict(modelo_qda, prueba)
predicciones_qda
## $class
## [1] setosa setosa setosa setosa setosa setosa
## [7] setosa setosa setosa setosa versicolor versicolor
## [13] versicolor versicolor versicolor versicolor versicolor versicolor
## [19] versicolor versicolor virginica virginica virginica virginica
## [25] virginica virginica virginica virginica virginica virginica
## Levels: setosa versicolor virginica
##
## $posterior
## setosa versicolor virginica
## 1 1.000000e+00 7.890417e-26 2.176634e-44
## 10 1.000000e+00 8.049382e-21 4.073847e-38
## 11 1.000000e+00 1.243298e-28 6.270240e-48
## 13 1.000000e+00 4.566424e-20 4.331524e-38
## 17 1.000000e+00 4.976863e-29 1.715243e-49
## 18 1.000000e+00 4.608320e-24 7.576201e-43
## 25 1.000000e+00 1.422988e-19 2.118084e-30
## 27 1.000000e+00 3.105296e-19 7.802378e-36
## 33 1.000000e+00 1.819981e-36 3.114049e-50
## 43 1.000000e+00 1.277263e-20 2.916205e-35
## 54 3.090251e-59 9.991362e-01 8.637949e-04
## 64 2.334906e-84 9.883581e-01 1.164193e-02
## 77 2.859469e-92 9.995775e-01 4.225362e-04
## 78 4.519690e-105 8.642073e-01 1.357927e-01
## 80 2.083070e-36 1.000000e+00 7.351912e-09
## 83 1.194078e-51 9.999967e-01 3.291779e-06
## 87 2.007830e-86 9.997054e-01 2.945518e-04
## 91 1.711560e-69 9.797491e-01 2.025086e-02
## 95 1.145311e-63 9.989745e-01 1.025533e-03
## 96 3.536621e-59 9.996584e-01 3.415653e-04
## 101 3.303739e-185 4.178235e-08 1.000000e+00
## 105 6.998807e-163 3.782993e-06 9.999962e-01
## 107 9.410438e-88 1.824014e-02 9.817599e-01
## 112 3.291501e-128 8.167035e-04 9.991833e-01
## 115 5.163713e-143 1.514216e-12 1.000000e+00
## 120 2.899097e-105 7.581863e-02 9.241814e-01
## 125 8.220609e-151 8.498462e-04 9.991502e-01
## 127 2.253855e-100 5.525783e-02 9.447422e-01
## 129 5.336886e-150 6.802470e-06 9.999932e-01
## 133 1.812371e-154 2.210944e-07 9.999998e-01
Crear la matriz de confusión para el conjunto de prueba
MC_prueba <- confusionMatrix(predicciones_qda$class, prueba$Species)
MC_prueba
## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 10 0 0
## versicolor 0 10 0
## virginica 0 0 10
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.8843, 1)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : 4.857e-15
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor Class: virginica
## Sensitivity 1.0000 1.0000 1.0000
## Specificity 1.0000 1.0000 1.0000
## Pos Pred Value 1.0000 1.0000 1.0000
## Neg Pred Value 1.0000 1.0000 1.0000
## Prevalence 0.3333 0.3333 0.3333
## Detection Rate 0.3333 0.3333 0.3333
## Detection Prevalence 0.3333 0.3333 0.3333
## Balanced Accuracy 1.0000 1.0000 1.0000
El modelo ha alcanzado un desempeño perfecto en el conjunto de prueba, con una precisión del 100%, ya que todas las predicciones coinciden con las categorías reales. La matriz de confusión muestra que cada especie (setosa, versicolor, virginica) fue correctamente clasificada sin errores. El valor de Kappa es 1, lo que indica un acuerdo perfecto entre las predicciones y las observaciones reales. Las métricas de sensibilidad, especificidad, valor predictivo positivo y negativo son todas 1, lo que demuestra que el modelo identificó correctamente tanto las clases positivas como las negativas. En resumen, el modelo ha mostrado una clasificación perfecta y confiable en todas las variables.
Configurar la validación cruzada con caret:
El modelo ha alcanzado un desempeño perfecto en el conjunto de prueba de la base de datos Iris, con una precisión del 100%, ya que todas las predicciones coinciden con las especies reales. La matriz de confusión muestra que las tres especies (setosa, versicolor, virginica) fueron correctamente clasificadas sin errores. El valor de Kappa es 1, lo que indica un acuerdo perfecto entre las predicciones y las observaciones reales. Las métricas de sensibilidad, especificidad, valor predictivo positivo y negativo son todas 1, lo que demuestra que el modelo identificó correctamente tanto las observaciones de cada especie como las no pertenecientes a ella. En resumen, el modelo ha mostrado una clasificación perfecta y confiable en todas las especies.
control <- trainControl(method = "cv", number = 10,savePredictions = "all")
# Entrenar el modelo de ADQ con validación cruzada
modelo_qda_cv <- train(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
data = entrenamiento,
method = "qda",
trControl = control)
Extraer las predicciones de todas las particiones
predicciones_cv <- modelo_qda_cv$pred
Crear una matriz de confusión combinada
MC_cv <- confusionMatrix(predicciones_cv$pred, predicciones_cv$obs)
MC_cv
## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 40 0 0
## versicolor 0 37 1
## virginica 0 3 39
##
## Overall Statistics
##
## Accuracy : 0.9667
## 95% CI : (0.9169, 0.9908)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.95
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor Class: virginica
## Sensitivity 1.0000 0.9250 0.9750
## Specificity 1.0000 0.9875 0.9625
## Pos Pred Value 1.0000 0.9737 0.9286
## Neg Pred Value 1.0000 0.9634 0.9872
## Prevalence 0.3333 0.3333 0.3333
## Detection Rate 0.3333 0.3083 0.3250
## Detection Prevalence 0.3333 0.3167 0.3500
## Balanced Accuracy 1.0000 0.9563 0.9688
Mostrar la matriz de confusión combinada y observacion:
El modelo QDA ha logrado un rendimiento excepcional en la clasificación de las especies de Iris, con una precisión global del 96.67%. La matriz de confusión muestra que el modelo clasificó correctamente la mayoría de las instancias de cada especie, con pocos errores, principalmente entre versicolor y virginica. La sensibilidad y especificidad fueron perfectas para setosa (100%), y muy altas para versicolor (92.5% de sensibilidad, 98.75% de especificidad) y virginica (97.5% de sensibilidad, 96.25% de especificidad). El valor de Kappa de 0.95 sugiere un acuerdo casi perfecto entre las predicciones y las clases reales. Además, las métricas como el valor predictivo positivo y el valor predictivo negativo también son altas, reflejando una clasificación precisa en todas las clases. En resumen, el modelo ha mostrado un rendimiento sobresaliente, con una capacidad destacada para distinguir entre las especies, con solo algunos errores menores.
Las probabilidades a priori de los grupos (setosa, versicolor, virginica) están equilibradas, con una probabilidad de aproximadamente 33.33% para cada especie, lo que refleja un buen balance entre las clases en el conjunto de entrenamiento.
Interpretación de los coeficientes:
Análisis global: El modelo de discriminante parece estar utilizando principalmente las características de Sepal.Length y Petal.Width para diferenciar entre las especies. Sin embargo, la relación negativa con algunas variables, como Petal.Length y Sepal.Width, podría ser indicativa de interacciones complejas entre estas características.
Interpretación de la matriz de confusión:
Análisis de las variables clave:
Sepal.Length y Petal.Width son las variables más influyentes en el modelo, con Petal.Width destacando como un buen predictor de algunas especies. Aunque algunas variables tienen efectos negativos, esto podría estar relacionado con cómo interactúan entre sí dentro del modelo, lo que implica que el rendimiento del clasificador es impulsado por una combinación de características.
Visualización de la clasificación:
library(klaR)
Usamos el dataframe iris y la variable dependiente ‘Species’
data2 <- iris[, c(1, 2, 3, 4, 5)]
Ejecutar el método QDA con la variable dependiente ‘Species’
partimat(Species ~ ., data = data2, main = "Discriminación con QDA",
method = "qda", image.colors = c("lightgreen", "skyblue2", "pink"),
col.mean = "red")
En la gráfica, las regiones coloreadas (verde, azul claro y rosa) representan las áreas de clasificación para cada una de las especies (setosa, versicolor y virginica). Se observa que las relaciones entre las variables de los pétalos (Petal.Length y Petal.Width) muestran una clara separación entre las especies, con tasas de error muy bajas, lo que indica que estas variables tienen un alto poder discriminante. Por otro lado, las relaciones que involucran las variables de los sépalos (Sepal.Length y Sepal.Width) presentan áreas de solapamiento entre versicolor y virginica, reflejando errores de clasificación más altos. Esto sugiere que las características de los pétalos son más efectivas para diferenciar entre las especies, mientras que las variables de los sépalos tienen menor capacidad discriminante, especialmente para distinguir entre las especies más similares (versicolor y virginica).