1 Introduction

Une collection de fonctions simples pour analyser une base de données.

2 Analyse statistique simple

2.1 Résumé des données

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
plot(iris)

2.2 Analyse univariée

Comprendre le comportement d’une variable

  • quantile pour afficher les quantiles, et on peut utiliser l’option probs pour définir les probabilités qu’on souhaite afficher
  • mean pour la moyenne, var pour la variance et sd pour l’écart-type
  • hist pour afficher un histogramme
  • plot(density()) pour voir la densité
  • Pour aller plus loin : utiliser ggplot pour contrôler la fenêtre du noyau, superposer plusieurs distributions
quantile(iris$Sepal.Length)
##   0%  25%  50%  75% 100% 
##  4.3  5.1  5.8  6.4  7.9

2.3 Analyse multivariée

Comprendre la relation entre 2 ou plus de variables

  • Calculer les coefficients de corrélation linéaire
  • Calculer la matrice de covariance et la matrice de corrélation linéaire (cov et cor)
  • Tracer des graphiques avec 2 variables représentées

2.4 Visualisation de 2 variables

plot(iris$Petal.Length, iris$Petal.Width, main="Edgar Anderson's Iris Data")

plot(iris$Petal.Length, iris$Petal.Width, 
     pch=c(23,24,25)[unclass(iris$Species)], 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

2.5 Visualisation 2 à 2

Améliorer le plot(iris)

  • Mettre les couleurs
  • Enlever la variable espèce
  • Constater la symétrique du grahpique
  • Afficher les corrélations linéaires
  • Afficher les coefficients de corrélation linéaire sur la moitié du graphique

Fonctions R : pairs() ou plot()

2.6 Nuages de Points

pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])

2.7 Calcul des coeff de corrélation linéaire

panel.pearson <- function(x, y, ...) {
  horizontal <- (par("usr")[1] + par("usr")[2]) / 2; 
  vertical <- (par("usr")[3] + par("usr")[4]) / 2; 
  text(horizontal, vertical, format(abs(cor(x,y)), digits=2)) 
}

2.8 Plot avec coeff de corrélation

pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red","green3","blue")[unclass(iris$Species)], upper.panel=panel.pearson)

2.9 D’autres visualisations par paire

library(GGally)
ggpairs(iris[1:4])

2.10 Analyse multivariée en fonction des espèces

Comme on connaît les différentes espèces, on peut calculer les éléments statistiques en fonction des espèces

  • Tester aggregate(,summary,data=iris) pour différentes variables
  • créer un boxplot pour les différentes variables

2.11 Boxplot

boxplot(Sepal.Length~Species, data=iris)

2.12 Tabplot

Distribution des variables en fonction des espèces

# install.packages("tabplot")
library(tabplot)
tableplot(iris, sortCol="Species")

2.13 Heatmap

library(ggplot2)
distMatrix <- as.matrix(dist(iris[,1]))
heatmap(distMatrix)

2.14 Parallel Cordinates

library(MASS)
parcoord(iris[1:4], col=iris$Species)

2.15 Visualisation de 3 variables

Jusqu’à maintenant, la visualisation est réalisée en dimension 2. Visualiser 3 variables dans l’espace

library(scatterplot3d)
scatterplot3d(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width)

2.16 Visualisation de 3 variables interactive

library(threejs)
scatterplot3js(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width,color=c("black","steelblue","red")[unclass(iris$Species)])

2.17 Visualisation de 3 variables en dim 2

library(ggplot2)
qplot(Sepal.Length,Petal.Length, data=iris,color=Species,size=Petal.Width)

ggplot(iris, aes(Sepal.Length, Petal.Length, fill = Petal.Width)) + geom_tile()

last_plot() + facet_wrap(~ Species)

3 Techinques d’apprentissage automatique

3.1 Exploration (pour aller plus loin)

Dans le graphique en 3D interactif, on voit qu’on peut tourner les points dans l’espace. Selon le point de vue, on distingue plus ou moins mieux les 3 classes. L’idée d’analyse en composantes principales est de choisir un repère de façon à augmenter la variance inter classe.

lda permet de mieux distinguer les différentes classes.

3.2 Classification non supervisée - k-means

iris2 <- iris
iris2$Species <- NULL
(kmeans.result <- kmeans(iris2, 3))
## K-means clustering with 3 clusters of sizes 38, 62, 50
## 
## Cluster means:
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     6.850000    3.073684     5.742105    2.071053
## 2     5.901613    2.748387     4.393548    1.433871
## 3     5.006000    3.428000     1.462000    0.246000
## 
## Clustering vector:
##   [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
##  [36] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [71] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1
## [106] 1 2 1 1 1 1 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1
## [141] 1 1 2 1 1 1 2 1 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 23.87947 39.82097 15.15100
##  (between_SS / total_SS =  88.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"    
## [5] "tot.withinss" "betweenss"    "size"         "iter"        
## [9] "ifault"

