Interfaces utilisateur et rapports statistiques avec R et Sas
Introduction
Chapitre 1. Environnement de travail
Chapitre 2. Le langage R
2.1. Vecteurs
2.2. Matrices
2.3. Listes
2.4. Tableaux de données
2.5. Fonctions personnalisées
2.6. Exercices
Chapitre 3. Rapports statistiques
Chapitre 4. Interfaces utilisateur
Chapitre 5. Bases de données et langage Sql
Annexe A : une applette Java
Annexe B : le logiciel Sas
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante Démarrage du logiciel Webographie du module Glossaire du module

2.6. Exercices

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)
Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante Démarrage du logiciel Webographie du module Glossaire du module