Statistique avec R

Lois usuelles de probabilité

De nombreuses distributions de probabilité sont disponibles sous R. En voici une liste non exhaustive :

Table des lois usuelles sous R
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

  1. Simuler un échantillon de taille 1000 suivant une loi normale \(\mathcal{N}(0,1)\).
  2. Sur un même graphique, superposer la répartition empirique (histogramme) et la densité de la loi \(\mathcal{N}(0,1)\).
  3. 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)\).
  4. 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)

  1. Générer \(N=10000\) échantillons de taille \(n\) (pour la loi de votre choix), pour différentes valeurs de \(n\).
  2. 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
Ech = rnorm(1000, 0, 1)
# 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
p = 0.4
n = 1000
N = 10000
X = matrix(rbinom(n * N, size = 1, prob = p), nrow = N, ncol = n)
Xbar = apply(X, 1, mean)
V = sqrt(n) * (Xbar - p)/sqrt(p * (1 - p))

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:

Data$Qualite = as.factor(Data$Qualite)
Data$Type = factor(Data$Type, labels = c("blanc", "rouge"))
head(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 
EffType = as.vector(table(Data$Type))
EffType
[1] 425 175

On utilise aussi les fréquences \(f_k=\frac{n_k}{n}\) donc \(\sum_{k=1}^K f_k=1\).

Freq = EffType/length(Data$Type)
Description de la variable Type
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)
Data$Qualite_rec <- fct_relevel(Data$Qualite, "bad", "medium", "good")
par(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 :

g1 = ggplot(Data) + geom_bar(aes(x = Type)) + ggtitle("Effectifs")
g2 = ggplot(Data) + geom_bar(aes(x = Type, y = ..prop.., group = 1)) + ggtitle("Frequences")
df = data.frame(type = levels(Data$Type), value = as.vector(Freq))
g3 = ggplot(df, aes(x = "", y = value, fill = type)) + geom_bar(width = 1, stat = "identity")
g4 = g3 + coord_polar("y", start = 0)

grid.arrange(g1, g2, g3, g4, nrow = 2)

Pour la variable Qualité :

library(tidyverse)
Data$Qualite_rec <- fct_relevel(Data$Qualite, "bad", "medium", "good")
df <- data.frame(Qualite = levels(Data$Qualite_rec), value = table(Data$Qualite_rec),
    valuecumul = 100 * cumsum(prop.table(table(Data$Qualite_rec))))
df$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good")
df <- df %>%
    mutate(freq = value.Freq/nrow(Data))
g1 <- ggplot(Data) + geom_bar(aes(x = Qualite_rec)) + ggtitle("Effectifs")
g2 <- ggplot(Data) + geom_bar(aes(x = Qualite_rec, y = ..prop.., group = 1)) + ggtitle("Frequences")
g3 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") +
    ggtitle("Fréquences cumulées")

g4 <- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") +
    coord_polar("y", start = 0)


grid.arrange(g1, g2, g3, g4, ncol = 2)

Data <- Data[, -9]

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}]\)\(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

q.Alc <- quantile(x = Data$Alcool, probs = c(0.25, 0.75), names = FALSE)
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 :

L = q.Alc + diff(q.Alc) * c(-1.5, 1.5)
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 :

H <- hist(Data$Alcool, plot = FALSE)
attributes(H)
$names
[1] "breaks"   "counts"   "density"  "mids"     "xname"    "equidist"

$class
[1] "histogram"
H$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 
ggplot
g1 = ggplot(Data, aes(x = Alcool)) + geom_histogram(color = "black", fill = "white",
    binwidth = 0.5)
g2 = ggplot(Data, aes(x = Alcool)) + geom_histogram(aes(y = ..density..), color = "black",
    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 :

B <- boxplot(Data$SO2lbr, horizontal = TRUE)

attributes(B)
$names
[1] "stats" "n"     "conf"  "out"   "group" "names"

Dans B$stats, on retrouve les quartiles, la médiane et les valeurs adjacentes :

B$stats
     [,1]
[1,]  2.0
[2,] 15.5
[3,] 27.0
[4,] 41.0
[5,] 73.5
median(Data$SO2lbr)
[1] 27
q <- quantile(x = Data$SO2lbr, probs = c(0.25, 0.75), names = FALSE)
q
[1] 15.75 41.00
L = q + diff(q) * c(-1.5, 1.5)
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+]\)):

B$out
[1]  89.0 105.0  85.0 112.0  79.5
Data$SO2lbr[which(Data$SO2lbr < B$stats[1] | Data$SO2lbr > B$stats[5])]
[1]  89.0 105.0  85.0 112.0  79.5
ggplot

Représentation des boxplot avec ggplot2 :

g1 = ggplot(gather(key = "variable", value = "valeur", Data[, c(3:4)])) + geom_boxplot(aes(x = variable,
    y = valeur))
g2 = ggplot(gather(key = "variable", value = "valeur", Data[, c(5:6)])) + geom_boxplot(aes(x = variable,
    y = valeur))
grid.arrange(g1, g2, ncol = 2)

Représentation des violin plots :

g1 = ggplot(gather(key = "variable", value = "valeur", Data[, c(3:4)])) + geom_violin(aes(x = variable,
    y = valeur))
g2 = ggplot(gather(key = "variable", value = "valeur", Data[, c(5:6)])) + geom_violin(aes(x = variable,
    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
g1 = ggplot(Data, aes(x = Qualite, y = Alcool)) + geom_boxplot()
g2 = ggplot(Data, aes(x = Qualite, y = Alcool)) + geom_violin()
g3 = ggplot(Data, aes(x = Alcool, fill = Qualite)) + geom_density(alpha = 0.2)
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.cont = table(Data$Qualite, Data$Type)
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é