[This article was first published on Learning Data Science , and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Supposons que l’on dispose d’iris de Paris (en population >100khabts) et qu’on veuille pouvoir les classer selon leurs caractéristiques sociodémos :Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
- Population
- taux de chômage
- Etudiants
- CSP
- etc…
On va tester deux méthodes ici :
- L’analyse discriminante
- La régression logistique multinomiale
# Etape 1 : Réduction de la dimension par une ACP pour diminuer le nombre de variables
# Etape 2 : CAH sur les facteurs de l’ACP –> Définition des classes
# Etape 3: Analyse discriminante pour trouver les règles d’affectation aux classes
# Etape 4: Reg. log. pour trouver les mêmes règles d’affectation
# Etape 5: Comparaison des résultats des méthodes sur un échantillon test et mesure du taux de mal classés
1. Réduction de la dimension
# Etape 1 : Réduction de la dimension
require(ade4)
Vm.acp <-dudi.pca(df=Vm,center=TRUE,scale=TRUE,scan=FALSE)
# Eboulis des valeurs propres
screeplot(Vm.acp,type =”l”, main = ‘choix du nombre d axes’)
nbaxes =3;
Vm.acp <-dudi.pca(df=Vm,center=T,scale=T,nf=nbaxes,scannf=FALSE)
s.corcircle(Vm.acp$co,xax=1,yax=3,clabel=0.7,sub=”C. de corr des variables”,possub=”topright”)
summary(Vm.acp)
New.vm<-Vm.acp$li
2. CAH sur les facteurs de l’ACP
# CAH sur les facteurs de l’ACP
preclus<-dist(New.vm)**2 # La CAH op?re sur les distances
cah.vm<-hclust(d=preclus,method=”ward”)
# Visualisation de la CAH
par(mfrow=c(1,1))
nbclasses.fi =3
groups<-cutree(cah.vm,k=nbclasses.fi)
plot(cah.vm)
rect.hclust(cah.vm,k=nbclasses.fi,border=”blue”)
Les résultats de la classif
# Rattachement des groupes pour chacun des iris > discrim.vm<-cbind(Vm,cluster=as.factor(groups)) > table(discrim.vm$cluster) 1 2 3 180 483 250 3. Analyse discriminante pour affectation dans les classes > index <- sample(nrow(discrim.vm), nrow(discrim.vm)*.70) > #Echantillon d'apprentissage > appren <- discrim.vm[index, ] > #Echantillon de test > test <- discrim.vm[-index, ] > vm.disc= f.lda(appren[,-29],groups=appren$cluster) > # Matrice de confusion > pred.vm <-predict(vm.disc,newdata=test) > # Taux d'erreur > Tx_err <- function(y,ypred){ + mc <- table(y,ypred) + error <- 100*(mc[1,2]+mc[2,1])/sum(mc) + print(mc) + print(paste(round(error,2),"%",sep ="")) + } > Tx_err(test$cluster,pred.vm$class) ypred y 1 2 3 1 47 4 1 2 3 142 2 3 0 11 64 [1] "2.55%" Une erreur de prévision de 2% avec une analyse discriminante 4. Avec une régression logistique multinomiale # Avec une régression logistique multinomiale: > # Avec une régression logistique multinomiale: > library(nnet) > logi=multinom(cluster~., data = appren) # weights: 90 (58 variable) initial value 702.013252 iter 10 value 113.648468 iter 20 value 75.506364 iter 30 value 69.704088 iter 40 value 65.256664 iter 50 value 62.358589 iter 60 value 61.152375 iter 70 value 60.246843 iter 80 value 59.528363 iter 90 value 58.957304 iter 100 value 58.452446 final value 58.452446 stopped after 100 iterations > pp = predict(logi,newdata=test) > Tx_err(test$cluster,pp) ypred y 1 2 3 1 51 0 1 2 1 140 6 3 1 12 62 [1] "0.36%" Verdict : La reg. log. fait beaucoup mieux que l'analyse discriminante. Certains auteurs avaient déjà commencé à traiter la question. Ils voyaient l'analyse discriminante linéaire comme un cas particulier de la régression logistique (ce avec quoi je ne suis pas totalement d'accord, car aucune de ces deux méthodes ne s'affranchit de l'hypothèse forte de normalité et utilise les moments d'ordre deux à chaque fois) Quelques conclusions néanmoins intéressantes :1. Lorsque le nombre de paramètre à estimer est important, le temps que met une reg log peut être 1,5 fois plus important que l’ADL du fait de l’algo itératif 2. La rég. log. peut être plus précise sur de petits échantillons, car du fait des modalités de référence, le nombre de paramètres à estimer est plus faible que si l’on utilise une ADL GT
To leave a comment for the author, please follow the link and comment on their blog: Learning Data Science .
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.