Une brève introduction à R

Le logiciel R est un langage très puissant orienté vers l’analyse statistique et traitement des données. Il est développé depuis une vingtaine d’années par un groupe de volontaires de différents pays. C’est un logiciel libre, disponible gratuitement pour Windows, Mac OS X et Linux. Il est à noter que le développement autour de R a été particulièrement actif ces dernières années. R est très utilisé dans le monde academique et dans l’industrie.

R regorge des developpeurs de talent, des packages assez interessants ont vu le jour recemment. Toute personne interessée en R peut trouver la documentation en ligne.

http://www.ehess.fr/fr/enseignement/enseignements/2014/ue/562/

alt text

alt text

L’objectif ce cpremier TP est de présenter comment réaliser des analyses statistiques et diverses opérations courantes (comme la manipulation de données ou la production de graphiques) avec R.Il est important de remarquer que cet atelier n’est pas un cours de statistiques. Nous supposons que vous avez déjà une connaissance des certains méthodes présentées ici. Si vous souhaitez des précisions théoriques/méthodologiques à propos d’un certain type d’analyses, nous vous conseillons de voir la doc !

Installation du logiciel R

Avant de commencer ce TP, il est nécessaire de s’assurer que le logiciel R est installé sur votre machine. Le logiciel R est gratuit et téléchargeable sur internet à l’adresse http://cran.r-project.org.

  • Pour une installation sous Windows, on se rendra sur cette page : http://cran.r-project.org/bin/windows/ base/ et l’on suivra le premier lien pour télécharger le programme d’installation. Une fois le programme d’installation lancé, il suffira d’installer R avec les options par défaut.

  • Pour Mac OS X, les fichiers d’installation sont disponibles à http://cran.r-project.org/bin/macosx/.

Une fois R correctement installé,vous pouvez également télécharger le logiciel RStudio (une interface de développement pour R) à l’adresse suivante : rendez-vous sur http://www.rstudio.com/products/rstudio/download/

  • Création d’un script R : Le logiciel R utilise des lignes de commandes. Il faut donc taper les commandes dans la console pour les exécuter. Plutôt que de saisir les commandes directement dans la console, on vous conseille de les enregistrer directement dans un script de commandes R, ce qui permet de reproduire les analyses ultérieurement. A chaque séance de TP créer un fichier scrip R pour enregistrer les commandes et codes.

  • Aide en ligne : R possède un système d’aide en ligne, incluant un moteur de recherche et un index des commandes associées. Pour accéder à l’aide pour n’importe quelle fonction, on utilise la commande . Le logiciel R ouvre une fenêtre avec les informations relatives à la fonction demandée.

  • Packages (commande library) : R dispose d’un certain nombre de packages de base qui sont installés lors de l’installation de R. Il est possible d’installer des packages additionnels. Le chargement d’un package s’effectue à l’aide de la commande , en indiquant le nom du package.

  • Doc sur initiation à R : A vous de regarder la doc ! Par exemple vous pouvez aller sur la site

http://www.math.univ-toulouse.fr/~besse/Wikistat/pdf/st-tutor2-R-init.pdf

Exercice 1 (Découvrir R)

Visualiser sur la console de R les commandes suivaNtes. Vous remarquerez que R est anglo-saxon. Les nombres sont donc saisies à l’anglaise, c’est-à-dire en utilisant le point ( . ) comme séparateur pour les décimales.

