Statistique avec R
Lois usuelles de probabilité
De nombreuses distributions de probabilité sont disponibles sous R. En voici une liste non exhaustive :
Loi | NomR |
---|---|
Beta | beta |
Binomiale | binom |
Cauchy | cauchy |
Khi-Deux | chisq |
Exponentielle | exp |
Fisher | f |
Gamma | gamma |
Géométrique | geom |
Hypergéométrique | hyper |
Log-Normale | lnorm |
Logistique | logis |
Normale | norm |
Poisson | pois |
Student | t |
Uniforme | unif |
Weibull | weibull |
Pour chaque distribution, quatre commandes préfixées par une des
lettres d, p, q, r et suivi du nom de la distribution
(nomdist) sont disponibles :
- dnomdist : fonction de densité \(f_X(.)\) pour une loi continue ou fonction
de probabilité \(\mathbb{P}(X = k)\)
pour une loi discrète
- pnomdist : fonction de répartition \(F_X(.) = \mathbb{P}(X\leq .)\)
- qnomdist : quantiles
- rnomdist : génère des réalisations aléatoires indépendantes
de la distribution nomdist.
Vous pouvez retrouver ces informations dans l’aide de R
?Distributions
.
Exemple
Exemple pour la loi normale \(\mathcal{N}(0,1)\) :
Soit \(X\) une variable alétoire de loi
\(\mathcal{N}(0,1)\), alors
dnorm(10)
évalue la valeur de la fonction densité en \(x=10\) i.e \(f_X(10)\)
pnorm(0)
évalue la valeur de la fonction de répartition en
\(x=0\) i.e \(F_X(0)=\mathbb{P}(X\leq 0)=\frac 1
2\)
qnorm(0.95)
évalue le quantile à l’ordre \(0.95\) de la loi normale \(\mathcal{N}(0,1)\)
rnorm(10)
génère un un échantillon observé de taille \(10\) pour la loi \(\mathcal{N}(0,1)\)
Exercice 1
- Simuler un échantillon de taille 1000 suivant une loi normale \(\mathcal{N}(0,1)\).
- Sur un même graphique, superposer la répartition empirique
(histogramme) et la densité de la loi \(\mathcal{N}(0,1)\).
- Sur un même graphique, superposer la fonction de répartition empirique et la fonction de répartition de la loi \(\mathcal{N}(0,1)\).
- Reprendre les questions précédentes avec d’autres lois de votre choix.
Exercice 2
Illustration du Théorème de la limite centrale (TCL)
- Générer \(N=10000\) échantillons de
taille \(n\) (pour la loi de votre
choix), pour différentes valeurs de \(n\).
- A chaque fois, on prendra soin de faire apparaître sur un même graphique la répartition des \(N\) moyennes empiriques (sous forme d’un histogramme) ainsi que la densité de la variable gaussienne limite associée.
Correction
Exercice 1 :
# Question 1
= rnorm(1000, 0, 1)
Ech # Question 2
hist(Ech, breaks = 50, freq = F)
points(seq(-4, 4, 0.01), dnorm(seq(-4, 4, 0.01)), type = "l", col = "red")
ggplot(data.frame(Ech = Ech), aes(x = Ech)) + geom_histogram(aes(y = ..density..),
bins = 50, fill = "white", colour = "black") + stat_function(fun = dnorm, aes(x = Ech),
colour = "red")
# Question 3
plot(ecdf(Ech))
points(seq(-4, 4, 0.01), pnorm(seq(-4, 4, 0.01)), col = "red", type = "l")
ggplot(data.frame(Ech = Ech), aes(x = Ech)) + stat_ecdf(geom = "step") + stat_function(fun = pnorm,
aes(x = Ech), colour = "red")
Exercice 2 :
Enoncé du TLC : Soit \(X_1,\ldots,X_n\) i.i.d d’espérance \(\mathbb{E}[X_1]<+\infty\) et variance \(Var(X_1)<+\infty\). Alors \(\sqrt{n} \frac{\bar X_n - \mathbb{E}[X_1]}{\sqrt{Var(X_1)}} \underset{n\rightarrow +\infty}{\stackrel{\mathcal{L}}{\rightarrow}} \mathcal{N}(0,1).\)
# Illustration ici avec la loi de Bernoulli
= 0.4
p = 1000
n = 10000
N = matrix(rbinom(n * N, size = 1, prob = p), nrow = N, ncol = n)
X = apply(X, 1, mean)
Xbar = sqrt(n) * (Xbar - p)/sqrt(p * (1 - p))
V
hist(V, breaks = 30, freq = F)
points(seq(-3, 3, 0.01), dnorm(seq(-3, 3, 0.01)), col = "red", type = "l")
ggplot(data.frame(Ech = V), aes(x = Ech)) + geom_histogram(aes(y = ..density..),
bins = 30, fill = "white", colour = "black") + stat_function(fun = dnorm, aes(x = Ech),
colour = "red")
Statistiques descriptives
On va illustrer toute cette section à l’aide du jeu de donnée wine disponible dans Data/wine.txt. Ce jeu de données comprend des mesures physico-chimiques réalisées sur un échantillon de \(600\) vins (rouges et blancs) du Portugal. Ces mesures sont complétées par une évaluation sensorielle de la qualité par un ensemble d’experts. Chaque vin est décrit par les variables suivantes :
- Qualite : son évaluation sensorielle par les experts (“bad”,“medium”,“good”),
- Type : son type (1 pour un vin rouge, 0 pour un vin blanc),
- AcidVol : la teneur en acide volatile (en g/dm3 d’acide acétique),
- AcidCitr : la teneur en acide citrique (en g/dm3),
- SO2lbr : le dosage du dioxyde de soufre libre (en mg/dm3),
- SO2tot : le dosage du dioxyde de soufre total (en mg/dm3),
- Densite : la densité (en g/cm3),
- Alcool : le degré d’alcool (en % Vol.).
Dans un premier temps, commencez par charger le jeu de données avec
la commande suivante
Data = read.table("Data/wine.txt",header=T)
.
Voici les premières lignes du jeu de données :
head(Data)
Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
1352 medium 1 0.62 0.01 8 46 0.99332 11.8
5493 medium 0 0.34 0.10 17 63 0.99370 9.2
5153 medium 0 0.22 0.22 39 110 0.99855 9.0
5308 medium 0 0.35 0.46 61 183 0.99786 9.0
3866 medium 0 0.42 0.32 20 167 0.99479 10.6
694 medium 1 0.48 0.32 21 122 0.99840 9.4
Le jeu de données est donc maintenant stocké dans l’objet
Data de type data.frame (>class(Data)
data.frame).
Contenu du jeu de données
On peut commencer par regarder les dimensions du jeu de données à
étudier à l’aide des commandes dim()
, nrow()
et
ncol()
:
dim(Data)
[1] 600 8
nrow(Data)
[1] 600
ncol(Data)
[1] 8
Ainsi le jeu de données contient 600 individus (correspondant aux 600
lignes) décrits par 8 variables (correspondant aux 8 colonnes).
Remarquons que l’on peut obtenir les noms des variables grâce à la
commande names(Data)
. Plus largement, on peut utiliser la
commande attributes()
:
attributes(Data)
$names
[1] "Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite"
[8] "Alcool"
$class
[1] "data.frame"
$row.names
[1] "1352" "5493" "5153" "5308" "3866" "694" "5085" "2280" "5231" "4388"
[11] "4172" "4763" "4001" "3244" "4663" "3256" "3444" "3867" "3161" "6420"
[21] "1590" "2155" "2258" "209" "4560" "1981" "2166" "5430" "6496" "346"
[31] "1288" "3615" "1837" "5637" "2520" "3046" "2983" "840" "3185" "4690"
[41] "6347" "728" "240" "6318" "2501" "3003" "4537" "4799" "141" "3664"
[51] "5167" "5291" "3383" "2712" "449" "214" "3216" "4917" "5005" "3501"
[61] "1291" "3137" "998" "1350" "6336" "492" "3901" "4878" "5343" "5096"
[71] "4516" "1118" "2680" "452" "3937"
[ reached getOption("max.print") -- omitted 525 entries ]
La commande str()
affiche quand à elle d’autres
informations concernant les données. En particulier, on retrouve le type
(data.frame) et la dimension (nombres d’observations et de variables)
des données. En outre, pour chaque variable, on peut lire son nom, son
format (entier, numérique, caractère) ainsi que ses premières
valeurs.
str(Data)
'data.frame': 600 obs. of 8 variables:
$ Qualite : chr "medium" "medium" "medium" "medium" ...
$ Type : int 1 0 0 0 0 1 0 0 0 0 ...
$ AcidVol : num 0.62 0.34 0.22 0.35 0.42 0.48 0.21 0.28 0.3 0.4 ...
$ AcidCitr: num 0.01 0.1 0.22 0.46 0.32 0.32 0.32 0.14 0.25 0.42 ...
$ SO2lbr : num 8 17 39 61 20 21 39 64 21 41 ...
$ SO2tot : int 46 63 110 183 167 122 113 159 124 176 ...
$ Densite : num 0.993 0.994 0.999 0.998 0.995 ...
$ Alcool : num 11.8 9.2 9 9 10.6 9.4 10.2 10 10.8 9.4 ...
On voit ici que les variables sont de différentes natures :
- Les variables Qualite et Type sont des variables qualitatives
- Les autres variables sont quantitatives
Attention à bien préciser à R les variables qui doivent être considérées comme qualitatives. Ici, on change donc la nature des variables Qualite et Type:
$Qualite = as.factor(Data$Qualite)
Data$Type = factor(Data$Type, labels = c("blanc", "rouge"))
Datahead(Data)
Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
1352 medium rouge 0.62 0.01 8 46 0.99332 11.8
5493 medium blanc 0.34 0.10 17 63 0.99370 9.2
5153 medium blanc 0.22 0.22 39 110 0.99855 9.0
5308 medium blanc 0.35 0.46 61 183 0.99786 9.0
3866 medium blanc 0.42 0.32 20 167 0.99479 10.6
694 medium rouge 0.48 0.32 21 122 0.99840 9.4
On peut obtenir un résumé rapide du jeu de données à l’aide de la
fonction summary()
summary(Data)
Qualite Type AcidVol AcidCitr SO2lbr
bad : 19 blanc:425 Min. :0.1000 Min. :0.0000 Min. : 2.00
good :110 rouge:175 1st Qu.:0.2400 1st Qu.:0.2400 1st Qu.: 15.75
medium:471 Median :0.3000 Median :0.3000 Median : 27.00
Mean :0.3512 Mean :0.3141 Mean : 29.41
3rd Qu.:0.4300 3rd Qu.:0.3900 3rd Qu.: 41.00
Max. :1.0400 Max. :1.0000 Max. :112.00
SO2tot Densite Alcool
Min. : 7.0 Min. :0.9875 Min. : 8.00
1st Qu.: 68.0 1st Qu.:0.9925 1st Qu.: 9.50
Median :114.5 Median :0.9949 Median :10.40
Mean :111.2 Mean :0.9947 Mean :10.49
3rd Qu.:154.0 3rd Qu.:0.9970 3rd Qu.:11.30
Max. :278.0 Max. :1.0030 Max. :14.00
Statistiques descriptives unidimensionnelles
Variable qualitative
On considère ici une variable qualitative \(X\) dont on observe \(n\) réalisations \(\underline{x}=(x_1,x_2,\ldots,x_n)\). Cette variable prend \(K\) modalités \(m_1,\ldots,m_K\). Si les modalités n’ont pas d’ordre naturel, on parle de variable qualitative nominale (ex. Type), sinon c’est une variable qualitative ordinale (ex. Qualite).
La variable Type contient \(K=\) 2 modalités qui sont blanc, rouge.
levels(Data$Type)
[1] "blanc" "rouge"
On récupère l’effectif \(n_k=\sum_{i=1}^n
\mathbb{1}_{x_i=m_k}\) pour chaque modalité \(m_k\) avec summary()
ou
table()
.
summary(Data$Type)
blanc rouge
425 175
= as.vector(table(Data$Type))
EffType EffType
[1] 425 175
On utilise aussi les fréquences \(f_k=\frac{n_k}{n}\) donc \(\sum_{k=1}^K f_k=1\).
= EffType/length(Data$Type) Freq
modalite | Eff | Freq |
---|---|---|
blanc | 425 | 0.708 |
rouge | 175 | 0.292 |
Pour une variable qualitative ordinale, on utilise également les effectifs cumulés \(N_k=\sum_{\ell=1}^k n_\ell\) et les fréquences cumulées \(F_k=\sum_{\ell=1}^k f_\ell\).
Visualisation
plot
Pour une variable qualitative, on utilise la représentation par camembert (pie) ou diagramme en bâton (barplot)
par(mfrow = c(1, 3))
pie(table(Data$Type))
barplot(table(Data$Type), main = "Effectifs")
barplot(table(Data$Type)/nrow(Data), main = "Frequences")
Pour une variable qualitative ordinale, on peut également tracer les fréquences cumulées :
library(tidyverse)
$Qualite_rec <- fct_relevel(Data$Qualite, "bad", "medium", "good")
Datapar(mfrow = c(1, 3))
pie(table(Data$Qualite_rec))
barplot(table(Data$Qualite_rec)/nrow(Data), main = "Frequences")
barplot(cumsum(table(Data$Qualite_rec))/nrow(Data), main = "Freq. cumulées")
ggplot
Pour la variable Type :
= ggplot(Data) + geom_bar(aes(x = Type)) + ggtitle("Effectifs")
g1 = ggplot(Data) + geom_bar(aes(x = Type, y = ..prop.., group = 1)) + ggtitle("Frequences")
g2 = data.frame(type = levels(Data$Type), value = as.vector(Freq))
df = ggplot(df, aes(x = "", y = value, fill = type)) + geom_bar(width = 1, stat = "identity")
g3 = g3 + coord_polar("y", start = 0)
g4
grid.arrange(g1, g2, g3, g4, nrow = 2)
Pour la variable Qualité :
library(tidyverse)
$Qualite_rec <- fct_relevel(Data$Qualite, "bad", "medium", "good")
Data<- data.frame(Qualite = levels(Data$Qualite_rec), value = table(Data$Qualite_rec),
df valuecumul = 100 * cumsum(prop.table(table(Data$Qualite_rec))))
$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good")
df<- df %>%
df mutate(freq = value.Freq/nrow(Data))
<- ggplot(Data) + geom_bar(aes(x = Qualite_rec)) + ggtitle("Effectifs")
g1 <- ggplot(Data) + geom_bar(aes(x = Qualite_rec, y = ..prop.., group = 1)) + ggtitle("Frequences")
g2 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") +
g3 ggtitle("Fréquences cumulées")
<- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") +
g4 coord_polar("y", start = 0)
grid.arrange(g1, g2, g3, g4, ncol = 2)
<- Data[, -9] Data
Variable quantitative
Nous allons ici nous intéresser à l’étude d’une variable quantitative \(X\) dont on a \(n\) observations \(\underline{x}=(x_1,\ldots,x_n)\). On va illustrer cette section avec la variable Alcool.
Indices statistiques
Nous rappelons les principaux indicateurs statistiques que l’on peut évaluer pour une série de mesures \(\underline{x}\): la moyenne, la médiane, la variance, l’écart-type ….
Mean/var/sd
La moyenne de \(\underline{x}\) : \(\bar{x} = \frac{1}{n} \sum_{i=1}^n x_i\)
mean(Data$Alcool)
[1] 10.48592
La variance \(s_x^2 = \frac{1}{n}\sum_{i=1}^n (x_i - \bar{x})^2\)
la variance corrigée \(var(\underline{x})=\frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2\)
l’écart-type corrigé \(\sqrt{var(\underline{x})}\)
Attention les fonctions var()
et sd()
renvoient les valeurs corrigées de la variance et de l’écart-type
respectivement.
var(Data$Alcool)
[1] 1.316059
sd(Data$Alcool)
[1] 1.147196
min/max/range
La commande range()
renvoie respectivement le minimum et
le maximum. On peut aussi utiliser min()
et
max()
range(Data$Alcool)
[1] 8 14
min(Data$Alcool)
[1] 8
max(Data$Alcool)
[1] 14
On peut alors récupérer l’étendue (\(max(\underline{x}) - min(\underline{x})\) ) avec le code suivant :
diff(range(Data$Alcool))
[1] 6
médiane / quartiles / quantiles
La médiane est une valeur qui divise l’échantillon en deux sous-échantillons de même cardinal : \(\sum_{i=1}^n \mathbb{1}_{x_i\geq m} \geq \frac{n}{2} \textrm{ et } \sum_{i=1}^n \mathbb{1}_{x_i\leq m} \geq \frac{n}{2}\)
median(Data$Alcool)
[1] 10.4
sort(Data$Alcool)[296:305]
[1] 10.3 10.3 10.3 10.3 10.4 10.4 10.4 10.4 10.4 10.4
La médiane est le deuxième des trois quartiles :
- le premier quartile \(q_{0.25}\) est une valeur qui sépare les 25\(\%\) des valeurs inférieures de l’échantillon du reste
- le deuxième quartile \(q_{0.5}\) est la médiane
- le troisième quartile \(q_{O.75}\) est une valeur qui sépare les 25% des valeurs supérieures de l’échantillon du reste. On retrouve ces valeurs dans la représentation par boxplot (voir la sous-section boxplot).
Les quartiles sont des cas particuliers de la notion de quantile. Le \(\alpha\)-quantile empirique est défini par \(q_{\alpha} = x_{(i)}\) avec \(\alpha\in]\frac{i-1}{n}, \frac{i}{n}]\) où \(x_{(1)}\leq x_{(2)}\leq \ldots \leq x_{(n)}\) sont les valeurs ordonnées de la série statistique.
quantile(Data$Alcool)
0% 25% 50% 75% 100%
8.0 9.5 10.4 11.3 14.0
quantile(Data$Alcool, 0.9)
90%
12.1
Pour calculer l’écart interquantile, il suffit de faire la différence entre les troisième et premier quantiles, à savoir
<- quantile(x = Data$Alcool, probs = c(0.25, 0.75), names = FALSE)
q.Alc diff(q.Alc)
[1] 1.8
Les valeurs d’adjacence (cf définitions dans la sous-section boxplot) sont obtenues de la manière suivante :
= q.Alc + diff(q.Alc) * c(-1.5, 1.5)
L L
[1] 6.8 14.0
# valeur adjacente inférieure :
min(Data$Alcool[Data$Alcool >= L[1]])
[1] 8
# valeur adjacente supérieure :
max(Data$Alcool[Data$Alcool <= L[2]])
[1] 14
Par ailleurs, toutes ces informations sont stockées dans la commande
summary()
:
summary(Data$Alcool)
Min. 1st Qu. Median Mean 3rd Qu. Max.
8.00 9.50 10.40 10.49 11.30 14.00
où sont affichés respectivement le minimum, le premier quartile, la médiane, la moyenne, le troisième quartile et le maximum.
Représentations graphiques
Histogramme
L’histogramme est une représentation graphique qui permet de visualiser la répartition d’une variable quantitative. Les valeurs sont regroupées en intervalles \(]a_k,a_{k+1}[\) et la hauteur associée est \(h_k=\frac{f_k}{a_{k+1} - a_k}\).
plot
par(mfrow = c(1, 2))
hist(Data$Alcool, main = "Histo. des effectifs")
hist(Data$Alcool, freq = FALSE, main = "Histo. des fréquences")
L’option breaks="Sturges"
donne le choix par défaut de R
pour le nombre de classes. D’autres options sont possibles (soit on
précise les classes elles mêmes dans un vecteur, soit on précise un
nombre arbitraire de classes, soit on lui précise l’algorithme pour
calculer le nombre de classes parmi "Sturges"
,
"Scott"
ou "FD"
pour Freedman-Diaconis). On
peut récupérer les informations de construction de l’histogramme en
stockant le résultat de hist()
dans une variable :
<- hist(Data$Alcool, plot = FALSE)
H attributes(H)
$names
[1] "breaks" "counts" "density" "mids" "xname" "equidist"
$class
[1] "histogram"
$breaks # les (K+1) bordures des classes [a_k,a_{k+1}]
H$counts # le nombre de points dans chaque classe
H$density # la hauteur des K classes
H$mids # le milieu des K classes
H$xname # le nom de la variable
H$equidist # découpage régulier H
ggplot
= ggplot(Data, aes(x = Alcool)) + geom_histogram(color = "black", fill = "white",
g1 binwidth = 0.5)
= ggplot(Data, aes(x = Alcool)) + geom_histogram(aes(y = ..density..), color = "black",
g2 fill = "white", binwidth = 0.5)
grid.arrange(g1, g2, ncol = 2)
ggplot(Data, aes(x = Alcool)) + geom_histogram(aes(y = ..density..), colour = "black",
fill = "white") + geom_density(alpha = 0.2, fill = "red")
ggplot(Data, aes(x = Alcool, color = Type)) + geom_histogram(aes(y = ..density..),
fill = "white") + geom_density(alpha = 0.2)
Fonction de répartition empirique
La fonction de répartition empirique est la fonction en escalier définie par \(t\in\mathbb{R}\mapsto F_n(t) = \frac{1}{n} \sum_{i=1}^n \mathbb{1}_{x_i\leq t}\)
plot
plot(ecdf(Data$Alcool), xlab = "Variable Alcool", ylab = "", main = "Fonction de répartition empirique")
ggplot
ggplot(Data, aes(Alcool)) + stat_ecdf(geom = "step") + xlab("Variable Alcool") +
ylab(" ") + ggtitle("Fonction de répartition empirique")
Boîte à moustaches / boxplot
La boîte à moustaches est un graphique qui résume la série statistique à partir de ses valeurs extrêmes et ses quartiles. En effet, on retrouve sur cette représentation
- les quartiles
- la valeur adjacente supérieure \(v+\), qui est la plus grande valeur de l’échantillon inférieure ou égale à \(L+ = q_{0.75} + 1.5 (q _{0.75} − q_{0.25})\)
- la valeur adjacente inférieure \(v−\), qui est la plus petite valeur de l’échantillon supérieure ou égale à \(L− = q_{0.25} − 1.5 (q_{0.75} − q_{0.25})\)
- les valeurs extrêmes (outliers) qui sont les valeurs de l’échantillon n’appartenant pas à l’intervalle \([v−, v+]\).
plot
Voici les boxplots pour les variables quantitatives de notre exemple.
boxplot(Data[, -c(1:2)])
Nous allons pour la suite nous concentrer sur la variable
SO2lbr. En plus du graphique, on peut récupérer de la fonction
boxplot()
différentes informations :
<- boxplot(Data$SO2lbr, horizontal = TRUE) B
attributes(B)
$names
[1] "stats" "n" "conf" "out" "group" "names"
Dans B$stats
, on retrouve les quartiles, la médiane et
les valeurs adjacentes :
$stats B
[,1]
[1,] 2.0
[2,] 15.5
[3,] 27.0
[4,] 41.0
[5,] 73.5
median(Data$SO2lbr)
[1] 27
<- quantile(x = Data$SO2lbr, probs = c(0.25, 0.75), names = FALSE)
q q
[1] 15.75 41.00
= q + diff(q) * c(-1.5, 1.5)
L min(Data$SO2lbr[Data$SO2lbr >= L[1]])
[1] 2
max(Data$SO2lbr[Data$SO2lbr <= L[2]])
[1] 73.5
B$out
renvoie toutes les valeurs aberrantes (en dehors
des barres inférieure et supérieure c’est à dire en dehors de
l’intervalle \([v-,v+]\)):
$out B
[1] 89.0 105.0 85.0 112.0 79.5
$SO2lbr[which(Data$SO2lbr < B$stats[1] | Data$SO2lbr > B$stats[5])] Data
[1] 89.0 105.0 85.0 112.0 79.5
ggplot
Représentation des boxplot avec ggplot2 :
= ggplot(gather(key = "variable", value = "valeur", Data[, c(3:4)])) + geom_boxplot(aes(x = variable,
g1 y = valeur))
= ggplot(gather(key = "variable", value = "valeur", Data[, c(5:6)])) + geom_boxplot(aes(x = variable,
g2 y = valeur))
grid.arrange(g1, g2, ncol = 2)
Représentation des violin plots :
= ggplot(gather(key = "variable", value = "valeur", Data[, c(3:4)])) + geom_violin(aes(x = variable,
g1 y = valeur))
= ggplot(gather(key = "variable", value = "valeur", Data[, c(5:6)])) + geom_violin(aes(x = variable,
g2 y = valeur))
grid.arrange(g1, g2, ncol = 2)
Statistiques descriptives bidimensionnelles
Entre 2 variables quantitatives
Supposons dans cette partie que X et Y sont deux variables quantitatives et on observe une série de \(n\) valeurs pour chacune : \(\underline{x}=(x_1,\ldots,x_n)\) et \(\underline{y}=(y_1,\ldots,y_n)\).
On peut tout d’abord représenter le nuage de points de coordonnées \((x_i,y_i)\) :
plot
plot(Data$Alcool, Data$Densite, pch = 20, xlab = "Alcool", ylab = "Densite")
ggplot
ggplot(Data, aes(x = Alcool, y = Densite)) + geom_point()
Corrélation
On peut calculer la covariance (généralisaton bidimensionnelle de la
variance) entre ces deux séries de mesure à l’aide de la commande
cov()
: \[
Cov(\underline{x},\underline{y}) = \frac{1}{n} \sum_{i=1}^n
(x_i-\bar{x}) (y_i -\bar{y}).
\] Mais la covariance dépendant des unités de mesure des deux
variables considérées, on calcule plutôt la corrélation linéaire
(renormalisation de la covariance par les écarts-type) qui appartient à
l’intervalle \([-1,1]\) à l’aide de
cor()
: \[
cor(\underline{x},\underline{y}) =
\frac{Cov(\underline{x},\underline{y})}{\sqrt{s_x^2\ \ s_y^2}}
\]
corrplot()
A l’aide de la fonction corrplot()
(issue du package du
même nom) on représente ici la matrice des corrélations entre les
variables quantitatives de notre jeu de données:
corrplot(cor(Data[, -c(1:2)]), method = "ellipse")
ggcorrplot()
ggcorrplot(cor(Data[, -c(1:2)]), method = "circle")
ggcorrplot(cor(Data[, -c(1:2)]), hc.order = TRUE, type = "lower", lab = TRUE)
Régression linéaire
Le coefficient de corrélation linéaire entre les variables Densité et Alcool vaut -0.68. On peut vérifier que le nuage de points de ces deux variables s’aligner sur une droite de pente négative :
plot
plot(Densite ~ Alcool, data = Data, pch = 20)
abline(lm(Densite ~ Alcool, data = Data), col = "red")
ggplot
ggplot(Data, aes(x = Alcool, y = Densite)) + geom_point() + geom_smooth(method = lm)
Entre une variable quantitative et une variable qualitative
Supposons dans cette partie que \(X\) est une variable qualitative prenant \(J\) modalités \(m_1, \ldots, m_J\) et \(Y\) une variable quantitative. On observe une série de \(n\) valeurs pour chacune : \(\underline{x}=(x_1,\ldots,x_n)\) et \(\underline{y}=(y_1,\ldots,y_n)\).
On note \(C_j=\{i\in\{1,\ldots,n\}; x_i=m_j\}\) l’ensemble des individus prenant la modalité \(m_j\) et \(n_j\) son cardinal.
La moyenne de \(\underline{y}\) peut alors se décomposer en une moyenne pondérée des moyennes de \(y\) conditionnellement aux modalités de \(X\) : \[ \bar{y} = \frac{1}{n} \sum_{j=1}^J n_j\ \bar{y}_{[j]} \textrm{ avec } \bar{y}_{[j]} = \frac{1}{n_j} \sum_{i\in C_j} y_i \] De même la variance se décompose en \(s_y^2 = \underbrace{s_{y,E}^2}_{\textrm{variance inter-classe}} + \underbrace{s_{y,R}^2}_{\textrm{variance intra-classe}}\) avec
\[ s_{y,E}^2 = \frac{1}{n} \sum_{j=1}^J n_j\ (\bar{y}_{[j]} - \bar{y})^2 \] et \[ s_{y,R}^2 = \frac{1}{n} \sum_{j=1}^J n_j\ s_{y,[j]}^2 \textrm{ avec } s^2_{y,[j]} = \frac{1}{n_j}\sum_{i\in C_j} (y_i - \bar{y}_{[j]})^2 \] On peut alors définir le rapport de corrélation \[ \rho_{y|x} = \sqrt{\frac{s_{y,E}^2}{s_{y}^2}} = \sqrt{1 - \frac{s_{y,R}^2}{s_{y}^2}}\in[0,1]. \] Plus \(\rho_{y|x}\) est proche de \(0\), plus \(s_{y,E}^2\) est proche de 0 et donc moins la variable qualitative \(X\) a d’influence sur la variable quantitative \(Y\).
Graphiquement, on peut représenter la distribution de la variable quantitative conditionnellement aux modalités de la variable qualitative pour visualiser la liaison potentielle entre les deux variables.
plot
par(mfrow = c(1, 2))
boxplot(Alcool ~ Qualite, data = Data)
boxplot(Alcool ~ Type, data = Data)
ggplot
= ggplot(Data, aes(x = Qualite, y = Alcool)) + geom_boxplot()
g1 = ggplot(Data, aes(x = Qualite, y = Alcool)) + geom_violin()
g2 = ggplot(Data, aes(x = Alcool, fill = Qualite)) + geom_density(alpha = 0.2)
g3 grid.arrange(g1, g2, g3, ncol = 2)
Entre deux variables qualitatives
Supposons dans cette partie que \(X\) est une variable qualitative prenant \(J\) modalités \(m_1,\ldots,m_J\) et \(Y\) est une vraiable qualitative prenant \(K\) modalités \(\ell_1,\ldots,\ell_K\). On observe une série de \(n\) valeurs pour chacune : \(\underline{x}=(x_1,\ldots,x_n)\) et \(\underline{y}=(y_1,\ldots,y_n)\). Pour étudier l’influence de deux variables qualitatives entre elles, on se base sur la table de contingence qui est l’ensemble des effectifs conjoints \[ n_{j,k} = \sum_{i=1}^n \mathrm{1}_{x_i = m_j\ \cap\ y_i=\ell_k},\ \ \forall j\in\{1,\ldots,J\},\ \forall k\in\{1,\ldots,K\} \] On définit les effectifs marginaux par \[ n_{j,.}=\sum_{k=1}^K n_{j,k}\ \ \ \textrm{ et } \ \ \ n_{.,k}=\sum_{j=1}^J n_{j,k} \]
= table(Data$Qualite, Data$Type)
table.cont table.cont
blanc rouge
bad 17 2
good 89 21
medium 319 152
Graphiquement, on peut représenter un mosaicplot qui correspond à la représentation des profils-lignes \[ \left(\frac{n_{j,1}}{n_{j,.}},\ldots,\frac{n_{j,K}}{n_{j,.}}\right)\in [0,1]^K \] ou des profils-colonnes
\[ \left(\frac{n_{1,k}}{n_{.,k}},\ldots,\frac{n_{J,k}}{n_{.,k}}\right)\in [0,1]^J \]
plot
mosaicplot(table(Data$Qualite, Data$Type))
mosaicplot(table(Data$Type, Data$Qualite))
ggplot
library(ggmosaic)
ggplot(data = Data) + geom_mosaic(aes(x = product(Type, Qualite), fill = Qualite),
na.rm = TRUE) + xlab("Qualite") + ylab("Type")
ggplot(data = Data) + geom_mosaic(aes(x = product(Qualite, Type)), na.rm = TRUE) +
xlab("Type") + ylab("Qualite")
Pour aller plus loin
Dans la suite de votre cursus modIA, vous aborderez la mise en pratique d’algorithmes en R et python sur les thématiques suivantes :
- les statistiques descriptives multidimensionnelles dont l’ACP
- le modèle linéaire et modèle linéaire généralisé
- l’apprentissage supervisé
- l’apprentissage non supervisé
- …