Exploration et caractérisation de pourriels avec

Résumé

Exploration statistique d'un ensemble de données textuelles afin de définir les caractéristiques des pourriels (spam). Cette analyse nécessite la mise en oeuvre successive et donc l'apprentissage approfondi des principales méthodes de statistique mutidimensionnelle: ACP, AFC, MDS, classification non supervisée. Le scénario d'analyse proposé vise à la représentation la plus explicite des données étudiées et teste également une approché spécifique pour la fouille de texte et les matrices très creuses, la factorisation d'une matrice non-négative (NMF).

Introduction

Objectif

Cette étude est un exemple d'analyse textuelle d'un corpus de documents, ici des courriels. Une telle analyse est classiquement basée sur la fréquence d'une sélection de mots. L'objectif est de mieux appréhender la structure particulière de ces données avant d'aborder un autre objectif de discrimination ou classification supervisée pour construire un détecteur de pourriels (spams)} personnalisé c'est-à-dire adapté au contenu spécifique de la boîte d'un internaute. Il s'agit en fait d'un modèle susceptible de prévoir la qualité d'un message reçu en fonction de son contenu. Le déroulement de cette étude est évidemment marqué par le type particulier des données mais celle-ci peut facilement se transposer à d'autres types de données textuelles ou analyse du contenu: livres, pages web, discours politiques, réponses ouvertes dans des questionnaires... les exemples sont nombreux en sciences humaines, marketing lorsqu'il s'agit d'estimer des scores, par exemple, de satisfaction de clientèle. Les données se caractérisent généralement par des matrices très creuses c'est-à-dire comportant beaucoup de 0s.

Données

George, ingénieur chez HP dans le département Computer Science a recueilli un échantillon de messages électroniques dans chacun desquels il a évalué le nombre d'occurrences d'une sélection de mots et caractères. Les variables considérées sont, dans une première partie, des rapports: nombre d'occurrences d'un mot spécifique sur le nombre total de mots ou nombre d'occurrences d'un caractère sur le nombre de caractères du message avant d'être, dans une deuxième partie, des indicatrices ou facteurs: présence / absence de mots ou ensemble de caractères. Il a également considéré trois variables prenant en compte la casse (majuscule / minuscule) des caractères et une dernière qualitative binaire indiquant le classement qu'il a fait de chaque message : spam ou Nsp. Les variables d'occurrences sont décrites dans le tableau 1, celles associées à la casse dans le tableau 2. Ces données sont publiques, elles servent régulièrement de benchmark pour la comparaison de méthodes d'apprentissage machine:

Frank A., Asuncion A. (2010). UCI Machine Learning Repository. Irvine, CA: University of California, School of Information and Computer Science.

Ce sont donc finalement 58 variables qui sont observées sur 4601 messages dont 1813 pourriels (spams). La variable binaire Spam est présente à titre illustratif, elle est toujours considérée en supplémentaire dans ce travail exploratoire préliminaire.

Le tableau ci-dessous liste 54 variables exprimant soit:

  • le rapport du nombre d'occurrence d'un mot (resp. de caractères) sur le nombre total de mots (de caractères) dans un message,
  • soit la présence ou non de ce mot (resp. caractère) dans le message,
  • des numéros (85...) qui sont ceux de bureau, téléphone, code postal de George.

Tableau 1: Les colonnes contiennent successivement le libellé de la variable, le mot ou ensemble de caractères concernés, le libellé des modalités Présence / Absence utilisées après recodage.