#Assignation 
a <- 2 #(ou a=2)
a
## [1] 2
#Operations algebraiques
2*4 + 2^2 + sqrt(4) + exp(0) +log(1)
## [1] 15
#Création d'un vecteur 
#La fonction c() combine des valeurs dans un  vecteur
x1=c(10,16,12,11,14);x1
## [1] 10 16 12 11 14
#Quelques calcules simples : moyenne et ecart-type de x1
mean(x1); sd(x1)
## [1] 12.6
## [1] 2.408319
#un autre vecteur
x2=c(6,8,10,11,12.5)
#Combitation de deux vecteurs
x3=c(x1,x2);x3
##  [1] 10.0 16.0 12.0 11.0 14.0  6.0  8.0 10.0 11.0 12.5
#Creation d'autres vecteurs :
#Suite de 3 nombres consécutifs (1 à 3)
1:3
## [1] 1 2 3
#A vous de jouer !  
#Regarder l'aide. Taper sur la console help(rep) puis help(seq)
rep(1,times=5)
## [1] 1 1 1 1 1
rep(1:3,times=5)
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
seq(from=1,to=5,by=0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(from=1,to=5,length=10)
##  [1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667
##  [8] 4.111111 4.555556 5.000000
#Generation d'un vecetur de taille 100 selon une loi normale
#de moyenne 0 et écar-type 1 par defaut.
x=rnorm(100,mean=0,sd=1)
#A vous de jouer ! Taper help(rnorm) sur la console de R.
#Afficher x sur la console.
#Calculer la moyenne, la variance et l'ecart-type de x.

Exercice 2

Cet exercice porte sur les données observées sur un échantillon de 474 employés tirés au sort dans une entreprise canadienne. Les variables étudiées ici sont les suivantes :

Libraries nécessaire

Dans cet attelier on utilisera beaucoup le package dplyr. Ce package est plutôt indiqué dans la manipulation des données, surtout de grande taille. Ce package dispose des fonctions assez interessantes pour la manipulation des données comme filter, select, mutate, et des fonctions pour la fusion des bases des données. On utilisera ces fonctions au fur et à messure de cettes series de TP.

Le package questionr dispose des fonctions utiles pour pour la manipulation des tableaux en sciences sociales et plus particulièrement le traitement d’enquêtes.

library(dplyr) #dplyr ne s'utilise qu'avec des dataframes
library(questionr) # pour des tableaux
library(ggfortify) # pour des plots
library(ggplot2) # très utilisé dans les représentations grahiques sophistiquées

Les données

Lecture des données

Salaire= read.table('salaires.txt',header=TRUE)
attach(Salaire)

On peut lister les noms des variables d’un tableau de données à l’aide de la fonction names :

names(Salaire)
## [1] "salary"   "salbegin" "jobtime"  "prevexp"  "educ"     "minority"
## [7] "sex"

Il faut maintenant bien déterminer la nature des variables. Certains fonctions de R sont ici très utiles.

Visualisation des données

Tout d’abord, jetons un apercu des données grace à la fonction glimpse de la librarie dplyr. Vous pouvez utiliser également la fonction str. Avec cettes fonctions on voit rapidement si les variables sont quantitatives ou qualitatives. A vous de choisir votre fonction préferée.

glimpse(Salaire)
## Observations: 474
## Variables: 7
## $ salary   <int> 57000, 40200, 21450, 21900, 45000, 32100, 36000, 2190...
## $ salbegin <int> 27000, 18750, 12000, 13200, 21000, 13500, 18750, 9750...
## $ jobtime  <int> 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 9...
## $ prevexp  <int> 144, 36, 381, 190, 138, 67, 114, 0, 115, 244, 143, 26...
## $ educ     <int> 15, 16, 12, 8, 15, 15, 15, 12, 15, 12, 16, 8, 15, 15,...
## $ minority <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,...
## $ sex      <int> 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0,...
str(Salaire)
## 'data.frame':    474 obs. of  7 variables:
##  $ salary  : int  57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
##  $ salbegin: int  27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
##  $ jobtime : int  98 98 98 98 98 98 98 98 98 98 ...
##  $ prevexp : int  144 36 381 190 138 67 114 0 115 244 ...
##  $ educ    : int  15 16 12 8 15 15 15 12 15 12 ...
##  $ minority: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ sex     : int  0 0 1 1 0 0 0 1 1 1 ...

Que peut-on remarquer sur les variables ?

head(Salaire)
##   salary salbegin jobtime prevexp educ minority sex
## 1  57000    27000      98     144   15        0   0
## 2  40200    18750      98      36   16        0   0
## 3  21450    12000      98     381   12        0   1
## 4  21900    13200      98     190    8        0   1
## 5  45000    21000      98     138   15        0   0
## 6  32100    13500      98      67   15        0   0

Résumés numériques

summary(Salaire)
##      salary          salbegin        jobtime         prevexp      
##  Min.   : 15750   Min.   : 9000   Min.   :63.00   Min.   :  0.00  
##  1st Qu.: 24000   1st Qu.:12488   1st Qu.:72.00   1st Qu.: 19.25  
##  Median : 28875   Median :15000   Median :81.00   Median : 55.00  
##  Mean   : 34420   Mean   :17016   Mean   :81.11   Mean   : 95.86  
##  3rd Qu.: 36938   3rd Qu.:17490   3rd Qu.:90.00   3rd Qu.:138.75  
##  Max.   :135000   Max.   :79980   Max.   :98.00   Max.   :476.00  
##       educ          minority           sex        
##  Min.   : 8.00   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:12.00   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :12.00   Median :0.0000   Median :0.0000  
##  Mean   :13.49   Mean   :0.2194   Mean   :0.4557  
##  3rd Qu.:15.00   3rd Qu.:0.0000   3rd Qu.:1.0000  
##  Max.   :21.00   Max.   :1.0000   Max.   :1.0000

Codage

Le recodage de variables est une opération extrêmement fréquente lors du traitement d’enquête.

Salaire$minority = factor(minority,labels=c("Non","Oui")) 
Salaire$sex = factor(sex,labels=c("H","F"))
attach(Salaire)

Re-regardons les résumés numériques. Que peut-on remarquer ?

summary(Salaire)
##      salary          salbegin        jobtime         prevexp      
##  Min.   : 15750   Min.   : 9000   Min.   :63.00   Min.   :  0.00  
##  1st Qu.: 24000   1st Qu.:12488   1st Qu.:72.00   1st Qu.: 19.25  
##  Median : 28875   Median :15000   Median :81.00   Median : 55.00  
##  Mean   : 34420   Mean   :17016   Mean   :81.11   Mean   : 95.86  
##  3rd Qu.: 36938   3rd Qu.:17490   3rd Qu.:90.00   3rd Qu.:138.75  
##  Max.   :135000   Max.   :79980   Max.   :98.00   Max.   :476.00  
##       educ       minority  sex    
##  Min.   : 8.00   Non:370   H:258  
##  1st Qu.:12.00   Oui:104   F:216  
##  Median :12.00                    
##  Mean   :13.49                    
##  3rd Qu.:15.00                    
##  Max.   :21.00

Tableau tri à plat et tableaux de contingence

Tableau d’une varible qualitative (tri à 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, ce qu’on appelle un tri à plat.

table(sex)
## sex
##   H   F 
## 258 216

Pour obtenir un tableau avec la répartition en pourcentages, on peut utiliser la fonction freq de l’extension questionr3

freq(sex, cum = TRUE, total = TRUE, sort = "inc",digits = 2, exclude = NA)
##         n      %   %cum
## F     216  45.57  45.57
## H     258  54.43 100.00
## Total 474 100.00 100.00

Tableau de deux variables (tableu croisé)

Le tableau croisé des deux variables s’obtient de la manière suivante

tableau=table(minority,sex); tableau
##         sex
## minority   H   F
##      Non 194 176
##      Oui  64  40

Il est tout à fait possible de croiser trois variables ou plus. A vous de jouer !

La librarie questionr fournit des fonctions permettant de calculer facilement les profils lignes (pourcentage en lignes), colonnes et totaux d’un tableau croisé (en pourcentage). Les profils lignes s’obtiennent avec la fonction lprop . Celle-ci s’applique au tableau croisé généré par la fonction table.

#Tableu de pourcentages lignes
lprop(tableau)
##           sex
## minority   H     F     Total
##   Non       52.4  47.6 100.0
##   Oui       61.5  38.5 100.0
##   Ensemble  54.4  45.6 100.0
lprop(tableau,digits = 2, percent = TRUE)
##           sex
## minority   H       F       Total  
##   Non       52.43%  47.57% 100.00%
##   Oui       61.54%  38.46% 100.00%
##   Ensemble  54.43%  45.57% 100.00%

Les profils colonnes (pourcentage en colonnes) s’obtiennent avec cprop.

#Tableu de pourcentages colonnes
cprop(tableau)
##         sex
## minority H     F     Ensemble
##    Non    75.2  81.5  78.1   
##    Oui    24.8  18.5  21.9   
##    Total 100.0 100.0 100.0

Il est important de remarquer qu’on peut personnaliser l’affichage de ces tableaux de profil lignes et profil colonnes à 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. A vous de jouer !

Représentation graphique d’un tableau de contingence

On peut obtenir une représentation graphique synthétisant l’ensemble des résultats obtenus sous la forme d’un graphique en mosaïque grâce à la fonction mosaicplot. Ici chaque rectangle représente une case de tableau. Sa largeur correspond aux pourcentages en colonnes. Sa hauteur correspond aux pourcentages en lignes.

mosaicplot(t(tableau), data = Salaire, main = "Graphe en mosaïque")

Remarque : Les graphiques en mosaïque permettent notamment de représenter des tableaux croisés à 3 ou 4 dimensions, voire plus. La librarie vcd fournie une fonction mosaic fournissant plus d’options pour la création d’un graphique en mosaïque, permettant par exemple d’indiquer quelles variables doivent être affichées horizontalement ou verticalement, ou encore de colorier le contenu des rectangles en fonction d’une variable donnée. A vous de jouer !

Graphiques univariés et bivariés

Graphiques simples avec R

#Diagramme en Tuyaux d'orgue
barplot(table(sex))

barplot(table(minority))

#Boites à moustaches
boxplot(salary,col = grey(0.8), main="Boîte à moustache de la variable salary")

#Boites à moustaches paralleles (2 variables)
boxplot(salary ~ sex,col = grey(0.8),main="Boîte à moustache de la variable salary en fonction du sexe")

#Histogramme
hist(salary,col = grey(0.8),probability = T,main="Histogramme de la variable salary")

#Histogramme et densité estimée dans une même fênetre 
hist(salary,col = grey(0.8),probability = T,main="Histogramme et densité estimée de la variable salary ")
ptx = seq(min(salary),max(salary), length=100)
lines(ptx, dnorm(ptx, mean=mean(salary), sd=sd(salary)),lty=1,lwd=2,col="red")

#Nuage de points et pleusiuers droités dans une même fênetre
plot(salbegin,salary,main="Nuage de points") 
abline(2000,1.5,col="red",lwd=2)
abline(2000,1.9,col="blue",lwd=2)
abline(2000,2.5,col="green",lwd=2)

Graphiques plus complexes avec R (l’affichage est plus jolie)

qplot(data = Salaire, sex)

qplot(data = Salaire, minority)

ggplot(data = Salaire, aes(x=salary,y= ..density..))+geom_histogram(colour="white")

ggplot(data = Salaire, aes(x=salbegin,y= ..density..))+geom_histogram(colour="white")

ggplot(data = Salaire, aes(x=salary,y= ..density..))+geom_histogram(colour="white")+
geom_line(stat="density",col="red",size=1.2)

ggplot(data = Salaire, aes(x=salbegin,y= ..density..))+geom_histogram(colour="white")+
geom_line(stat="density",col="red",size=1.2)

ggplot(data = Salaire, aes(x=salbegin,y=salary)) +
  geom_point() 

ggplot(data = Salaire, aes(x=salbegin,y=salary)) + geom_point() +
geom_abline(intercept = 2000, slope = 1.5, col="red", lwd=1)+
geom_abline(intercept = 2500, slope = 1.9, col="blue", lwd=1)+
geom_abline(intercept = 5000, slope = 2.5, col="green", lwd=1)+
  geom_abline(intercept = 10000, slope = 1.5, col="cyan", lwd=1)

A vous de jouer avec les graphiques !

Coefficient de correlation entre deux variables

cor(salary,salbegin)
## [1] 0.8801175

Matrice de correlation

cor(Salaire[,1:5])
##               salary    salbegin      jobtime      prevexp        educ
## salary    1.00000000  0.88011747  0.084092267 -0.097466926  0.66055891
## salbegin  0.88011747  1.00000000 -0.019753475  0.045135627  0.63319565
## jobtime   0.08409227 -0.01975347  1.000000000  0.002978134  0.04737878
## prevexp  -0.09746693  0.04513563  0.002978134  1.000000000 -0.25235252
## educ      0.66055891  0.63319565  0.047378777 -0.252352521  1.00000000
pairs(Salaire[,1:5])