Computing">
Intro R2
Intro R2
Intro R2
Février 2023
2 Utilisation de RStudio 2
3 Packages 2
4 Bases du langage R 3
6 Traitements univariés 5
6.1 Variables quantitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
6.2 Variables qualitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.3 Question à réponses multiples (Multiples Response Variable) . . . . . . . . . . . . . . . . . . . . . . 7
7 Traitements bivariés 8
7.1 Variables quantitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
7.2 Variables qualitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
7.3 Variable quantitative / Variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
8 Intervalles de confiance 13
9 Tests 14
9.1 Tests sur un échantillon unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
9.2 Tests sur deux échantillons indépendants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
9.3 Tests sur deux échantillons appariés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
9.4 Tests de normalité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
10 Analyse de la variance 19
11 Régression linéaire 19
13 Couleurs ! 23
14 Probabilités et échantillons 24
15 Calcul matriciel 25
1 Introduction
R est un logiciel libre de statistiques mais aussi un langage de programmation plus particulièrement adapté
au traitement statistique des données. Il est possible de le télécharger gratuitement sur https://cran.
r-project.org. Le logiciel RStudio, en complément de R, offre une environnement de travail grandement
amélioré par rapport à la console par défaut de R. Son téléchargement, gratuit, est vivement recommandé.
Il est disponible sur le site https://posit.co.
1
Le langage de programmation R est assez sophistiqué et son temps d’apprentissage peut être relativement
long. Il existe d’excellents livres et tutoriels en ligne sur ce sujet. Le but de ce document n’est pas d’en créer
un nouveau, mais de vous apprendre rapidement à utiliser R pour effectuer des traitements statistiques
basiques (niveau L).
En complément de cette introduction, un document RStudio est disponible à l’adresse https://www.unilim.
fr/pages_perso/vincent.jalby/resources/commun/introR.zip.
2 Utilisation de RStudio
L’utilisation de R se fait en ligne de commande au travers d’une console : chaque instruction tapée et
validée produit un résultat (écran ci-dessous à gauche). Mais cette interface n’offre que peu de possibilités
de sauvegarde et de gestion des fichiers et graphiques.
Le logiciel RStudio facilite son utilisation, en particulier la gestion des projets et l’import des données. Pour
RStudio, un projet (un document) correspond à un dossier (directory). Pour créer un projet dans RStudio,
on utilise la commande File > New Project… puis New Directory > New Project ; on précise alors le
nom du projet (Directory Name) et l’endroit où on souhaite le créer (Browse…).
Afin de conserver un historique des instructions utilisées, il est préférable de créer un script via la com-
mande File > New File > R Script(qu’il faudra ensuite enregistrer dans le dossier du projet).
La fenêtre principale de RStudio ressemble alors à la fenêtre ci-dessus à droite. A bas à gauche, la console
R permet de taper des instructions et affiche les résultats de ces instructions. Attention, son contenu dispa-
raitra à la fin de la session (lorsqu’on quitte RStudio). Au dessus, la fenêtre du script (créé précédemment
et enregistré sous le nom intro.R. Les instructions tapées dans cette zone sont modifiables et seront enre-
gistrées. Pour exécuter une instruction, il faut valider la ligne au clavier en tapant <Controle> + <Retour>.
Le résultat s’affiche toujours au niveau de la console (et les graphiques dans l’onglet Plots dans la zone en
bas à droite).
Les résultats affichées ne sont pas enregistrés à la fin de la session. Pour les conserver, il faut les copier et
les coller dans un traitement de texte en utilisant la police Courier ou Consolas pour un affichage correct.
3 Packages
La version de base de R contient déjà un grand nombre de fonctions statistiques, mais la puissance du
logiciel réside dans de nombreuses extensions (appelées packages) permettant d’étendre ses fonctionnali-
tés. Ces packages, écrits pour la plupart par des experts, doivent être téléchargés puis activés avant d’être
utilisables. Certains sont installés, voire activés par défaut, par exemple les packages utils et stats.
Dans la suite, nous utiliserons à plusieurs reprises les packages readxl, DescTools et psych. Pour les installer
(les télécharger), utiliser l’instruction suivante :
install.packages(c('readxl','DescTools','psych'))
L’installation n’est à faire qu’une seule fois. Par contre, il faudra activer les packages à chaque session.
2
4 Bases du langage R
Les instructions et noms d’object (variables, etc) sont sensibles à la casse. Donc, Mean et mean ne sont pas
équivalents. Pour exécuter plusieurs instructions sur une même ligne de commande, on les sépare par des
points-virgules (;). Pour affecter une valeur à une variable, on utilise l’opérateur (->) plutôt que (=).
Un vecteur dans R est une liste d’objets identiques (numérique, caractère). L’instruction c() permet de
définir un vecteur.
Pour obtenir une liste des entiers entre deux valeurs, on utilise l’opérateur : :
3:12
## [1] 3 4 5 6 7 8 9 10 11 12
Les valeurs booléennes vrai / faux sont notées indifféremment TRUE / FALSE ou T / F.
Pour CSV et Excel, il faut que le fichier à importer soit composé uniquement des données, les variables en
colonnes (les observations en lignes). La première ligne doit contenir les noms des variables (privilégier
des noms très courts sans accent, sans espace). Le nom indiqué dans le champ Name (basé sur le nom du
fichier importé) sera le nom du dataframe contenant les données.
Il est aussi possible d’importer le fichier à l’aide du code suivant (utilisant le package readxl) :
Si la variable a été codée numériquement (par exemple la variable lieu, codée de 1 à 4), il faut la redéfinir,
en précisant les valeurs (levels) et les étiquettes (labels) associées.
3
courses$lieu <- factor(courses$lieu, level=c(1,2,3,4),
labels=c('Hyper', 'Super', 'Proximité', 'Specialisé'))
Pour les variables qualitatives ordinales, il est préférable d’utiliser la fonction ordered au lieu de factor.
Attention ! Lors des transformations ci-dessus, la variable originale est écrasée par sa redéfinition. En cas
d’erreur, il faudra réimporter les données pour récupérer la variable d’origine.
5.3 Vérification
L’instruction str() permet de vérifier rapidement si l’importation s’est correctement effectuée.
str(courses)
head(courses)
## # A tibble: 6 x 12
## num age sexe sitfam freque~1 lieu super~2 hyper~3 proxi~4 speci~5 revenu
## <dbl> <dbl> <fct> <dbl> <ord> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 11 25 H 1 Mensuel Super 1 0 1 0 1400
## 2 48 33 H 1 Mensuel Super 1 0 1 0 1230
## 3 36 33 F 2 Mensuel Hyper 0 1 0 1 1900
## 4 22 32 H 3 Mensuel Super 1 0 1 1 1860
## 5 34 29 <NA> 4 Mensuel Hyper 0 1 0 0 1640
## 6 17 33 H 3 Mensuel Super 1 0 1 1 1940
## # ... with 1 more variable: budget <dbl>, and abbreviated variable names
## # 1: frequence, 2: supermarche, 3: hypermarche, 4: proximite, 5: specialise
Une fois les données préparées, il est possible d’utiliser directement le nom des variables (sans le faire
précéder du nom du dataframe) en attachant le dataframe.
attach(courses)
4
5.4 Enregistrement des données
A la fin de la session (lorsqu’on quitte l’application), les données (apparaissant dans l’onglet Environement
> data), c’est-à-dire, tout ce qui a été enregistré avec un nom avec l’instruction ->, sont enregistrées dans
le fichier .RData. Elles seront à nouveau disponibles lorsqu’on réouvrira le projet.
Il est aussi possible d’enregistrer un dataframe séparément dans un fichier pour pouvoir l’utiliser par ailleur
(dans un autre projet par exemple). Pour cela, on utilise la commande save() :
Pour charger ces données (dans un autre projet), on utilise la commande load() :
load("courses.RData")
6 Traitements univariés
6.1 Variables quantitatives
Les fonctions mean(), sd(), var(), min(), max(), median()... permettent de calculer les principaux résumés
statistiques d’une variable quantitative.
mean(age);median(age)
## [1] 31.98
## [1] 32.5
Lorsque la variable contient des valeurs manquantes (NA), il faut rajouter l’option na.rm=TRUE.
mean(revenu);mean(revenu, na.rm=TRUE)
## [1] NA
## [1] 1934.468
La fonction summary() permet aussi d’obtenir plus rapidement quelques résumés statistiques.
summary(revenu)
Mais la fonction describe() du package psych est plus complète. L’option fast=TRUE n’affiche que les
principaux résumés.
describe(revenu, fast=TRUE)
Pour l’appliquer à plusieurs variables simultanément, il faut les regrouper dans un dataframe ou utiliser la
notation tableau.
5
Les fonctions hist() et boxplot() permettent obtenir un histogramme et une boite à moustaches respec-
tivement.
hist(budget);boxplot(budget)
Histogram of budget
10 15
Frequency
400
5
200
0
budget
Diverses options permettent d’améliorer l’apparence des graphiques.
10
0
Budget Budget
table(lieu)
## lieu
## Hyper Super Proximité Specialisé
## 20 21 5 2
prop.table(table(lieu))
## lieu
## Hyper Super Proximité Specialisé
## 0.41666667 0.43750000 0.10416667 0.04166667
Freq(lieu)
6
## level freq perc cumfreq cumperc
## 1 Hyper 20 41.7% 20 41.7%
## 2 Super 21 43.8% 41 85.4%
## 3 Proximité 5 10.4% 46 95.8%
## 4 Specialisé 2 4.2% 48 100.0%
La variable lieu étant nominale, il est préférable de trier le tableau par effectifs décroissants.
Freq(lieu, ord='desc')
Les fonctions pie() et barplot(), couplées à la fonction table(), permettent d’obtenir un diagramme en
secteurs ou en bâtons.
pie( table(lieu) )
barplot( table(lieu) )
Hyper 20
15
10
Specialisé
Proximité
5
Super
0
barplot(
sort( prop.table( table(lieu) )*100, decreasing=TRUE),
ylab='Pourcentages', ylim=c(0,50), col=c('blue','red','green','orange')
)
Pourcentages
40
20
0
7
source('MultipleResponse.R')
multipleResponse(courses, c('supermarche','hypermarche','proximite','specialise'),
order='decreasing',plot='percentage',ylim=c(0,70), main="Lieux d'achats",ylab="% d'observations",
names=c('Supermarché', 'Hypermarché', 'Proximité','Spécialisé'), col='orange3')
Lieux d'achats
% d'observations
20 40 60
0
##
## Multiple Response Variable (Number of cases: 46)
## Option Frequency Perc. of responses Perc. of cases
## 2 Hypermarché 30 33.33333 65.21739
## 1 Supermarché 22 24.44444 47.82609
## 4 Spécialisé 22 24.44444 47.82609
## 3 Proximité 16 17.77778 34.78261
## 5 Total 90 100.00000 195.65217
7 Traitements bivariés
7.1 Variables quantitatives
La covariance et la corrélation entre deux variables s’obtiennent avec les fonctions cov() et cor(). En cas de
valeurs manquantes, il est nécessaire de préciser l’option use='complete.obs' ou use='pairwise.complete.obs'.
cov(revenu,budget,use="complete.obs")
## [1] 43654.95
cor(revenu,budget,use="complete.obs")
## [1] 0.8621749
On obtient de même la matrice des corrélations entre deux (ou plus) variables.
cor(data.frame(age,revenu,budget),use="pairwise.complete.obs")
La représentation graphique du nuage de points se fait à l’aide de la fonction plot(). La fonction text()
permet de rajouter au graphique précédent des étiquettes à chaque point. La fonction abline() permet de
rajouter des lignes de référence horizontales ou verticales
plot(revenu,budget, xlab='Revenu',ylab='Budget')
text(revenu,budget,num,pos=4)
abline(v=mean(revenu, na.rm=TRUE) )
abline(h=mean(budget, na.rm=TRUE) )
8
37
6
1
400
46
Budget
354526 12
13 44 16 81429
325
17
42 27
39341943
50
22 15728 30 31
10
200
2441 47 18
36
20
33 9
5484911
23 40
38 2
Revenu
Le symbole utilisé pour représenter les points est modifiable avec les options pch=0 à pch=25. Il est même
possible d’utiliser un symbole différent selon les valeurs d’une variable qualitative (factor). La fonction
legend() permet alors de préciser la légende.
F
H
2500
Revenu
1500
20 25 30 35 40 45
Age
Suivant le même principe, on peut aussi utiliser des couleurs différentes.
F
H
2500
Revenu
1500
20 25 30 35 40 45
Age
9
table(lieu,frequence)
## frequence
## lieu Mensuel Bimensuel Hebdomadaire Plus souvent
## Hyper 7 6 5 2
## Super 5 6 7 3
## Proximité 0 0 2 3
## Specialisé 1 1 0 0
round( prop.table(table(lieu,frequence))*100, 2 )
## frequence
## lieu Mensuel Bimensuel Hebdomadaire Plus souvent
## Hyper 14.58 12.50 10.42 4.17
## Super 10.42 12.50 14.58 6.25
## Proximité 0.00 0.00 4.17 6.25
## Specialisé 2.08 2.08 0.00 0.00
Pour calculer les pourcentages en ligne ou colonne, il faut rajouter l’option margin=1 ou margin=2 respec-
tivement.
## frequence
## lieu Mensuel Bimensuel Hebdomadaire Plus souvent
## Hyper 35.00 30.00 25.00 10.00
## Super 23.81 28.57 33.33 14.29
## Proximité 0.00 0.00 40.00 60.00
## Specialisé 50.00 50.00 0.00 0.00
La fonction PercTable() du package DescTools offre plus d’options et permet d’obtenir facilement les
marges de la table. L’option freq=F supprime l’affichage des effectifs (pour n’afficher que les pourcentages).
L’option rfrq="010" (resp. rfrq="001") affiche les pourcentages en ligne (resp. en colonne). margins=2
(resp. margins=1) affiche la ligne (resp. colonne) somme.
##
## Mensuel Bimensuel Hebdomadaire Plus souvent
##
## Hyper 35.00% 30.00% 25.00% 10.00%
## Super 23.81% 28.57% 33.33% 14.29%
## Proximité 0.00% 0.00% 40.00% 60.00%
## Specialisé 50.00% 50.00% 0.00% 0.00%
## Sum 27.08% 27.08% 29.17% 16.67%
Les graphiques sont obtenus avec la fonction barplot() combinée avec table().
barplot(
table(frequence,lieu),
col=c('skyblue','steelblue1','steelblue3','steelblue4'),
ylim=c(0,25), cex.names=0.8
)
legend("topright",legend = levels(frequence),
col=c('skyblue','steelblue1','steelblue3','steelblue4'), pch = 16, cex=0.7)
10
25
Mensuel
Bimensuel
15
Hebdomadaire
Plus souvent
0 5
Hyper Super Proximité Specialisé
barplot(
table(frequence,lieu),
col=c('skyblue','steelblue1','steelblue3','steelblue4'),
ylim=c(0,7), cex.names=0.8, beside=TRUE
)
legend("topright",legend = levels(frequence),
col=c('skyblue','steelblue1','steelblue3','steelblue4'), pch = 16, cex=0.7)
Mensuel
6
Bimensuel
Hebdomadaire
4
Plus souvent
2
0
barplot(
prop.table( table(frequence,lieu),margin=2 )*100,
col=c('skyblue','steelblue1','steelblue3','steelblue4'),
xlim=c(0,6))
legend("topright",legend = levels(frequence),
col=c('skyblue','steelblue1','steelblue3','steelblue4'), pch = 16, cex=0.7)
Mensuel
80
Bimensuel
Hebdomadaire
Plus souvent
40
0
Phi(lieu,frequence)
## [1] 0.4939191
CramerV(lieu,frequence)
## [1] 0.2851643
chisq.test(lieu,frequence)
11
##
## Pearson's Chi-squared test
##
## data: lieu and frequence
## X-squared = 11.71, df = 9, p-value = 0.2302
Une formule du type <var_dep> ~ <var_ind> permet d’obtenir les boites à moustaches pour chaque groupe.
200
lieu
On peut aussi rajouter les moyennes par groupe au graphique précédent avec l’instruction points().
12
400
budget
lieu
On peut aussi utiliser un graphique en barre, représentant les moyennes de chaque groupe.
100
0
library(lattice)
histogram(~ budget | lieu, col='violet', xlab='Budget', ylab='Effectif',
layout=c(1,5))
Specialisé
30
0
Proximité
Effectif
30
0
Super
30
0
Hyper
30
0
100 200 300 400 500
Budget
8 Intervalles de confiance
Il est possible d’obtenir les intervalles de confiance pour une moyenne (𝜎 inconnu) en utilisant les fonctions
de test de R.
13
Encore une fois, le package DescTools offre plus de possibilités.
Pour obtenir l’intervalle de confiance d’une proportion, il est nécessaire de calculer manuellement le nombre
de succès (𝑘) et d’essais (𝑛).
table(supermarche)
## supermarche
## 0 1
## 24 22
On peut ensuite utiliser le test d’une proportion (𝑍) ou binomial (exact) selon la taille de l’échantillon.
Bien sûr, le package DescTools permet de calculer cet intervalle avec diverses méthodes.
BinomCI(24,24+22,conf.level=0.95, method="wilson")
BinomCI(24,24+22,conf.level=0.95, method="wald")
9 Tests
L’ensemble des tests classiques sont disponibles dans R de base ou dans le package DescTools. La syntaxe et
les sorties sont très similaires. L’hypothèse alternative est précisée avec les options alternative='two.sided'
(test bilatéral), alternative='less' (test unilatéral à gauche) ou alternative='greater' (test unilatéral
à droite).
14
ZTest(budget, mu=200, sd_pop=90, alternative = 'two.sided')
##
## One Sample z-test
##
## data: budget
## z = 3.7175, Std. Dev. Population = 90, p-value = 0.0002012
## alternative hypothesis: true mean is not equal to 200
## 95 percent confidence interval:
## 222.5964 272.9955
## sample estimates:
## mean of x
## 247.7959
##
## One Sample t-test
##
## data: budget
## t = 3.5698, df = 48, p-value = 0.0008237
## alternative hypothesis: true mean is not equal to 200
## 95 percent confidence interval:
## 220.8755 274.7163
## sample estimates:
## mean of x
## 247.7959
##
## One Sample Chi-Square test on variance
##
## data: budget
## X-squared = 52.053, df = 48, p-value = 0.3191
## alternative hypothesis: true variance is greater than 8100
## 95 percent confidence interval:
## 6469.648 Inf
## sample estimates:
## variance of x
## 8783.999
Le test sur une proportion a deux variantes : exact (binomial) et approché (Test Z) – le premier étant à pri-
vilégier lorsque l’échantillon est petit. Comme pour l’intervalle de confiance (voir plus haut), il faut calculer
séparément, le nombre de succès (𝑘) et d’essais (𝑛). Pour le test approché, R fait un test sur la statistiques
𝑍2 qui suit une loi 𝜒2 (1).
##
## 1-sample proportions test with continuity correction
##
## data: 22 out of 24 + 22, null probability 0.45
## X-squared = 0.056214, df = 1, p-value = 0.4063
## alternative hypothesis: true p is greater than 0.45
## 95 percent confidence interval:
## 0.3515955 1.0000000
## sample estimates:
## p
## 0.4782609
15
##
## Exact binomial test
##
## data: 22 and 24 + 22
## number of successes = 22, number of trials = 46, p-value = 0.4046
## alternative hypothesis: true probability of success is greater than 0.45
## 95 percent confidence interval:
## 0.3502462 1.0000000
## sample estimates:
## probability of success
## 0.4782609
##
## F test to compare two variances
##
## data: revenu by sexe
## F = 1.0705, num df = 23, denom df = 16, p-value = 0.9061
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.4058792 2.6115561
## sample estimates:
## ratio of variances
## 1.070466
Si la normalité des échantillons n’est pas vérifiée (voir plus loin), il est préférable d’utiliser le test de Levene
(DescTools).
Le test T de comparaison des moyennes s’obtient avec la fonction t.test() (déja utilisée pour le test sur
un échantillon). L’option var.equal permet de préciser si les variances sont égales (test T) ou différentes
(test de Welch-Satterthwaite).
##
## Two Sample t-test
##
## data: revenu by sexe
## t = 1.7405, df = 39, p-value = 0.08966
## alternative hypothesis: true difference in means between group F and group H is not equal to 0
## 95 percent confidence interval:
## -46.17424 615.68405
## sample estimates:
## mean in group F mean in group H
## 2004.167 1719.412
Le test (Z) de comparaison de deux proportions utilise encore la fonction prop.test(). Comme pour le test
pour un échantillon, il faut calculer le nombre de succès et d’essais pour chaque groupe et les indiquer dans
des vecteurs.
16
table(proximite,sexe)
## sexe
## proximite F H
## 0 22 5
## 1 2 10
prop.test(c(2,10),c(2+22,10+5))
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(2, 10) out of c(2 + 22, 10 + 5)
## X-squared = 12.134, df = 1, p-value = 0.0004951
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.9004399 -0.2662268
## sample estimates:
## prop 1 prop 2
## 0.08333333 0.66666667
##
## Paired t-test
##
## data: revenu and budget
## t = 24.983, df = 46, p-value < 0.00000000000000022
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 1547.735 1818.989
## sample estimates:
## mean difference
## 1683.362
shapiro.test(budget)
##
## Shapiro-Wilk normality test
##
## data: budget
## W = 0.90237, p-value = 0.0006573
JarqueBeraTest(budget, na.rm=TRUE)
##
## Robust Jarque Bera Test
##
## data: structure(c(154, 160, 190, 223, 220, 252, 312, 130, 120, 146, 158, 230, 430, 165, 180, 16
## X-squared = 39.026, df = 2, p-value = 0.000000003355
17
LillieTest(budget)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: budget
## D = 0.15558, p-value = 0.00459
CramerVonMisesTest(budget)
##
## Cramer-von Mises normality test
##
## data: budget
## W = 0.20524, p-value = 0.004353
ShapiroFranciaTest(budget)
##
## Shapiro-Francia normality test
##
## data: budget
## W = 0.90078, p-value = 0.001065
Il est aussi possible de tester graphiquement la normalité d’un échantillon via un histogramme ou un dia-
gramme quantile-quantile.
Histogramme de budget
0.006
Density
0.000
Budget
qqnorm(revenu)
qqline(revenu,col='red')
1500 2500
−2 −1 0 1 2
Theoretical Quantiles
18
10 Analyse de la variance
On obtient une analyse de la variance à un facteur (comparaison des moyennes d’une variable quantitative
selon les modalités d’une variable qualitative) avec la fonction aov.
Il est alors possible d’effectuer des tests de comparaison « Post-Hoc » à l’aide de la fonction TukeyHSD.
TukeyHSD(aovbudget)
Attention, l’analyse de la variance suppose l’égalité des variances entre les différents groupes qui peut être
vérifiée à l’aide des fonctions bartlett.test() si les variables sont normales et LeveneTest() sinon.
bartlett.test(budget ~ lieu)
##
## Bartlett test of homogeneity of variances
##
## data: budget by lieu
## Bartlett's K-squared = 8.6334, df = 3, p-value = 0.03458
11 Régression linéaire
La fonction ln() permet d’obtenir la régression linéaire entre deux (ou plusieurs) variables.
##
## Call:
## lm(formula = budget ~ revenu)
19
##
## Residuals:
## Min 1Q Median 3Q Max
## -115.594 -35.683 3.004 30.437 109.630
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -38.1985 26.2908 -1.453 0.153
## revenu 0.1495 0.0131 11.416 0.00000000000000699 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 48 on 45 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.7433,Adjusted R-squared: 0.7376
## F-statistic: 130.3 on 1 and 45 DF, p-value: 0.000000000000006991
200
Revenu
On vérifie la normalité des résidus avec un test de Shapiro.
shapiro.test(resid(reg))
##
## Shapiro-Wilk normality test
##
## data: resid(reg)
## W = 0.99302, p-value = 0.9932
layout(matrix(1:4, 2, 2))
plot(reg)
20
Standardized residuals
Residuals vs Fitted Scale−Location
Residuals
17 41 27 17
−100
0.0
41 27
Standardized residuals
Normal Q−Q Residuals vs Leverage
17 17
35 0.5
Cook's distance
−2
−3
27 41 27 0.5
layout(matrix(1,1,1))
courses[,2]
## # A tibble: 50 x 1
## age
## <dbl>
## 1 25
## 2 33
## 3 33
## 4 32
## 5 29
## 6 33
## 7 20
## 8 37
## 9 19
## 10 29
## # ... with 40 more rows
courses[,'age']
## # A tibble: 50 x 1
## age
## <dbl>
## 1 25
## 2 33
## 3 33
## 4 32
## 5 29
## 6 33
## 7 20
## 8 37
## 9 19
## 10 29
## # ... with 40 more rows
21
Cela permet de sélectionner plusieurs variables avec une commande du type
courses[,c('age','revenu')]
## # A tibble: 50 x 2
## age revenu
## <dbl> <dbl>
## 1 25 1400
## 2 33 1230
## 3 33 1900
## 4 32 1860
## 5 29 1640
## 6 33 1940
## 7 20 2600
## 8 37 1100
## 9 19 NA
## 10 29 1330
## # ... with 40 more rows
De même, on peut sélectionner une ou plusieurs observations par son ou ses numéros
courses[7,]
## # A tibble: 1 x 12
## num age sexe sitfam freque~1 lieu super~2 hyper~3 proxi~4 speci~5 revenu
## <dbl> <dbl> <fct> <dbl> <ord> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 29 20 F 2 Mensuel Super 1 0 0 1 2600
## # ... with 1 more variable: budget <dbl>, and abbreviated variable names
## # 1: frequence, 2: supermarche, 3: hypermarche, 4: proximite, 5: specialise
courses[7:9,]
## # A tibble: 3 x 12
## num age sexe sitfam freque~1 lieu super~2 hyper~3 proxi~4 speci~5 revenu
## <dbl> <dbl> <fct> <dbl> <ord> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 29 20 F 2 Mensuel Super 1 0 0 1 2600
## 2 38 37 H 1 Plus so~ Prox~ 0 0 1 0 1100
## 3 4 19 F 2 Bimensu~ Super 1 0 0 1 NA
## # ... with 1 more variable: budget <dbl>, and abbreviated variable names
## # 1: frequence, 2: supermarche, 3: hypermarche, 4: proximite, 5: specialise
En combinant les deux, on obtient la valeur d’une variable pour une certaine observation.
courses[7,'revenu']
## # A tibble: 1 x 1
## revenu
## <dbl>
## 1 2600
revenu[7]
## [1] 2600
Il est souvent nécessaire de ne travailler que sur une partie des observations définie par un ou plusieurs
critères. Les tests ==, <, >=, != permettent de sélectionner les observations dont une variable est égale,
inférieure, supérieure ou égale, différente d’une valeur.
sexe=='F'
## [1] FALSE FALSE TRUE FALSE NA FALSE TRUE FALSE TRUE TRUE TRUE NA
## [13] FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE NA FALSE TRUE
## [25] TRUE NA TRUE NA TRUE FALSE TRUE TRUE TRUE TRUE NA FALSE
## [37] TRUE TRUE FALSE FALSE NA TRUE TRUE TRUE TRUE FALSE TRUE FALSE
## [49] FALSE TRUE
22
revenu[sexe=='F']
## [1] 1900 NA 2600 NA 1330 1320 NA 1950 3200 1340 1850 1300 NA 2200 2900
## [16] NA 2700 NA 1950 1850 2510 1600 1550 NA 1800 NA NA 2250 2500 1750
## [31] 2100 1550 2100
On peut combiner plusieurs conditions avec les conjonctions & (et) et | (ou).
## [1] 2600 NA 1330 1320 NA 3200 1340 1300 2200 2900 NA 2700 NA 2510 NA
## [16] NA NA 2250 2500 2100 2100
Attention, cela n’est possible que sur une variable particulière (et non un dataframe) et les conditions
ne s’appliquent pas aux valeurs manquantes (NA). Pour supprimer ces deux limitations, il est préférable
d’utiliser la fonction subset().
## # A tibble: 6 x 12
## num age sexe sitfam freque~1 lieu super~2 hyper~3 proxi~4 speci~5 revenu
## <dbl> <dbl> <fct> <dbl> <ord> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 29 20 F 2 Mensuel Super 1 0 0 1 2600
## 2 37 46 F 2 Mensuel Hyper 0 1 0 1 3200
## 3 45 19 F 3 Bimensu~ Hyper 0 1 0 1 2200
## 4 12 29 F 1 Hebdoma~ Hyper 0 1 0 0 2900
## 5 31 48 F 4 Plus so~ Prox~ 0 0 1 0 2700
## 6 46 42 F 2 Hebdoma~ Hyper 0 1 0 1 2510
## # ... with 1 more variable: budget <dbl>, and abbreviated variable names
## # 1: frequence, 2: supermarche, 3: hypermarche, 4: proximite, 5: specialise
La fonction cut() permet de transformer une variable quantitative en une variable qualitative ordinale
(mise en classes). On précise pour cela les bornes des intervalles (ouverts à gauche). L’option dig.lab=5
évite l’utilisation de notation scientifique.
## revenuclass
## (0,1500] (1500,2000] (2000,2500] (2500,3000] (3000,3500]
## 12 16 12 5 2
13 Couleurs !
Dans la plupart des graphiques, il est possible d’indiquer la couleur du graphique via l’option col :
hist(age, col='lightblue')
Histogram of age
12
Frequency
8
4
0
15 20 25 30 35 40 45 50
age
23
La liste des noms des 657 couleurs (de base) utilisables s’obtient avec la fonction colors().
Dans certains graphiques (barplot, pie), il est possible d’indiquer plusieurs couleurs (sous la forme d’un
vecteur), une pour chaque bâton ou secteur :
barplot(table(lieu),col=c('lightblue','pink','seagreen3','gray'))
15
5
0
pie(rep(1,12),col=rainbow(12))
pie(rep(1,8),col=hcl.colors(8))
4 3 3 2
5 2
6 1 4 1
7 12 5 8
8 11
9 10 6 7
14 Probabilités et échantillons
Il est bien-sûr possible de calculer les probabilités (fonctions de réparation) et quantiles des lois usuelles
de la statistiques.
Les noms des fonctions à utiliser commencent par p pour les probabilités et par q pour les quantiles, suivi
du nom de la loi parmi norm pour loi normale, t pour Student, chisq pour Khi-deux, f pour Fisher, exp pour
exponentielle, binom pour binomiale, hyper pour hypergéométrique, geom pour géométrique, pois pour
Poisson. Les paramètres dépendent bien-sûr des lois. Rechercher dans l’aide pnom, qgeom... pour obtenir la
syntaxe exacte.
## [1] 0.9750021
## [1] 1.644854
## [1] 0.9796023
## [1] 26.21697
## [1] 0.9999104
## [1] 0.6171727
Il est aussi possible de générer un échantillon (aléatoire) de ces lois en utilisant le préfixe r (pour random).
Par exemple, un 8-échantillon de la loi normale 𝒩(5, 3) est obtenu ainsi :
24
rnorm(8, mean=5, sd=3)
set.seed(12345678)
rnorm(5, mean=1, sd=2)
15 Calcul matriciel
Bien que cela ne soit pas son utilisation principale, il est aussi possible d’utiliser R pour effectuer du calcul
matriciel.
On définit une matrice à l’aide de la fonction matrix(). Attention, les coefficients sont donnés sous forme
de vecteur (en utilisant la fonction c()).
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
C <- diag(c(-2,3));C
## [,1] [,2]
## [1,] -2 0
## [2,] 0 3
Les opérations standards se notent naturellement. On utilise la fonction t() pour calculer la transposée
d’une matrice.
2*B
A+C
## [,1] [,2]
## [1,] -1 3
## [2,] 2 7
t(B)
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
La multiplication de deux matrices utilise la notation non standard %*%. L’inverse d’une matrice carrée se
calcule avec la fonction solve(). La fonction det() calcule son déterminant.
25
A %*% B
det(A)
## [1] -2
solve(A)
## [,1] [,2]
## [1,] -2 1.5
## [2,] 1 -0.5
Finalement, la fonction eigen() donne les valeurs propres et les vecteurs propres d’une matrice.
E <- matrix(c(2,1,1,2),ncol=2);E
## [,1] [,2]
## [1,] 2 1
## [2,] 1 2
eigen(E)
## eigen() decomposition
## $values
## [1] 3 1
##
## $vectors
## [,1] [,2]
## [1,] 0.7071068 -0.7071068
## [2,] 0.7071068 0.7071068
Les valeurs propres sont donc 3 et 1. Les vecteurs propres sont normés (sont de norme 1). Habituellement
(par le calcul à la main) on trouve plutôt :
eigen(E)$vectors * sqrt(2)
## [,1] [,2]
## [1,] 1 -1
## [2,] 1 1
26