table(avocado$type)
conventional organic
9126 9123
El presente documento es un análisis de la técnica de discriminantes sobre la base **avocado**.
Se quiere clasificar que tipo de aguacates pertenecen, para lo cual se evaluaron las siguientes variables
Type: Tipo (Orgánico,Convencional) (**Dependiente**)
Total.Volume: Número total de aguacates vendidos
X4046: Número total de aguacates con PLU 4046 vendidos
X4225: Número total de aguacates con PLU 4225 vendidos
X4770: Número total de aguacates con PLU 4770 vendidos
Total.Bags: Número total de Bolsas vendidas
Small.Bags: Número total de Bolsas pequeñas vendidas
Large.Bags: Número total de Bolsas grandes vendidas
XLarge.Bags: Número total de Bolsas muy grandes vendidas
AveragePrice: El precio medio de aguacates
Primeramente vems como están compuesto tipos de aguacates
table(avocado$type)
conventional organic
9126 9123
Se puede observar que de los 18249 datos, 9126 son convencionales y 9123 son orgánicos. Ahora bien, el número de variables discriminantes viene dado por por \(p=10<(18249-2)\).
Las variables a estudiar deben de ser linealmente independiente, por lo cual, haremos un gráfico de relación:
cor=cor(avocado[,1:9])
corrplot(cor,type="upper",tl.col="black",tl.srt=45)Ahora bien, el siguiente supuesto es verificar si las variables seleccionadas siguen una distribución normal multivariante.
avocado.organico = subset(avocado,avocado$type=='organic')
avocado.convencional = subset(avocado,avocado$type=='conventional')
lillie.test(avocado.organico$AveragePrice)
Lilliefors (Kolmogorov-Smirnov) normality test
data: avocado.organico$AveragePrice
D = 0.042489, p-value < 2.2e-16
lillie.test(avocado.convencional$AveragePrice)
Lilliefors (Kolmogorov-Smirnov) normality test
data: avocado.convencional$AveragePrice
D = 0.057243, p-value < 2.2e-16
Podemos observar que en los diferentes grupos, la variable discriminante sigue una distribución normal, lo veremos gráficamente con qqplot.
qqnorm(avocado.organico$AveragePrice,main="Precio Promedio Orgánico")
qqline(avocado.organico$AveragePrice,col="gray50")qqnorm(avocado.convencional$AveragePrice,,main="Precio Promedio Orgánico")
qqline(avocado.convencional$AveragePrice,col="gray50")El último supuesto que nos falta evaluar es la igualdad de matrices de varianzas-covarianzas.
bartlett.test(AveragePrice~type,data=avocado)
Bartlett test of homogeneity of variances
data: AveragePrice by type
Bartlett's K-squared = 938.43, df = 1, p-value < 2.2e-16
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.
muestra=sample(1:nrow(avocado),size=14600)
entreno=avocado[muestra,]
prueba=avocado[-muestra,]qda.entreno=qda(type~AveragePrice,data=entreno)
qda.entrenoCall:
qda(type ~ AveragePrice, data = entreno)
Prior probabilities of groups:
conventional organic
0.4989041 0.5010959
Group means:
AveragePrice
conventional 1.157153
organic 1.654759
Ahora bien, vamos a predecir utilizando la función predict, para determinar el porcentaje de acierto en cada grupo.
p.qda.entreno=predict(qda.entreno,entreno[,1:9])
m.qda.ent=table(entreno$type,p.qda.entreno$class)
m.qda.ent
conventional organic
conventional 6140 1144
organic 1825 5491
diag(prop.table(m.qda.ent,1))conventional organic
0.8429434 0.7505467
sum(diag(prop.table(m.qda.ent)))[1] 0.7966438
Podemos decir que el porcentaje de acierto para el tipo convencional es de 84.32% y del orgánico es de 74.42%, de la cual es un acierto de 79.35% de la base de entrenamiento.
Ahora bien, utilizaremos la data de prueba para verificar esta eficacia.
p.qda.prueba=predict(qda.entreno,prueba[,1:9])
m.qda.pru=table(prueba$type,p.qda.prueba$class)
m.qda.pru
conventional organic
conventional 1536 306
organic 477 1330
diag(prop.table(m.qda.pru,1))conventional organic
0.8338762 0.7360266
sum(diag(prop.table(m.qda.pru)))[1] 0.7854207
Vemos que casi es similar con el anterior teniendo una eficacia de 83.06% para la convencional, 75.05% para el orgánico y 79.06% en total.