Variable Mot ou Carac Modalités P/A Variable Mot ou Carac. Modalités
make make make / Nmk X650 650 650 / N65
address address addr / Nad lab lab lab / Nlb
all all all / Nal labs labs labs / Nls
X3d 3d 3d / N3d telnet telnet teln / Ntl
our our our / Nou X857 857 857 / N87
over over over / Nov data data data / Nda
remove remove remo / Nrm X415 415 415 / N41
internet internet inte / Nin X85 85 85 / N85
order order orde / Nor technology technology tech / Ntc
mail mail mail / Nma X1999 1999 1999/ N19
receive receive rece / Nrc parts parts part / Npr
will will will / Nwi pm pm pm / Npm
people people peop / Npp direct direct dire / Ndr
report report repo / Nrp cs cs cs / Ncs
addresses addresses adds / Nas meeting meeting meet/Nmt
free free free / Nfr original original orig / or
business business busi / Nbs project project proj / Npj
email email emai / Nem re re re / Nre
you you you / Nyo edu edu edu / Ned
credit credit cred / Ncr table table tabl / Ntb
your your your / Nyr conference conferenc e conf / Ncf
font order font / Nft CsemiCol ; Cscl / NCs
X000 000 000 / N00 Cpar ( Cpar / NCp
money money mone/ Nmn Ccroch [ Ccro / NCc
hp hp hp / Nhp Cexclam ! Cexc / NCe
hpl hpl hpl / Nhl Cdollar \$ Cdol / NCd
george george geor / Nge Cdiese # Cdie / NCi

Un deuxième tableau liste 4 variables dont celle dénombrant le nombre de lettres majuscules.

Tableau 2:Liste de 4 variables, de leur libellé et des modalités après recodage.

Code variable Libellé Modalités
Spam Type de message pourriel ou non Spam / Nsp
CapLM Nombre moyen de capitales par mot Mm1 / Mm2 / Mm3
CapLsup Nombre max de capitales par mot Ms1 / Ms2 / Ms3
CapLtot Nombre totale de lettres capitales Mt1 / Mt2 / Mt3

Préparation des données

Lecture

Les données, déjà bien nettoyées et préparées à partir des messages bruts sont disponibles le fichier spam.dat chargé avec ce calepin dans le même répertoire . Les lire avec les commandes suivantes:


In [42]:
spam <- read.table("spam.dat", header = TRUE)
spam[, 1] <- as.factor(spam[, 1])
summary(spam)


 spam          make           address            all              X3d          
 0:2788   Min.   :0.0000   Min.   : 0.000   Min.   :0.0000   Min.   : 0.00000  
 1:1813   1st Qu.:0.0000   1st Qu.: 0.000   1st Qu.:0.0000   1st Qu.: 0.00000  
          Median :0.0000   Median : 0.000   Median :0.0000   Median : 0.00000  
          Mean   :0.1046   Mean   : 0.213   Mean   :0.2807   Mean   : 0.06542  
          3rd Qu.:0.0000   3rd Qu.: 0.000   3rd Qu.:0.4200   3rd Qu.: 0.00000  
          Max.   :4.5400   Max.   :14.280   Max.   :5.1000   Max.   :42.81000  
      our               over            remove          internet      
 Min.   : 0.0000   Min.   :0.0000   Min.   :0.0000   Min.   : 0.0000  
 1st Qu.: 0.0000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.: 0.0000  
 Median : 0.0000   Median :0.0000   Median :0.0000   Median : 0.0000  
 Mean   : 0.3122   Mean   :0.0959   Mean   :0.1142   Mean   : 0.1053  
 3rd Qu.: 0.3800   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.: 0.0000  
 Max.   :10.0000   Max.   :5.8800   Max.   :7.2700   Max.   :11.1100  
     order              mail            receive             will       
 Min.   :0.00000   Min.   : 0.0000   Min.   :0.00000   Min.   :0.0000  
 1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
 Median :0.00000   Median : 0.0000   Median :0.00000   Median :0.1000  
 Mean   :0.09007   Mean   : 0.2394   Mean   :0.05982   Mean   :0.5417  
 3rd Qu.:0.00000   3rd Qu.: 0.1600   3rd Qu.:0.00000   3rd Qu.:0.8000  
 Max.   :5.26000   Max.   :18.1800   Max.   :2.61000   Max.   :9.6700  
     people            report           addresses           free        
 Min.   :0.00000   Min.   : 0.00000   Min.   :0.0000   Min.   : 0.0000  
 1st Qu.:0.00000   1st Qu.: 0.00000   1st Qu.:0.0000   1st Qu.: 0.0000  
 Median :0.00000   Median : 0.00000   Median :0.0000   Median : 0.0000  
 Mean   :0.09393   Mean   : 0.05863   Mean   :0.0492   Mean   : 0.2488  
 3rd Qu.:0.00000   3rd Qu.: 0.00000   3rd Qu.:0.0000   3rd Qu.: 0.1000  
 Max.   :5.55000   Max.   :10.00000   Max.   :4.4100   Max.   :20.0000  
    business          email             you             credit        
 Min.   :0.0000   Min.   :0.0000   Min.   : 0.000   Min.   : 0.00000  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.: 0.000   1st Qu.: 0.00000  
 Median :0.0000   Median :0.0000   Median : 1.310   Median : 0.00000  
 Mean   :0.1426   Mean   :0.1847   Mean   : 1.662   Mean   : 0.08558  
 3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.: 2.640   3rd Qu.: 0.00000  
 Max.   :7.1400   Max.   :9.0900   Max.   :18.750   Max.   :18.18000  
      your              font              X000            money         
 Min.   : 0.0000   Min.   : 0.0000   Min.   :0.0000   Min.   : 0.00000  
 1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.:0.0000   1st Qu.: 0.00000  
 Median : 0.2200   Median : 0.0000   Median :0.0000   Median : 0.00000  
 Mean   : 0.8098   Mean   : 0.1212   Mean   :0.1016   Mean   : 0.09427  
 3rd Qu.: 1.2700   3rd Qu.: 0.0000   3rd Qu.:0.0000   3rd Qu.: 0.00000  
 Max.   :11.1100   Max.   :17.1000   Max.   :5.4500   Max.   :12.50000  
       hp               hpl              george             X650       
 Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.0000   Min.   :0.0000  
 1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.:0.0000  
 Median : 0.0000   Median : 0.0000   Median : 0.0000   Median :0.0000  
 Mean   : 0.5495   Mean   : 0.2654   Mean   : 0.7673   Mean   :0.1248  
 3rd Qu.: 0.0000   3rd Qu.: 0.0000   3rd Qu.: 0.0000   3rd Qu.:0.0000  
 Max.   :20.8300   Max.   :16.6600   Max.   :33.3300   Max.   :9.0900  
      lab                labs            telnet              X857        
 Min.   : 0.00000   Min.   :0.0000   Min.   : 0.00000   Min.   :0.00000  
 1st Qu.: 0.00000   1st Qu.:0.0000   1st Qu.: 0.00000   1st Qu.:0.00000  
 Median : 0.00000   Median :0.0000   Median : 0.00000   Median :0.00000  
 Mean   : 0.09892   Mean   :0.1029   Mean   : 0.06475   Mean   :0.04705  
 3rd Qu.: 0.00000   3rd Qu.:0.0000   3rd Qu.: 0.00000   3rd Qu.:0.00000  
 Max.   :14.28000   Max.   :5.8800   Max.   :12.50000   Max.   :4.76000  
      data               X415              X85            technology     
 Min.   : 0.00000   Min.   :0.00000   Min.   : 0.0000   Min.   :0.00000  
 1st Qu.: 0.00000   1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.:0.00000  
 Median : 0.00000   Median :0.00000   Median : 0.0000   Median :0.00000  
 Mean   : 0.09723   Mean   :0.04784   Mean   : 0.1054   Mean   :0.09748  
 3rd Qu.: 0.00000   3rd Qu.:0.00000   3rd Qu.: 0.0000   3rd Qu.:0.00000  
 Max.   :18.18000   Max.   :4.76000   Max.   :20.0000   Max.   :7.69000  
     X1999           parts              pm               direct       
 Min.   :0.000   Min.   :0.0000   Min.   : 0.00000   Min.   :0.00000  
 1st Qu.:0.000   1st Qu.:0.0000   1st Qu.: 0.00000   1st Qu.:0.00000  
 Median :0.000   Median :0.0000   Median : 0.00000   Median :0.00000  
 Mean   :0.137   Mean   :0.0132   Mean   : 0.07863   Mean   :0.06483  
 3rd Qu.:0.000   3rd Qu.:0.0000   3rd Qu.: 0.00000   3rd Qu.:0.00000  
 Max.   :6.890   Max.   :8.3300   Max.   :11.11000   Max.   :4.76000  
       cs             meeting           original         project       
 Min.   :0.00000   Min.   : 0.0000   Min.   :0.0000   Min.   : 0.0000  
 1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.:0.0000   1st Qu.: 0.0000  
 Median :0.00000   Median : 0.0000   Median :0.0000   Median : 0.0000  
 Mean   :0.04367   Mean   : 0.1323   Mean   :0.0461   Mean   : 0.0792  
 3rd Qu.:0.00000   3rd Qu.: 0.0000   3rd Qu.:0.0000   3rd Qu.: 0.0000  
 Max.   :7.14000   Max.   :14.2800   Max.   :3.5700   Max.   :20.0000  
       re               edu              table            conference      
 Min.   : 0.0000   Min.   : 0.0000   Min.   :0.000000   Min.   : 0.00000  
 1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.:0.000000   1st Qu.: 0.00000  
 Median : 0.0000   Median : 0.0000   Median :0.000000   Median : 0.00000  
 Mean   : 0.3012   Mean   : 0.1798   Mean   :0.005444   Mean   : 0.03187  
 3rd Qu.: 0.1100   3rd Qu.: 0.0000   3rd Qu.:0.000000   3rd Qu.: 0.00000  
 Max.   :21.4200   Max.   :22.0500   Max.   :2.170000   Max.   :10.00000  
    CsemiCol            Cpar           Ccroch           Cexclam       
 Min.   :0.00000   Min.   :0.000   Min.   :0.00000   Min.   : 0.0000  
 1st Qu.:0.00000   1st Qu.:0.000   1st Qu.:0.00000   1st Qu.: 0.0000  
 Median :0.00000   Median :0.065   Median :0.00000   Median : 0.0000  
 Mean   :0.03857   Mean   :0.139   Mean   :0.01698   Mean   : 0.2691  
 3rd Qu.:0.00000   3rd Qu.:0.188   3rd Qu.:0.00000   3rd Qu.: 0.3150  
 Max.   :4.38500   Max.   :9.752   Max.   :4.08100   Max.   :32.4780  
    Cdollar            Cdiese             CapLM             CapLsup       
 Min.   :0.00000   Min.   : 0.00000   Min.   :   1.000   Min.   :   1.00  
 1st Qu.:0.00000   1st Qu.: 0.00000   1st Qu.:   1.588   1st Qu.:   6.00  
 Median :0.00000   Median : 0.00000   Median :   2.276   Median :  15.00  
 Mean   :0.07581   Mean   : 0.04424   Mean   :   5.191   Mean   :  52.17  
 3rd Qu.:0.05200   3rd Qu.: 0.00000   3rd Qu.:   3.706   3rd Qu.:  43.00  
 Max.   :6.00300   Max.   :19.82900   Max.   :1102.500   Max.   :9989.00  
    CapLtot       
 Min.   :    1.0  
 1st Qu.:   35.0  
 Median :   95.0  
 Mean   :  283.3  
 3rd Qu.:  266.0  
 Max.   :15841.0  

In [43]:
dim(spam)
print(str(spam))


  1. 4601
  2. 58
'data.frame':	4601 obs. of  58 variables:
 $ spam      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
 $ make      : num  0 0.21 0.06 0 0 0 0 0 0.15 0.06 ...
 $ address   : num  0.64 0.28 0 0 0 0 0 0 0 0.12 ...
 $ all       : num  0.64 0.5 0.71 0 0 0 0 0 0.46 0.77 ...
 $ X3d       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ our       : num  0.32 0.14 1.23 0.63 0.63 1.85 1.92 1.88 0.61 0.19 ...
 $ over      : num  0 0.28 0.19 0 0 0 0 0 0 0.32 ...
 $ remove    : num  0 0.21 0.19 0.31 0.31 0 0 0 0.3 0.38 ...
 $ internet  : num  0 0.07 0.12 0.63 0.63 1.85 0 1.88 0 0 ...
 $ order     : num  0 0 0.64 0.31 0.31 0 0 0 0.92 0.06 ...
 $ mail      : num  0 0.94 0.25 0.63 0.63 0 0.64 0 0.76 0 ...
 $ receive   : num  0 0.21 0.38 0.31 0.31 0 0.96 0 0.76 0 ...
 $ will      : num  0.64 0.79 0.45 0.31 0.31 0 1.28 0 0.92 0.64 ...
 $ people    : num  0 0.65 0.12 0.31 0.31 0 0 0 0 0.25 ...
 $ report    : num  0 0.21 0 0 0 0 0 0 0 0 ...
 $ addresses : num  0 0.14 1.75 0 0 0 0 0 0 0.12 ...
 $ free      : num  0.32 0.14 0.06 0.31 0.31 0 0.96 0 0 0 ...
 $ business  : num  0 0.07 0.06 0 0 0 0 0 0 0 ...
 $ email     : num  1.29 0.28 1.03 0 0 0 0.32 0 0.15 0.12 ...
 $ you       : num  1.93 3.47 1.36 3.18 3.18 0 3.85 0 1.23 1.67 ...
 $ credit    : num  0 0 0.32 0 0 0 0 0 3.53 0.06 ...
 $ your      : num  0.96 1.59 0.51 0.31 0.31 0 0.64 0 2 0.71 ...
 $ font      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ X000      : num  0 0.43 1.16 0 0 0 0 0 0 0.19 ...
 $ money     : num  0 0.43 0.06 0 0 0 0 0 0.15 0 ...
 $ hp        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ hpl       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ george    : num  0 0 0 0 0 0 0 0 0 0 ...
 $ X650      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ lab       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ labs      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ telnet    : num  0 0 0 0 0 0 0 0 0 0 ...
 $ X857      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ data      : num  0 0 0 0 0 0 0 0 0.15 0 ...
 $ X415      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ X85       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ technology: num  0 0 0 0 0 0 0 0 0 0 ...
 $ X1999     : num  0 0.07 0 0 0 0 0 0 0 0 ...
 $ parts     : num  0 0 0 0 0 0 0 0 0 0 ...
 $ pm        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ direct    : num  0 0 0.06 0 0 0 0 0 0 0 ...
 $ cs        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ meeting   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ original  : num  0 0 0.12 0 0 0 0 0 0.3 0 ...
 $ project   : num  0 0 0 0 0 0 0 0 0 0.06 ...
 $ re        : num  0 0 0.06 0 0 0 0 0 0 0 ...
 $ edu       : num  0 0 0.06 0 0 0 0 0 0 0 ...
 $ table     : num  0 0 0 0 0 0 0 0 0 0 ...
 $ conference: num  0 0 0 0 0 0 0 0 0 0 ...
 $ CsemiCol  : num  0 0 0.01 0 0 0 0 0 0 0.04 ...
 $ Cpar      : num  0 0.132 0.143 0.137 0.135 0.223 0.054 0.206 0.271 0.03 ...
 $ Ccroch    : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Cexclam   : num  0.778 0.372 0.276 0.137 0.135 0 0.164 0 0.181 0.244 ...
 $ Cdollar   : num  0 0.18 0.184 0 0 0 0.054 0 0.203 0.081 ...
 $ Cdiese    : num  0 0.048 0.01 0 0 0 0 0 0.022 0 ...
 $ CapLM     : num  3.76 5.11 9.82 3.54 3.54 ...
 $ CapLsup   : int  61 101 485 40 40 15 4 11 445 43 ...
 $ CapLtot   : int  278 1028 2259 191 191 54 112 49 1257 749 ...
NULL

Description élémentaire

Q Commenter les distributions des variables (symmétrie, nombre de "0"). Quelle est la principale catractéristique de la matrice étudiée?

Caractéristique très généralement rencontrée en text mining.


In [44]:
par(mfrow = c(1, 2))
options(repr.plot.width = 5, repr.plot.height = 3)
boxplot(spam[, "all"]); hist(spam[, "all"], main = "")



In [45]:
par(mfrow = c(1,2))
boxplot(spam[, "CapLtot"]); hist(spam[, "CapLtot"], main = "", xlab = "")



In [46]:
boxplot(spam[, 2:55])
print(mean(spam[, -1] == 0))


[1] 0.774149

In [47]:
boxplot(spam[, 56:58])


Q Commenter le choix de la transformation.


In [48]:
par(mfrow = c(1,2))
varName <- names(spam)[58]
boxplot(log(1 + spam[, varName]), main = varName)
hist(log(1 + spam[, varName]), main = "", xlab = "")



In [49]:
Lspam <- data.frame("spam" = spam[, 1], log(1 + spam[, -1]))

Approche "quantitative"

Analyse en composantes principales

Ce sont d'abord les variables quantitatives (nombres d'occurences) qui sont étudiées pour tenter de caractériser les spams. Ces variables sont toutes transformées selon les remarques de la première partie.

Une première ACP est calculée.


In [50]:
library(FactoMineR)
res.pca <- PCA(Lspam, scale.unit = FALSE, quali.sup = 1, graph = FALSE)
options(repr.plot.width = 5, repr.plot.height = 5)
plot(res.pca,choix = "var")


Q Que dire de cette représentation? Quel est le problème rencontré? Quelle est la matrice diagonalisée? Que serait-il préférable de faire?

En conséquence, une autre ACP est calculée fournissant un début de tableau ci-dessous.


In [51]:
res.pca <- PCA(Lspam, scale.unit = TRUE, quali.sup = 1, graph = FALSE)
summary(res.pca)


Call:
PCA(X = Lspam, scale.unit = TRUE, quali.sup = 1, graph = FALSE) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               7.628   5.146   2.256   1.823   1.633   1.462   1.409
% of var.             13.383   9.028   3.957   3.199   2.865   2.566   2.473
Cumulative % of var.  13.383  22.411  26.368  29.567  32.432  34.998  37.471
                       Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13  Dim.14
Variance               1.365   1.328   1.235   1.205   1.170   1.081   1.063
% of var.              2.394   2.330   2.167   2.114   2.053   1.896   1.865
Cumulative % of var.  39.865  42.195  44.362  46.476  48.528  50.425  52.289
                      Dim.15  Dim.16  Dim.17  Dim.18  Dim.19  Dim.20  Dim.21
Variance               1.035   1.030   1.008   0.990   0.977   0.948   0.938
% of var.              1.816   1.807   1.769   1.738   1.714   1.663   1.646
Cumulative % of var.  54.105  55.913  57.682  59.419  61.133  62.796  64.442
                      Dim.22  Dim.23  Dim.24  Dim.25  Dim.26  Dim.27  Dim.28
Variance               0.902   0.900   0.873   0.847   0.832   0.825   0.812
% of var.              1.582   1.579   1.531   1.487   1.459   1.448   1.425
Cumulative % of var.  66.024  67.603  69.134  70.621  72.080  73.529  74.954
                      Dim.29  Dim.30  Dim.31  Dim.32  Dim.33  Dim.34  Dim.35
Variance               0.799   0.779   0.744   0.733   0.713   0.696   0.686
% of var.              1.401   1.366   1.306   1.286   1.250   1.221   1.204
Cumulative % of var.  76.355  77.721  79.027  80.313  81.563  82.785  83.988
                      Dim.36  Dim.37  Dim.38  Dim.39  Dim.40  Dim.41  Dim.42
Variance               0.663   0.657   0.644   0.612   0.602   0.555   0.547
% of var.              1.164   1.152   1.129   1.074   1.056   0.974   0.960
Cumulative % of var.  85.152  86.304  87.433  88.507  89.563  90.537  91.497
                      Dim.43  Dim.44  Dim.45  Dim.46  Dim.47  Dim.48  Dim.49
Variance               0.529   0.485   0.446   0.437   0.416   0.394   0.383
% of var.              0.928   0.850   0.782   0.766   0.731   0.691   0.672
Cumulative % of var.  92.425  93.275  94.057  94.823  95.554  96.245  96.916
                      Dim.50  Dim.51  Dim.52  Dim.53  Dim.54  Dim.55  Dim.56
Variance               0.371   0.302   0.276   0.265   0.239   0.218   0.077
% of var.              0.651   0.530   0.484   0.465   0.420   0.383   0.134
Cumulative % of var.  97.567  98.098  98.582  99.047  99.467  99.850  99.984
                      Dim.57
Variance               0.009
% of var.              0.016
Cumulative % of var. 100.000

Individuals (the 10 first)
               Dist    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3
1          |  4.211 | -1.463  0.006  0.121 |  0.542  0.001  0.017 | -0.501
2          |  5.275 | -2.659  0.020  0.254 |  3.077  0.040  0.340 | -0.095
3          |  9.493 | -3.195  0.029  0.113 |  5.153  0.112  0.295 |  1.217
4          |  4.200 | -1.478  0.006  0.124 |  0.843  0.003  0.040 | -0.277
5          |  4.200 | -1.479  0.006  0.124 |  0.841  0.003  0.040 | -0.278
6          |  6.093 | -0.420  0.001  0.005 | -0.857  0.003  0.020 | -0.238
7          |  6.302 | -1.512  0.007  0.058 |  0.361  0.001  0.003 | -1.668
8          |  6.151 | -0.384  0.000  0.004 | -1.009  0.004  0.027 | -0.387
9          |  9.965 | -2.793  0.022  0.079 |  4.464  0.084  0.201 |  1.567
10         |  3.396 | -1.511  0.007  0.198 |  0.660  0.002  0.038 | -0.220
              ctr   cos2  
1           0.002  0.014 |
2           0.000  0.000 |
3           0.014  0.016 |
4           0.001  0.004 |
5           0.001  0.004 |
6           0.001  0.002 |
7           0.027  0.070 |
8           0.001  0.004 |
9           0.024  0.025 |
10          0.000  0.004 |

Variables (the 10 first)
              Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2
make       | -0.209  0.575  0.044 |  0.275  1.472  0.076 | -0.090  0.358  0.008
address    | -0.111  0.161  0.012 |  0.102  0.203  0.010 | -0.029  0.038  0.001
all        | -0.247  0.801  0.061 |  0.316  1.943  0.100 | -0.081  0.294  0.007
X3d        | -0.041  0.022  0.002 |  0.047  0.044  0.002 |  0.064  0.181  0.004
our        | -0.214  0.600  0.046 |  0.271  1.432  0.074 | -0.164  1.192  0.027
over       | -0.232  0.705  0.054 |  0.289  1.620  0.083 | -0.065  0.188  0.004
remove     | -0.250  0.818  0.062 |  0.272  1.439  0.074 | -0.135  0.803  0.018
internet   | -0.197  0.511  0.039 |  0.275  1.464  0.075 | -0.039  0.066  0.001
order      | -0.247  0.800  0.061 |  0.419  3.404  0.175 |  0.150  0.995  0.022
mail       | -0.156  0.318  0.024 |  0.371  2.682  0.138 |  0.118  0.621  0.014
            
make       |
address    |
all        |
X3d        |
our        |
over       |
remove     |
internet   |
order      |
mail       |

Supplementary categories
                Dist     Dim.1    cos2  v.test     Dim.2    cos2  v.test  
0          |   1.551 |   1.153   0.553  35.104 |  -0.986   0.404 -36.557 |
1          |   2.385 |  -1.773   0.553 -35.104 |   1.516   0.404  36.557 |
             Dim.3    cos2  v.test  
0            0.174   0.013   9.756 |
1           -0.268   0.013  -9.756 |

Q Comment s'interprètent les eigenvalues? Quel choix de dimension ou nombre de composantes retenues, donnerait la règle dite de Kaiser? Cette règle est-elle raisonnablement applicable?

Q Que sont les graphiques ci-dessous? Quel choix de dimension suggèrent-ils?


In [52]:
par(mfrow = c(1,2))
options(repr.plot.width = 8, repr.plot.height = 3)
barplot(res.pca$eig[, 1], main = "Eigenvalues", names.arg = 1:nrow(res.pca$eig))
boxplot(res.pca$ind$coord)


Q Le graphique ci-dessous des variables est difficile à lire. Identifier néanmoins quelques variables permettant une première interprétation élémentaire des axes.


In [53]:
options(repr.plot.width = 5, repr.plot.height = 5)
plot(res.pca,choix = "var", cex = 0.6)


Q Le graphique suivant représente les "individus"; les points rouges identifient les pourriels. Caractérisez sommairement les deux types de messages. A la vue de ce graphique, pensez vous facile de discriminer linéairement les deux groupes?


In [54]:
plot(res.pca, choix = "ind", habillage = 1, cex = 0.1)


Q Compléter l'interprétation des axes et la caractérisation des variables vis-à-vis du type de message.


In [55]:
res.pca <- PCA(Lspam, scale.unit = FALSE, quali.sup = 1, graph = FALSE)

In [56]:
dimdesc(res.pca, axes = c(1,2))


$Dim.1
$quanti
A matrix: 48 × 2 of type dbl
correlationp.value
CapLtot 0.96045277 0.000000e+00
CapLsup 0.95669619 0.000000e+00
CapLM 0.72683749 0.000000e+00
order 0.411590061.229503e-187
your 0.366730911.823897e-146
Cdollar 0.361855512.275266e-142
X000 0.313813261.097187e-105
mail 0.29256054 1.758706e-91
all 0.27810132 1.730871e-82
business 0.27604822 2.965831e-81
Cexclam 0.26734913 3.828927e-76
receive 0.26666128 9.531768e-76
addresses 0.25979547 7.394829e-72
money 0.25494799 3.513263e-69
credit 0.24539537 4.510063e-64
over 0.23766698 4.239475e-60
our 0.22222408 1.397166e-52
will 0.22202914 1.724254e-52
email 0.20915391 1.193907e-46
make 0.20673980 1.348805e-45
remove 0.20448880 1.258646e-44
internet 0.20105496 3.610154e-43
free 0.19658185 2.609738e-41
you 0.19497112 1.188712e-40
people 0.19089685 5.186524e-39
report 0.17514613 5.122326e-33
Cdiese 0.16719034 3.399511e-30
font 0.15181465 3.973389e-25
CsemiCol 0.08925074 1.324491e-09
X3d 0.08062619 4.341657e-08
address 0.07161935 1.156701e-06
Cpar 0.07073979 1.562736e-06
X1999 0.06004651 4.590254e-05
direct 0.03125928 3.398242e-02
pm-0.03442660 1.953103e-02
X650-0.03480554 1.822785e-02
cs-0.03753537 1.088856e-02
hpl-0.03822136 9.519172e-03
telnet-0.03898231 8.181584e-03
X415-0.03901957 8.120637e-03
X857-0.04386316 2.921386e-03
labs-0.05258496 3.592053e-04
edu-0.08948913 1.196877e-09
lab-0.09009189 9.253297e-10
project-0.09039054 8.140625e-10
meeting-0.12316607 5.111261e-17
re-0.18394773 2.672227e-36
george-0.368583094.854334e-148
$quali
A matrix: 1 × 2 of type dbl
R2p.value
spam0.27516779.881313e-324
$category
A matrix: 2 × 2 of type dbl
Estimatep.value
spam=1 1.083989.881313e-324
spam=0-1.083989.881313e-324
$Dim.2
$quanti
A matrix: 50 × 2 of type dbl
correlationp.value
hp 0.71474071 0.000000e+00
hpl 0.61346144 0.000000e+00
technology 0.496826801.907507e-285
labs 0.489033562.648977e-275
X650 0.482678513.173162e-267
X85 0.477495279.226440e-261
telnet 0.457872052.814229e-237
X857 0.439908804.356313e-217
X415 0.437874177.083284e-215
lab 0.365880389.565787e-146
direct 0.351639775.132629e-134
Cpar 0.329601735.035515e-117
X1999 0.321097277.837274e-111
george 0.28431347 2.753929e-86
original 0.21920929 3.533774e-51
data 0.17332914 2.323041e-32
pm 0.15536257 2.982828e-26
Ccroch 0.14003517 1.385517e-21
CapLtot 0.11768297 1.164127e-15
CsemiCol 0.11579336 3.307477e-15
conference 0.08508291 7.463599e-09
meeting 0.08350090 1.409006e-08
project 0.08030786 4.906463e-08
cs 0.05603715 1.429585e-04
table 0.03135401 3.344430e-02
re-0.03978588 6.954021e-03
CapLM-0.04708625 1.399297e-03
order-0.06590502 7.675851e-06
addresses-0.08514279 7.284577e-09
internet-0.10868166 1.447988e-13
address-0.11021150 6.552692e-14
will-0.11051177 5.601113e-14
mail-0.11929455 4.714494e-16
credit-0.12950695 1.151580e-18
people-0.13829377 4.370416e-21
email-0.15913954 1.770176e-27
over-0.16506206 1.832809e-29
business-0.17122156 1.314235e-31
X000-0.18464449 1.444640e-36
make-0.18605344 4.133763e-37
Cdollar-0.19391915 3.176917e-40
receive-0.20881804 1.675962e-46
all-0.22858215 1.310502e-55
our-0.23060897 1.356618e-56
money-0.24388504 2.765737e-63
remove-0.24821421 1.477683e-65
free-0.28892707 3.592728e-89
Cexclam-0.346647844.796839e-130
your-0.54328169 0.000000e+00
you-0.72320672 0.000000e+00
$quali
A matrix: 1 × 2 of type dbl
R2p.value
spam0.20390734.801598e-230
$category
A matrix: 2 × 2 of type dbl
Estimatep.value
spam=0 0.38018384.801598e-230
spam=1-0.38018384.801598e-230

Analyse en composantes principales à noyau (kernel PCA)

L'ACP à noyau permet de tenir compte de non-linéarités, en réalisant une ACP classique dans un espace cible ("feature space") obtenu en appliquant une transformation non linéaire, à partir d'un noyau de covariance k(x, x'). L'espace cible est "engendré" par les fonctions x -> k(x, .). Seul le noyau a donc besoin d'être spécifié.


In [87]:
library(kernlab)
set.seed(1)
subset <- sample(nrow(Lspam), size = 500)
mydata <- spam[subset, ]
mydataL <- Lspam[subset, ]

# scale the data
mydata[, -1] <- scale(mydata[, -1]) 
mydataL[, -1] <- scale(mydataL[, -1])

# standard PCA on scaled data (centered, variance 1), with the "spam" column
vpc <- kpca(~., data = mydata, kernel = "vanilladot", 
                   kpar = list())
vpcL <- kpca(~., data = mydataL, kernel = "vanilladot", 
                   kpar = list())

# kernel PCA on scaled data (centered, variance 1), with the "spam column"
kpc <- kpca(~., data = mydata, kernel = "anovadot", 
                   kpar = list(sigma = 5, degree = 1))
kpcL <- kpca(~., data = mydataL, kernel = "anovadot", 
                   kpar = list(sigma = 5, degree = 1))

# eigenvalues
par(mfrow = c(1, 2))
vEigRatio <- eig(vpcL)/sum(eig(vpcL))
kEigRatio <- eig(kpcL)/sum(eig(kpcL))
barplot(vEigRatio[1:20]); barplot(kEigRatio[1:20])

#plot the data projection on the components
par(mfrow = c(2, 2))
cex <- 0.2
col <- as.integer(Lspam[subset, 1])
col[col == 1] <- "grey"
plot(rotated(vpc), col = col, cex = cex,
     xlab = "1st Principal Component", ylab = "2nd Principal Component", main = "PCA (raw data)")
plot(rotated(kpc), col = col, cex = cex,
     xlab = "1st Principal Component", ylab = "2nd Principal Component", main = "kernel PCA (raw data)")
plot(rotated(vpcL), col = col, cex = cex,
     xlab = "1st Principal Component", ylab = "2nd Principal Component", main = "PCA (log data)")
plot(rotated(kpcL), col = col, cex = cex,
     xlab = "1st Principal Component", ylab = "2nd Principal Component", main = "kernel PCA (log data)")


Q Quel pourrait être l'intérêt de l'ACP à noyau ici ? A quoi correspond la valeur élevée (sigma = 5) du paramètre du noyau ? Pourquoi les résultats sont-ils similaires sur les données brutes et les données transformées ? Que se passe t-il si sigma est plus faible ? Et pour d'autres types de noyaux ?

Fin du mirage : Relancer le code ci-dessus en retirant la colonne "spam" pour réaliser les ACP ...

Classification des variables

Ces résultat ne sont pas satisfaisants, notamment à cause du nombre de variables. Une classification de celles-ci pourrait aider à l'interprétation.

Classification ascendante hiérarchique

Q Quelle est, ci-dessous, la distance calculée entre les "variables"? Est-elle euclidienne? Quelle autre distance aurait pu être utilisée?


In [107]:
dist.var <- as.dist(1 - cor(Lspam[2:58])^2)

Q Quelle est la méthode utilisée ci-dessous et avec quelle option? Quelles autres options sont disponibles?


In [108]:
clas.var <- hclust(dist.var, method = "ward.D")

Q Comment choisir le nombre de classes? Justifier.


In [109]:
options(repr.plot.width = 3, repr.plot.height = 3)
plot(clas.var$height[56:40])


Q Comment sont mesurées les distances entre sous-groupes de variables ? Retrouvez dans le dendrogramme les deux classes de variables les plus explicites pour caractériser les messages.


In [85]:
options(repr.plot.width = 8, repr.plot.height = 5)
plot(clas.var)


Représentation par positionnement multidimensionnel (MDS)

Représentation des classes dans le premier plan du MDS.

Q La représentation obtenue ci-dessous est assez similaire à celle de l’ACP. Pourquoi selon-vous ?


In [103]:
rS <- cor(Lspam[-1])
dS2 <- sqrt(1 - rS^2)
dN <- names(Lspam[-1])
mdspam <- cmdscale(dS2, k = 2)
options(repr.plot.width = 6, repr.plot.height = 6)
plot(mdspam, type = "n", xlab = "", ylab = "", main = "")
text(mdspam, dN)
abline(v = 0, h = 0)


Représentation de 4 classes de variables dans les coordonnées du MDS


In [114]:
classes <- cutree(clas.var, k = 4)
#sort(classes)
print(classes)
names(classes[classes == 2]) #variables de la classe 2
coul <- classes
plot(mdspam, type = "n", xlab = "Dimension 1", ylab = "Dimension 2", main = "CAH euclid")
text(mdspam, dN, col = coul)


      make    address        all        X3d        our       over     remove 
         1          1          1          1          1          1          1 
  internet      order       mail    receive       will     people     report 
         1          1          1          1          1          1          1 
 addresses       free   business      email        you     credit       your 
         1          1          1          1          1          1          1 
      font       X000      money         hp        hpl     george       X650 
         1          1          1          2          2          1          2 
       lab       labs     telnet       X857       data       X415        X85 
         3          2          3          3          1          3          2 
technology      X1999      parts         pm     direct         cs    meeting 
         2          1          1          1          3          1          1 
  original    project         re        edu      table conference   CsemiCol 
         1          1          1          1          1          1          1 
      Cpar     Ccroch    Cexclam    Cdollar     Cdiese      CapLM    CapLsup 
         1          1          1          1          1          4          4 
   CapLtot 
         4 
  1. 'hp'
  2. 'hpl'
  3. 'X650'
  4. 'labs'
  5. 'X85'
  6. 'technology'

Q Retrouve-t-on des éléments d'interprétation des variables dans l'ACP?

Approche "qualitative" par Analyse des Correspondances Multiple (AFCM)

Les distributions des variables les rendent peu adaptées à une ACP. La matrice des données est en fait très creuse (beaucoup de 0). Une autre piste est suivie en considérant les variables qualitatives : présence / absence, d’un mot ou caractère.

Recodage

C'est souvent la partie la plus fastidieuse du travail: recoder en classe, c'est-à-dire transformer en facteur, chaque variable. Le point important est de donner à chaque modalité un identificateur suffisamment explicite pour que les sorties graphiques soient lisibles et ce d'autant plus qu'il y a de variables à traiter.

Les commandes suivantes on été utilisées pour l'obtention du fichier spamq.dat. Elles sont données à titre d'exemple.

Recodage en présence / absence des variables ou mots.

spamq <- data.frame(matrix(as.factor(as.matrix(spam[, 2:55] > 0)), ncol = 54))

Les niveaux des facteurs sont renommés. Voici un exemple désignant la présence (make) et son absence (Nmk) de la variable make.

make <- factor(spamq[, "make"], c(TRUE, FALSE), labels = c("make", "Nmk"))

Les variables dénombrant les lettres majuscules sont traitées à part avec la commande suivante.

Q Quelles sont les bornes des classes, que peut-on dire des effectifs de chacune d’elles ?

CapLMq <-cut(spam[, "CapLM"], breaks=quantile
      (spam[, "CapLM"], probs = seq(0, 1, 1/3)), 
      labels = c("Mm1", "Mm2", "Mm3"),
      include.lowest = TRUE)

Enfin, toutes variables sont regoupées dans la même base et sauvegardées.

Il suffit de relire le fichier:


In [115]:
spam.quali <- read.table("spamq.dat")
summary(spam.quali)


   make      address      all        X3d        our         over     
 make:1053   addr: 898   all:1888   3d :  47   Nou:2853   Nov :3602  
 Nmk :3548   Nad :3703   Nal:2713   N3d:4554   our:1748   over: 999  
                                                                     
  remove     internet     order        mail      receive       will     
 Nrm :3794   inte: 824   Nor :3828   mail:1302   Nrc :3892   Nwi :2276  
 remo: 807   Nin :3777   orde: 773   Nma :3299   rece: 709   will:2325  
                                                                        
  people      report     addresses     free      business     email     
 Npp :3749   Nrp :4244   adds: 336   free:1241   busi: 963   emai:1038  
 peop: 852   repo: 357   Nas :4265   Nfr :3360   Nbs :3638   Nem :3563  
                                                                        
  you        credit       your        font       X000       money     
 Nyo:1374   cred: 424   Nyr :2178   font: 773   000: 679   mone: 735  
 you:3227   Ncr :4177   your:2423   Nft :3828   N00:3922   Nmn :3866  
                                                                      
   hp        hpl        george      X650       lab         labs     
 hp :1090   hpl: 811   geor: 780   650: 463   lab: 372   labs: 469  
 Nhp:3511   Nhl:3790   Nge :3821   N65:4138   Nlb:4229   Nls :4132  
                                                                    
  telnet      X857        data       X415       X85       technology 
 Ntl :4308   857: 205   data: 405   415: 215   85 : 485   Ntc :4002  
 teln: 293   N87:4396   Nda :4196   N41:4386   N85:4116   tech: 599  
                                                                     
  X1999       parts        pm        direct       cs       meeting    
 1999: 829   Npr :4518   Npm:4217   dire: 453   cs : 148   meet: 341  
 N19 :3772   part:  83   pm : 384   Ndr :4148   Ncs:4453   Nmt :4260  
                                                                      
 original    project       re        edu        table      conference 
 or  :4226   Npj :4274   Nre:3290   edu: 517   Ntb :4538   conf: 203  
 orig: 375   proj: 327   re :1311   Ned:4084   tabl:  63   Ncf :4398  
                                                                      
 CsemiCol      Cpar       Ccroch     Cexclam     Cdollar      Cdiese    
 Cscl: 790   Cpar:2715   Ccro: 529   Cexc:2258   Cdol:1400   Cdie: 750  
 NCs :3811   NCp :1886   NCc :4072   NCe :2343   NCd :3201   NCi :3851  
                                                                        
 CapLMq     CapLsupq   CapLtotq    spamf     
 Mm1:1534   Ms1:1650   Mt1:1537   Nsp :2788  
 Mm2:1534   Ms2:1456   Mt2:1530   spam:1813  
 Mm3:1533   Ms3:1495   Mt3:1534              

Analyse Factorielle des Correspondances Multiples

Après le calcul de l'AFCM, une kyrielle de graphiques peuvent être construits. Certains sont proposés mais d'autres sont sans doute plus pertinents pour arriver à représenter au mieux la structure des données et expliquer les caractéristiques des spams.

Q L’analyse factorielle des correspondances multiples est exécutée dans FactoMineR avec la commande suivante. Que signifie l’option quali.sup ?


In [116]:
afc <- MCA(spam.quali, quali.sup = c(32,34,58))
summary(afc)


Call:
MCA(X = spam.quali, quali.sup = c(32, 34, 58)) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               0.188   0.117   0.041   0.036   0.031   0.029   0.025
% of var.             17.868  11.056   3.908   3.397   2.962   2.767   2.418
Cumulative % of var.  17.868  28.923  32.832  36.229  39.191  41.958  44.376
                       Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13  Dim.14
Variance               0.024   0.022   0.021   0.020   0.019   0.018   0.017
% of var.              2.244   2.090   1.956   1.896   1.836   1.748   1.656
Cumulative % of var.  46.620  48.710  50.667  52.562  54.399  56.147  57.803
                      Dim.15  Dim.16  Dim.17  Dim.18  Dim.19  Dim.20  Dim.21
Variance               0.017   0.017   0.016   0.016   0.015   0.015   0.014
% of var.              1.616   1.600   1.498   1.475   1.437   1.418   1.368
Cumulative % of var.  59.419  61.019  62.517  63.992  65.429  66.847  68.216
                      Dim.22  Dim.23  Dim.24  Dim.25  Dim.26  Dim.27  Dim.28
Variance               0.014   0.014   0.013   0.013   0.013   0.013   0.012
% of var.              1.341   1.306   1.270   1.243   1.236   1.185   1.146
Cumulative % of var.  69.556  70.862  72.132  73.375  74.611  75.797  76.942
                      Dim.29  Dim.30  Dim.31  Dim.32  Dim.33  Dim.34  Dim.35
Variance               0.012   0.012   0.011   0.011   0.011   0.011   0.011
% of var.              1.132   1.098   1.076   1.063   1.050   1.032   1.024
Cumulative % of var.  78.074  79.172  80.249  81.312  82.362  83.394  84.418
                      Dim.36  Dim.37  Dim.38  Dim.39  Dim.40  Dim.41  Dim.42
Variance               0.010   0.010   0.010   0.010   0.009   0.009   0.009
% of var.              0.985   0.953   0.944   0.914   0.899   0.877   0.845
Cumulative % of var.  85.402  86.356  87.299  88.213  89.112  89.989  90.834
                      Dim.43  Dim.44  Dim.45  Dim.46  Dim.47  Dim.48  Dim.49
Variance               0.009   0.009   0.008   0.008   0.008   0.008   0.007
% of var.              0.822   0.816   0.782   0.766   0.750   0.738   0.711
Cumulative % of var.  91.656  92.471  93.253  94.020  94.770  95.508  96.219
                      Dim.50  Dim.51  Dim.52  Dim.53  Dim.54  Dim.55  Dim.56
Variance               0.007   0.007   0.006   0.005   0.005   0.004   0.004
% of var.              0.673   0.617   0.578   0.504   0.429   0.377   0.344
Cumulative % of var.  96.892  97.509  98.087  98.591  99.020  99.397  99.742
                      Dim.57  Dim.58
Variance               0.003   0.000
% of var.              0.258   0.000
Cumulative % of var. 100.000 100.000

Individuals (the 10 first)
        Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2  
1    |  0.170  0.003  0.051 | -0.222  0.009  0.087 | -0.195  0.020  0.068 |
2    |  1.095  0.138  0.617 | -0.133  0.003  0.009 | -0.063  0.002  0.002 |
3    |  1.282  0.190  0.642 |  0.059  0.001  0.001 |  0.022  0.000  0.000 |
4    |  0.492  0.028  0.253 | -0.181  0.006  0.034 | -0.102  0.005  0.011 |
5    |  0.492  0.028  0.253 | -0.181  0.006  0.034 | -0.102  0.005  0.011 |
6    | -0.263  0.008  0.142 | -0.113  0.002  0.026 | -0.052  0.001  0.006 |
7    |  0.107  0.001  0.018 | -0.215  0.009  0.074 | -0.191  0.019  0.058 |
8    | -0.289  0.010  0.172 | -0.146  0.004  0.044 | -0.004  0.000  0.000 |
9    |  0.778  0.070  0.364 | -0.040  0.000  0.001 |  0.034  0.001  0.001 |
10   |  0.811  0.076  0.362 | -0.112  0.002  0.007 |  0.244  0.031  0.033 |

Categories (the 10 first)
         Dim.1     ctr    cos2  v.test     Dim.2     ctr    cos2  v.test  
make |   1.071   2.535   0.341  39.586 |   0.147   0.078   0.006   5.445 |
Nmk  |  -0.318   0.752   0.341 -39.586 |  -0.044   0.023   0.006  -5.445 |
addr |   1.123   2.373   0.306  37.494 |  -0.060   0.011   0.001  -2.001 |
Nad  |  -0.272   0.576   0.306 -37.494 |   0.015   0.003   0.001   2.001 |
all  |   0.763   2.308   0.406  43.197 |   0.048   0.015   0.002   2.715 |
Nal  |  -0.531   1.606   0.406 -43.197 |  -0.033   0.010   0.002  -2.715 |
3d   |   0.735   0.053   0.006   5.068 |  -0.121   0.002   0.000  -0.836 |
N3d  |  -0.008   0.001   0.006  -5.068 |   0.001   0.000   0.000   0.836 |
Nou  |  -0.462   1.277   0.348 -40.025 |  -0.034   0.012   0.002  -2.989 |
our  |   0.754   2.084   0.348  40.025 |   0.056   0.019   0.002   2.989 |
       Dim.3     ctr    cos2  v.test  
make   0.333   1.117   0.033  12.287 |
Nmk   -0.099   0.331   0.033 -12.287 |
addr  -0.102   0.090   0.003  -3.413 |
Nad    0.025   0.022   0.003   3.413 |
all    0.098   0.174   0.007   5.547 |
Nal   -0.068   0.121   0.007  -5.547 |
3d    -0.336   0.051   0.001  -2.313 |
N3d    0.003   0.001   0.001   2.313 |
Nou    0.018   0.009   0.001   1.545 |
our   -0.029   0.014   0.001  -1.545 |

Categorical variables (eta2)
           Dim.1 Dim.2 Dim.3  
make     | 0.341 0.006 0.033 |
address  | 0.306 0.001 0.003 |
all      | 0.406 0.002 0.007 |
X3d      | 0.006 0.000 0.001 |
our      | 0.348 0.002 0.001 |
over     | 0.368 0.000 0.017 |
remove   | 0.263 0.029 0.076 |
internet | 0.322 0.000 0.003 |
order    | 0.455 0.003 0.056 |
mail     | 0.317 0.007 0.012 |

Supplementary categories
         Dim.1    cos2  v.test     Dim.2    cos2  v.test     Dim.3    cos2
857  |  -0.501   0.012  -7.339 |   3.232   0.487  47.333 |  -1.430   0.095
N87  |   0.023   0.012   7.339 |  -0.151   0.487 -47.333 |   0.067   0.095
415  |  -0.438   0.009  -6.575 |   3.073   0.463  46.138 |  -1.373   0.092
N41  |   0.021   0.009   6.575 |  -0.151   0.463 -46.138 |   0.067   0.092
Nsp  |  -0.501   0.386 -42.161 |   0.255   0.100  21.416 |   0.287   0.127
spam |   0.771   0.386  42.161 |  -0.392   0.100 -21.416 |  -0.442   0.127
      v.test  
857  -20.941 |
N87   20.941 |
415  -20.621 |
N41   20.621 |
Nsp   24.162 |
spam -24.162 |

Supplementary categorical variables (eta2)
        Dim.1 Dim.2 Dim.3  
X857  | 0.012 0.487 0.095 |
X415  | 0.009 0.463 0.092 |
spamf | 0.386 0.100 0.127 |

Q Que sont les eigenvalues du tableau précédents? Comment s'interprètent ces valeurs ?

Q Quelle AFC a été calculée ou quelle tableau a été décomposé (SVD) pour obtenir le graphe ci-dessous? Que dire de la représentation des individus de l’AFC par rapport à celle de l’ACP ?


In [117]:
options(repr.plot.width = 5, repr.plot.height = 5)
plot(afc$ind$coord, type = "p", pch = ".", cex = 2, col = as.integer(spam.quali[, 58]))


Q Comment le graphique de droite ci-dessous a-t-il été obtenu à partir de celui de gauche ? En quoi celui-ci aide-t-il à caractériser un peu mieux les pourriels des autres messages ?


In [120]:
par(mfrow = c(1, 2))
options(repr.plot.width = 10, repr.plot.height = 5)
plot.MCA(afc, invisible = c("ind"), col.var = "blue", cex = 0.6)
plot.MCA(afc, invisible = c("ind"), col.var = "blue", xlim = c(-1, 1), ylim = c(-1, 1), cex = 0.6)


La dispersion des message est plus encourageante qu'avec l'ACP mais que dire d'une possible discrimination linéaire entre pourriels et courriels?

Classification des modalités

Comme les modalités sont très nombreuses, une classification de celles-ci va aider à l'interprétation.

Par CAH puis k-means

Q Quelle est la matrice qui est construite ci-dessous ? A partir de quelles "composantes"?


In [121]:
dist.mod <- dist(afc$var$coord, method = "euclidean")

Q La fonction R produit le graphe ci-dessous. Justifier le nombre de classes à retenir (4).


In [125]:
hclusmod <- hclust(dist.mod, method = "ward.D")
options(repr.plot.width = 4, repr.plot.height = 4)
plot(hclusmod$height[112:100])



In [139]:
options(repr.plot.width = 18, repr.plot.height = 6)
plot(hclusmod)



In [140]:
hclasmod <- cutree(hclusmod,k = 4)
clas.mod <- kmeans(afc$var$coord, 4)
kclasmod <- clas.mod$cluster
# comparaison des classes entre CAH et k-means
table(hclasmod, kclasmod)


        kclasmod
hclasmod  1  2  3  4
       1 29  0  2  0
       2  0  0 58  0
       3  0  0  0 10
       4  3  2  4  5

Q Quel autre algorithme est utilisé ci-dessus? Que fournit-il comme résultat ? Que dire des deux classifications obtenues et donc de leur "robustesse"?

Représentation des classes dans l'AFCM

Q Comment le graphe ci-dessous a-t-il été obtenu?


In [141]:
options(repr.plot.width = 6, repr.plot.height = 6)
plot.MCA(afc, invisible = c("ind"), col.var = as.integer(clas.mod$cluster), cex = 0.6)


Lister les modalités des variables par classe.


In [142]:
names(hclasmod)[hclasmod == 1]
names(hclasmod)[hclasmod == 2]
names(hclasmod)[hclasmod == 3]
names(hclasmod)[hclasmod == 4]


  1. 'make'
  2. 'addr'
  3. 'all'
  4. '3d'
  5. 'our'
  6. 'over'
  7. 'remo'
  8. 'inte'
  9. 'orde'
  10. 'mail'
  11. 'rece'
  12. 'will'
  13. 'peop'
  14. 'repo'
  15. 'adds'
  16. 'free'
  17. 'busi'
  18. 'emai'
  19. 'you'
  20. 'cred'
  21. 'your'
  22. 'font'
  23. '000'
  24. 'mone'
  25. 'Cpar'
  26. 'Cexc'
  27. 'Cdol'
  28. 'Cdie'
  29. 'Mm3'
  30. 'Ms3'
  31. 'Mt3'
  1. 'Nmk'
  2. 'Nad'
  3. 'Nal'
  4. 'N3d'
  5. 'Nou'
  6. 'Nov'
  7. 'Nrm'
  8. 'Nin'
  9. 'Nor'
  10. 'Nma'
  11. 'Nrc'
  12. 'Nwi'
  13. 'Npp'
  14. 'Nrp'
  15. 'Nas'
  16. 'Nfr'
  17. 'Nbs'
  18. 'Nem'
  19. 'Nyo'
  20. 'Ncr'
  21. 'Nyr'
  22. 'Nft'
  23. 'N00'
  24. 'Nmn'
  25. 'Nhp'
  26. 'Nhl'
  27. 'Nge'
  28. 'N65'
  29. 'Nlb'
  30. 'Nls'
  31. 'Ntl'
  32. 'Nda'
  33. 'N85'
  34. 'Ntc'
  35. 'N19'
  36. 'Npr'
  37. 'Npm'
  38. 'Ndr'
  39. 'Ncs'
  40. 'Nmt'
  41. 'or'
  42. 'Npj'
  43. 'Nre'
  44. 'Ned'
  45. 'Ntb'
  46. 'Ncf'
  47. 'NCs'
  48. 'NCp'
  49. 'NCc'
  50. 'NCe'
  51. 'NCd'
  52. 'NCi'
  53. 'Mm1'
  54. 'Mm2'
  55. 'Ms1'
  56. 'Ms2'
  57. 'Mt1'
  58. 'Mt2'
  1. 'hp'
  2. 'hpl'
  3. 'geor'
  4. '650'
  5. 'lab'
  6. 'labs'
  7. 'teln'
  8. '85'
  9. 'tech'
  10. 'dire'
  1. 'data'
  2. '1999'
  3. 'part'
  4. 'pm'
  5. 'cs'
  6. 'meet'
  7. 'orig'
  8. 'proj'
  9. 're'
  10. 'edu'
  11. 'tabl'
  12. 'conf'
  13. 'Cscl'
  14. 'Ccro'

Q Quelles co-occurrences de quels mots/caractères caractérisent principalement les spams?

Q Quels sont les messages indifférentiables? Que suggérer à Georges pour améliorer son détecteur de pourriel?

Approche par Factorisation non négative

Les données quantitatives sont reconsidérées mais en intégrant le caractère essentiellement non négatif de la matrice des données ainsi que sa parcinomie (matrice très creuse). Cette situation couramment répandue a suscité une nouvelle forme d'analyse dite Non Negativ Matrix Factorization (NMF) dont le principe est de rechercher deux matrices de faible rang r de telle sorte que leur produit approche au mieux les valeurs observées. Cette méthode très utilisée pour la recommandation de produits par filtrage collaboratif est illustré sur ces données.

Q Quelles différences majeurs entre une NMF et une SVD?

Les matrices de faible rang ou les facteurs ne permettent plus de représentation comme en ACP mais au moins une classification non supervisée des objets lignes et colonnes de la matrice décomposée.

Cette approche est testée sur les données de spam pour en comparer les résultats obtenus.

NMF de R

La librairie NMF (Gaujoux et Seoighe, 2010) de R propose plusieurs versions de l'algorithme de factorisation dont principalement Multiplicative update algorithms et Alternate least Square (ALS), adaptées à deux fonctions perte possibles: divergence de Kullback-Leibler (KL) ou moindres carrés.

Attention, les choix: fonction objectif, algorithme, rang des matrices, influencent fortement les résultats obtenus qui se résument principalement à des classifications construites sur les facteurs de la décomposition.


In [ ]:
library(NMF)
nmfAlgorithm()

Q Identifier les algorithmes disponibles ainsi que la fonction objectif associée. . Plusieurs initialisation sont possibles; seule celle aléatoire est utilisée.


In [ ]:
nmfAlgorithm("brunet")

In [ ]:
nmfAlgorithm("lee")

In [ ]:
nmfAlgorithm("snmf/l")

In [ ]:
nmfAlgorithm("snmf/r")

Les données quantitatives initiales (comptages "non négatifs") sont reprises en compte.

Attention, les données sont bien creuses et non négatives, mais les variables s'expriment dans des unités et donc avec des variances très différentes. Une forme de normalisation est nécessaire.


In [ ]:
summary(spam)

Les données doivent être sous la forme d'une matyrice non négative:


In [ ]:
creux=as.matrix(spam[,2:58])
classe=spam[,1]

Q Justifiez la transformaiton suivante:


In [ ]:
creux=cbind(log(1+creux[,1:54]),log(creux[,55:57])/2)
boxplot(creux)

Souci: quelques lignes (messages) se trouvent avec uniquement des 0; Celles-ci sont supprimées.


In [ ]:
sum(apply(creux,1,sum)==0)
# 3 messages sont devenus tout à 0
# suppression
ident=apply(creux,1,sum)!=0
creux=creux[ident,]
classe=classe[ident]

Recherche d'une "meilleure" méthode en exécutant, pour chacune d'entre elles, 10 factorisations de rang 5. Les exécutions sont répétées car la convergence locale dépend de l'initialisation aléatoire.


In [ ]:
res.multi.method=nmf(creux, 5,nrun=10,list("brunet","lee","snmf/l","snmf/r"),seed = 111, .options ="t")
compare(res.multi.method)

Q Les comparaisons sont reproduites dans le graphe ci-dessous. Expliquer comment est obtenu ce graphe. Quelle méthode retenir.


In [ ]:
consensusmap(res.multi.method,hclustfun="ward")

De façon analogue, plusieurs 10 décompositons sont calculées pour défférentes valeurs de rang.


In [ ]:
estim.r=nmf(creux,2:7,method="snmf/l",nrun=10,seed=111)
plot(estim.r)

In [ ]:
consensusmap(estim.r)

Q Utiliser les résultats précédents pour justifier le choix d'un rang "optimal".

Une fois méthode et rang déterminés, itérer plusieurs fois l'exécution (30) pour en déterminer une "meilleure".


In [ ]:
nmf.spam=nmf(creux,5,method="snmf/l",nrun=30,seed=111)

Remarquer la complexité de la procédure mise en oeuvre et le temps de calcul nettemnte supérieurs à la recherche d'une simple décomposition en valeurs singulières. (SVD)

Extraction des résulats numériques.


In [ ]:
summary(nmf.spam)

Extraction des matrices de la décompositon.


In [ ]:
w=basis(nmf.spam)
h=coef(nmf.spam)

Production des graphiques associés aux matrices w et h de la factorisation. La classe des messages (spam ou pas spam) est ajoutée dans la représentation des lignes: couleur de la première colonne de légende X2 (0 ou 1). La deuxième colone (basis) indique le numéro du facteur qui représente le mieux le message ou le mot.


In [ ]:
basismap(nmf.spam,annRow=classe,hclustfun="ward")

In [ ]:
coefmap(nmf.spam,hclustfun="ward")

Remarquer la plus ou moins bonne séparation des pourriels et courriels dans les classes de la CAH ainsi que les regropements de mots / variables.

Il est possible de calculer des distances entre lignes (messages) d'une part et entre colonnes (mots) d'autres part à partir de chacune des matrices w et h puis de faire des représentations de chacun de ces ensembles par un positionnement multidiemnsionnel (MDS) comme dans la section ACP. Mais, il n'est pas possible, comme en comme en ACP ou AFCM de mettre en relation les deux représentations des lignes et colonnes, individus et variables de la matrice factorisée.

Cela peut être fait de façon détournée à l'aide d'une heatmap qui représente la matrice des données initiales en permutant lignes et colonnes comme conséquence des classifications hiérarchiques. La librairie NMF (Gaujoux et Seoighe, 2010) a été réalisée et publiée avec pour premier objectif le traitement des données génomiques dans l'environnement de Bioconductor, donc de la Bioinformatique. C'est sans doute ce qui explique l'utilisation systématique de la classification ascendante hiérarchique et des représentations graphiques par heatmap.


In [ ]:
dist.mod=dist(scale(w), method="euclidean")
hclusmod.w=hclust(dist.mod,method="ward")
dist.mod=dist(t(h), method="euclidean")
hclusmod.h=hclust(dist.mod,method="ward")
plot(hclusmod.h)

aheatmap(creux,Rowv=hclusmod.w,Colv=hclusmod.h,annRow=classe)

Repérer où se concentrent les pourriels en relation avec le plus d'occurences de certains mots ou caractères.

Q Quelle stratégie: ACP, AFCM ou NMF vous permet de mieux analyser les caractéristiques des pourriels?