Statistique et Probabilités [M3201]
TP 1 : Introduction à R
Exercice 1 : Yams
- Faire une fonction qui simule le lancement d’une pièce (résultat pile ou face).
- Faire une fonction qui simule le lancement d’un dé à 6 faces (avec la fonction sample()).
- Simuler le jeu de Yams (lancer de 5 dés simultanément) en utilisant les paramètres size et replace de la fonction sample().
- Estimer la probabilité d’obtenir un yams (5 des identiques) en utilisant les fonctions apply(), replicate() et unique(). Comparer à la valeur théorique.
# 1.a)
pile_ou_face <- function() sample(0:1, 1, replace=T)
# 1.b)
de <- function() sample(1:6, 1, replace=T)
#1.c)
yams <- function() sample(1:6, 5, replace=T)
num_exp = 1e6
simu <- replicate(num_exp, yams())
is_yams <- function(x) length(unique(x)) == 1
result <- apply(simu, MARGIN=2, FUN=is_yams)
proba_yams_empirique = sum(result) / num_exp
proba_yams_theorique = 1 / 6^4 # = 6 * 6^5
sprintf("Proba empirique %.2e vs. Proba theorique: %.2e",
proba_yams_empirique, proba_yams_theorique)
## [1] "Proba empirique 7.47e-04 vs. Proba theorique: 7.72e-04"
Exercice 2 : Etude sur l’indice de la masse corporelle
On dispose d’un échantillon de 10 enfants agés de 3 ou 4 ans lors de leur entrée en maternelle. Les données disponibles pour chaque enfant sont :
- le sexe : F pour fille et G pour garçon;
- le fait que leur école soit située en ZEP : O pour oui et N pour non;
- l’âge en années et en mois (constituant deux variables An et Mois);
- le poids en kg arrondi à 100 g près;
- la taille en cm arrondie à 0.5 cm près.
Prénom | Erika | Célia | Eric | Eve | Paul | Jean | Adan | Louis | Jules | Léo |
---|---|---|---|---|---|---|---|---|---|---|
Sexe | F | F | G | F | G | G | G | G | G | G |
ZEP | O | O | O | O | N | O | N | O | O | O |
Poids | 16 | 14 | 13.5 | 15.4 | 16.5 | 16 | 17 | 14.8 | 17 | 16.7 |
An | 3 | 3 | 3 | 4 | 3 | 4 | 3 | 3 | 4 | 3 |
Mois | 5 | 10 | 5 | 0 | 8 | 0 | 11 | 9 | 1 | 3 |
Taille | 100 | 97 | 95.5 | 101 | 100 | 98.5 | 103 | 98 | 101.5 | 100 |
- Choisissez la fonction R appropriée pour enregistrer les données de chacune des variables dans des vecteurs que vous nommerez Individus, Poids, Taille et Sexe.
- Calculez la moyenne des variables lorsque c’est possible.
- Calculer l’IMC des individus et regroupez les valeurs obtenues dans un vecteur nommé IMC sachant que \(IMC= \displaystyle \frac{Poids (kg)}{Taille^2(m)}\).
- Regroupez ces variables dans la structure R qui vous paraît la plus adaptée.
- Utilisez l’aide en ligne de R afin d’obtenir des informations sur la fonction plot().
- Tracez le nuage de points du Poids en fonction de la Taille. Pensez à fournir un titre à votre graphique et à annoter vos axes.
# 2.1 Vecteurs
Sexe = factor(c('F', 'F', 'G', 'F', 'G', 'G', 'G', 'G', 'G', 'G'))
ZEP = factor(c('O', 'O', 'O', 'O', 'N', 'O', 'N', 'O', 'O', 'O'))
Poids = c(16, 14, 13.5, 15.4, 16.5, 16, 17, 14.8, 17, 16.7)
Taille = c(100, 97, 95.5, 101, 100, 98.5, 103, 98, 101.5, 100)
Individus = strsplit("Erika Célia Eric Eve Paul Jean Adan Louis Jules Léo",' ')[[1]]
# 2.2 Moyenne:
mean(Taille)
## [1] 99.45
mean(Poids)
## [1] 15.69
# 2.3 calcul de l'IMC
(indice <- Poids / (Taille / 100) ^ 2)
## [1] 16.00000 14.87937 14.80223 15.09656 16.50000 16.49102 16.02413
## [8] 15.41025 16.50125 16.70000
# 2.4 Data-frame:
IMC <- data.frame(Sexe=Sexe,
ZEP=ZEP,
Taille=Taille,
Poids=Poids,
An=c(3, 3, 3, 4, 3, 4, 3, 3, 4, 3),
Mois=c(5, 10, 5, 0, 8, 0, 11, 9, 1, 3),
Prenom=Individus)
# Inserer une colonne:
IMC$indice <- indice
# Enlever la colonne:
IMC = subset(IMC, select = -c(indice))
# 2.6
plot(y=IMC$Poids, x=IMC$Taille,
xlab='Taille (cm)', ylab='Poids (kg)',
pch=19,
main="Nuage de points du Poids en fonction de la Taille")
Exercice 3: Importer des données
donnees <- read.table(file="nutriage.txt", header=T,sep="\t", dec=".")
# creere des variables avec les noms de chaque colonne:
attach(donnees)
Exerice 4 : Etude d’un jeu de données
Structuration des variables suivant leur type
En statistique, on classe les variables selon 4 catégories :
- qualitatives nominales (sans ordre)
- qualitatives ordinales (avec ordre)
- quantitatives discrètes
- quantitatives continues
Question : A partir de cette figure, classer toutes les variables du jeu de données nutriage ?
- sexe : Quali. nominale
- situation : Quali. nominale
- the : Quanti. discrete
- cafe : Quanti. discrete
- taille : Quanti. continue
- poids : Quanti. continue
- age : Quanti. continue
- viande : Quali. ordinale
- poisson : Quali. ordianle
- fruit_crus : Quali. ordinale
- fruit_legume_cuits : Quali. ordinale
- chocol : Quali. ordinale
- matgras : Quali. nominale
# Relaod:
donnees <- read.table(file="nutriage.txt", header=T,sep="\t", dec=".")
# Sexe:
# class(donnees$sexe)
# donnees$sexe <- as.factor(donnees$sexe)
# class(donnees$sexe)
donnees$sexe <- factor(donnees$sexe,
levels=(1:2),
labels=c("Homme", "Femme"))
# Situation:
donnees$situation <- factor(donnees$situation,
levels=(1:4),
labels=c("seul", "couple", "famille", "autre"))
# Matgras
donnees$matgras <- factor(donnees$matgras,
levels=(1:8),
labels=c("beurre", "margarine", "h.arachide",
"h.tournesol", "h.olive", "h.melange",
"h.colza", "graisse"))
# chocol:
for (var in c("chocol", "viande", "poisson", "fruit_crus", "fruit_legume_cuits")) {
donnees[[var]] <- ordered(donnees[[var]],
levels=(0:5),
labels=c("Jamais",
"Moins d'une fois par S",
"Une fois par semaine",
"2/3 fois par semaine",
"4/6 fois par semaine",
"Tous les jours"))
}
Présentation synthétique des données
On dispose des mesures d’une ou plusieurs variables pour chacun des N individus. Le tableau donne les variables en colonne et les individus en ligne. Sous R, les données ainsi définies sont dans une structure appelée data.frame.
Tableau des effectifs ou des fréquences d’une variable qualitative
Pour connaître la distribution d’une variable dans notre échantillon, il est plus pratique de représenter un tableau de données individuelles sous une forme plus condensée, par exemple un tableau des effectifs ou des fréquences. On peut le faire sous R grâce à la commande table(). On se servira de la fonction length() pour donner le tableau des fréquences.
Question : Comment les personnes de cet échantillon utilisent les matières grasses pour cuisiner ?
table(matgras)
## matgras
## 1 2 3 4 5 6 7 8
## 15 27 48 68 40 23 1 4
popul <- length(matgras)
table(matgras)/ popul * 100
## matgras
## 1 2 3 4 5 6
## 6.6371681 11.9469027 21.2389381 30.0884956 17.6991150 10.1769912
## 7 8
## 0.4424779 1.7699115
Question : Combien de personnes mangent quotiennement de la viande ?
table(viande)
## viande
## 0 1 2 3 4 5
## 1 3 11 83 67 61
sum(viande == "Tous les jours")
## [1] 0
Tableau de données regroupées en classes d’une variable quantitative
On peut représenter un tableau de données individuelles quantitatives en regroupant les valeurs par intervalle. Par exemple, on peut se servir de la fonction hist() en spécifiant le vecteur des bornes des classes dans son paramètre breaks.
Question : Combien y-a-t-il d’individus dont la taille est dans l’intervalle ]155,160] ?
res <- hist(taille, plot=F)
nn <- as.character(res$breaks)
x<-as.table(res$counts)
dimnames(x)
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
dimnames(x) <- list(paste(nn[-length(nn)], nn[-1], sep="-"))
x
## 140-145 145-150 150-155 155-160 160-165 165-170 170-175 175-180 180-185
## 1 7 37 50 46 31 27 17 4
## 185-190
## 6
# Alternative:
sum(taille>155 & taille<=160)
## [1] 50
Tableaux croisant deux variables qualitatives
Tableau de contingence
On peut utiliser la fonction table() pour obtenir le tableau de contingence de deux variables
Question : Dans cet échantillon de 226 individus, quel est le pourcentage d’hommes vivant en couple ?
matable <- table(sexe, situation)
matable
## situation
## sexe 1 2 3
## 1 20 63 2
## 2 78 56 7
# Alternative:
sum(sexe == "Homme" & situation == "couple") / length(sexe) * 100
## [1] 0
On peut ajouter les marges en utilisant la fonction addmargins().
Question : Parmi les hommes, quel est le pourcentage d’homme vivant en couple ?
matable_complete <- addmargins(matable)
matable_complete
## situation
## sexe 1 2 3 Sum
## 1 20 63 2 85
## 2 78 56 7 141
## Sum 98 119 9 226
# Alternative:
sum(sexe == "Homme" & situation == "couple") / sum(sexe == "Homme") * 100
## [1] NaN
Résumés numériques
Tous les exemples donnés seront effectués sur la variable taille. Les résumés numériques ne peuvent être calculés en présence de données manquantes (NA). Si cela est nécessaire, il est possible d’utiliser la fonction na.omit() pour les retirer lors du calcul.
x <- na.omit(taille)
Résumés de position d’une distribution d’une variable quantitative
La médiane
La médiane d’une série statistique est la valeur \(m_e\) de la variable \(X\) qui partage cette série statistique en deux parties (inférieure et supérieure à \(m_e\)) de même effectif. Cette quantité ne se calcule pas sur des variables purement qualitatives.
La fonction R est median() et s’applique uniquement sur des valeurs numériques.
Question : Combien d’invidus mesurent strictement moins que la médiane et combien mesurent strictement plus que la médiane ?
median_taille = median(taille)
sum(taille < median_taille); sum(taille > median_taille)
## [1] 107
## [1] 107
sum(taille == median_taille)
## [1] 12
La moyenne
Elle se calcule uniquement sur des variables quantitatives via la fonction mean(). Question : Quelle est la moyenne de la variable taille ? La comparer à la mediane ?
mean_taille = mean(taille)
mean_taille; median_taille
## [1] 163.9602
## [1] 163
Les fractiles
Le fractile d’ordre p (0<p<1) est la valeur \(q_p\) qui coupe l’échantillon en deux portions, l’une ayant un nombre d’éléments (inférieurs à \(q_p\)) égal à \(p\%\) du nombre total d’éléments et l’autre à \((1-p)\%\) étant supérieurs à \(q_p\). Il ne se calcule pas pour des variables purement qualitatives. Si on prend \(p=0.5\), on retrouve la définition de la médiane.
En R, la fonction quantile() (avec le paramètre probs) permet de donner les fractiles de la variable.
quantile(taille, probs=c(0.1,0.25,0.77))
## 10% 25% 77%
## 153 157 171
deciles_1_9 = quantile(taille, probs=seq(0.1, 0.9, by=0.1)); deciles_1_9
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 153.0 156.0 158.5 160.0 163.0 165.0 168.0 172.0 176.0
quartiles = quantile(taille, probs=seq(0.25, 0.75, by=0.25)); quartiles
## 25% 50% 75%
## 157 163 170
deciles = quantile(taille, probs=seq(0, 1, by=0.1)); deciles
## 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
## 140.0 153.0 156.0 158.5 160.0 163.0 165.0 168.0 172.0 176.0 188.0
En créant 3 vecteurs, vous donnerez 3 sorties pour la variable taille :
- 1er et 9ème déciles
- 1er, 2ème et 3ème quartiles
- tous les déciles
La fonction summary() appliquée sur un vecteur de données quantitatives permet de calculer le minimum, le maximum, la moyenne et les trois quartiles.
Question : Donner les principaux résumés numériques pour la variable age.
# summary(taille)
summary(age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 65.00 70.00 74.00 74.48 78.00 91.00
Résumé de dispersion autour de la moyenne d’une distribution
Ces résumés peuvent être calculés uniquement pour des variables quantitatives. Les principales sont :
- Variance \(\sigma^2\) de la population. Attention, la fonction var() du logiciel R renvoie une estimation non biaisée de la variance.
- l’écart type est la racine carrée de la variance.
- Coefficient de variation \(c_v=\frac{\sigma}{\mu}\)
Reprogrammer les fonctions variance, écart-type, et coefficient de variation d’une population (qu’on nommera var.pop, sd.pop et co.pop).
# Mean
mean.pop <- function(x) sum(x) / length(x)
var.pop <- function(x) sum((x - mean.pop(x))**2) / length(x)
unbiased.var.pop <- function(x) sum((x - mean.pop(x))**2) / (length(x) - 1)
sd.pop <- function(x) sqrt(var.pop(x))
co.pop <- function(x) sd.pop(x) / mean.pop(x)