Une collection de fonctions simples pour analyser une base de 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)
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 affichermean
pour la moyenne, var
pour la variance et sd
pour l’écart-typehist
pour afficher un histogrammeplot(density())
pour voir la densitéggplot
pour contrôler la fenêtre du noyau, superposer plusieurs distributionsquantile(iris$Sepal.Length)
## 0% 25% 50% 75% 100%
## 4.3 5.1 5.8 6.4 7.9
Comprendre la relation entre 2 ou plus de variables
cov
et cor
)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")
Améliorer le plot(iris)
Fonctions R : pairs()
ou plot()
pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])
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))
}
pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red","green3","blue")[unclass(iris$Species)], upper.panel=panel.pearson)
library(GGally)
ggpairs(iris[1:4])
Comme on connaît les différentes espèces, on peut calculer les éléments statistiques en fonction des espèces
aggregate(,summary,data=iris)
pour différentes variablesboxplot
pour les différentes variablesboxplot(Sepal.Length~Species, data=iris)
Distribution des variables en fonction des espèces
# install.packages("tabplot")
library(tabplot)
tableplot(iris, sortCol="Species")
library(ggplot2)
distMatrix <- as.matrix(dist(iris[,1]))
heatmap(distMatrix)
library(MASS)
parcoord(iris[1:4], col=iris$Species)
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)
library(threejs)
scatterplot3js(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width,color=c("black","steelblue","red")[unclass(iris$Species)])
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)
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.
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"
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)
table(iris$Species, kmeans.result$cluster)
##
## 1 2 3
## setosa 0 0 50
## versicolor 2 48 0
## virginica 36 14 0
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.
party
, et la fonction ctree(variable à expliquer ~ variable 1 + variable 2)
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)
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
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
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
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)
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)
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))