3.2.1 Classification non supervisée - k-means plot

plot(iris2[c("Sepal.Length", "Sepal.Width")], col = kmeans.result$cluster)
points(kmeans.result$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3,pch = 8, cex=2)

3.2.2 Classification non supervisée - k-means prédiction

table(iris$Species, kmeans.result$cluster)
##             
##               1  2  3
##   setosa      0  0 50
##   versicolor  2 48  0
##   virginica  36 14  0

3.3 Arbre de décision

Dans la base iris, on sait que trois espèces de fleurs sont représentées avec certaines caractéristiques (4 variables). La question qu’on se pose, c’est si une nouvelle observation arrive (avec les valeurs des 4 mesures), comment peut-on savoir à quelle espace la fleur appartient ?

Rappel : processus global de la construction d’un algorithme.

3.3.1 Arbre de décision - construction

  • Créer deux bases : apprentisage et test
  • Construire un arbre de décision sur la base d’apprentissage avec la librairie party, et la fonction ctree(variable à expliquer ~ variable 1 + variable 2)
  • Afficher l’arbre avec print et plot
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))
trainData <- iris[ind==1,]
testData <- iris[ind==2,]
library(party)
myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormula, data=trainData)

3.3.2 Arbre de décision - Affichage

plot(iris_ctree)

print(iris_ctree)
## 
##   Conditional inference tree with 3 terminal nodes
## 
## Response:  Species 
## Inputs:  Sepal.Length, Sepal.Width, Petal.Length, Petal.Width 
## Number of observations:  107 
## 
## 1) Petal.Length <= 1.9; criterion = 1, statistic = 99.746
##   2)*  weights = 34 
## 1) Petal.Length > 1.9
##   3) Petal.Width <= 1.7; criterion = 1, statistic = 52.247
##     4)*  weights = 40 
##   3) Petal.Width > 1.7
##     5)*  weights = 33

3.3.3 Arbre de décision - Exploitation

  • Quelle est la varialbe la plus explicative ?
  • Quelle est la précision de prédiction ?
  • Combien a-t-on de branches et de feuilles ?

3.3.4 Arbre de décision - table de confusion

table(predict(iris_ctree), trainData$Species)
##             
##              setosa versicolor virginica
##   setosa         34          0         0
##   versicolor      0         37         3
##   virginica       0          0        33

Calculer les taux de faux positif, faux négatifs, taux d’erreur

3.3.5 Arbre de décision - Prédiction

testPred <- predict(iris_ctree, newdata = testData)
table(testPred, testData$Species)
##             
## testPred     setosa versicolor virginica
##   setosa         16          0         0
##   versicolor      0         12         2
##   virginica       0          1        12

Calculer les taux de faux positif, faux négatifs, taux d’erreur Pour aller plus loin : créer une boucle pour calculer un taux moyen d’erreur Autre pacakge rpart pour construire un arbre de décision

3.4 Random Forest - Introduction

Si on n’a pas fixé le seed() on voit que les échantillons d’apprentissage et de test sont choisis de façon aléatoire. La bagging permet de réaliser ces opérations automatiques. De plus, on peut aussi choisir les variables. Les deux randomisations ensemble, on obtient une forêt aléatoire.

library(randomForest)
## Warning: package 'randomForest' was built under R version 3.2.3
## randomForest 4.6-12
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
rf <- randomForest(Species ~ ., data=trainData, ntree=100, proximity=TRUE)

3.5 Random Forest - Analyse

table(predict(rf), trainData$Species)
##             
##              setosa versicolor virginica
##   setosa         34          0         0
##   versicolor      0         36         3
##   virginica       0          1        33
print(rf)
## 
## Call:
##  randomForest(formula = Species ~ ., data = trainData, ntree = 100,      proximity = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 3.74%
## Confusion matrix:
##            setosa versicolor virginica class.error
## setosa         34          0         0  0.00000000
## versicolor      0         36         1  0.02702703
## virginica       0          3        33  0.08333333
attributes(rf)
## $names
##  [1] "call"            "type"            "predicted"      
##  [4] "err.rate"        "confusion"       "votes"          
##  [7] "oob.times"       "classes"         "importance"     
## [10] "importanceSD"    "localImportance" "proximity"      
## [13] "ntree"           "mtry"            "forest"         
## [16] "y"               "test"            "inbag"          
## [19] "terms"          
## 
## $class
## [1] "randomForest.formula" "randomForest"
importance(rf)
##              MeanDecreaseGini
## Sepal.Length         7.221444
## Sepal.Width          1.971294
## Petal.Length        31.828355
## Petal.Width         29.547038
varImpPlot(rf)

plot(rf)

3.5.1 Random Forest - Prédiction 1

irisPred <- predict(rf, newdata=testData)
table(irisPred, testData$Species)
##             
## irisPred     setosa versicolor virginica
##   setosa         16          0         0
##   versicolor      0         11         0
##   virginica       0          2        14
plot(margin(rf, testData$Species))