On reprend le fichier de données (medecine.txt)
étudié dans le chapitre 1 avec RCommander.
Le stocker dans un dataframe nommé med, soit avec RCommander, soit en exécutant les commandes
suivantes :
setwd("C:/Documents and Settings/raffinat") # à adapter
med = read.table("medecine.txt", header=TRUE, sep="\t", na.strings="NA",
dec=",", strip.white=TRUE)
Les corrigés sont disponibles en cliquant ici, mais il est
conseillé de chercher les exercices auparavant !
Exercice 1 : valeurs hors-norme
Nous avons vu dans l'exercice 2 du chapitre 1
que certains graphiques étaient faussés par des valeurs hors norme (par exemple poids de l'ordre de
250 kg)
1) Déterminer le poids maximum à l'aide de la fonction summary, max ou sort (tri).
2)
a) Vérifier, en exécutant l'instruction suivante, que l'histogramme du poids est "pollué"
par cette valeur hors norme :
hist(med$poids, main="histogramme du poids")
b) Consulter l'aide (taper help(hist)) et utiliser l'option xlim afin de limiter
l'histogramme aux poids compris entre 40 et 130 kg.
3)
a) vérifier, en exécutant l'instruction suivante, que la boite à moustaches du poids est "polluée"
par cette valeur hors norme :
boxplot(med$poids, main="boite à moustaches du poids")
b) Construire deux dataframes nommés moins130 (les personnes de moins de 130 kg)
et plus130 (les personnes de plus de 130 kg), puis afficher le second dataframe.
c) En utilisant le dataframe moins130, représenter une boite à moustaches non
polluée par l'individu de poids maximal.
Exercice 2 : ajout de variables
1)
a) Ajouter au dataframe med une variable IMC, sachant que l'IMC (Indice de Masse Corporelle) est égal
au poids divisé par le carré de la taille.
b) Faire un histogramme de l'IMC, en fixant les classes suivantes :
-
15 à 18,5 : maigreur
-
18,5 à 25 : corpulence normale
-
25 à 30 : surpoids
-
30 à 35 : obésité modérée
-
35 à 45 : obésité sévère
2)
a) Ajouter au dataframe med une variable libelleIMC, dont les modalités
sont maigreur, normal, surpoids, obesite_legere et obesite_severe.
b) Faire un camembert de la variable libelleIMC.
Exercice 3 : mise en forme des résultats
La mise en forme des résultats effectuée dans cet exercice
aura une réelle utilité dans le chapitre 3 (rapports statistiques)...
1)
|
1 (moyenne) |
2 (mediane) |
1 (Entreprise1) |
... |
... |
2 (Entreprise2) |
... |
... |
Une matrice de statistiques du poids par société
a) Construire les dataframes med1 (employés de la société "entreprise1") et
med2 (employés de l'entreprise "entreprise2").
b) En déduire le poids moyen des employés de la société "entreprise1"
ainsi que le poids médian (aide : taper help(median)).
c) Compléter le programme suivant afin d'obtenir la matrice des statistiques
du poids par société :
mat = matrix(0, nrow=2 , ncol=2)
mat[1,1] = ...
mat[1,2] = ...
mat[2,1] = ...
mat[2,2] = ...
rownames(mat) = c("Entreprise1","Entreprise2")
colnames(mat) = ...
print(mat)
d) Vérifier, en exécutant le programme suivant, qu'il existe une
méthode plus directe pour obtenir la matrice de statistiques du poids par société :
moyenne = by(med$poids, med$societe, mean, na.rm=T)
mediane = by(med$poids, med$societe, median, na.rm=T)
mat = cbind(moyenne, mediane)
print(mat)
e) On définit une fonction nommée creerMatrice créant la matrice
de statistiques pour une variable quantitative quelconque (var1)
suivant les modalités d'une variable qualitative quelconque (var2) :
creerMatrice = function(var1, var2) {
moyenne = by(var1, var2, mean, na.rm=T)
mediane = by(var1, var2, median, na.rm=T)
mat = cbind(moyenne, mediane)
return(mat)
}
Utiliser cette fonction pour obtenir :
-
la matrice des statistiques du poids par société
-
la matrice des statistiques de la taille par docteur
2)
|
1 (moyenne) |
2 (mediane) |
1 (taille) |
... |
... |
2 (poids) |
... |
... |
Une matrice de statistiques sur le poids et la taille
a) Compléter le programme suivant afin d'obtenir la matrice des statistiques
sur le poids et la taille :
mat = matrix(0, nrow=2 , ncol=2)
mat[1,1] = ...
mat[1,2] = ...
mat[2,1] = ...
mat[2,2] = ...
colnames(mat) = ...
rownames(mat) = ...
print(mat)
b) Vérifier, en exécutant le programme suivant, qu'il existe une
méthode plus directe pour obtenir les statistiques sur le poids
et la taille :
resume_taille = summary(med$taille)
print(resume_taille)
resume_poids = summary(med$poids)
mat = rbind(resume_taille[c(4,3)],resume_poids[c(4,3)])
rownames(mat) = c("taille","poids")
print(mat)
Exercice 4 : valeurs manquantes
1) Chercher avec RCommander (menu Statistiques / Résumés) s'il y a des valeurs manquantes et vérifier que
le code R obtenu est :
sapply(med, function(x)(sum(is.na(x))))
2) Exécuter et interpréter le code suivant :
sum( is.na(med$age) )
which( is.na(med$age) )
sum( is.na(med$age) & is.na(med$docteur) )
which( is.na(med$age) & is.na(med$docteur) )
sum( is.na(med$age) | is.na(med$docteur) )
which( is.na(med$age) | is.na(med$docteur) )
3) Construire et afficher les dataframes suivants :
-
le dataframe des personnes avec age manquant
-
le dataframe des personnes avec age présent
-
le dataframe des personnes avec age et docteur manquants
-
le dataframe des personnes avec age ou docteur manquant
4)
a) Expliquer, après avoir l'avoir exécuté, les failles du programme suivant :
tab = data.frame(math=c(10,NA,10,NA,5), anglais=c(12,13,NA,NA,15))
tab$moyenne = (3*tab$math + 2*tab$anglais) / (3 + 2)
print(tab)
b) Vérifier, en l'exécutant, que ce programme affiche une par une chaque moyenne :
n=length(tab$moyenne)
for(i in 1:n) {
print(tab$moyenne[i])
}
c) Compléter le programme suivant pour qu'il modifie les moyennes des étudiants
absents à l'une des deux épreuves :
n=length(tab$moyenne)
for(i in 1:n) {
if ( is.na(tab$math[i]) ) {
tab$moyenne[i] = ...
} else if ( is.na(tab$anglais[i]) ) {
tab$moyenne[i] = ...
}
}
print(tab)
d) La combinaison for-if de la question précédente peut
être réutilisée pour calculer l'avis (recalé de 0 à 8, oral de 8 à 10, admis
de 10 à 20) :
n=length(tab$moyenne)
avis = character(0) # cree un vecteur textuel vide
for(i in 1:n) {
if ( tab$moyenne[i] < 8 ) {
avis[i] = 'recale'
}
...
}
print(avis)
tab$avis = as.factor(avis)
print(tab)