table(iris$Species)
setosa versicolor virginica
50 50 50
El presente documento es un análisis de la técnica de discriminantes sobre la base **Iris** de R.
Se quiere evaluar el tipo de especie de las flores, la cual se evaluaron las siguientes variables
Species: Tipo (Setosa, Versicolor, Virginica) (**Dependiente**)
Sepal.Length: Longitud del Sépalo.
Sepal.Width: Anchura del Sépalo.
Petal.Length: Longitud del Pétalo.
Petal.Width: Anchura del Pétalo.
Primeramente vems como están compuesto los tipos de especies.
table(iris$Species)
setosa versicolor virginica
50 50 50
Se puede observar que de los 250 datos, 50 es de cada tipo. Ahora bien, el número de variables discriminantes viene dado por por \(p=4<(150-2)\).
Las variables a estudiar deben de ser linealmente independiente, por lo cual, haremos un gráfico de relación:
=cor(iris[,c(1,2,3,4)])
corcorrplot(cor,type="upper",tl.col="black",tl.srt=45)
Lo cual tomaremos como variables descriminantes las variables Sepal.Width y Petal.Length, donde garantizamos la ausencia de multicolinealidad.
Ahora bien, el siguiente supuesto es verificar si las variables seleccionadas siguen una distribución normal multivariante en los diferentes grupos, donde utilizamos la transformación \(1/x\).
= subset(iris,iris$Species=='setosa')
iris.setosa = subset(iris,iris$Species=='versicolor')
iris.versicolor = subset(iris,iris$Species=='virginica')
iris.virginica
lillie.test(1/iris.setosa$Sepal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.setosa$Sepal.Width
D = 0.13453, p-value = 0.0242
lillie.test(1/iris.setosa$Petal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.setosa$Petal.Width
D = 0.35922, p-value < 2.2e-16
lillie.test(1/iris.versicolor$Sepal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.versicolor$Sepal.Width
D = 0.15806, p-value = 0.003158
lillie.test(1/iris.versicolor$Petal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.versicolor$Petal.Width
D = 0.20776, p-value = 1.114e-05
lillie.test(1/iris.virginica$Sepal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.virginica$Sepal.Width
D = 0.15282, p-value = 0.005154
lillie.test(1/iris.virginica$Petal.Width)
Lilliefors (Kolmogorov-Smirnov) normality test
data: 1/iris.virginica$Petal.Width
D = 0.13393, p-value = 0.02536
Podemos observar que en los diferentes grupos, la variable discriminante sigue una distribución normal, lo veremos gráficamente con qqplot.
qqnorm(1/iris.setosa$Sepal.Width,main="Sepal Width Setosa")
qqline(1/iris.setosa$Sepal.Width,col="gray50")
qqnorm(1/iris.versicolor$Sepal.Width,main="Sepal Width versicolor")
qqline(1/iris.versicolor$Sepal.Width,col="gray50")
qqnorm(1/iris.virginica$Sepal.Width,main="Sepal Width virginica")
qqline(1/iris.virginica$Sepal.Width,col="gray50")
qqnorm(1/iris.setosa$Petal.Length,main="Petal.Length Setosa")
qqline(1/iris.setosa$Petal.Length,col="gray50")
qqnorm(1/iris.versicolor$Petal.Length,main="Petal.Length versicolor")
qqline(1/iris.versicolor$Petal.Length,col="gray50")
qqnorm(1/iris.virginica$Petal.Length,main="Petal.Length virginica")
qqline(1/iris.virginica$Petal.Length,col="gray50")
El último supuesto que nos falta evaluar es la igualdad de matrices de varianzas-covarianzas.
boxM(cbind(Sepal.Width, Petal.Length) ~ Species, data=iris)
Box's M-test for Homogeneity of Covariance Matrices
data: Y
Chi-Sq (approx.) = 62.768, df = 6, p-value = 1.231e-11
Vemos que el valor p es muy pequeño, por lo cual se rechaza la hipótesis nula y se dice que tenemos que en un grupo es mas variable que otro, entonces no podemos utilizar el método lineal, no obstante, utilizaremos análisis discriminante cuadrático, ya que no se necesita verificar este supuesto.
Primeramente para aplicar la técnica, vamos a dividir los datos, una de entrenamiento y la otra de prueba. En el estudio de Machine Learning, se recomienda utilizar el 80% de los datos para la de entrenamiento y 20% para la prueba.
Para aplicar la técnica de análisis lineal en R se utiliza lda y para la cuadrática se utiliza qda, ambas de la librería MASS.
=sample(1:nrow(iris),size=120)
muestra=iris[muestra,]
entreno=iris[-muestra,] prueba
=qda(Species~Sepal.Width+Petal.Length,data=entreno)
qda.entreno qda.entreno
Call:
qda(Species ~ Sepal.Width + Petal.Length, data = entreno)
Prior probabilities of groups:
setosa versicolor virginica
0.3250000 0.3583333 0.3166667
Group means:
Sepal.Width Petal.Length
setosa 3.392308 1.446154
versicolor 2.793023 4.318605
virginica 2.992105 5.628947
Ahora bien, vamos a predecir utilizando la función predict, para determinar el porcentaje de acierto en cada grupo.
=predict(qda.entreno,entreno[,1:4])
p.qda.entreno=table(entreno$Species,p.qda.entreno$class)
m.qda.ent m.qda.ent
setosa versicolor virginica
setosa 39 0 0
versicolor 0 41 2
virginica 0 3 35
diag(prop.table(m.qda.ent,1))
setosa versicolor virginica
1.0000000 0.9534884 0.9210526
sum(diag(prop.table(m.qda.ent)))
[1] 0.9583333
Podemos decir que el porcentaje de acierto para la especie de setosa es de 100%, versicolor 93.33%, de virginica 95.35%, de la cual es un acierto de 95.8% de la base de entrenamiento.
Ahora bien, utilizaremos la data de prueba para verificar esta eficacia.
=predict(qda.entreno,prueba[,1:4])
p.qda.prueba=table(prueba$Species,p.qda.prueba$class)
m.qda.pru m.qda.pru
setosa versicolor virginica
setosa 11 0 0
versicolor 0 7 0
virginica 0 2 10
diag(prop.table(m.qda.pru,1))
setosa versicolor virginica
1.0000000 1.0000000 0.8333333
sum(diag(prop.table(m.qda.pru)))
[1] 0.9333333
Vemos que casi es similar con el anterior teniendo una eficacia de 100% para la setosa, 100% para la versicolor, 71.42% para la virginica y 93.33% en total.