R Introduction
R Introduction
(et assimilés)
Julien Barnier
Groupe de Recherche sur la Socialisation
CNRS – UMR 5040
[Link]@[Link]
8 mars 2010
Table des matières
1 Introduction 5
1.1 À propos de ce document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Conventions typographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Présentation de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Philosophie de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Prise en main 7
2.1 L’invite de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1 Objets simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1 Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.2 Quelques fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.3 Aide sur une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Import/export de données 33
4.1 Accès aux fichiers et répertoire de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Import de données depuis un tableur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.1 Depuis Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.2 Depuis OpenOffice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.3 Autres sources / en cas de problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Import depuis d’autres logiciels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.1 SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.2 SPSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3.3 Modalisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3.4 Fichiers dbf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.4 Autres sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2
Table des matières 3
5 Manipulation de données 40
5.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.1 Types de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.2 Renommer des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.3 Facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2 Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.1 Indexation directe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.2 Indexation par nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.3 Indexation par conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2.4 Indexation et assignation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3 Sous-populations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3.1 Par indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3.2 Fonction subset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.3.3 Fonction tapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.4 Recodages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.4.1 Convertir une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.4.2 Découper une variable numérique en classes . . . . . . . . . . . . . . . . . . . . . . 55
5.4.3 Regrouper les modalités d’une variable . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.4.4 Variables calculées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.4.5 Combiner plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.4.6 Variables scores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.4.7 Vérification des recodages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5 Tri de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.6 Fusion de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.7 Organiser ses scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.8 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6 Statistique bivariée 69
6.1 Deux variables quantitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2 Une variable quantitative et une variable qualitative . . . . . . . . . . . . . . . . . . . . . 74
6.3 Deux variables qualitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.3.1 Tableau croisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.3.2 χ2 et dérivés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.3.3 Représentation graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7 Données pondérées 84
7.1 Options de certaines fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.2 Fonctions de l’extension rgrs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.3 L’extension survey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8 Cartographie 89
8.1 Données spatiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.1.1 Exemple d’objet spatial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.1.2 Importer des données spatiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
8.2 Cartes simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.2.1 Représentation de proportions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.2.2 Représentation d’effectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.2.3 Représentation d’une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . 98
8.3 Ajout d’éléments à une carte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.3.1 Bordure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4 Table des matières
A Installer R 120
A.1 Installation de R sous Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
A.2 Installation de R sous Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
A.3 Mise à jour de R sous Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
A.4 Interfaces graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
A.4.1 Tinn-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
B Extensions 125
B.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
B.2 Installation des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
B.3 L’extension rgrs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
B.3.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
B.3.2 Fonctions et utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
B.3.3 Le jeu de données hdv2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
B.3.4 Le jeu de données rp99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Introduction
Le résultat de la commande tel qu’affiché par R est indiqué dans une police à chasse fixe inclinée rouge
foncé :
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.75600 -0.64300 -0.09227 -0.18050 0.41170 2.01900
Lorsque la commande R est trop longue et répartie sur plusieurs lignes, les lignes suivantes sont
précédées du symbole + :
R> coo <- [Link](dfxy = dfxy, xax = xax, yax = yax,
+ xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes,
+ cgrid = cgrid, [Link] = [Link])
5
6 Introduction
1.3 Présentation de R
R est un langage orienté vers le traitement de données et l’analyse statistique dérivé du langage S.
Il est développé depuis plus de 10 ans par un groupe de volontaires de différents pays. C’est un logiciel
libre 1 , publié sous licence GNU GPL.
L’utilisation de R présente plusieurs avantages :
– c’est un logiciel multiplateforme, qui fonctionne aussi bien sur des sytèmes Linux, Mac OS X ou
Windows ;
– c’est un logiciel libre, développé par ses utilisateurs et modifiable par tout un chacun ;
– c’est un logiciel gratuit ;
– c’est un logiciel très puissant, dont les fonctionnalités de base peuvent être étendues à l’aide d’ex-
tensions 2 ;
– c’est un logiciel dont le développement est très actif et dont la communauté d’utilisateurs ne cesse
de s’élargir ;
– c’est un logiciel avec d’excellentes capacités graphiques.
Comme rien n’est parfait, on peut également trouver quelques inconvénients :
– le logiciel, la documentation de référence et les principales ressources sont en anglais. Il est toutefois
parfaitement possible d’utiliser R sans spécialement maîtriser cette langue ;
– par son mode de fonctionnement, R charge normalement l’intégralité des données traitées en mé-
moire. Il nécessite donc une machine relativement puissante pour travailler sur des grosses enquêtes
de plusieurs milliers d’individus ;
– il n’existe pas encore d’interface graphique pour R équivalente à celle d’autres logiciels comme SPSS
ou Modalisa. R fonctionne à l’aide de scripts (des petits programmes) édités et exécutés au fur et
à mesure de l’analyse, et se rapprocherait davantage de SAS dans son utilisation (mais avec une
syntaxe et une philosophie très différentes).
À noter que ce dernier point, qui peut apparaître comme un gros handicap, s’avère après un temps
d’apprentissage être un mode d’utilisation d’une grande souplesse.
1.4 Philosophie de R
Deux points particuliers dans le fonctionnement de R peuvent parfois dérouter les utilisateurs habitués
à d’autres logiciels :
– sous R, en général, on ne voit pas les données sur lesquelles on travaille ; on ne dispose pas en
permanence d’une vue des données sous forme de tableau, comme sous Modalisa ou SPSS. Ceci peut
être déroutant au début, mais on se rend vite compte qu’on n’a pas besoin de voir en permanence
les données pour les analyser ;
– avec les autres logiciels, en général la production d’une analyse génère un grand nombre de résultats
de toutes sortes dans lesquels l’utilisateur est censé retrouver et isoler ceux qui l’intéressent. Avec
R, c’est l’inverse : par défaut l’affichage est réduit au minimum, et c’est l’utilisateur qui demande à
voir des résultats supplémentaires ou plus détaillés.
Inhabituel au début, ce fonctionnement permet en fait assez rapidement de gagner du temps dans la
conduite des analyses.
Prise en main
L’installation du logiciel proprement dite n’est pas décrite ici mais indiquée dans l’annexe A, page 120.
On part donc du principe que vous avez sous la main un ordinateur avec une installation récente de R,
quel que soit le système d’exploitation que vous utilisez (Linux, Mac OS X ou Windows).
1. La figure 2.1 de la présente page montre l’interface par défaut sous Windows.
7
8 Prise en main
(...)
suivi d’une ligne commençant par le caractère > et sur laquelle devrait se trouver votre curseur. Cette
ligne est appelée l’invite de commande (ou prompt en anglais). Elle signifie que R est disponible et en
attente de votre prochaine commande.
Nous allons tout de suite lui fournir une première commande :
R> 2 + 3
[1] 5
Bien, nous savons désormais que R sait faire les additions à un chiffre 2 . Nous pouvons désormais
continuer avec d’autres opérations arithmétiques de base :
R> 8 - 12
[1] -4
R> 14 * 25
[1] 350
R> -3/10
[1] -0.3
Une petite astuce très utile lorsque vous tapez des commandes directement dans la console : en util-
isant les flèches Haut et Bas du clavier, vous pouvez naviguer dans l’historique des commandes tapées
précédemment, que vous pouvez alors facilement réexécuter ou modifier.
Lorsqu’on fournit à R une commande incomplète, celui-ci nous propose de la compléter en nous
présentant une invite de commande spéciale utilisant les signe +. Imaginons par exemple que nous avons
malencontreusement tapé sur Entrée alors que nous souhaitions calculer 4*3 :
R> 4 *
+
On peut alors compléter la commande en saisissant simplement 3 :
R> 4 *
+ 3
[1] 12
2. La présence du [1] en début de ligne sera expliquée par la suite, page 10.
2.2. Des objets 9
Pour des commandes plus complexes, il arrive parfois qu’on se retrouve coincé avec un invite + sans plus
savoir comment compléter la saisie correctement. On peut alors annuler la commande en utilisant la touche
Echap ou Esc sous Windows. Sous Linunx on utilise le traditionnel Control + C.
À noter que les espaces autour des opérateurs n’ont pas d’importance lorsque l’on saisit les commandes
dans R. Les trois commandes suivantes sont donc équivalentes, mais on privilégie en général la deuxième
pour des raisons de lisibilité du code.
R> 10+2
R> 10 + 2
R> 10 + 2
R> x <- 2
Que signifie cette commande ? L’opérateur <- est appelé opérateur d’assignation. Il prend une valeur
quelconque à droite et la place dans l’objet indiqué à gauche. La commande pourrait donc se lire mettre
la valeur 2 dans l’objet nommé x.
On va ensuite pouvoir réutiliser cet objet dans d’autres calculs ou simplement afficher son contenu :
R> x + 3
[1] 5
R> x
[1] 2
Par défaut, si on donne à R seulement le nom d’un objet, il va se débrouiller pour nous présenter son
contenu d’une manière plus ou moins lisible.
On peut utiliser autant d’objets qu’on veut. Ceux-ci peuvent contenir des nombres, des chaînes de
caractères (indiquées par des guillemets droits ") et bien d’autres choses encore :
R> x <- 27
R> y <- 10
R> foo <- x + y
R> foo
[1] 37
10 Prise en main
Les noms d’objets peuvent contenir des lettres, des chiffres (mais ils ne peuvent pas commencer par un
chiffre), les symboles . et _, et doivent commencer par une lettre. R fait la différence entre les majuscules
et les minuscules, ce qui signifie que x et X sont deux objets différents. On évitera également d’utiliser des
caractères accentués dans les noms d’objets, et comme les espaces ne sont pas autorisés on pourra les remplacer
par un point ou un tiret bas.
Enfin, signalons que certains noms courts sont réservés par R pour son usage interne et doivent être
évités. On citera notamment c, q, t, C, D, F, I, T, max, min. . .
2.2.2 Vecteurs
Imaginons maintenant que nous avons interrogé dix personnes au hasard dans la rue et que nous avons
relevé pour chacune d’elle sa taille en centimètres. Nous avons donc une série de dix nombres que nous
souhaiterions pouvoir réunir de manière à pouvoir travailler sur l’ensemble de nos mesures.
Un ensemble de données de même nature constituent pour R un vecteur (en anglais vector) et se
construit à l’aide d’un opérateur nommé c 3 . On l’utilise en lui donnant la liste de nos données, entre
parenthèses, séparées par des virgules :
R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163,
+ 170)
Ce faisant, nous avons créé un objet nommé tailles et comprenant l’ensemble de nos données, que
nous pouvons afficher :
R> tailles
[1] 167 192 173 174 172 167 171 185 163 170
Dans le cas où notre vecteur serait beaucoup plus grand, et comporterait par exemple 40 tailles, on
aurait le résultat suivant :
R> tailles
[1] 144 168 179 175 182 188 167 152 163 145 176 155 156 164 167 155 157
[18] 185 155 169 124 178 182 195 151 185 159 156 184 172 156 160 183 148
[35] 182 126 177 159 143 161 180 169 159 185 160
On a bien notre suite de quarante tailles, mais on peut remarquer la présence de nombres entre
crochets au début de chaque ligne ([1], [18] et [35]). En fait ces nombres entre crochets indiquent la
position du premier élément de la ligne dans notre vecteur. Ainsi, le 185 en début de deuxième ligne est
le 18ème élément du vecteur, tandis que le 182 de la troisième ligne est à la 35ème position.
On en déduira d’ailleurs que lorsque l’on fait :
R> 2
[1] 2
3. c est l’abbréviation de combine. Le nom de cette fonction est très court car on l’utilise très souvent.
2.2. Des objets 11
On peut aussi combiner des vecteurs entre eux. L’exemple suivant calcule l’indice de masse corporelle
à partir de la taille et du poids :
R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163,
+ 170)
R> poids <- c(86, 74, 83, 50, 78, 66, 66, 51, 50, 55)
R> tailles.m <- tailles/100
R> imc <- poids/(tailles.m^2)
R> imc
[1] 30.83653 20.07378 27.73230 16.51473 26.36560 23.66524 22.57105
[8] 14.90139 18.81892 19.03114
Quand on fait des opérations sur les vecteurs, il faut veiller à soit utiliser un vecteur et un chiffre (dans des
opérations du type v * 2 ou v + 10), soit à utiliser des vecteurs de même longueur (dans des opérations
du type u + v).
Si on utilise des vecteurs de longueur différentes, on peut avoir quelques surprises 4 .
On a vu jusque-là des vecteurs composés de nombres, mais on peut tout à fait créer des vecteurs
composés de chaînes de caractères, représentant par exemple les réponses à une question ouverte ou
fermée :
R> reponse <- c("Bac+2", "Bac", "CAP", "Bac", "Bac", "CAP",
+ "BEP")
Enfin, notons que l’on peut accéder à un élément particulier du vecteur en faisant suivre le nom du
vecteur de crochets contenant le numéro de l’élément désiré. Par exemple :
R> reponse <- c("Bac+2", "Bac", "CAP", "Bac", "Bac", "CAP",
+ "BEP")
R> reponse[2]
[1] "Bac"
Cette opération s’appelle l’indexation d’un vecteur. Il s’agit ici de sa forme la plus simple, mais il en
existe d’autres beaucoup plus complexes. L’indexation des vecteurs et des tableaux dans R est l’un des
éléments particulièrement souples et puissants du langage (mais aussi l’un des plus délicats à comprendre
et à maîtriser). Nous en reparlerons section 5.2 page 43.
4. Quand R effectue une opération avec deux vecteurs de longueurs différentes, il recopie le vecteur le plus court de
manière à lui donner la même taille que le plus long, ce qui s’appelle la règle de recyclage (recycling rule). Ainsi, c(1,2) +
c(4,5,6,7,8) vaudra l’équivalent de c(1,2,1,2,1) + c(4,5,6,7,8).
12 Prise en main
on fait appel à la fonction nommée c, on lui passe en arguments (entre parenthèses et séparées par des
virgules) une série de chaînes de caractères, et elle retourne comme résultat un vecteur de chaînes de
caractères, que nous stockons dans l’objet tailles.
Prenons tout de suite d’autres exemples de fonctions courantes :
R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163,
+ 170)
R> length(tailles)
[1] 10
R> mean(tailles)
[1] 173.4
R> var(tailles)
[1] 76.71111
Ici, la fonction length nous renvoit le nombre d’éléments du vecteur, la fonction mean nous donne la
moyenne des éléments du vecteur, et la fonction var sa variance.
2.3.1 Arguments
Les arguments de la fonction lui sont indiqués entre parenthèses, juste après son nom. En général les
premiers arguments passés à la fonction sont des données servant au calcul, et les suivants des paramètres
influant sur ce calcul. Ceux-ci sont en général transmis sous la forme d’argument nommés.
Reprenons l’exemple des tailles précédent :
R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163,
+ 170)
Imaginons que le deuxième enquêté n’ait pas voulu nous répondre. Nous avons alors dans notre vecteur
une valeur manquante. Celle-ci est symbolisée dans R par le code NA :
R> tailles <- c(167, NA, 173, 174, 172, 167, 171, 185, 163,
+ 170)
R> mean(tailles)
[1] NA
Et oui, par défaut, R renvoit NA pour un grand nombre de calculs (dont la moyenne) lorsque les
données comportent une valeur manquante. On peut cependant modifier ce comportement en fournissant
un paramètre supplémentaire à la fonction mean, nommé [Link] :
R> mean(tailles, [Link] = TRUE)
[1] 171.3333
Positionner le paramètre [Link] à TRUE (vrai) indique à la fonction mean de ne pas tenir compte des
valeurs manquantes dans le calcul.
Lorsqu’on passe un argument à une fonction de cette manière, c’est-à-dire sous la forme nom=valeur,
on parle d’argument nommé.
Fonction Description
c construit un vecteur à partir d’une série de valeurs
length nombre d’éléments d’un vecteur
mean moyenne d’un vecteur de type numérique
var variance d’un vecteur de type numérique
+, -, *, / opérateurs mathématiques de base
ˆ passage à la puissance
Fonction Description
min valeur minimale d’un vecteur numérique
max valeur maximale d’un vecteur numérique
sd écart-type d’un vecteur numérique
: génère une séquence de nombres. 1:4 équivaut à c(1,2,3,4)
2.4 Exercices
Exercice 2.1
. Solution page 129
Construire le vecteur suivant :
Exercice 2.2
. Solution page 129
Générez les vecteurs suivants chacun de deux manières différentes :
[1] 1 2 3 4
[1] 1 2 3 4 8 9 10 11
[1] 2 4 6 8
Exercice 2.3
. Solution page 129
On a demandé à 4 ménages le revenu du chef de ménage, celui de son conjoint, et le nombre de
personnes du ménage :
R> chef <- c(1200, 1180, 1750, 2100)
R> conjoint <- c(1450, 1870, 1690, 0)
R> [Link] <- c(4, 2, 3, 2)
Exercice 2.4
. Solution page 129
Dans l’exercice précédent, calculez le revenu minimum et le revenu maximum parmi ceux du chef de
ménage :
R> chef <- c(1200, 1180, 1750, 2100)
Recommencer avec les revenus suivants, parmi lesquels l’un des enquêtés n’a pas voulu répondre :
R> [Link] <- c(1200, 1180, 1750, NA)
Partie 3
R> 2 + 2
[1] 4
Voici donc comment soumettre rapidement à R les commandes saisies dans votre fichier. Vous pouvez
désormais l’enregistrer, l’ouvrir plus tard, et en exécuter tout ou partie. À noter que vous avez plusieurs
possibilités pour soumettre des commandes à R :
– vous pouvez exécuter la ligne sur laquelle se trouve votre curseur en sélectionnant Éditon puis
Exécuter la ligne ou sélection, ou plus simplement en appuyant simultanément sur les touches Ctrl
et R 2 ;
– vous pouvez sélectionner plusieurs lignes contenant des commandes et les exécuter toutes en une
seule fois exactement de la même manière ;
– vous pouvez exécuter d’un coup l’intégralité de votre fichier en choisissant Édition puis Exécuter
tout.
La plupart du travail sous R consistera donc à éditer un ou plusieurs fichiers de commandes et à
envoyer régulièrement les commandes saisies à R en utilisant les raccourcis clavier ad hoc.
1. Les indications données ici concernent l’interface par défaut de R sous Windows. Elles sont très semblables sous Mac
OS X.
2. Sous Mac OS X, on utilise les touches Pomme et Entrée.
15
16 Premier travail avec des données
Dans tous les cas, il est très important de documenter ses fichiers R au fur et à mesure, faute de quoi on
risque de ne plus y comprendre grand chose si on les reprend ne serait-ce que quelques semaines plus tard.
R> library(rgrs)
Puis indiquer à R que nous souhaitons accéder au jeu de données à l’aide de la commande data :
R> data(hdv2003)
Bien. Et maintenant, elles sont où mes données ? Et bien elles se trouvent dans un objet nommé
hdv2003 désormais accessible directement. Essayons de taper son nom à l’invite de commande :
R> hdv2003
Le résultat (non reproduit ici) ne ressemble pas forcément à grand-chose. . . Il faut se rappeler que par
défaut, lorsqu’on lui fournit seulement un nom d’objet, R essaye de l’afficher de la manière la meilleure
(ou la moins pire) possible. La réponse à la commande hdv2003 n’est donc rien moins que l’affichage des
données brutes contenues dans cet objet.
Ce qui signifie donc que l’intégralité de notre jeu de données est inclus dans l’objet nommé hdv2003 !
En effet, dans R, un objet peut très bien contenir un simple nombre, un vecteur ou bien le résultat d’une
3. À noter que les exemples de ce document ne pourront être reproduits qu’avec une version de rgrs supérieure à 0.2-11.
3.4. Inspecter les données 17
enquête tout entier. Dans ce cas, les objets sont appelés des data frames, ou tableaux de données. Ils
peuvent être manipulés comme tout autre objet. Par exemple :
va entraîner la copie de l’ensemble de nos données dans un nouvel objet nommé d, ce qui peut paraître
parfaitement inutile mais a en fait l’avantage de fournir un objet avec un nom beaucoup plus court, ce
qui diminuera la quantité de texte à saisir par la suite.
Résumons Comme nous avons désormais décidé de saisir nos commandes dans un script et non plus
directement dans la console, les premières lignes de notre fichier de travail sur les données de l’enquête
Histoire de vie pourraient donc ressembler à ceci :
## Chargement des extensions nécessaires
library(rgrs)
R> nrow(d)
[1] 2000
R> ncol(d)
[1] 20
R> dim(d)
[1] 2000 20
La fonction names donne les noms des colonnes de notre tableau, c’est-à-dire les noms des variables :
R> names(d)
[1] "id" "age" "sexe" "nivetud"
[5] "poids" "occup" "qualif" "[Link]"
[9] "clso" "relig" "[Link]" "[Link]"
[13] "[Link]" "[Link]" "[Link]" "cuisine"
[17] "bricol" "cinema" "sport" "[Link]"
La fonction str est plus complète. Elle liste les différentes variables, indique leur type et donne le cas
échéant des informations supplémentaires ainsi qu’un échantillon des premières valeurs prises par cette
variable :
18 Premier travail avec des données
R> str(d)
'[Link]': 2000 obs. of 20 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ age : int 28 23 59 34 71 35 60 47 20 28 ...
$ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
$ nivetud : Factor w/ 8 levels "N'a jamais fait d'etudes",..: 8 NA 3 8 3 6 3 6 NA 7 ...
$ poids : num 2634 9738 3994 5732 4329 ...
$ occup : Factor w/ 7 levels "Exerce une profession",..: 1 3 1 1 4 1 6 1 3 1 ...
$ qualif : Factor w/ 7 levels "Ouvrier specialise",..: 6 NA 3 3 6 6 2 2 NA 7 ...
$ [Link]: int 8 2 2 1 0 5 1 5 4 2 ...
$ clso : Factor w/ 3 levels "Oui","Non","Ne sait pas": 1 1 2 2 1 2 1 2 1 2 ...
$ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3 2 ...
$ [Link] : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4 NA 3 ...
$ [Link] : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 2 2 1 1 ...
$ cuisine : Factor w/ 2 levels "Non","Oui": 2 1 1 2 1 1 2 2 1 1 ...
$ bricol : Factor w/ 2 levels "Non","Oui": 1 1 1 2 1 1 1 2 1 1 ...
$ cinema : Factor w/ 2 levels "Non","Oui": 1 2 1 2 1 2 1 1 2 2 ...
$ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
$ [Link] : num 0 1 0 2 3 2 2.9 1 2 2 ...
La première ligne nous informe qu’il s’agit bien d’un tableau de données avec 2000 observations et
20 variables. Vient ensuite la liste des variables. La première se nomme id et est de type nombre entier
(int). La seconde se nomme age et est de type numérique. La troisième se nomme sexe, il s’agit d’un
facteur (factor).
Un facteur et une variable pouvant prendre un nombre limité de modalités (levels). Ici notre variable
a deux modalités possibles : Homme et Femme. Ce type de variable est décrit plus en détail section 5.1.3
page 42.
R> edit(d)
La fenêtre qui s’affiche permet de naviguer dans le tableau, et même d’éditer le contenu des cases
et donc de modifier les données. Lorsque vous fermez la fenêtre, le contenu du tableau s’affiche dans la
console : il s’agit en fait du tableau comportant les éventuelles modifications effectuées, d restant inchangé.
Si vous souhaitez appliquer ces modifications, vous pouvez le faire en créant un nouveau tableau :
4. Dans ce cas on peut utiliser la fonction fix sous la forme fix(d), qui est équivalente à d <- edit(d).
3.4. Inspecter les données 19
La fonction edit peut être utile pour un avoir un aperçu visuel des données, par contre il est très fortement
déconseillé de l’utiliser pour modifier les données. Si on souhaite effectuer des modifications, on remonte
en général aux données originales (retouches ponctuelles dans un tableur par exemple) ou on les effectue à
l’aide de commandes (qui seront du coup reproductibles).
R> d$sexe
[1] Femme Femme Homme Homme Femme Femme Femme Homme Femme Homme Femme
[12] Homme Femme Femme Femme Femme Homme Femme Homme Femme Femme Homme
[23] Femme Femme Femme Homme Femme Homme Homme Homme Homme Homme Homme
[34] Homme Femme Femme Homme Femme Femme Homme Femme Homme Homme Femme
[45] Femme Homme Femme Femme Femme Femme Homme Femme Homme Femme Homme
[56] Femme Femme Femme Homme Femme Femme Homme Homme Homme Homme Femme
[67] Homme Homme Femme Femme
[ reached getOption("[Link]") -- omitted 1930 entries ]]
Levels: Homme Femme
On constate alors que R a bien accédé au contenu de notre variable sexe du tableau d et a affiché son
contenu, c’est-à-dire l’ensemble des valeurs prises par la variable.
Les fonctions head et tail permettent d’afficher seulement les premières (respectivement les dernières)
valeurs prises par la variable. On peut leur passer en argument le nombre d’éléments à afficher :
R> head(d$sport)
[1] Non Oui Oui Oui Non Oui
Levels: Non Oui
R> tail(d$age, 10)
[1] 52 42 50 41 46 45 46 24 24 66
A noter que ces fonctions marchent aussi pour afficher les lignes du tableau d :
R> head(d, 2)
id age sexe nivetud
1 1 28 Femme Enseignement superieur y compris technique superieur
2 2 23 Femme <NA>
poids occup qualif [Link] clso
1 2634.398 Exerce une profession Employe 8 Oui
2 9738.396 Etudiant, eleve <NA> 2 Oui
relig [Link] [Link] [Link]
20 Premier travail avec des données
Principaux indicateurs
Comme la fonction str nous l’a indiqué, notre tableau d contient plusieurs valeurs numériques, dont
la variable [Link] qui représente le nombre moyen passé par les enquêtés à regarder la télévision
quotidiennement. On peut essayer de déterminer quelques caractéristiques de cette variable, en utilisant
des fonctions déjà vues précédemment :
R> mean(d$[Link])
[1] NA
R> mean(d$[Link], [Link] = TRUE)
[1] 2.246566
R> sd(d$[Link], [Link] = TRUE)
[1] 1.775853
R> min(d$[Link], [Link] = TRUE)
[1] 0
R> max(d$[Link], [Link] = TRUE)
[1] 12
R> range(d$[Link], [Link] = TRUE)
[1] 0 12
On peut lui ajouter la fonction median, qui donne la valeur médiane, et le très utile summary qui donne
toutes ces informations ou presque en une seule fois, avec en plus les valeurs des premier et troisième
quartiles et le nombre de valeurs manquantes (NA) :
R> median(d$[Link], [Link] = TRUE)
[1] 2
R> summary(d$[Link])
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 1.000 2.000 2.247 3.000 12.000 5.000
Histogramme
Tout cela est bien pratique, mais pour pouvoir observer la distribution des valeurs d’une variable
quantitative, il n’y a quand même rien de mieux qu’un bon graphique.
On peut commencer par un histogramme de la répartition des valeurs. Celui-ci peut être généré très
facilement avec la fonction hist, comme indiqué figure 3.1 page ci-contre.
Ici, les options main, xlab et ylab permettent de personnaliser le titre du graphique, ainsi que les
étiquettes des axes. De nombreuses autres options existent pour personnaliser l’histogramme, parmi celles-
ci on notera :
3.5. Analyser une variable 21
R> hist(d$[Link], main = "Nombre d'heures passées devant la télé par jour",
+ xlab = "Heures", ylab = "Effectif")
300
200
100
0
0 2 4 6 8 10 12
Heures
0.15
0.10
0.05
0.00
0 2 4 6 8 10 12
Heures
probability si elle vaut TRUE, l’histogramme indique la proportion des classes de valeurs au lieu des
effectifs.
breaks permet de contrôler les classes de valeurs. On peut lui passer un chiffre, qui indiquera alors le
nombre de classes, un vecteur, qui indique alors les limites des différentes classes, ou encore une
chaîne de caractère ou une fonction indiquant comment les classes doivent être calculées.
col la couleur de l’histogramme 5 .
Deux exemples sont donnés figure 3.2 de la présente page et figure 3.3 page ci-contre.
Voir la page d’aide de la fonction hist pour plus de détails sur les différentes options.
5. Il existe un grand nombre de couleurs prédéfinies dans R. On peut récupérer leur liste en utilisant la fonction colors
en tapant simplement colors() dans la console, ou en consultant le document suivant : [Link]
~tzheng/files/[Link]
3.5. Analyser une variable 23
0.15
0.10
0.05
0.00
0 2 4 6 8 10 12
Heures
●
10
●
8
●
Heures
6
4
2
0
Boîtes à moustaches
Les boîtes à moustaches, ou boxplot en anglais, sont une autre représentation graphique de la ré-
partition des valeurs d’une variable quantitative. Elles sont particulièrement utiles pour comparer les
distributions de plusieurs variables ou d’une même variable entre différents groupes, mais peuvent aussi
être utilisées pour représenter la dispersion d’une unique variable. La fonction qui produit ces graphiques
est la fonction boxplot. On trouvera un exemple figure 3.4 de la présente page.
Comment interpréter ce graphique ? On le comprendra mieux à partir de la figure 3.5 page ci-contre 6 .
Le carré au centre du graphique est délimité par les premiers et troisième quartiles, avec la médiane
représentée par une ligne plus sombre au milieu. Les « fourchettes » s’étendant de part et d’autres vont
soit jusqu’à la valeur minimale ou maximale, soit jusqu’à une valeur approximativement égale au quartile
6. Le code ayant servi à générer cette figure est une copie quasi conforme de celui présenté dans l’excellent document
de Jean Lobry sur les graphiques de base avec R, téléchargeable sur le site du Pôle bioinformatique lyonnais : http:
//[Link]/R/pdf/[Link].
3.5. Analyser une variable 25
R> boxplot(d$[Link], col = grey(0.8), main = "Nombre d'heures passées devant la télé par jour",
+ ylab = "Heures")
R> abline(h = median(d$[Link], [Link] = TRUE), col = "navy",
+ lty = 2)
R> text(1.35, median(d$[Link], [Link] = TRUE) + 0.15, "Médiane",
+ col = "navy")
R> Q1 <- quantile(d$[Link], probs = 0.25, [Link] = TRUE)
R> abline(h = Q1, col = "darkred")
R> text(1.35, Q1 + 0.15, "Q1 : premier quartile", col = "darkred",
+ lty = 2)
R> Q3 <- quantile(d$[Link], probs = 0.75, [Link] = TRUE)
R> abline(h = Q3, col = "darkred")
R> text(1.35, Q3 + 0.15, "Q3 : troisième quartile", col = "darkred",
+ lty = 2)
R> arrows(x0 = 0.7, y0 = quantile(d$[Link], probs = 0.75,
+ [Link] = TRUE), x1 = 0.7, y1 = quantile(d$[Link], probs = 0.25,
+ [Link] = TRUE), length = 0.1, code = 3)
R> text(0.7, Q1 + (Q3 - Q1)/2 + 0.15, "h", pos = 2)
R> mtext("L'écart inter-quartile h contient 50 % des individus",
+ side = 1)
R> abline(h = Q1 - 1.5 * (Q3 - Q1), col = "darkgreen")
R> text(1.35, Q1 - 1.5 * (Q3 - Q1) + 0.15, "Q1 -1.5 h", col = "darkgreen",
+ lty = 2)
R> abline(h = Q3 + 1.5 * (Q3 - Q1), col = "darkgreen")
R> text(1.35, Q3 + 1.5 * (Q3 - Q1) + 0.15, "Q3 +1.5 h", col = "darkgreen",
+ lty = 2)
●
10
●
8
●
Heures
Q3 +1.5 h
6
4
Q3 : troisième quartile
h Médiane
2
Q1 : premier quartile
0
Q1 −1.5 h
●
10
●
8
●
Heures
6
4
2
0
le plus proche plus 1,5 fois l’écart inter-quartile. Les points se situant en-dehors de cette fourchette sont
représentés par des petits ronds et sont généralement considérés comme des valeurs extrêmes, potentielle-
ment aberrantes.
On peut ajouter la représentation des valeurs sur le graphique pour en faciliter la lecture avec des
petits traits dessinés sur l’axe vertical (fonction rug), comme sur la figure 3.6 de la présente page.
Tris à plat
La fonction la plus utilisée pour le traitement et l’analyse des variables qualitatives (variable prenant
ses valeurs dans un ensemble de modalités) est sans aucun doute la fonction table, qui donne les effectifs
de chaque modalité de la variable.
3.5. Analyser une variable 27
R> table(d$sexe)
Homme Femme
899 1101
La tableau précédent nous indique que parmi nos enquêtés on trouve 894 hommes et 1106 femmes.
Quand le nombre de modalités est élevé, on peut ordonner le tri à plat selon les effectifs à l’aide de la
fonction sort.
R> table(d$occup)
Exerce une profession Chomeur Etudiant, eleve
1049 134 94
Retraite Retire des affaires Au foyer
392 77 171
Autre inactif
83
R> sort(table(d$occup))
Retire des affaires Autre inactif Etudiant, eleve
77 83 94
Chomeur Au foyer Retraite
134 171 392
Exerce une profession
1049
R> sort(table(d$occup), decreasing = TRUE)
Exerce une profession Retraite Au foyer
1049 392 171
Chomeur Etudiant, eleve Autre inactif
134 94 83
Retire des affaires
77
À noter que la fonction table exclut par défaut les non-réponses du tableau résultat. L’utilisation de
summary permet l’affichage du tri à plat et du nombre de non-réponses :
R> summary(d$[Link])
Satisfaction Insatisfaction Equilibre NA's
480 117 451 952
Pour obtenir un tableau avec la répartition en pourcentages, on peut utiliser la fonction freq de
l’extension rgrs. rgrs
R> freq(d$qualif)
n %
Ouvrier specialise 203 10.2
Ouvrier qualifie 292 14.6
Technicien 86 4.3
Profession intermediaire 160 8.0
Cadre 260 13.0
Employe 594 29.7
Autre 58 2.9
NA 347 17.3
28 Premier travail avec des données
La colonne %cum indique ici le pourcentage cumulé, ce qui est ici une très mauvaise idée puisque pour
ce type de variable cela n’a aucun sens. Les lignes du tableau résultat ont été triés par effectifs croissants,
les totaux ont été ajoutés, les non-réponses exclues, et les pourcentages arrondis à deux décimales.
Pour plus d’informations sur la commande freq, consultez sa page d’aide en ligne avec ?freq ou
help("freq").
Représentation graphique
Pour représenter la répartition des effectifs parmi les modalités d’une variable qualitative, on a souvent
tendance à utiliser des diagrammes en secteurs (camemberts). Ceci est possible sous R avec la fonction
pie, mais la page d’aide de ladite fonction nous le déconseille assez vivement : les diagrammes en secteur
sont en effet une mauvaise manière de présenter ce type d’information, car l’œil humain préfère comparer
des longueurs plutôt que des surfaces 7 .
On privilégiera donc d’autres formes de représentations, à savoir les diagrammes en bâtons et les
diagrammes de Cleveland.
Les diagrammes en bâtons sont utilisés automatiquement par R lorsqu’on applique la fonction
générique plot à un tri à plat obtenu avec table. On privilégiera cependant ce type de représenta-
tions pour les variables de type numérique comportant un nombre fini de valeurs. Le nombre de frères,
sœurs, demi-frères et demi-sœurs est un bon exemple, indiqué figure 3.7 page ci-contre.
Pour les autres types de variables qualitatives, on privilégiera les diagrammes de Cleveland, obtenus
avec la fonction dotchart. On doit appliquer cette fonction au tri à plat de la variable, obtenu avec la
fonction table. Le résultat se trouve figure 3.8 page 30.
Quand la variable comprend un grand nombre de modalités, il est préférable d’ordonner le tri à plat
obtenu à l’aide de la fonction sort (voir figure 3.9 page 31).
3.6 Exercices
Exercice 3.5
. Solution page 130
Créer un script qui effectue les actions suvantes et exécutez-le :
– charger l’extension rgrs
– charger le jeu de données hdv2003
7. On trouvera des exemples illustrant cette idée dans le document de Jean Lobry cité précédemment.
3.6. Exercices 29
200
100
0
0 1 2 3 4 5 6 7 8 9 11 13 15 18 22
Ne sait pas ●
Non ●
Oui ●
Niveau de qualification
Employe ●
Ouvrier qualifie ●
Cadre ●
Ouvrier specialise ●
Profession intermediaire ●
Technicien ●
Autre ●
Exercice 3.6
. Solution page 130
Des erreurs se sont produites lors de la saisie des données de l’enquête. En fait le premier individu du
jeu de données n’a pas 42 ans mais seulement 24, et le second individu n’est pas un homme mais une
femme. Corrigez les erreurs et stockez les données corrigées dans un objet nommé [Link].
Affichez ensuite les 4 premières lignes de [Link] pour vérifier que les modifications ont bien été prises en
compte.
Exercice 3.7
. Solution page 131
Nous souhaitons étudier la répartition des âges des enquêtés (variable age). Pour cela, affichez les
principaux indicateurs de cette variable. Représentez ensuite sa distribution par un histogramme en 10
classes, puis sous forme de boîte à moustache, et enfin sous la forme d’un diagramme en bâtons
représentant les effectifs de chaque âge.
Exercice 3.8
. Solution page 131
On s’intéresse maintenant à l’importance accordée par les enquêtés à leur travail (variable [Link]).
Faites un tri à plat des effectifs des modalités de cette variable avec la commande table. Y’a-t-il des
valeurs manquantes ?
Faites un tri à plat affichant à la fois les effectifs et les pourcentages de chaque modalité.
Représentez graphiquement les effectifs des modalités à l’aide d’un diagramme de Cleveland.
Partie 4
Import/export de données
L’import et l’export de données depuis ou vers d’autres applications est couvert en détail dans l’un
des manuels officiels (en anglais) nommé R Data Import/Export et accessible, comme les autres manuels,
à l’adresse suivante :
[Link]
Cette partie est très largement tirée de ce document, et on pourra s’y reporter pour plus de détails.
Importer des données est souvent l’une des première opérations que l’on effectue lorsque l’on débute sous
R, et ce n’est pas la moins compliquée. En cas de problème il ne faut donc pas hésiter à demander de l’aide
par les différents moyens disponibles (voir partie 10 page 114) avant de se décourager.
Un des points délicats pour l’importation de données dans R concerne le nom des variables. Pour être
utilisables dans R ceux-ci doivent être à la fois courts et explicites, ce qui n’est pas le cas dans d’autres
applications comme Modalisa par exemple. La plupart des fonctions d’importation s’occupent de convertir
les noms de manières à ce qu’ils soient compatibles avec les règles de R (remplacement des espaces par des points
par exemple), mais un renommage est souvent à prévoir, soit au sein de l’application d’origine, soit une fois les
données importées dans R.
Cependant, ceci ne fonctionnera que si le fichier se trouve dans le répertoire de travail de R. De quoi
s’agit-il ? Tout simplement du répertoire dans lequel R est actuellement en train de s’exécuter. Pour savoir
33
34 Import/export de données
R> getwd()
[1] "/home/julien/r/doc/intro"
Si on veut modifier le répertoire de travail, on utilise setwd en lui indiquant le chemin complet. Par
exemple sous Linux :
R> setwd("/home/julien/projets/R")
Sous Windows le chemin du répertoire est souvent un peu plus compliqué. Vous pouvez alors utiliser
rgrs la fonction selectwd de l’extension rgrs 2 en tapant simplement :
R> selectwd()
Une boîte de dialogue devrait alors s’afficher vous permettant de sélectionner un répertoire sur votre
disque. Sous Windows elle devrait ressembler à celle de la figure 4.1 de la présente page.
Sélectionnez le répertoire de travail de votre session R est cliquez sur Ok 3 . Vous devriez voir s’afficher
le message suivant :
Nouveau repertoire de travail : C:/Documents and Settings/Bureau
Pour automatiser ce changement dans un script, utilisez :
setwd("C:/Documents and Settings/Bureau")
Si vous travaillez en ligne de commande dans la console, le répertoire de travail a été mis à jour. Si
vous travaillez dans un script, il peut être intéressant de rajouter la ligne setwd indiquée précédemment
au début de votre script pour automatiser cette opération.
Une fois le répertoire de travail fixé, on pourra accéder aux fichiers qui s’y trouvent directement, en
spécifiant seulement leur nom. On peut aussi créer des sous-répertoires dans le répertoire de travail ; une
potentielle bonne pratique peut être de regrouper tous les fichiers de données dans un sous-répertoire
nommé donnees. On pourra alors accéder aux fichiers qui s’y trouvent de la manière suivante :
1. Le résultat indiqué ici correspond à système Linux, sous Windows vous devriez avoir quelque chose de la forme
C:/Documents and Settings/ . . .
2. Sous Windows, si vous utilisez l’interface graphique par défaut, vous pouvez aussi utiliser la fonction Changer le
répertoire courant du menu Fichier
3. Sous Windows, si vous ne retrouvez pas votre répertoire Mes documents, celui-ci se trouve en général dans le réper-
toire portant le nom de votre utilisateur situé dans le répertoire Documents and Settings du lecteur {C:. Par exemple
C:\Documents and Settings\Administrateur\Mes Documents\
4.2. Import de données depuis un tableur 35
Dans ce qui suit on supposera que les fichiers à importer se trouvent directement dans le répertoire
de travail, et on n’indiquera donc que le nom du fichier, sans indication de chemin ou de répertoire
supplémentaire.
Il est assez courant de vouloir importer des données saisies ou traitées avec un tableur du type
OpenOffice ou Excel. En général les données prennent alors la forme d’un tableau avec les variables en
colonne et les individus en ligne.
La démarche pour importer ces données dans R est d’abord de les enregistrer dans un format de type
texte. Sous Excel, on peut ainsi sélectionner Fichier, Enregistrer sous, puis dans la zone Type de fichier
choisir soit Texte (séparateur tabulation), soit CSV (séparateur : point-virgule).
36 Import/export de données
Dans le premier cas, on peut importer le fichier en utilisant la fonction read.delim2, de la manière
suivante :
4.3.1 SAS
Les fichiers au format SAS se présentent en général sous deux format : format SAS export (extension
.xport ou .xpt) ou format SAS natif (extension .sas7bdat).
R peut lire directement les fichiers au format export via la fonction [Link] de l’extension foreign.
Celle-ci s’utilise très simplement, en lui passant le nom du fichier en argument :
R> donnees <- [Link]("[Link]")
En ce qui concerne les fichiers au format SAS natif, il existe des fonctions permettant de les importer,
mais elles nécessitent d’avoir une installation de SAS fonctionnelle sur sa machine (il s’agit des fonctions
[Link] de l’extension foreign, et [Link] de l’extension Hmisc).
Si on ne dispose que des fichiers au format SAS natif, le plus simple est d’utiliser l’application SAS
System Viewer, qui permet de lire des fichiers SAS natif, de les visualiser et de les enregistrer dans un
format texte. Cette application est téléchargeable gratuitement, mais ne fonctionne que sous Windows 4 :
[Link]
Une fois le fichier de données au format SAS natif ouvert on peut l’enregistrer au format texte tabulé.
L’import dans R se fait alors avec la commande suivante :
4.3.2 SPSS
Les fichiers générés par SPSS sont accessibles depuis R avec la fonction [Link] de l’extension
foreign. Celle-ci peut lire aussi bien les fichiers sauvegardés avec la fonction Enregistrer que ceux générés
par la fonction Exporter.
La syntaxe est également très simple :
Plusieurs options permettant de contrôler l’importation des données sont disponibles. On se reportera
à la page d’aide de la fonction pour plus d’informations.
4.3.3 Modalisa
rgrs L’extension rgrs fournit plusieurs fonctions pour l’import ou l’export de données depuis ou vers Modal-
isa et pour leur traitement, en particulier concernant les questions à réponses multiples.
L’import de données permet de récupérer des sauvegardes au format ASCII et s’appuie sur la fonction
[Link].
On trouvera davantage d’informations à l’adresse suivante :
[Link]
La principale limitation des fichiers dbf est de ne pas gérer plus de 256 colonnes. Les tables des
enquêtes de l’Insee sont donc parfois découpées en plusieurs fichiers dbf qu’il convient de fusionner avec
la fonction merge. L’utilisation de cette fonction est détaillée dans la section 5.6 page 62.
4.6 Exercices
Exercice 4.9
. Solution page 131
Saisissez quelques données fictives dans une application de type tableur, enregistrez-les dans un format
texte et importez-les dans R.
Vérifiez que l’importation s’est bien déroulée.
Exercice 4.10
. Solution page 131
L’adresse suivante permet de télécharger un fichier au format dBase contenant une partie des données
de l’enquête EPCV Vie associative de l’INSEE (2002) :
http:
//[Link]/fichiersdetail/epcv1002/dbase/epcv1002_BENEVOLAT_dbase.zip
Téléchargez le fichier, décompressez-le et importez les données dans R.
Partie 5
Manipulation de données
Cette partie est un peu aride et pas forcément très intuitive. Elle aborde cependant la base de tous les
traitements et manipulation de données sous R, et mérite donc qu’on s’y arrête un moment, ou qu’on y
revienne un peu plus tard en cas de saturation. . .
5.1 Variables
Le type d’objet utilisé par R pour stocker des tableaux de données s’appelle un data frame. Celui-ci
comporte des observations en ligne et des variables en colonnes. On accède aux variables d’un data frame
avec l’opérateur $.
Dans ce qui suit on travaillera sur le jeu de données tiré de l’enquête Histoire de vie, fourni avec
l’extension rgrs et décrit dans l’annexe B.3.3, page 127.
R> library(rgrs)
R> data(hdv2003)
R> d <- hdv2003
Mais aussi sur le jeu de données tiré du recensement 1999, décrit page 128 :
R> data(rp99)
40
5.1. Variables 41
Pour connaître le type d’une variable donnée, on peut utiliser la fonction class.
R> class(d$age)
[1] "integer"
R> class(d$sexe)
[1] "factor"
R> class(c(TRUE, TRUE, FALSE))
[1] "logical"
La fonction str permet également d’avoir un listing de toutes les variables d’un tableau de données
et indique le type de chacune d’elle.
R> names(d)
[1] "id" "age" "sexe" "nivetud"
[5] "poids" "occup" "qualif" "[Link]"
[9] "clso" "relig" "[Link]" "[Link]"
[13] "[Link]" "[Link]" "[Link]" "cuisine"
[17] "bricol" "cinema" "sport" "[Link]"
Cette fonction peut également être utilisée pour renommer l’ensemble des variables. Si par exemple
on souhaitait passer les noms de toutes les variables en majuscules, on pourrait faire :
Ce type de renommage peut être utile lorsqu’on souhaite passer en revue tous les noms de variables
d’un fichier importé pour les corriger le cas échéant. Pour faciliter un peu ce travail pas forcément
passionant, on peut utiliser la fonction dput :
42 Manipulation de données
R> dput(names(d))
c("id", "age", "sexe", "nivetud", "poids", "occup", "qualif",
"[Link]", "clso", "relig", "[Link]", "[Link]",
"[Link]", "[Link]", "[Link]", "cuisine", "bricol",
"cinema", "sport", "[Link]")
On obtient en résultat la liste des variables sous forme de vecteur déclaré. On n’a plus alors qu’à
copier/coller cette chaîne, rajouter names(d) <- devant, et modifier un à un les noms des variables.
Si on souhaite seulement modifier le nom d’une variable, on peut utiliser la fonction [Link]
rgrs de l’extension rgrs. Celle-ci prend en argument le tableau de données, le nom actuel de la variable et
le nouveau nom. Par exemple, si on veut renommer la variable bricol du tableau de données d en
bricolage :
5.1.3 Facteurs
Parmi les différents types de variables, les facteurs (factor) sont à la fois à part et très utilisés, car
ils vont correspondre à la plupart des variables issues d’une question fermée dans un questionnaire.
Les facteurs prennent leurs valeurs dans un ensemble de modalités prédéfinies, et ne peuvent en prendre
d’autres. La liste des valeurs possibles est donnée par la fonction levels :
R> levels(d$sexe)
[1] "Homme" "Femme"
Si on veut modifier la valeur du sexe du premier individu de notre tableau de données avec une valeur
différente, on obient un message d’erreur et une valeur manquante est utilisée à la place :
On peut très facilement créer un facteur à partir d’une variable de type caractères avec la commande
factor :
Par défaut, les niveaux d’un facteur nouvellement créés sont l’ensemble des valeurs de la variable
caractères, ordonnées par ordre alphabétique. Cette ordre des niveaux est utilisé à chaque fois qu’on
utilise des fonctions comme table, par exemple :
R> table(v)
5.2. Indexation 43
v
F H
1 3
On peut modifier cet ordre au moment de la création du facteur en utilisant l’option levels :
R> v <- factor(c("H", "H", "F", "H"), levels = c("H", "F"))
R> table(v)
v
H F
3 1
On peut aussi modifier l’ordre des niveaux d’une variable déjà existante :
R> d$qualif <- factor(d$qualif, levels = c("Ouvrier specialise",
+ "Ouvrier qualifie", "Employe", "Technicien", "Profession intermediaire",
+ "Cadre", "Autre"))
R> table(d$qualif)
Ouvrier specialise Ouvrier qualifie Employe
203 292 594
Technicien Profession intermediaire Cadre
86 160 260
Autre
58
Par défaut, les valeurs manquantes ne sont pas considérées comme un niveau de facteur. On peut
cependant les transformer en niveau en utilisant l’option exclude=NULL. Ceci signifie cependant qu’elle
ne seront plus considérées comme manquantes par R :
R> summary(d$[Link])
Satisfaction Insatisfaction Equilibre NA's
480 117 451 952
R> summary(factor(d$[Link], exclude = NULL))
Satisfaction Insatisfaction Equilibre <NA>
480 117 451 952
5.2 Indexation
L’indexation est l’une des fonctionnalités les plus puissantes mais aussi les plus difficiles à maîtriser de
R. Il s’agit d’opérations permettant de sélectionner des sous-ensembles d’observations et/ou de variables
en fonction de différents critères. L’indexation peut porter sur des vecteurs, des matrices ou des tableaux
de données.
Le principe est toujours le même : on indique, entre crochets et à la suite du nom de l’objet à indexer,
une série de conditions indiquant ce que l’on garde ou non. Ces conditions peuvent être de différents
types.
R> v[1]
[1] "a"
R> v[1:3]
[1] "a" "b" "c"
R> v[c(2, 6, 7)]
[1] "b" "f" "g"
R> v[length(v)]
[1] "g"
Dans le cas de matrices ou de tableaux de données, l’indexation prend deux arguments séparés par une
virgule : le premier concerne les lignes et le second les colonnes. Ainsi, si on veut l’élément correspondant
à la troisième ligne et à la cinquième colonne du tableau de données d :
R> d[3, 5]
[1] 3994.102
Si on laisse l’un des deux critères vides, on sélectionne l’intégralité des lignes ou des colonnes. Ainsi
si l’on veut seulement la cinquième colonne ou les deux premières lignes :
R> d[, 5]
[1] 2634.3982 9738.3958 3994.1025 5731.6615 4329.0940 8674.6994
[7] 6165.8035 12891.6408 7808.8721 2277.1605 704.3227 6697.8682
[13] 7118.4659 586.7714 11042.0774 9958.2287 4836.1393 1551.4846
[19] 3141.1572 27195.8378 14647.9983 8128.0603 1281.9156 11663.3383
[25] 8780.2614 1700.8437 6662.8375 3359.4690 8536.1101 10620.5259
[31] 5264.2953 14161.7597 1339.6196 9243.9153 4512.2959 7871.6452
[37] 1356.9621 7626.3300 1630.2746 2196.2485 5605.9846 8841.2960
[43] 9113.5378 2267.5912 7706.2944 2446.5111 8118.2639 10751.5037
[49] 831.8599 6591.6440 1936.8826 834.3845 3432.5286 11354.8932
[55] 9292.9762 6344.1227 4899.9404 4766.8652 3462.8121 23732.4853
[61] 833.8428 8529.4403 3190.3680 2423.1052 5945.9929 14991.8652
[67] 2062.1124 5702.0623 20604.2642 2634.4861
[ reached getOption("[Link]") -- omitted 1930 entries ]]
R> d[1:2, ]
5.2. Indexation 45
Enfin, si on préfixe les arguments avec le signe « - », ceci signifie « tous les éléments sauf ceux
indiqués ». Si par exemple on veut tous les éléments de v sauf le premier :
R> v[-1]
[1] "b" "c" "d" "e" "f" "g"
Bien sûr, tous ces critères se combinent et on peut stocker le résultat dans un nouvel objet. Dans cet
exemple d2 contiendra les trois premières lignes de d mais sans les colonnes 2, 6 et 8.
R> d$clso
[1] Oui Oui Non Non Oui
[6] Non Oui Non Oui Non
[11] Oui Oui Oui Oui Oui
[16] Non Non Non Non Non
[21] Oui Oui Non Non Non
[26] Oui Non Non Non Oui
[31] Non Oui Oui Non Non
[36] Oui Oui Non Non Oui
[41] Non Non Oui Non Non
[46] Non Non Oui Oui Non
[51] Non Non Oui Non Oui
[56] Oui Non Non Oui Non
[61] Non Oui Oui Oui Oui
[66] Non Oui Non Non Ne sait pas
[ reached getOption("[Link]") -- omitted 1930 entries ]]
Levels: Oui Non Ne sait pas
R> d[, "clso"]
[1] Oui Oui Non Non Oui
[6] Non Oui Non Oui Non
[11] Oui Oui Oui Oui Oui
[16] Non Non Non Non Non
46 Manipulation de données
Là aussi on peut utiliser un vecteur pour sélectionner plusieurs noms et récupérer un « sous-tableau »
de données :
Les noms peuvent également être utilisés pour les observations (lignes) d’un tableau de données si
celles-ci ont été munies d’un nom avec la fonction [Link]. Par défaut les noms de ligne sont leur
numéro d’ordre, mais on peut leur assigner comme nom la valeur d’une variable d’identifiant. Ainsi, on
peut assigner aux lignes du jeu de données rp99 le nom des communes correspondantes :
Par contre il n’est pas possible d’utiliser directement l’opérateur « - » comme pour l’indexation
directe. On doit effectuer une pirouette un peu compliquée utilisant la fonction which. Celle-ci renvoit
les positions des éléments satisfaisant une condition. On peut ainsi faire :
Pour sélectionner toutes les colonnes sauf celle qui s’appelle qualif.
5.2. Indexation 47
Tests et conditions
Une condition est une expression logique dont le résultat est soit TRUE (vrai) soit FALSE (faux).
Une condition comprend la plupart du temps un opérateur de comparaison. Les plus courants sont
les suivants :
Opérateur Signification
== égal à
!= différent de
> strictement supérieur à
< strictement inférieur à
>= supérieur ou égal à
<= inférieur ou égal à
Que s’est-il passé ? Nous avons fourni à R une condition qui signifie « la valeur de la variable sexe
vaut "Homme" ». Et il nous a renvoyé un vecteur avec autant d’éléments qu’il y’a d’observations dans d,
et dont la valeur est TRUE si l’observation correspond à un homme, et FALSE dans les autres cas.
Prenons un autre exemple. On n’affichera cette fois que les premiers éléments de notre variable d’intérêt
à l’aide de la fonction head :
R> head(d$age)
[1] 28 23 59 34 71 35
R> head(d$age > 40)
[1] FALSE FALSE TRUE FALSE TRUE FALSE
On voit bien ici qu’à chaque élément du vecteur d$age dont la valeur est supérieure à 40 correspond
un élément TRUE dans le résultat de la condition.
On peut combiner ou modifier des conditions à l’aide des opérateurs logiques habituels :
Opérateur Signification
& et logique
| ou logique
! négation logique
Comment les utilise-t-on ? Voyons tout de suite des exemples. Supposons que je veuille déterminer
quels sont dans mon échantillon les hommes ouvriers spécialisés :
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE NA
[34] NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[56] FALSE FALSE FALSE FALSE FALSE FALSE NA FALSE NA FALSE FALSE
[67] FALSE FALSE FALSE FALSE
[ reached getOption("[Link]") -- omitted 1930 entries ]]
Si je souhaite récupérer les enquêtés qui ne sont pas cadres, on peut utiliser l’une des deux formes
suivantes :
R> d$qualif != "Cadre"
[1] TRUE NA TRUE TRUE TRUE TRUE TRUE TRUE NA TRUE TRUE
[12] TRUE TRUE NA NA TRUE FALSE NA TRUE TRUE TRUE TRUE
[23] TRUE NA TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE NA
[34] NA TRUE TRUE TRUE NA TRUE FALSE TRUE TRUE FALSE FALSE
[45] NA TRUE TRUE NA TRUE FALSE TRUE TRUE TRUE NA TRUE
[56] TRUE NA FALSE TRUE NA TRUE NA TRUE NA TRUE TRUE
[67] TRUE TRUE TRUE NA
[ reached getOption("[Link]") -- omitted 1930 entries ]]
R> !(d$qualif == "Cadre")
[1] TRUE NA TRUE TRUE TRUE TRUE TRUE TRUE NA TRUE TRUE
[12] TRUE TRUE NA NA TRUE FALSE NA TRUE TRUE TRUE TRUE
[23] TRUE NA TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE NA
[34] NA TRUE TRUE TRUE NA TRUE FALSE TRUE TRUE FALSE FALSE
[45] NA TRUE TRUE NA TRUE FALSE TRUE TRUE TRUE NA TRUE
[56] TRUE NA FALSE TRUE NA TRUE NA TRUE NA TRUE TRUE
[67] TRUE TRUE TRUE NA
[ reached getOption("[Link]") -- omitted 1930 entries ]]
5.2. Indexation 49
Lorsqu’on mélange « et » et « ou » il est nécessaire d’utiliser des parenthèses pour différencier les
blocs. La condition suivante identifie les femmes qui sont soit cadre, soit employée :
R> d$sexe == "Femme" & (d$qualif == "Employe" | d$qualif ==
+ "Cadre")
[1] TRUE NA FALSE FALSE TRUE TRUE FALSE FALSE NA FALSE TRUE
[12] FALSE TRUE NA NA TRUE FALSE NA FALSE FALSE TRUE FALSE
[23] TRUE NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[34] FALSE FALSE TRUE FALSE NA TRUE FALSE TRUE FALSE FALSE TRUE
[45] NA FALSE FALSE NA TRUE TRUE FALSE TRUE FALSE NA FALSE
[56] FALSE NA TRUE FALSE NA TRUE FALSE FALSE FALSE FALSE TRUE
[67] FALSE FALSE TRUE NA
[ reached getOption("[Link]") -- omitted 1930 entries ]]
L’opérateur %in% peut être très utile : il teste si une valeur fait partie des éléments d’un vecteur. Ainsi
on pourrait remplacer la condition précédente par :
R> d$sexe == "Femme" & d$qualif %in% c("Employe", "Cadre")
[1] TRUE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
[12] FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE
[23] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[34] FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE
[45] FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE FALSE FALSE
[56] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
[67] FALSE FALSE TRUE FALSE
[ reached getOption("[Link]") -- omitted 1930 entries ]]
Enfin, signalons qu’on peut utiliser les fonctions table ou summary pour avoir une idée du résultat de
notre condition :
R> table(d$sexe)
Homme Femme
899 1101
R> table(d$sexe == "Homme")
FALSE TRUE
1101 899
R> summary(d$sexe == "Homme")
Mode FALSE TRUE NA's
logical 1101 899 0
L’utilisation des conditions pour l’indexation est assez simple : si on indexe un vecteur avec un vecteur
booléen, seuls les éléments correspondant à TRUE seront conservés.
Ainsi, si on fait :
R> dh <- d[d$sexe == "Homme", ]
On obtiendra un nouveau tableau de données comportant l’ensemble des variables de d, mais seulement
les observations pour lesquelles d$sexe vaut « Homme ».
La plupart du temps ce type d’indexation s’applique aux lignes, mais on peut aussi l’utiliser sur
les colonnes d’un tableau de données. L’exemple suivant, un peu compliqué, sélectionne uniquement les
variables dont le nom commence par a ou s :
50 Manipulation de données
On peut évidemment combiner les différents type d’indexation. L’exemple suivant sélectionne les
femmes de plus de 40 ans et ne conserve que les variables qualif et bricol.
R> d2 <- d[d$sexe == "Femme" & d$age > 40, c("qualif", "bricol")]
Une remarque importante : quand l’un des termes d’une condition comporte une valeur manquante
(NA), le résultat de cette condition n’est pas toujours TRUE ou FALSE, il peut aussi être à son tour une
valeur manquante.
Une autre conséquence importante de ce comportement est qu’on ne peut pas utiliser l’opérateur ==
NA pour tester la présence de valeurs manquantes. On utilisera à la place la fonction ad hoc [Link].
On comprendra mieux le problème avec l’exemple suivant :
Pour compliquer encore un peu le tout, lorsqu’on utilise une condition pour l’indexation, lorsque la
condition renvoit NA, l’élément est sélectionné, comme s’il valait TRUE. Ceci aura donc des conséquences
pour l’extraction de sous-populations, comme indiqué section 5.3.1 page suivante.
Cette fois, au lieu d’utiliser quelque chose comme x <- v[1], qui aurait placé la valeur du premier
élément de v dans x, on a utilisé v[1] <- 3, ce qui a mis à jour le premier élément de v avec la valeur 3.
Ceci fonctionne également pour les tableaux de données et pour les différents types d’indexation
évoqués précédemment :
Enfin on peut modifier plusieurs éléments d’un seul coup soit en fournissant un vecteur, soit en profitant
du mécanisme de recyclage. Les deux commandes suivantes sont ainsi rigoureusement équivalentes :
R> d$age[d$age >= 20 & d$age <= 30] <- "20-30 ans"
R> d$age[[Link](d$age)] <- "Inconnu"
52 Manipulation de données
5.3 Sous-populations
Si on utilise directement l’indexation, il convient cependant d’être extrêmement prudent avec les
valeurs manquantes. Comme indiqué précédemment, la présence d’une valeur manquante dans une con-
dition fait que celle-ci est évaluée en NA et au final sélectionnée par l’indexation :
R> summary(d$[Link])
Satisfaction Insatisfaction Equilibre NA's
480 117 451 952
R> [Link] <- d[d$[Link] == "Satisfaction", ]
R> dim([Link])
[1] 1432 20
Comme on le voit, ici [Link] contient les individus ayant la modalité Satisfaction mais aussi ceux
ayant une valeur manquante NA. C’est pourquoi il faut toujours soit vérifier au préalable qu’on n’a pas
de valeurs manquantes dans les variables de la condition, soit exclure explicitement les NA de la manière
suivante :
C’est notamment pour cette raison qu’on préfèrera le plus souvent utiliser la fonction subset.
5.3. Sous-populations 53
L’utilisation de subset présente plusieurs avantages. Le premier est d’économiser quelques touches.
On n’est en effet pas obligé de saisir le nom du tableau de données dans la condition sur les lignes. Ainsi
les deux commandes suivantes sont équivalentes :
Le second avantage est que subset s’occupe du problème des valeurs manquantes évoquées précédem-
ment et les exclut de lui-même, contrairement au comportement par défaut :
R> summary(d$[Link])
Satisfaction Insatisfaction Equilibre NA's
480 117 451 952
R> [Link] <- d[d$[Link] == "Satisfaction", ]
R> dim([Link])
[1] 1432 20
R> [Link] <- subset(d, [Link] == "Satisfaction")
R> dim([Link])
[1] 480 20
Enfin, l’utilisation de l’argument select est simplifié pour l’expression de condition sur les colonnes.
On peut ainsi spécifier les noms de variable sans guillemets et leur appliquer directement l’opérateur
d’exclusion - :
Cette section documente une fonction qui peut être très utile, mais pas forcément indispensable au
départ.
La fonction tapply n’est qu’indirectement liée à la notion de sous-population, mais peut permettre
d’éviter d’avoir à créer ces sous-populations dans certains cas.
54 Manipulation de données
Son fonctionnement est assez simple, mais pas forcément intuitif. La fonction prend trois arguments :
un vecteur, un facteur et une fonction. Elle applique ensuite la fonction aux éléments du vecteur corre-
spondant à un même niveau du facteur. Vite, un exemple !
R> tapply(d$age, d$sexe, mean)
Homme Femme
48.16129 48.15350
Qu’est-ce que ça signifie ? Ici tapply a sélectionné toutes les observations correspondant à « Homme »,
puis appliqué la fonction mean aux valeurs de age correspondantes. Puis elle a fait de même pour les
observations correspondant à « Femme ». On a donc ici la moyenne d’âge chez les hommes et chez les
femmes.
On peut fournir à peu près n’importe quelle fonction à tapply :
R> tapply(d$bricol, d$sexe, freq)
$Homme
n %
Non 384 42.7
Oui 515 57.3
NA 0 0.0
$Femme
n %
Non 763 69.3
Oui 338 30.7
NA 0 0.0
Les arguments supplémentaires fournis à tapply sont en fait fournis directement à la fonction appelée.
R> tapply(d$bricol, d$sexe, freq, total = TRUE)
$Homme
n %
Non 384 42.7
Oui 515 57.3
NA 0 0.0
Total 899 100.0
$Femme
n %
Non 763 69.3
Oui 338 30.7
NA 0 0.0
Total 1101 100.0
5.4 Recodages
Le recodage de variables est une opération extrêmement fréquente lors du traitement d’enquête. Celui-
ci utilise soit l’une des formes d’indexation décrites précédemment, soit des fonctions ad hoc de R.
On passe ici en revue différents types de recodage parmi les plus courants. Les exemples s’appuient,
comme précédemment, sur l’extrait de l’enquête Histoire de vie :
R> data(hdv2003)
R> d <- hdv2003
5.4. Recodages 55
La conversion d’un facteur en caractères est fréquemment utilisé lors des recodages du fait qu’il
est impossible d’ajouter de nouvelles modalités à un facteur. Par exemple, la première des commandes
suivantes génère un message d’avertissement, tandis que les deux autres fonctionnent :
Dans le premier cas, le message d’avertissement indique que toutes les modaolités « Ouvrier specialise »
de notre variable qualif ont été remplacées par des valeurs manquantes NA.
Enfin, une variable de type caractères dont les valeurs seraient des nombres peut être convertie en
variable numérique avec la fonction [Link]. Si on souhaite convertir un facteur en variable numérique,
il faut d’abord le convertir en variable de classe caractère :
Par défaut R nous a bien créé cinq classes d’amplitudes égales. La première classe va de 16,9 à 32,2
ans (en fait de 17 à 32), etc.
Les frontières de classe seraient plus présentables si elles utilisaient des nombres entiers. On va donc
spécifier manuellement le découpage souhaité, par tranches de 20 ans :
R> d$age20 <- cut(d$age, c(0, 20, 40, 60, 80, 100))
R> table(d$age20)
(0,20] (20,40] (40,60] (60,80] (80,100]
72 660 780 436 52
On aurait pu tenir compte des âges extrêmes pour la première et la dernière valeur :
R> range(d$age)
[1] 18 97
R> d$age20 <- cut(d$age, c(17, 20, 40, 60, 80, 93))
R> table(d$age20)
(17,20] (20,40] (40,60] (60,80] (80,93]
72 660 780 436 50
Les symboles dans les noms attribués aux classes ont leur importance : ( signifie que la frontière de la
classe est exclue, tandis que [ signifie qu’elle est incluse. Ainsi, (20,40] signifie « strictement supérieur
à 20 et inférieur ou égal à 40 ».
On remarque que du coup, dans notre exemple précédent, la valeur minimale, 17, est exclue de notre
première classe, et qu’une observation est donc absente de ce découpage. Pour résoudre ce problème on
peut soit faire commencer la première classe à 16, soit utiliser l’option [Link]=TRUE :
R> d$age20 <- cut(d$age, c(16, 20, 40, 60, 80, 93))
R> table(d$age20)
(16,20] (20,40] (40,60] (60,80] (80,93]
72 660 780 436 50
R> d$age20 <- cut(d$age, c(17, 20, 40, 60, 80, 93), [Link] = TRUE)
R> table(d$age20)
[17,20] (20,40] (40,60] (60,80] (80,93]
72 660 780 436 50
On peut également modifier le sens des intervalles avec l’option right=FALSE, et indiquer manuelle-
ment les noms des modalités avec labels :
R> d$age20 <- cut(d$age, c(16, 20, 40, 60, 80, 93), right = FALSE,
+ [Link] = TRUE)
R> table(d$age20)
[16,20) [20,40) [40,60) [60,80) [80,93]
48 643 793 454 60
R> d$age20 <- cut(d$age, c(17, 20, 40, 60, 80, 93), [Link] = TRUE,
+ labels = c("<20ans", "21-40 ans", "41-60ans", "61-80ans",
+ ">80ans"))
R> table(d$age20)
5.4. Recodages 57
Enfin, l’extension rgrs propose une fonction [Link] permettant de découper une variable numérique rgrs
en un nombre de classes donné ayant des efffectifs semblables. Il suffit de lui passer le nombre de classes
en argument :
[Link] admet les mêmes autres options que cut ([Link], right, labels. . . ).
R> table(d$qualif)
Ouvrier specialise Ouvrier qualifie Technicien
203 292 86
Profession intermediaire Cadre Employe
160 260 594
Autre
58
R> d$[Link][d$qualif == "Ouvrier specialise"] <- "Ouvrier"
R> d$[Link][d$qualif == "Ouvrier qualifie"] <- "Ouvrier"
R> d$[Link][d$qualif == "Employe"] <- "Employe"
R> d$[Link][d$qualif == "Profession intermediaire"] <- "Intermediaire"
R> d$[Link][d$qualif == "Technicien"] <- "Intermediaire"
R> d$[Link][d$qualif == "Cadre"] <- "Cadre"
R> d$[Link][d$qualif == "Autre"] <- "Autre"
R> table(d$[Link])
Autre Cadre Employe Intermediaire Ouvrier
58 260 594 246 495
On peut faire une version encore plus compacte en utilisant l’opérateur logique ou (|) :
Enfin, pour terminer ce petit tour d’horizon, on peut également remplacer l’opérateur | par %in%, qui
peut parfois être plus lisible :
Dans tous les cas le résultat obtenu est une variable de type caractère. On pourra la convertir en
facteur par un simple :
Si on souhaite recoder les valeurs manquantes, il suffit de faire appel à la fonction [Link] :
R> table(d$[Link])
Satisfaction Insatisfaction Equilibre
480 117 451
R> d$[Link] <- [Link](d$[Link])
R> d$[Link][[Link](d$[Link])] <- "Valeur manquante"
R> table(d$[Link])
Equilibre Insatisfaction Satisfaction Valeur manquante
451 117 480 952
Autre exemple tiré du jeu de données rp99 : si on souhaite calculer le pourcentage d’actifs dans chaque
commune, on peut diviser la population active [Link] par la population totale [Link].
Les combinaisons de variables un peu complexes nécessitent parfois un petit travail de réflexion. En
particulier, l’ordre des commandes de recodage ont parfois une influence dans le résultat final.
Pour prendre un exemple tout à fait arbitraire, imaginons que nous souhaitons calculer un score
d’activités extérieures. Dans ce score on considère que le fait d’aller au cinéma « pèse » 10, celui de
pêcher ou chasser vaut 30 et celui de faire du sport vaut 20. On pourrait alors calculer notre score de la
manière suivante :
Cette notation étant un peu lourde, on peut l’alléger un peu en utilisant la fonction ifelse. Celle-ci
prend en argument une condition et deux valeurs. Si la condition est vraie elle retourne la première valeur,
sinon elle retourne la seconde.
Non Oui
Bricolage seulement 0 437
Cuisine et Bricolage 0 416
Cuisine seulement 465 0
Ni cuisine ni bricolage 682 0
On peut appliquer cette fonction à une variable, mais celle-ci ne permet que d’ordonner les valeurs
de cette variable, et pas l’ensemble du tableau de données dont elle fait partie. Pour cela nous avons
besoin d’une autre fonction, nommée order. Celle-ci ne renvoit pas les valeurs du vecteur triées, mais les
emplacements de ces valeurs.
Un exemple pour comprendre :
Le résultat renvoyé signifie que la plus petite valeur est la valeur située en 3ème position, suivie de
celle en 1ère position et de celle en 2ème position. Tout cela ne paraît pas passionnant à première vue,
mais si on mélange ce résultat avec un peu d’indexation directe, ça devient intéressant. . .
R> order(d$age)
[1] 162 215 346 377 511 646 852 916 1211 1213 1261 1333 1395 1447
[15] 1600 1774 1937 38 100 134 196 204 256 257 349 395 407 427
[29] 453 578 726 969 1052 1056 1077 1177 1234 1250 1342 1377 1381 1382
[43] 1540 1559 1607 1634 1689 1983 9 18 25 231 335 347 358 488
[57] 496 642 826 922 1023 1042 1156 1175 1290 1384 1464 1467 1608 1661
[ reached getOption("[Link]") -- omitted 1930 entries ]]
Ce que cette fonction renvoit, c’est l’ordre dans lequel on doit placer les éléments de age, et donc par
extension les lignes de d, pour que la variable soit triée par ordre croissant. Par conséquent, si on fait :
Alors on a trié les lignes de d par ordre d’âge croissant ! Et si on fait un petit :
R> head([Link], 3)
id age sexe nivetud poids occup qualif [Link]
162 162 18 Homme <NA> 4982.964 Etudiant, eleve <NA> 2
215 215 18 Homme <NA> 4631.188 Etudiant, eleve <NA> 2
clso relig [Link] [Link] [Link]
162 Non Appartenance sans pratique <NA> <NA> Non
215 Oui Ni croyance ni appartenance <NA> <NA> Non
[Link] [Link] cuisine bricol cinema sport [Link] [Link]
162 Non Non Non Non Non Oui 3 2
215 Non Non Oui Non Oui Oui 2 2
62 Manipulation de données
R> data(hdv2003)
R> d <- hdv2003
R> dim(d)
[1] 2000 20
R> d1 <- subset(d, select = c("id", "age", "sexe"))
R> dim(d1)
[1] 2000 3
R> d2 <- subset(d, select = c("id", "clso"))
R> dim(d2)
[1] 2000 2
On a donc deux tableaux de données, d1 et d2, comportant chacun 2000 lignes et respectivement 3 et
2 colonnes. Comment les rassembler pour n’en former qu’un ?
Intuitivement, cela paraît simple. Il suffit de « coller » d2 à la droite de d1, comme dans l’exemple
suivant.
Id V1 V2 Id V3 Id V1 V2 V3
1 H 12 1 Rouge 1 H 12 Rouge
2 H 17 2 Bleu 2 H 17 Bleu
3 F 41 + 3 Bleu = 3 F 41 Bleu
4 F 9 4 Rouge 4 F 9 Rouge
.. .. .. .. .. .. .. .. ..
. . . . . . . . .
5.6. Fusion de tables 63
Cela semble fonctionner. La fonction qui permet d’effectuer cette opération sous R s’appelle cbind,
elle « colle » des tableaux côte à côte en regroupant leurs colonnes 1 .
À part le fait qu’on a une colonne id en double, le résultat semble satisfaisant. À première vue
seulement. Imaginons maintenant que nous avons travaillé sur d1 et d2, et que nous avons ordonné les
lignes de d1 selon l’âge des enquêtés :
Que constate-t-on ? La présence de la variable id en double nous permet de voir que les identifiants
ne coïncident plus ! En regroupant nos colonnes nous avons donc attribué à des individus les réponses
d’autres individus.
La commande cbind ne peut en effet fonctionner que si les deux tableaux ont exactement le même
nombre de lignes, et dans le même ordre, ce qui n’est pas le cas ici.
1. L’équivalent de cbind pour les lignes s’appelle rbind.
64 Manipulation de données
On va donc être obligé de pocéder à une fusion des deux tableaux, qui va permettre de rendre à
chaque ligne ce qui lui appartient. Pour cela nous avons besoin d’un identifiant qui permet d’identifier
chaque ligne de manière unique et qui doit être présent dans tous les tableaux. Dans notre cas, c’est
plutôt rapide, il s’agit de la variable id.
Une fois l’identifiant identifié 2 , on peut utiliser la commande merge. Celle-ci va fusionner les deux
tableaux en supprimant les colonnes en double et en regroupant les lignes selon leurs identifiants :
Ici l’utilisation de la fonction est plutôt simple car nous sommes dans le cas de figure idéal : les lignes
correspondent parfaitement et l’identifiant est clairement identifié. Parfois les choses peuvent être un peu
plus compliquées :
– parfois les identifiants n’ont pas le même nom dans les deux tableaux. On peut alors les spécifier
par les options by.x et by.y ;
– parfois les deux tableaux comportent des colonnes (hors identifiants) ayant le même nom. merge
conserve dans ce cas ces deux colonnes mais les renomme en les suffixant par .x pour celles provenant
du premier tableau, et .y pour celles du second ;
– parfois on n’a pas d’identifiant unique préétabli, mais on en construit un à partir de plusieurs
variables. On peut alors donner un vecteur en paramètres de l’option by, par exemple
by=c("nom","prenom","[Link]").
Une subtilité supplémentaire intervient lorsque les deux tableaux fusionnés n’ont pas exactement les
mêmes lignes. Par défaut, merge ne conserve que les lignes présentes dans les deux tableaux :
Id V1 Id V2
Id V1 V2
1
2
H
H
+ 1
2
10
15
= 1 H 10
2 H 15
3 F 5 31
On peut cependant modifier ce comportement avec les options all.x=TRUE et all.y=TRUE. La première
option indique de conserver toutes les lignes du premier tableau. Dans ce cas merge donne une valeur NA
pour ces lignes aux colonnes provenant du second tableau. Ce qui donnerait :
2. Si vous me passez l’expression. . .
5.7. Organiser ses scripts 65
Id V1 Id V2 Id V1 V2
1
2
H
H
+ 1
2
10
15
= 1
2
H
H
10
15
3 F 5 31 3 F NA
all.y fait la même chose en conservant toutes les lignes du second tableau. On peut enfin décider
toutes les lignes des deux tableaux en utilisant à la fois all.x=TRUE et all.y=TRUE, ce qui donne :
Id V1 V2
Id V1 Id V2
1 H 10
1
2
H
H
+ 1
2
10
15
= 2 H 15
3 F NA
3 F 5 31
5 NA 31
Parfois, l’un des identifiants est présent à plusieurs reprises dans l’un des tableaux (par exemple
lorsque l’une des tables est un ensemble de ménages et que l’autre décrit l’ensemble des individus de ces
ménages). Dans ce cas les lignes de l’autre table sont dupliquées autant de fois que nécessaires :
Id V2 Id V1 V2
Id V1 1 10 1 H 10
1
2
H
H
+ 1
1
18
21
= 1
1
H
H
18
21
3 F 2 11 2 H 11
3 31 3 F 31
setwd("/home/julien/r/projet")
d1 <- [Link]("[Link]")
d2 <- [Link]("[Link]")
## RECODAGES
## ANALYSES
Une manière d’organiser notre script 3 pourrait être de placer les opérations d’import des données et
celles de recodage dans deux fichiers scripts séparés. Créons alors un fichier nommé import.R dans notre
répertoire de travail et copions les lignes suivantes :
## IMPORT DES DONNÉES
d1 <- [Link]("[Link]")
d2 <- [Link]("[Link]")
setwd("/home/julien/r/projet")
source("import.R")
source("recodages.R")
## ANALYSES
Au fur et à mesure du travail sur les données, on placera les recodages que l’on souhaite conserver
dans le fichier recodages.R.
Cette méthode présente plusieurs avantages :
3. Ceci n’est qu’une suggestion, la manière d’organiser (ou non) son travail étant bien évidemment très hautement
subjectif.
5.8. Exercices 67
– bien souvent, lorsqu’on effectue des recodages on se retrouve avec des variables recodées qu’on ne
souhaite pas conserver. Si on prend l’habitude de placer les recodages intéressants dans le fichier
recodages.R, alors il suffit d’exécuter les cinq premières lignes du fichier pour se retrouver avec un
tableau de données d propre et complet.
– on peut répartir ses analyses dans différents scripts. Il suffit alors de copier les cinq premières lignes
du fichier précédent dans chacun des scripts, et on aura l’assurance de travailler sur exactement les
mêmes données.
Le premier point illustre l’une des caractéristiques de R : il est rare que l’on stocke les données
modifiées. En général on repart toujours du fichier source original, et les recodages sont conservés sous
forme de scripts et recalculés à chaque fois qu’on recommence à travailler. Ceci offre une traçabilité
parfaite du traitement effectué sur les données.
5.8 Exercices
Exercice 5.11
. Solution page 131
Renommer la variable clso du jeu de données hdv2003 en [Link], puis la renommer en
clso.
Exercice 5.12
. Solution page 131
Réordonner les niveaux du facteur clso pour que son tri à plat s’affiche de la manière suivante :
tmp
Non Ne sait pas Oui
1037 27 936
Exercice 5.13
. Solution page 131
Affichez :
– les 3 premiers éléments de la variable cinema
– les éléments 12 à 30 de la variable [Link]
– les colonnes 4 et 8 des lignes 5 et 12 du jeu de données hdv2003
– les 4 derniers éléments de la variable age
Exercice 5.14
. Solution page 132
Construisez les sous-tableaux suivants avec la fonction subset :
– âge et sexe des lecteurs de BD
– ensemble des personnes n’étant pas chômeur (variable occup), sans la variable cinema
– identifiants des personnes de plus de 45 ans écoutant du hard rock
– femmes entre 25 et 40 ans n’ayant pas fait de sport dans les douze derniers mois
– hommes ayant entre 2 et 4 frères et sœurs et faisant la cuisine ou du bricolage
Exercice 5.15
. Solution page 132
Calculez le nombre moyen d’heures passées devant la télévision chez les lecteurs de BD, d’abord en
construisant les sous-populations, puis avec la fonction tapply.
68 Manipulation de données
Exercice 5.16
. Solution page 132
Convertissez la variable [Link] en variable de type caractères. Convertissez cette nouvelle
variable en facteur. Puis convertissez à nouveau ce facteur en variable numérique. Vérifiez que votre
variable finale est identique à la variable de départ.
Exercice 5.17
. Solution page 133
Découpez la variable [Link] :
– en cinq classes d’amplitude égale
– en catégories « de 0 à 2 », « de 2 à 4 », « plus de 4 », avec les étiquettes correspondantes
– en quatre classes d’effectif équivalent
– d’où vient la différence d’effectifs entre les deux découpages précédents ?
Exercice 5.18
. Solution page 133
Recodez la variable [Link] en trav.imp2cl pour obtenir les modalités « Le plus ou aussi
important » et « moins ou peu important ». Vérifiez avec des tris à plat et un tableau croisé.
Recodez la variable relig en relig.4cl en regroupant les modalités « Pratiquant regulier » et
« Pratiquant occasionnel » en une seule modalité « Pratiquant », et en remplaçant la modalité « NSP
ou NVPR » par des valeurs manquantes. Vérifiez avec un tri croisé.
Exercice 5.19
. Solution page 134
Créez une variable ayant les modalités suivantes :
– Homme de plus de 40 ans lecteur de BD
– Homme de plus de 30 ans
– Femme faisant du bricolage
– Autre
Vérifier avec des tris croisés.
Exercice 5.20
. Solution page 135
Ordonner le tableau de données selon le nombre de frères et soeurs croissant. Afficher le sexe des 10
individus regardant le plus la télévision.
Partie 6
Statistique bivariée
On entend par statistique bivariée l’étude des relations entre deux variables, celles-ci pouvant être
quantitatives ou qualitatives.
Comme dans la partie précédente, on travaillera sur les jeux de données fournis avec l’extension rgrs
et tiré de l’enquête Histoire de vie et du recensement 1999 : rgrs
R> data(hdv2003)
R> d <- hdv2003
R> data(rp99)
L’option use permet d’éliminer les observations pour lesquelles l’une des deux valeurs est manquante.
Le cœfficient de corrélation est très faible.
On va donc s’intéresser plutôt à deux variables présentes dans le jeu de données rp99, la part de
diplômés du supérieur et la proportion de cadres dans les communes du Rhône en 1999.
69
70 Statistique bivariée
● ●
● ●
10
●● ● ● ● ● ● ●● ● ●
● ●
●● ● ● ● ● ● ● ● ● ●
8
● ●● ●● ● ● ● ● ● ●
d$[Link]
●●●●
●●●●
● ●
●●●●●●●●
●●●●●●●●
●●●●●●●●
●●
●●
●
●●●●●●●
●●●
●●
●●●●
●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●● ●
●
●●●●●●●●●●
●●●●●●●● ●●●
●●●●●●●●●●●●● ●●●●●●●●
●●●●●● ●●●●●●●●● ●● ●●● ●
●●●●●●●● ●●●
2
● ● ● ●●
● ● ●●● ● ●● ● ●● ●● ●● ● ● ● ●
●●●●
●● ●●●
●●●●●●●●●●●●
●●● ●●●●●●●●●
●●●
●●●●●●●●●●●
●●●●●●●●●●●●●●
●●●
●●●●● ●●●●
● ●● ● ●●●●●● ● ● ●●
● ● ● ●
● ●●
●● ●●●
●●●● ●●●●●● ●● ● ● ●● ● ●
●●
●● ●●●●●●● ●●●●●
● ●●
●●
●●
● ●
●●●
●● ●
●●
●●
●●●●
●●● ● ● ● ●● ● ●
●●● ●
● ● ● ●● ● ● ● ●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●● ●●●● ●●● ● ●●●●
●●
●●
●●●●●●●●●●●●●● ● ● ●
0
20 40 60 80 100
d$age
6
4
2
0
20 40 60 80 100
d$age
R> library(MASS)
R> tmp <- d[, c("age", "[Link]")]
R> tmp <- tmp[[Link](tmp), ]
R> [Link](kde2d(tmp$age, tmp$[Link]), color = [Link])
12 0.007
0.006
10
0.005
8
0.004
0.003
4
0.002
2
0.001
0 0.000
20 40 60 80
●
●
●
●
30
● ●
●
● ●
●
●
●●
● ●
● ●
25
●
● ●
● ●
● ●● ●
● ● ● ●● ●
●
Part des cadres
● ● ●
●
●
20
● ●
● ●
●
● ● ●
● ●
● ● ●●
●●
● ● ●
● ●● ● ● ●
● ● ●● ● ●
● ● ●
15
● ●●●
● ●● ●●●
●
● ● ●
● ● ● ●● ●●● ●
● ● ● ●●
● ●
● ● ● ●● ●
● ● ● ●●●●● ● ●● ●
● ●
●●
● ● ●
10
● ●● ● ●● ●
● ●● ●● ● ●●
● ● ● ● ●
● ●●● ●●
● ● ●● ●
●●
● ● ●●●●● ●
● ●●●
●
●●
● ●● ●● ● ●
● ●●●● ● ●●● ● ●●
●
●●●●●●● ●● ● ●
● ● ● ● ●
●●●● ●●● ●● ●
5
●●
● ●●● ●
● ● ● ● ● ●●●
● ●● ● ●
●●●
● ● ●
●●● ●●● ●●
●● ● ●
●●
● ●● ● ●
● ●● ●
● ● ● ● ●●● ●● ●
0
0 5 10 15 20 25
À nouveau, commençons par représenter les deux variables (figure 6.4 page précédente). Ça ressemble
déjà beaucoup plus à une relation de type linéaire.
Calculons le coefficient de corrélation :
R> cor(rp99$[Link], rp99$cadres)
[1] 0.8975282
C’est beaucoup plus proche de 1. On peut alors effectuer une régression linéaire complète en utilisant
la fonction lm :
R> reg <- lm(cadres ~ [Link], data = rp99)
R> summary(reg)
Call:
lm(formula = cadres ~ [Link], data = rp99)
Residuals:
Min 1Q Median 3Q Max
-9.6905 -1.9010 -0.1823 1.4913 17.0866
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.24088 0.32988 3.762 0.000203 ***
[Link] 1.38352 0.03931 35.196 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Le résultat montre que les cœfficients sont significativement différents de 0. La part de cadres augmente
donc avec celle de diplômés du supérieur (ô surprise). On peut très facilement représenter la droite de
régression à l’aide de la fonction abline (figure 6.5 page suivante).
●
●
●
●
30
● ●
●
● ●
●
●
●●
● ●
● ●
25
●
● ●
● ●
● ●● ●
● ● ● ●● ●
●
Part des cadres
●● ●
●
●
20
● ●
● ●
●
● ● ●
● ●
● ● ●●
●●
● ● ●
● ●● ● ● ●
● ● ●● ● ●
● ● ●
15
● ●●●
● ●● ●●●
●
● ● ● ●
● ● ● ●● ● ● ●
● ● ● ●●
● ●
● ● ● ●● ●
● ● ● ● ● ●
● ●●
● ●●●●
●●
● ● ●
10
● ●● ● ● ●
● ● ●● ● ●●●
● ●●●●●● ● ●
●
● ●●
● ●● ●
● ●●●●● ● ●
● ● ●●●●●● ●● ● ●
● ●●
● ●
●
● ●●
● ●●● ●● ● ● ●
● ●●●●●●● ● ● ●
●
● ● ● ● ●
●●●● ● ●●
5
●●
● ●●● ●● ●●●
●● ● ●●
● ●● ● ●●
●●● ●● ● ●
●●
● ● ●
●● ● ●
●●
● ●● ● ●
● ●● ●
● ● ● ● ●●● ●● ●
0
0 5 10 15 20 25
1 2
Non Oui
L’écart est très important. Est-il statistiquement significatif ? Pour cela on peut faire un test t de
comparaison de moyennes à l’aide de la fonction [Link] :
Le test est extrêmement significatif. L’intervalle de confiance à 95 % de la différence entre les deux
moyennes va de 14,5 ans à 21,8 ans.
Nous sommes cependant allés un peu vite en besogne, car nous avons négligé une hypothèse fonda-
mentale du test t : les ensembles de valeur comparés doivent suivre approximativement une loi normale
et être de même variance 3 . Comment le vérifier ?
D’abord avec un petit graphique, comme sur la figure 6.8 page suivante.
Ça a l’air à peu près bon pour les « Sans hard rock », mais un peu plus limite pour les fans de
Metallica, dont les effectifs sont d’ailleurs assez faibles. Si on veut en avoir le cœur net on peut utiliser le
test de normalité de Shapiro-Wilk avec la fonction [Link] :
Visiblement, le test estime que les distributions ne sont pas suffisamment proches de la normalité dans
les deux cas.
Et concernant l’égalité des variances ?
L’écart n’a pas l’air négligeable. On peut le vérifier avec le test fourni par la fonction [Link] :
3. Concernant cette seconde condition, R propose une option nommée [Link] qui permet d’utiliser une approximation
dans le cas où les variances ne sont pas égales
6.2. Une variable quantitative et une variable qualitative 79
200
4
150
3
Frequency
Frequency
100
2
50
1
0
15 20 25 30 35 40 45 20 40 60 80 100
La différence est très significative. En toute rigueur le test t n’aurait donc pas pu être utilisé.
Damned ! Ces maudits tests statistiques vont-ils nous empêcher de faire connaître au monde entier
notre fabuleuse découverte sur l’âge des fans de Sepultura ? Non ! Car voici qu’approche à l’horizon un nou-
veau test, connu sous le nom de Wilcoxon/Mann-Whitney. Celui-ci a l’avantage d’être non-paramétrique,
c’est à dire de ne faire aucune hypothèse sur la distribution des échantillons comparés. Par contre il ne
compare pas des différences de moyennes mais des différences de médianes :
Ouf ! La différence est hautement significative 4 . Nous allons donc pouvoir entamer la rédaction de
notre article pour la Revue française de sociologie.
rgrs On n’a cependant que les effectifs, ce qui rend difficile les comparaisons. L’extension rgrs fournit des
fonctions permettant de calculer les pourcentages lignes, colonnes et totaux d’un tableau croisé.
Les pourcentages lignes s’obtiennent avec la fonction lprop. Celle-ci s’applique au tableau croisé
généré par table :
Les pourcentages ligne ne nous intéressent guère ici. On ne cherche pas à voir quelle est la proportion
de cadres parmi ceux qui pratiquent un sport, mais plutôt quelle est la proportion de sportifs chez les
cadres. Il nous faut donc des pourcentages colonnes, que l’on obtient avec la fonction cprop :
R> cprop(tab)
Autre Cadre Employe Intermediaire Ouvrier Ensemble
Non 65.5 45.0 67.5 51.6 77.0 64.4
Oui 34.5 55.0 32.5 48.4 23.0 35.6
Total 100.0 100.0 100.0 100.0 100.0 100.0
Dans l’ensemble, le pourcentage de personnes ayant pratiqué un sport est de 35,6 %. Mais cette
proportion varie fortement d’une catégorie professionnelle à l’autre : 55,0 % chez les cadres contre 23,0 %
chez les ouvriers.
À noter qu’on peut personnaliser l’affichage de ces tableaux de pourcentages à l’aide de différentes
options, dont digits, qui règle le nombre de décimales à afficher, et percent, qui indique si on souhaite ou
non rajouter un symbole % dans chaque case du tableau. Cette personnalisation peut se faire directement
au moment de la génération du tableau, et dans ce cas elle sera utilisée par défaut :
R> ctab <- cprop(tab, digits = 2, percent = TRUE)
R> ctab
Autre Cadre Employe Intermediaire Ouvrier Ensemble
Non 65.52% 45.00% 67.51% 51.63% 76.97% 64.37%
Oui 34.48% 55.00% 32.49% 48.37% 23.03% 35.63%
Total 100.00% 100.00% 100.00% 100.00% 100.00% 100.00%
Ou bien ponctuellement en passant les mêmes arguments aux fonctions print (pour affichage dans
R) ou copie (pour export vers un logiciel externe) :
R> ctab <- cprop(tab)
R> print(ctab, percent = TRUE)
Autre Cadre Employe Intermediaire Ouvrier Ensemble
Non 65.5% 45.0% 67.5% 51.6% 77.0% 64.4%
Oui 34.5% 55.0% 32.5% 48.4% 23.0% 35.6%
Total 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
6.3.2 χ2 et dérivés
Pour tester l’existence d’un lien entre les modalités des deux variables, on va utiliser le très classique
test du χ2 5 . Celui-ci s’obtient grâce à la fonction [Link], appliquée au tableau croisé obtenu avec
table 6 :
R> [Link](tab)
Pearson's Chi-squared test
data: tab
X-squared = 96.7983, df = 4, p-value < 2.2e-16
Le test est hautement significatif, on ne peut pas considérer qu’il y a indépendance entre les lignes et
les colonnes du tableau.
On peut affiner l’interprétation du test en déterminant dans quelle case l’écart à l’indépendance est
le plus significatif en utilisant les résidus du test. Ceux-ci sont notamment affichables avec la fonction
residus de rgrs : rgrs
5. On ne donnera pas plus d’indications sur le test du χ2 ici. Les personnes désirant une présentation plus détaillée
pourront se reporter (attention, séance d’autopromotion !) à la page suivante : [Link]
6. On peut aussi appliquer directement le test en spécifiant les deux variables à croiser via [Link](d$qualreg,
d$sport)
82 Statistique bivariée
R> residus(tab)
Autre Cadre Employe Intermediaire Ouvrier
Non 0.11 -3.89 0.95 -2.49 3.49
Oui -0.15 5.23 -1.28 3.35 -4.70
Les cases pour lesquelles l’écart à l’indépendance est significatif ont un résidu dont la valeur est
supérieure à 2 ou inférieure à -2. Ici on constate que la pratique d’un sport est sur-représentée parmi
les cadres et, à un niveau un peu moindre, parmi les professions intermédiaires, tandis qu’elle est sous-
représentée chez les ouvriers.
Enfin, on peut calculer le cœfficient de contingence de Cramer du tableau, qui peut nous permettre
rgrs de le comparer par la suite à d’autres tableaux croisés. On peut pour cela utiliser la fonction [Link]
rgrs :
R> cramer.v(tab)
[1] 0.24199
Graphe en mosaïque
>4
2:4
0:2
Non
−2:0
sport
−4:−2
<−4
Standardized
Oui
Residuals:
qualreg
Données pondérées
S’il est tout à fait possible de travailler avec des données pondérées sous R, cette fonctionnalité n’est
pas aussi bien intégrée que dans la plupart des autres logiciels de traitement statistique. En particulier,
il y a plusieurs manières possibles de gérer la pondération.
Dans ce qui suit, on utilisera le jeu de données tiré de l’enquête Histoire de vie et notamment sa
variable de pondération poids 1 .
R> data(hdv2003)
R> d <- hdv2003
R> range(d$poids)
[1] 78.07834 31092.14132
84
7.3. L’extension survey 85
R> mean(d$age)
[1] 48.157
R> [Link](d$age, weights = d$poids)
[1] 46.34726
R> [Link](d$age, weights = d$poids)
[1] 325.2658
Pour les tris à plat, on utilise la fonction [Link] à laquelle on passe la variable en paramètre :
Le site officiel (en anglais) comporte beaucoup d’informations, mais pas forcément très accessibles :
[Link]
Pour utiliser les fonctionnalités de l’extension, on doit d’abord définir un design de notre enquête.
C’est-à-dire indiquer quel type de pondération nous souhaitons lui appliquer. Dans notre cas nous utilisons
le design le plus simple, avec une variable de pondération déjà calculée. Ceci se fait à l’aide de la fonction
svydesign :
R> library(survey)
R> dw <- svydesign(ids = ~1, data = d, weights = ~d$poids)
86 Données pondérées
Cette fonction crée un nouvel objet, que nous avons nommé dw. Cet objet n’est pas à proprement
parler un tableau de données, mais plutôt un tableau de données plus une méthode de pondération. dw
et d sont des objets distincts, les opérations effectuées sur l’un n’ont pas d’influence sur l’autre. On peut
cependant retrouver le contenu de d depuis dw en utilisant dw$variables :
R> mean(d$age)
[1] 48.157
R> mean(dw$variables$age)
[1] 48.157
Lorsque notre design est déclaré, on peut lui appliquer une série de fonctions permettant d’effectuer
diverses opérations statistiques en tenant compte de la pondération. On citera notamment :
D’autres fonctions sont disponibles, comme svyratio ou svyby, mais elles ne seront pas abordées ici.
Pour ne rien arranger, ces fonctions prennent leurs arguments sous forme de formules, c’est-à-dire pas
de la manière habituelle. En général l’appel de fonction se fait en spécifiant d’abord les variables d’intérêt
sous forme de formule, puis l’objet design.
Voyons tout de suite quelques exemples :
En particulier, les tris à plat se déclarent en passant comme argument le nom de la variable précédé
d’un symbole ˜, tandis que les tableaux croisés utilisent les noms des deux variables séparés par un + et
précédés par un ˜.
On peut récupérer le tableau issu de svytable dans un objet et le réutiliser ensuite comme n’importe
quel tableau croisé :
clso
sexe Oui Non Ne sait pas
Homme 2658744.04 2418187.64 72450.75
Femme 2602031.76 3242389.36 77422.79
R> lprop(tab)
clso
sexe Oui Non Ne sait pas Total
Homme 51.6 47.0 1.4 100.0
Femme 43.9 54.8 1.3 100.0
Ensemble 47.5 51.1 1.4 100.0
R> [Link](tab)
Pearson's Chi-squared test
data: tab
X-squared = 67214.28, df = 2, p-value < 2.2e-16
Les fonctions lprop, cprop et residus de rgrs sont donc tout à fait compatibles avec l’utilisation rgrs
de survey. La fonction freq peut également être utilisée si on lui passe en argument non pas la variable
elle-même, mais son tri à plat obtenu avec svytable :
Enfin, survey est également capable de produire des graphiques à partir des données pondérées. Des
exemples sont donnés figure 7.1 page suivante.
7.4 Conclusion
En attendant mieux, la gestion de la pondération sous R n’est sans doute pas ce qui se fait de plus
pratique et de plus simple. On pourra quand même donner les conseils suivants :
– utiliser les options de pondération des fonctions usuelles ou les fonctions de l’extension rgrs pour les
cas les plus simples ;
– si on utilise survey, effectuer tous les recodages et manipulations sur les données non pondérées
autant que possible ;
– une fois les recodages effectués, on déclare le design et on fait les analyses en tenant compte de la
pondération ;
– surtout ne jamais modifier les variables du design. Toujours effectuer recodages et manipulations
sur les données pondérées, puis redéclarer le design pour que les mises à jour effectuées soient
disponibles pour l’analyse ;
88 Données pondérées
0.30
10 12
● ●
● ●
●● ● ● ● ● ●● ●
● ● ●
● ●
0.20
●
8
●● ●
● ● ●
●● ● ● ●
[Link]
Density
● ●
●● ●
● ● ● ●
● ● ● ●
●●●● ● ● ● ● ● ●● ● ● ●●●●●●●● ●●● ●●●● ● ●
6
● ● ● ●● ● ● ● ● ●● ● ●
●
●● ●
●● ●● ●●●●●●●●●
● ●
●● ●
● ●●●●● ●● ●●● ●●●●●●●●●
●●
●
●
●●
●●
●
●●●●●●
●●●●
● ●● ●
●● ● ● ● ● ● ● ●
● ●● ●
● ● ● ● ●
0.10
● ●● ● ●● ● ● ●● ● ●● ●
●●●●● ●● ● ● ●● ● ●
4
● ●
●●
● ●●● ●
● ●●● ●●●●
●●●●
●●●●
● ●●
●● ●●●
●●●●
●●●
●
●●●●●●●●●
● ●●
● ●●● ●
●●●● ●
● ● ●
● ● ● ●●
●● ● ● ● ●● ● ● ●● ● ●
●●●●
●
● ●
●●
●●
●●●
● ●
●
●● ●● ●
●
●●
●
●
●
●●●
●●
●●
●●
●
●●
●●
●
●●
●●
●●●
●●
●●
●
●●
●
●●
●●
●
●
●●
●
●
●●
●●●
●●
●●
●
●
●●
●●
●●
● ●
●
●●
●
●
●
●
● ●
●
●
●
●
●●
●
●●●
●
●●
●
●
●●●●
●●
●●●
●
●
● ●
●●●
●● ● ●
●●
●●
●●
●
●
●●
●●●
●
●●
●
● ●●●
●
●●
●●●
●
●
●
●
●
●●
●●
●
●
●●●●●
●● ●
● ● ●●
●●
●●●
●●
● ● ● ● ● ● ● ●●●
●●● ●
● ●●●● ● ● ● ● ● ●
●
●
●●●●
● ●●
●●
●●
●●●
●●
●●●●●
●●●●
●
●●●●
●
● ●●●●●●
●●●●●●●
●
●●●
●●●
●●●●
●●●● ●●
●●●
●●● ● ● ●●●
●●
2
●
●●●●●●
●
● ●
●
●●● ●
● ●●●●
●●
●●●●●
●●●●●●
●●●●
●●●
●
●● ●●
●
●●●
●●●●●●
● ●● ●●
●●●
●●●●● ●● ●
●● ● ●●●●
●●
●●●● ●
●●●●●●●●●●●●● ●●●●●●
● ● ●●
● ●● ●●
● ●● ●
●●
●●●●● ●●● ● ●
● ● ●●
●● ● ● ●
● ●●
● ●● ● ● ●●
● ● ● ● ●
●●
●●
● ●
●●● ●●●● ● ● ● ●● ● ●
● ●
● ●● ●●● ● ● ● ● ●●
●
●● ●
●
●
● ●
● ●
●
●
●●
●●●
●●
●●
●
●●
●●
●
●●
●●●
●
● ●
● ●
●●●
●
●
●●
●● ●
●● ●●
●●●
●
●●●
●
●●●
●
●●
●
●
●
●●
●●●
●
●
●●
●●
●
●●●
● ●●
●
●●●
●
●
●
●
●●
●●●●●●●●●●
●
●
●●
● ●●
●●
●
●
●●
●●●
●●●
●●●
●●●
● ● ●●
●●●
●
●●
● ●
●
●●●●
●● ●
●●●
●●
●
●●
●●
● ●●●
●●●●
● ●
● ●
●
●●
●●●●●
● ●●●
●●
●●●
●
●● ● ● ● ●● ●
●● ● ●● ●● ● ●
● ●
●
●●● ● ● ● ● ● ● ●●● ● ● ●
●
●●
● ●
●●●
●
●
●
● ●● ●
●●●●●
● ●
●●●
● ●
●● ● ●● ● ●● ●
● ●
● ● ● ● ●●●●
●●
●
●●
●●
●● ● ●● ● ● ●
● ●● ● ● ●●
● ●
● ● ● ● ●●● ●●●● ●● ●●
●●●
●
● ● ●
●
● ●● ● ●● ●
●●●●●● ●● ● ● ●●
● ●
●●
● ●
●●●
● ●
●● ●●●●●● ● ●●●● ● ●● ●
0
●●● ●
● ● ●●●●
● ●●● ● ● ●●●
●●●●● ●●●●
●●●●
● ● ●●
●●
●●●●
●●
●● ● ●
● ●● ●●●●
● ●●● ● ● ●
● ●●●●●
●●
●●● ● ● ● ●
● ● ● ● ●● ●● ●
●
0.00
20 40 60 80 100 0 2 4 6 8 10 12
age [Link]
100
80
80
60
60
Âge
Âge
40
40
20
20
Homme Femme
Sexe
Cartographie
Cette partie aborde l’utilisation de R pour la création de cartes simples permettant la représentation
d’effectifs, de proportions ou de variables qualitatives pour des zonages géographiques (régions, communes,
Iris. . . ). Ceci ne constitue qu’une infime partie des possibilités de l’analyse spatiale de données.
Par ailleurs, le parti pris est ici de tout effectuer à l’intérieur de R, sans faire appel à des applications
externes spécialisées comme Quantum GIS, gvSig ou GRASS.
Les fonctions présentées ici font partie pour la plupart de l’extension rgrs , mais elles ne sont que rgrs
des interfaces visant à faciliter l’utilisation de fonctions disponibles dans des extensions spécialisées, en
particulier l’extension sp.
R> library(rgrs)
R> data(lyon)
Nous avons désormais à notre disposition un objet nommé lyon que nous pouvons tout de suite
représenter graphiquement à l’aide de la fonction plot. Le résultat est indiqué figure 8.1 page suivante.
Si l’on veut étudier la structure de l’objet lyon, par exemple en effectuant un str(lyon), on se
rend vite compte de la complexité de ce type d’objets. En fait lyon est lui-même composé de plusieurs
« sous-objets » (slots) accessibles avec l’opérateur @. Nous décrirons les trois principaux :
lyon@data est un tableau de données dont chaque ligne correspond à un des polygones (c’est à dire ici
à un arrondissement de Lyon) et qui lui associe un certain nombre de données (identifiant, nom de
l’arrondissement, etc.) ;
lyon@polygons est une liste de polygones définissant les contours de chaque arrondissement ;
89
90 Cartographie
R> sp::plot(lyon)
proj4string est un objet décrivant la projection géographique utilisée pour les données spatiales.
On n’accèdera en général jamais directement à ces sous-objets, à part éventuellement data, que l’on
peut manipuler comme n’importe quel tableau de données :
R> str(lyon@data)
'[Link]': 9 obs. of 2 variables:
$ DepCom : Factor w/ 301 levels "69001","69002",..: 293 294 295 296 297 298 299 300 301
$ Nom_Com: chr "LYON 1ER" "LYON 2E" "LYON 3E" "LYON 4E" ...
R> lyon@data$Nom_Com
[1] "LYON 1ER" "LYON 2E" "LYON 3E" "LYON 4E" "LYON 5E" "LYON 6E"
[7] "LYON 7E" "LYON 8E" "LYON 9E"
Cette section est relativement technique et peut-être sautée si l’on souhaite juste avoir un aperçu des
fonctionnalités présentées en utilisant les données incluses dans rgrs.
La conversion et l’import de données de type spatial sont des opérations relativement complexes,
notamment du fait qu’elles mettent en jeu des notions de projection pas toujours faciles à comprendre et
à maîtriser pour des non-spécialistes 1 .
R propose cependant de nombreux outils pour importer des données de différents formats, notamment
via les extensions maptools et rgdal.
On n’entrera pas ici dans le détail de ces opérations (que nous ne maîtrisons guère). Mais voici
cependant, à titre indicatif, la marche à suivre pour importer dans R des données de l’IGN telles que
fournies par le Centre Maurice Halbwachs (contours Iris de différents départements par exemple).
Les données étant fournies au format MapInfo, la première opération consiste à les convertir en format
ESRI Shapefile. Sous Linux cela se fait très facilement grâce à ogr2ogr avec une commande du type :
Ceci devrait vous générer trois fichiers portant le même nom mais avec les extensions shp, shx et dbf.
L’import dans R peut alors s’effectuer de la manière suivante :
library(maptools)
library(rgdal)
library(foreign)
## Projection d'origine
[Link] <- "+init=epsg:27572 +proj=lcc +lat_1=45.90287723937
+lat_2=47.69712276063 +lat_0=46.8 +lon_0=2.337229104484
+x_0=600000 +y_0=2200000 +units=m +pm=greenwich"
## Projection d'arrivée
[Link] <- "+proj=longlat +datum=WGS84"
## Import du fichier
[Link] <- readShapePoly("69_iris.shp", proj4string=CRS([Link]))
## Transformation de la projection
[Link] <- spTransform([Link], CRS([Link]))
## Sauvegarde
save([Link], file="rhone_iris.rda")
On peut ensuite charger le contenu du fichier rhone_iris.rda à l’aide de la fonction load dans un
autre script.
R> data(lyon)
R> data(rp99)
R> str(lyon@data)
'[Link]': 9 obs. of 2 variables:
$ DepCom : Factor w/ 301 levels "69001","69002",..: 293 294 295 296 297 298 299 300 301
$ Nom_Com: chr "LYON 1ER" "LYON 2E" "LYON 3E" "LYON 4E" ...
R> head(rp99$code, 20)
[1] 69001 69002 69003 69004 69005 69006 69007 69008 69009 69010 69012
[12] 69013 69014 69015 69016 69017 69018 69019 69020 69021
On se rend compte que les deux objets peuvent être « joints » grâce à un champ contenant le code
INSEE de chaque commune ou arrondissement. Ce champ se nomme DepCom pour l’objet lyon, et code
pour l’objet rp99.
Nous avons dès lors tout ce qu’il nous faut pour afficher une première carte, en l’occurrence le taux
de chômage par arrondissement en 1999. On utilise pour cela la fonction [Link] de rgrs. Le code et
le résultat sont indiqués figure 8.2 page suivante.
La fonction [Link] admet les arguments suivants :
– le premier argument est l’objet de type spatial contenant les données cartographiques, ici lyon ;
– le second argument est le tableau de données contenant les variables à cartographier, ici rp99 ;
– le troisième argument est le nom de la variable à représenter, ici "[Link]" ;
– l’argument [Link] correspond au nom du champ de jointure dans l’objet spatial ;
– l’argument [Link] correspond au nom du champ de jointure dans le tableau de données.
8.2. Cartes simples 93
16
15
14
13
12
11
10
16
14
12
10
Le nombre de classes de valeurs et les limites de ces classes sont calculés automatiquement. On peut
cependant spécifier soit un nombre de classes à l’aide de l’argument nbcuts 2 , soit les limites de ces classes
avec l’argument at, comme indiqué figure 8.3 de la présente page, et figure 8.4 page suivante.
De nombreuses options sont disponibles pour personnaliser l’affichage de la carte. On pourra citer :
15
12
11.5
11
10.5
10
Taux de chômage1999
16
15
14
13
12
11
10
Enfin, tout argument supplémentaire est transmis à la fonction spplot pour l’affichage de la carte.
Les palettes utilisées en argument de [Link] et [Link] sont celles définies par l’extension
RColorBrewer, elle-même issue du projet Colorbrewer :
[Link]
Le site du projet propose notamment un outil qui permet de visualiser et de choisir une palette de
manière interactive :
[Link]
Les noms de palettes passés en argument de [Link] et [Link] sont les mêmes que ceux
utilisés sur ce site.
Un exemple d’utilisation de ces différents paramètres est donné figure 8.5 de la présente page.
8.2. Cartes simples 97
● 10000
● 20000
● 30000
40000
40773
●
●
●
●
●
●
● ●
40000
40773
Un exemple d’utilisation de ces différents paramètres est donné figure 8.7 de la présente page.
A
B
C
D
E
de la présente page. Le tableau de données rp99 ne contenant pas de variable de type qualitative, on a
simulé les données de manière tout à fait aléatoire.
Là encore, plusieurs options sont disponibles pour personnaliser l’affichage de la carte. Ce sont en
fait les mêmes options que celles de [Link] (main, sub, posleg, palette. . . ), ainsi que l’option
[Link], qui permet de sélectionner une palette de l’extension RColorBrewer. Un exemple de
personnalisation est donné figure 8.9 page suivante.
Il est tout à fait possible de superposer d’autres éléments graphiques à une carte. On utilise alors en
général directement la fonction plot munie de l’argument add=TRUE.
100 Cartographie
Catégories d'arrondissements
A
B
C
D
E
Source : aléatoire
8.3.1 Bordure
Il peut être intéressant d’ajouter une bordure à une carte soit pour des raisons esthétiques (par exemple
pour délimiter son contour), soit pour mettre en valeur une zone particulière.
Imaginons par exemple que nous souhaitons mettre en valeur le premier arrondissement de Lyon sur
notre carte. Un objet de type spatial, malgré sa complexité, supporte l’indexation d’une manière semblable
aux tableaux de données. On peut donc sélectionner un sous-ensemble de notre carte des arrondissements
de Lyon de la manière suivante :
Cette commande sélectionne le polygone dont le nom est LYON 1ER et le place dans un nouvel objet. Il
est alors très simple de rajouter une bordure autour de cet arrondissement en utilisant la fonction plot,
comme indiqué figure 8.10 page suivante.
Si on souhaite délimiter le contour de notre carte avec une bordure, on doit effectuer une opération
supplémentaire, qui consiste à « fusionner » l’ensemble des polygones de notre carte pour n’en garder
que le contour. Cette opération peut se faire dans R à l’aide de la fonction unionSpatialPolygons de
l’extension maptools. Celle-ci permet de fusionner les polygones d’une carte en fonction des valeurs d’une
variable : les polygones ayant la même valeur sont alors regroupés pour n’en former plus qu’un.
Dans notre cas, nous voulons fusionner tous les polygones, nous pouvons donc créer une variable
artificielle (ici nommée fusion) contenant la même valeur pour toutes nos zones, puis appliquer la fonction
unionSpatialPolygons, ce qui donne :
R> library(maptools)
R> fusion <- rep(1, nrow(lyon@data))
R> [Link] <- unionSpatialPolygons(lyon, fusion)
On peut ensuite utiliser l’objet ainsi calculé pour ajouter une bordure globale à notre carte, comme
dans la figure 8.11 page 103.
8.3.2 Labels
L’ajout de labels est souvent indispensable pour augmenter la lisibilité d’une carte et permettre le
repérage des zonages géographiques représentés. La fonction [Link] est faite pour cela.
Elle accepte comme principaux arguments :
– le nom de l’objet spatial ;
– un vecteur de chaînes de caractères contenant les labels ;
On peut spécifier les coordonnées de placement des labels via l’argument coords. Si cet argument
vaut NULL (ce qui est le cas par défaut), la position des labels est automatiquement calculée en fonction
du polygone auquel il appartient (ce qui n’exclut cependant pas les chevauchements).
La figure 8.12 page 104 montre comment ajouter les noms des arrondissements à notre carte de Lyon.
Plusieurs options sont disponibles pour personnaliser l’affichage des labels, notamment :
La figure 8.13 page 105 montre comment ajouter la valeur du taux de chômage à notre carte, en leur
ajoutant une bordure blanche.
102 Cartographie
16
15
14
13
12
11
10
16
15
14
13
12
11
10
16
15
14
13
12
11
10
LYON 9E
LYON 4E
LYON 6E
LYON 1ER
LYON 5E
LYON 3E
LYON 2E
LYON 7E LYON 8E
16
15
14
13
12
11
10
15.1
11.2
10.7
15.7
10.5
11.6
10.9
12.9 14.2
Cette partie décrit comment, une fois les analyses réalisées, on peut exporter les résultats (tableaux
et graphiques) dans un traitement de texte ou une application externe.
R> data(hdv2003)
R> tab <- table(hdv2003$sexe, hdv2003$bricol)
R> tab
Non Oui
Homme 384 515
Femme 763 338
R> copie(tab)
On peut ensuite récupérer le résultat dans une feuille Excel en effectuant un simple Coller.
1. Celle-ci nécessite que l’extension R2HTML soit également installée sur le système via
[Link]("R2HTML",dep=TRUE).
2. En fait cela fonctionne aussi sous Linux si le programme xclip est installé et accessible. Cela fonctionne peut-être
aussi sous Mac OS X mais n’a pas pu être testé.
106
9.2. Export de graphiques 107
On peut ensuite sélectionner le tableau sous Excel, le copier et le coller dans Word :
Par défaut le résultat est placé dans un fichier nommé [Link] dans le répertoire courant, mais on
peut modifier le nom et l’emplacement avec l’option filename :
On peut ensuite l’intégrer directement dans Word ou dans OpenOffice en utilisant le menu Insertion
puis Fichier et en sélectionnant le fichier de sortie généré précédemment.
Une image bitmap est une image stockée sous forme de points, typiquement une photographie. Une
image vectorielle est une image enregistrée dans un langage de description, typiquement un schéma
ou une figure. Le second format présente l’avantage d’être en général beaucoup plus léger et d’être
redimensionnable à l’infini sans perte de qualité. Pour plus d’informations voir [Link]
Image_matricielle et [Link]
108 Exporter les résultats
L’option Copier dans le presse papier permet de placer le contenu de la fenêtre dans le presse-papier
soit dans un format vectoriel soit dans un format bitmap. On peut ensuite récupérer le résultat dans un
traitement de texte ou autre avec un simple Coller.
Des possibilités similaires sont offertes par l’interface sous Mac OS X, mais avec des formats proposés
un peu différents.
R> boxplot(rnorm(100))
R> [Link](device = png, file = "[Link]")
R> [Link]()
Les formats de sortie possibles varient selon les plateformes, mais on retrouve partout les formats
bitmap bmp, jpeg, png, tiff, et les formats vectoriels postscript ou pdf. La liste complète disponible pour
votre installation de R est disponible dans la page d’aide de Devices :
R> ?Devices
L’autre possibilité est de rediriger directement la sortie graphique dans un fichier, avant d’exécuter
la commande générant la figure. On doit pour cela faire appel à l’une des commandes permettant cette
redirection. Les plus courantes sont bmp, png, jpeg et tiff pour les formats bitmap, postscript, pdf,
svg 3 et [Link] 4 pour les formats vectoriels.
Ces fonctions prennent différentes options permettant de personnaliser la sortie graphique. Les plus
courantes sont width et height qui donnent la largeur et la hauteur de l’image générée (en pixels pour
les images bitmap, en pouces pour les images vectorielles), et pointsize qui donne la taille de base des
polices de caractère utilisées.
Il est nécessaire de faire un appel à la fonction [Link] après génération du graphique pour que le
résultat soit bien écrit dans le fichier de sortie (dans le cas contraire on se retrouve avec un fichier vide).
R et son extension odfWeave permettent de résoudre en partie ce problème. Le principe de base est
d’inclure du code R dans un document de type traitement de texte, et de procéder ensuite au remplacement
automatique du code par le résultat sous forme de texte, de tableau ou de figure.
9.3.1 Prérequis
odfWeave ne fonctionne qu’avec des documents au format ODF, donc en particulier avec OpenOffice
mais pas avec Word. L’utilisation d’OpenOffice est cependant très proche de celle de Word, et les documents
générés peuvent être ensuite ouverts sous Word pour édition.
L’installation de l’extension se fait de manière tout à fait classique :
Un autre prérequis est de disposer d’applications permettant de compresser et décompresser des fichiers
au format zip. Or ceci n’est pas le cas par défaut sous Windows. Pour les récupérer, téléchargez l’archive
à l’adresse suivante :
[Link]
Décompressez-là et placez les deux fichiers qu’elle contient ([Link] et [Link]) dans votre réper-
toire système, c’est à dire en général soit c:\windows, soit c:\winnt.
9.3.2 Exemple
Prenons tout de suite un petit exemple. Soit le fichier OpenOffice représenté figure 9.1 de la présente
page.
On voit qu’il contient à la fois du texte mis en forme (sous forme de titre notamment) mais aussi des
passages plus ésotériques qui ressemblent plutôt à du code R.
Ce code est séparé du reste du texte par les caractères «»=, en haut, et @, en bas.
110 Exporter les résultats
Créons maintenant un nouveau fichier R dans le même répertoire que notre fichier OpenOffice, et
mettons-y le contenu suivant :
R> library(odfWeave)
R> odfWeave("odfWeave_exemple1.odt", "odfWeave_exemple1_out.odt")
Puis exécutons le tout... Nous devrions alors avoir un nouveau fichier nommé
odfWeave_exemple1_out.odt dans notre répertoire de travail. Si on l’ouvre avec OpenOffice, on
obtient le résultat indiqué figure 9.2 de la présente page.
Que constate-t-on ? Le passage contenant du code R a été remplacé par le code R en question, de
couleur bleue, et par son résultat, en rouge.
Tout ceci est bien sympathique mais un peu limité. La figure 9.3 page suivante, montre un exemple
plus complexe, dont le résultat est indiqué figure 9.4, page 112.
Le premier bloc de code R contient des options entre les séparateurs « et »=. L’option echo=FALSE
supprime l’affichage du code R (en bleu) dans le document résultat. L’option results=hide supprime
l’affichage du résultat du code (en rouge). Au final, le code library(rgrs) est exécuté, mais caché dans
le document final.
Dans le deuxième bloc, l’option results=xml indique que le résultat du code ne sera pas du simple
texte mais un objet déjà au format OpenOffice (en l’occurrence un tableau). Le code lui-même est ensuite
rgrs assez classique, sauf la dernière instruction [Link], qui, appliquée à un objet de type table,
produit le tableau mis en forme dans le document résultat.
Plus loin, on a dans le cours du texte une chaîne \Sexprsum(tab) qui a été remplacée par le résultat
du code qu’elle contient.
Enfin, dans le dernier bloc, l’option fig=TRUE indique que le résultat sera cette fois une image. Et le
bloc est bien remplacé par la figure correspondante dans le document final.
9.3. Génération automatique de rapports avec OpenOffice 111
9.3.3 Utilisation
Le principe est donc le suivant : un document OpenOffice classique, avec du texte mis en forme, stylé
et structuré de manière tout à fait libre, à l’intérieur duquel se trouve du code R. Ce code est délimité par
les caractères «»= (avant le code) et @ (après le code). On peut indiquer des options concernant le bloc de
code R entre les caractères « et » de la chaîne ouvrante. Parmi les options possibles les plus importantes
sont :
eval si TRUE (par défaut), le bloc de code est exécuté. Sinon il est seulement affiché et ne produit pas de
résultat.
echo si TRUE (par défaut), le code R du bloc est affiché dans le document résultat (par défaut en bleu).
Si FALSE, le code est masqué.
results indique le type de résultat renvoyé par le bloc. Si l’option vaut verbatim (par défaut), le résultat
de la commande est affiché tel quel (par défaut en rouge). Si elle vaut xml, le résultat attendu est un
objet OpenOffice : c’est l’option qu’on utilisera lorsqu’on fait appel à la fonction [Link].
Si l’option vaut hide, le résultat est masqué.
fig si TRUE, indique que le résultat du code est une image.
En résumé, si on souhaite utiliser un bloc pour charger des extensions sans que des traces apparaissent
dans le document final, on utilise «echo=FALSE,results=hide»=. Si on veut afficher un tableau généré
par [Link], on utilise «echo=FALSE,results=xml»=. Si on souhaite insérer un graphique, on
utilise «echo=FALSE,fig=TRUE»=. Si on souhaite afficher du code R et son résultat « tel quel », on utilise
simplement «»=
La fonction [Link] fait partie de l’extension rgrs . Elle transforme l’objet qu’on lui passe en rgrs
paramètres dans un format mis en forme lisible par OpenOffice 5 .
Elle permet de transformer les objets de type suivant :
5. En fait la fonction [Link] ne fait rien par elle-même, elle se contente de simplifier l’appel à la fonction
odfTable de l’extension odfWeave.
112 Exporter les résultats
– table à une ou deux dimensions (tri à plat ou tableau croisé obtenu avec les fonctions table, lprop,
cprop. . .
– [Link], y compris les tableaux de données ou le résultat de la commande freq.
– vector
– matrix
Pour générer le document résultat, on doit lancer une session R utilisant comme répertoire de travail
celui où se trouve le document OpenOffice source, et exécuter les deux commandes suivantes :
R> library(odfWeave)
R> odfWeave("fichier_source.odt", "fichier_resultat.odt")
En pratique, on répartit en général son travail entre différents fichiers R qu’on appelle ensuite dans
le document OpenOffice à l’aide de la fonction source histoire de limiter le code R dans le document au
strict minimum. Par exemple, si on a regroupé le chargement des données et les recodages dans un fichier
nommé recodages.R, on pourra utiliser le code suivant en début de document :
<<echo=FALSE,results=hide>>=
source("recodages.R")
@
Il existe un conflit entre les extensions R2HTML et odfWeave qui peut empêcher la seconde de fonctionner
correctement si la première est chargée en mémoire. En cas de problème on pourra enlever l’extension
R2HTML avec la commande detach(package:R2HTML).
Enfin, différentes options sont disponibles pour personnaliser le résultat obtenu, et des commandes per-
mettent de modifier le style d’affichage des tableaux et autres éléments générés. Pour plus d’informations,
on se référera à la documentation de l’extension :
[Link]
et notamment au document d’introduction en anglais :
[Link]
6. C’est cet outil qui a permis de générer le document que vous avez sous les yeux.
Partie 10
Où trouver de l’aide
R> help("mean")
Ou sa forme abrégée :
?mean
Chaque page d’aide comprend plusieurs sections, en particulier :
R> example(mean)
114
10.2. Ressources sur le Web 115
Ceci devrait lancer votre navigateur favori et afficher une page vous permettant alors de naviguer parmi
les différentes extensions installées, d’afficher les pages d’aide des fonctions, de consulter les manuels,
d’effectuer des recherches, etc.
À noter qu’à partir du moment où vous avez lancé [Link](), les pages d’aide demandées avec
help("lm") ou ?plot s’afficheront désormais dans votre navigateur.
Si vous souhaitez rechercher quelque chose dans le contenu de l’aide directement dans la console,
vous pouvez utiliser la fonction [Link], qui renvoit une liste des pages d’aide contenant les termes
recherchés. Par exemple :
R> [Link]("logistic")
Les manuels sont des documents complets de présentation de certains aspects de R. Ils sont accessibles
en ligne, ou téléchargeables au format PDF :
[Link]
On notera plus particulièrement An introduction to R, normalement destiné aux débutants, mais qui
nécessite quand même un minimum d’aisance en informatique et en statistiques :
[Link]
R Data Import/Export explique notamment comment importer des données depuis d’autres logiciels :
[Link]
Les FAQ regroupent des questions fréquemment posées et leurs réponses. À lire donc ou au moins à
parcourir avant toute chose :
[Link]
La FAQ la plus utile est la FAQ généraliste sur R :
[Link]
Mais il existe également une FAQ dédiée aux questions liées à Windows, et une autre à la plateforme
Mac OS X.
Les manuels et les FAQ sont accessibles même si vous n’avez pas d’accès à Internet en utilisant la fonction
[Link]() décrite précédemment.
Le Wiki est un site dont les pages sont éditées par les utilisateurs, à la manière de Wikipédia. N’importe
quel visiteur du site peut ainsi rajouter ou modifier des informations sur tel aspect de l’utilisation du
logiciel :
[Link]
R-announce est la liste de diffusion électronique officielle du projet. Elle ne comporte qu’un nombre
réduit de messages (quelques-uns par mois tout au plus) et diffuse les annonces concernant de nouvelles
versions de R ou d’autres informations particulièrement importantes. On peut s’y abonner à l’adresse
suivante :
[Link]
R Journal est la « revue » officielle du projet R, qui a succédé début 2009 à la lettre de nouvelles R
News. Elle paraît entre deux et cinq fois par an et contient des informations sur les nouvelles versions
du logiciel, des articles présentant des extensions, des exemples d’analyse. . . Les parutions sont annoncées
sur la liste de diffusion R-announce, et les numéros sont téléchargeables à l’adresse suivante :
[Link]
Autres documents On trouvera de nombreux documents dans différentes langues, en général au format
PDF, dans le répertoire suivant :
[Link]
Parmi ceux-ci, les cartes de référence peuvent être très utiles, ce sont des aides-mémoire recensant les
fonctions les plus courantes :
10.3. Où poser des questions 117
[Link]
On notera également un document d’introduction en anglais progressif et s’appuyant sur des méthodes
statistiques relativement simples :
[Link]
Pour les utilisateurs déjà habitués à SAS ou SPSS, le livre R for SAS and SPSS Users et le document
gratuit qui en est tiré peuvent être de bonnes ressources, tout comme le site Web Quick-R :
[Link]
[Link]
10.2.3 Revue
La revue Journal of Statistical Software est une revue électronique anglophone, dont les articles sont
en accès libre, et qui traite de l’utilisation de logiciels d’analyse de données dans un grand nombre de
domaines. De nombreux articles (la majorité) sont consacrés à R et à la présentation d’extensions plus
ou moins spécialisées.
Les articles qui y sont publiés prennent souvent la forme de tutoriels plus ou moins accessibles mais
qui fournissent souvent une bonne introduction et une ressource riche en informations et en liens.
Adresse de la revue :
[Link]
Dans tous les cas, les règles de base à respecter avant de poser une question sont toujours les mêmes :
avoir cherché soi-même la réponse auparavant, notamment dans les FAQ et dans l’aide en ligne, et poser
sa question de la manière la plus claire possible, de préférence avec un exemple de code posant problème.
Pour une consultation ou un envoi ponctuels, le mieux est sans doute d’utiliser les interfaces Web
fournies par gmane :
[Link]
R-help est une liste avec de nombreux messages, suivie par des spécialistes de R, dont certains des
développeurs principaux. Elle est cependant à réserver aux questions particulièrement techniques qui
n’ont pas trouvé de réponses par d’autres biais.
Dans tous les cas, il est nécessaire avant de poster sur cette liste de bien avoir pris connaissance du
posting guide correspondant :
[Link]
Plusieurs autres listes plus spécialisées existent également, elles sont listées à l’adresse suivante :
[Link]
Annexe A
Installer R
120
A.3. Mise à jour de R sous Windows 121
La méthode conseillée pour mettre à jour R sur les plateformes Windows est la suivante 2 :
1. Désinstaller R. Pour cela on pourra utiliser l’entrée Uninstall R présente dans le groupe R du menu
Démarrer.
2. Installer la nouvelle version comme décrit précédemment.
3. Se rendre dans le répertoire d’installation de R, en général C:\Program Files\R. Sélectionner le
répertoire de l’ancienne installation de R et copier le contenu du dossier nommé library dans
le dossier du même nom de la nouvelle installation. En clair, si vous mettez à jour de R 2.6.2
vers R 2.7.1, copiez tout le contenu du répertoire C:\Program Files\R\R-2.6.2\library dans
C:\Program Files\R\R-2.7.1\library.
4. Lancez la nouvelle version de R et exécuter la commande [Link] pour mettre à jour les
extensions.
A.4.1 Tinn-R
Tinn-R est une alternative à l’interface graphique installée par défaut avec R sous Windows, et ne
fonctionne que sur ce système. Il s’agit d’un éditeur de texte, mais qui propose la coloration syntaxique
des scripts R, la soumission de commandes directement depuis l’éditeur, et une aide en ligne efficace. Son
interface n’est cependant disponible qu’en anglais.
Il s’agit d’un logiciel libre et gratuit. Son installation est vivement recommandée en cas d’utilisation
régulière de R sous Windows.
Le site officiel se trouve à l’adresse :
[Link]
Le téléchargement peut s’effectuer directement depuis Sourceforge :
[Link]
2. Méthode conseillée dans l’entrée correspondante de la FAQ de R pour Windows : [Link]
windows/[Link]#What_0027s-the-best-way-to-upgrade_003f
122 Installer R
Il est nécessaire d’avoir installé R sur votre système avant d’installer Tinn-R. De même, si vous aviez déjà
une version de Tinn-R plus ancienne sur votre système, il est conseillé de la désinstaller avant d’installer la
nouvelle. Dans ce cas, si vous souhaitez conserver votre configuration, vous pouvez utiliser les outils Backup
et Restore de menu Tools.
Une fois Tinn-R installé, vous pouvez le lancer via le menu Démarrer. Plusieurs étapes de configuration
restent à effectuer avant de pouvoir réellement commencer à travailler.
Tout d’abord, sélectionnez le menu R, puis Customize, puis Rconfigure.r. Un nouveau fichier apparaît.
Ajoutez alors les ligness suivantes à un endroit quelconque, comme indiqué figure A.1 de la présente page :
options([Link]=150)
options(repos="[Link]
Enregistrez le fichier (File puis Save ou bien Ctrl+S) et fermez sa fenêtre (File puis Close ou Ctrl+W).
Sélectionnez ensuite le menu R, puis Configure, puis Permanent. Un nouveau fichier devrait s’ouvrir,
et une boîte de dialogue s’afficher en vous proposant de lancer R. Choisissez Non.
Sélectionnez ensuite le menu R, Start/close and connections, puis Rterm. Vous devriez voir une nou-
velle fenêtre apparaître dans laquelle devrait se lancer R. Vous pouvez désormais utiliser la fenêtre R
comme la console dans l’interface par défaut, saisir directement des commandes et naviguer dans l’his-
torique à l’aide des touches Alt+Flèche haut et Alt+Flèche bas.
A.4. Interfaces graphiques 123
Vous pouvez également créer un nouveau script en choisissant File puis New. Si vous saisissez des
commandes R dans ce fichier, vous pouvez les exécuter directement en choisissant le menu R, puis Send
puis soit Line, Selection, File. . . ou en utilisant les icônes de la barre d’outil équivalentes.
À noter que par défaut la console R de Tinn-R comporte deux onglets, l’un nommé IO et l’autre Log.
C’est dans ce deuxième onglet que s’affichent les messages d’erreur et d’avertissement (par défaut un
bip est émis lorsqu’une erreur survient). Ce comportement par défaut n’étant pas pratique du tout, vous
pouvez le modifier en choisissant le menu R, puis Rterm, puis Split et enfin Horizontal split. Au final,
vous devriez obtenir une interface ressemblant quelque peu à la figure A.2 de la présente page.
De nombreuses options de configuration existent. Les principales se trouvent dans le menu Options,
Application sous l’onglet R. Mais les options les plus importantes sont sans doute celles permettant de
modifier les raccourcis claviers pour envoyer du code à R depuis un script.
Par exemple, si vous souhaitez pouvoir exécuter une ligne en utilisant Ctrl+Entrée :
1. Sélectionnez le menu R puis Hotkeys.
2. Une boîte de dialogue s’ouvre. Dans le champ Sending and controlling, sélectionnez la ligne Send :
line.
3. Dans le champ Set (hotkey method), cochez la case Ctrl et choisissez ENTRÉE dans la liste déroulante,
puis cliquez sur Add.
4. Vérifiez qu’en bas de la boîte de dialogue le champ Option est bien positionné sur Active. au final
vous devriez avoir quelque chose ressemblant à la figure A.3 page suivante.
5. Cliquez sur OK.
Vous devriez maintenant pouvoir exécuter une ligne directement depuis votre script en utilisant
Ctrl+Entrée. Vous pouvez faire de même pour Send : selection ou Send : file. . .
De nombreuses autres fonctionnalités sont disponibles dans Tinn-R, comme l’aide en ligne, l’affichage
et la manipulation des objets en mémoire, etc. Pour plus d’informations on pourra se reporter à l’aide du
logiciel, disponible via le menu Help, et notamment l’entrée French, Lisezmoi, HTML.
124 Installer R
Extensions
B.1 Présentation
L’installation par défaut du logiciel R contient le cœur du programme ainsi qu’un ensemble de fonctions
de base fournissant un grand nombre d’outils de traitement de données et d’analyse statistiques.
R étant un logiciel libre, il bénéficie d’une forte communauté d’utilisateurs qui peuvent librement
contribuer au développement du logiciel en lui ajoutant des fonctionnalités supplémentaires. Ces contri-
butions prennent la forme d’extensions (packages) pouvant être installées par l’utilisateur et fournissant
alors diverses fonctions supplémentaires.
Il existe un très grand nombre d’extensions (environ 1500 à ce jour), qui sont diffusées par un réseau
baptisé CRAN (Comprehensive R Archive Network).
La liste de toutes les extensions disponibles sur le CRAN est disponible ici :
[Link]
Pour faciliter un peu le repérage des extensions, il existe un ensemble de regroupements thématiques
(économétrie, finance, génétique, données spatiales. . . ) baptisés Task views :
[Link]
On y trouve notamment une Task view dédiée aux sciences sociales, listant de nombreuses extensions
potentiellement utiles pour les analyses statistiques dans ce champ disciplinaire :
[Link]
On notera cependant que l’installation et la mise à jour des extensions nécessite d’être connecté à
l’Internet.
L’installation d’une extension se fait par la fonction [Link], à qui on fournit le nom de
l’extension. Ici on souhaite installer l’extension ade4 :
125
126 Extensions
[Link]("ade4", dep=TRUE)
L’option dep=TRUE indique à R de télécharger et d’installer également toutes les extensions dont
l’extension choisie dépend pour son fonctionnement.
En général R va alors vous demander de choisir un miroir depuis lequel récupérer les données néces-
saires. Choisissez de préférence un miroir le plus proche possible de l’endroit où vous vous trouvez 1 .
Une fois l’extension installée, elle peut être appelée depuis la console ou un fichier script avec la
commande :
library(ade4)
À partir de là, on peut utiliser les fonctions de l’extension, consulter leur page d’aide en ligne, accéder
aux jeux de données qu’elle contient, etc.
Pour mettre à jour l’ensemble des extensions installées, une seule commande suffit :
[Link]()
Si on souhaite désinstaller une extension précédemment installée, on peut utiliser la fonction
[Link] :
[Link]("ade4")
B.3.1 Installation
L’installation nécessite d’avoir une connexion active à Internet. Depuis la version 0.2-6, l’extension est
hébergée sur le CRAN (Comprehensive R Archive Network), le réseau officiel de diffusion des extensions
de R. Elle est donc installable de manière très simple, comme n’importe quelle autre extension, par un
simple :
[Link]("rgrs",dep=TRUE)
L’extension s’utilise alors de manière classique grâce à l’instruction library en début de session ou
de fichier R :
library(rgrs)
1. Ayant déjà rencontré des soucis avec le miroir lyonnais, j’ai tendance à utiliser celui de Toulouse.
2. À noter que les fonctions en question ne sont en général que des interfaces facilitant l’utilisation de fonctions déjà
existantes.
B.3. L’extension rgrs 127
À noter que l’extension n’est disponible que pour les versions les plus récentes de R. Ainsi, depuis la
sortie de la version 2.8, elle n’est plus installable de la manière décrite précédemment pour les versions
2.7 de R. Il est alors conseillé de mettre son installation de R à jour.
Variable Description
id Identifiant (numéro de ligne)
poids Variable de pondération 3
age Âge
sexe Sexe
nivetud Niveau d’études atteint
occup Occupation actuelle
qualif Qualification de l’emploi actuel
[Link] Nombre total de frères, sœurs, demi-frères et demi-sœurs
clso Sentiment d’appartenance à une classe sociale
relig Pratique et croyance religieuse
[Link] Importance accordée au travail
[Link] Satisfaction ou insatisfaction au travail
[Link] Ecoute du Hard rock ou assimilés
[Link] Lecture de bandes dessinées
[Link] Pêche ou chasse pour le plaisir au cours des 12 derniers mois
cuisine Cuisine pour le plaisir au cours des 12 derniers mois
bricol Bricolage ou mécanique pour le plaisir au cours des 12 derniers mois
cinema Cinéma au cours des 12 derniers mois
sport Sport ou activité physique pour le plaisir au cours des 12 derniers mois
[Link] Nombre moyen d’heures passées àregarder la télévision par jour
128 Extensions
Variable Description
nom nom de la commune
code Code de la commune
[Link] Population active
[Link] Population totale
pop15 Population des 15 ans et plus
[Link] Nombre de résidences principales
agric Part des agriculteurs dans la population active
artis Part des artisans, commerçants et chefs d’entreprises
cadres Part des cadres
interm Part des professions intermédiaires
empl Part des employés
ouvr Part des ouvriers
retr Part des retraités
[Link] Part des chômeurs
etud Part des étudiants
[Link] Part des diplômés du supérieur
[Link] Part des personnes sans diplôme
proprio Part des propriétaires parmi les résidences principales
hlm Part des logements HLM parmi les résidences principales
locataire Part des locataires parmi les résidences principales
maison Part des maisons parmi les résidences principales
3. Comme il s’agit d’un extrait du fichier, cette variable de pondération n’a en toute rigueur aucune valeur statistique.
Elle a été tout de même incluse à des fins « pédagogiques ».
Annexe C
129
130 Solutions des exercices
Attention à ne pas utiliser la fonction fix dans ce cas, celle-ci modifierait directement le contenu de df.
Puis utilisez la fonction head :
R> head([Link], 4)
TRUE
2000
Homme Femme
Autre 162 763
Femme faisant du bricolage 0 338
Homme de plus de 30 ans 728 0
Homme de plus de 40 ans lecteur de BD 9 0
R> table(d$var, d$bricol)
Non Oui
Autre 847 78
Femme faisant du bricolage 0 338
Homme de plus de 30 ans 298 430
Homme de plus de 40 ans lecteur de BD 2 7
R> table(d$var, d$[Link])
Non Oui
Autre 905 20
Femme faisant du bricolage 324 14
Homme de plus de 30 ans 724 4
Homme de plus de 40 ans lecteur de BD 0 9
R> table(d$var, d$age > 30)
FALSE TRUE
Autre 283 642
Femme faisant du bricolage 68 270
Homme de plus de 30 ans 0 728
Homme de plus de 40 ans lecteur de BD 0 9
R> table(d$var, d$age > 40)
FALSE TRUE
Autre 417 508
Femme faisant du bricolage 152 186
Homme de plus de 30 ans 163 565
Homme de plus de 40 ans lecteur de BD 0 9
136
Table des figures 137
!, 47 [Link], 108
!=, 47 [Link], 108
*, 13 dim, 17
+, 13 dotchart, 28
-, 13 dput, 41
/, 13 [Link], 84
:, 13
<, 47 edit, 18, 19
<-, 5, 9 example, 114
<=, 47
==, 47 factor, 42, 55
>, 47 [Link], 69
>=, 47 fix, 18
$, 19, 40 freq, 27, 28, 60, 87, 113
%in%, 49, 58
[Link], 110, 111
&, 47
getwd, 34
ˆ, 13
glm, 84
abline, 74
head, 19, 47
[Link], 55, 57
[Link], 115
[Link], 55
[Link], 115
bmp, 108 [Link](), 115, 116
boxplot, 24, 74 hist, 20, 22
ifelse, 60
c, 10, 12, 13
image, 69
[Link], 97, 98
[Link], 125, 126
[Link], 101
[Link], 51, 58
[Link], 92–99
[Link], 98–100 jpeg, 108
cbind, 63
[Link], 81, 84, 85 kde2d, 69
class, 41
colors, 22 length, 12, 13
[Link], 69 levels, 42
contour, 69 library, 126
copie, 81, 106, 107 lm, 74, 84
cor, 69 load, 92
cprop, 80, 85, 87, 113 lprop, 80, 85, 87, 113
cramer.v, 82
cut, 55, 57 max, 13
mean, 5, 12, 13, 54, 84
data, 16 median, 20
138
Index des fonctions 139
[Link], 37
save, 39
sd, 13
selectwd, 34
setwd, 34, 65
[Link], 78
sort, 27, 28, 61
source, 65, 66, 113
spplot, 96
str, 17, 20, 41
subset, 52, 53
summary, 5, 20, 27, 49, 60
svg, 108
svyboxplot, 86
svydesign, 85
svyglm, 86
svyhist, 86
svymean, 86