Programmation dans Ch. 1. Bases de R
M2 CEE
Pr. Philippe Polomé, Université Lumière Lyon 2
2020 – 2021
Sommaire
Rappels basiques - voir cours RAE en M1 Rappel graphiques
Meilleurs graphiques : ggplot2
Démarrage
I
Il est sûrement utile de rafraîchir vos connaissances en suivant les 2 cours sur swirl indiqués dans le document
2020_R_installation_pour_tous_les_cours.pdf sur mon site
IProjet : En suivant les instructions de ce dernier document
I Créez un projet “Programmation R” ou “ProgR”
I Pour rappel : Là où vous le créez est votre répertoire de travail I Ne pas le mettre sur le bureau, la racine ou à un endroit
obscur
I Déchargez PR2020.R de ma page de cours I Dans le même dossier que votre projet I Ouvrez-le avec l’éditeur : icône en H à G
Rappel de quelques commandes
I
Suivre les commandes sur le fichier de code
I
Fonctions math communes : log, exp, sign, sqrt, abs, min, max
IVecteurs spéciaux
I ones <- rep(1, 10)
I even <- seq(from = 2, to = 20, by =2) I trend <- 1981 :2005
I
diag(4) matrice identité de taille 4
Opérations sur matrices
I
A<-matrix(1 :6, nrow = 2)
I Aregardez à quoi ça ressemble et comment R donne la position des éléments
I
t(A) = transposée de A (
pas A’)
Idim(A) = dimensions de A (L puis C)
Inrow(A) ; ncol(A) nbr L ; C
I
A[i,j] extrait l’élément (i,j)
I
A[,j] extrait C j (toutes les L) en un vecteur
I A[i,]même chose pour L iI
A1<-A[1 :2, c(1, 3)] A1 a 2 L qui contiennent les 1er et 3eme éléments de chaque L de A
I autre façonA[,-2]
Opérations sur matrices
I
det(A1) déterminant
Ieigen(A1) eigenvalues
I
chol(A1) décomposition de Cholesky
Isolve(A1) inverse
I
A %*% B produit matriciel
I A*Aproduit élément-par-élément I kronecker(A, B)produit de Kronecker⊗ I
crossprod(A, B) est un calcul efficient de A’B
Idiag(A1) extrait la diag
Opérations sur matrices
I
cbind(1, A1) “combine” une C de 1 et A1
. . .
. → . .
I
rbind(A1, diag(4, 2)) “empile” A1 et une matrice diag de taille 2 avec des 4 sur la diag
. .
. .
↑
. .
. .
Dataframe
I
“Frame” = cadre “contexte”
I Dans R, un “Dataframe” est une matrice de données I un ensemble de vecteurs de même longueur I mis l’un à côté de l’autre horizontalement
I
Chaque vecteur = 1 C = 1 variable
I possiblement de nature6=I quantitative, numérique mais qualitative, caractères, dates...
I qui contient de plus des méta-informations I p.e. le type de variable ou le nom des catégories
I
Chaque L = 1 observations
IRem.
I Une “array” est, dans R, un objet plus général car elle peut avoir + de 2 dimensions
I Un “tibble” est une version plus récente d’un dataframe
Création
I
Un Dataframe peut être créé de plusieurs façons
I clavier, lecture fichier R, importationI
Création clavier (cfr Swirl programming lesson 7)
I alternative 1I mydata <- data.frame(one = 1 :10, two = 11 :20, three = 21 :30)
I alternative 2
I mydata <- as.data.frame(matrix(1 :30, ncol=3)) and names(mydata) <- c(“one”, “two”, “three”)
I Clairement, R n’est pas le meilleur logiciel pour entrer des données manuellement
attach
I
Lorsqu’un dataframe est “attached”
I en utilisant la commande attach,
I alors les noms des variables dans le dataframe peuvent être utilisés dans des commandes
I
Par exemple
I mean(two)produit un message d’erreur
I attach(mydata)et puismean(two)produit la moyenne de la variable “two”
I
detach(mydata) permet de détacher le Dataframe
I p.e. pour éviter des confusions sur les noms de variables IPour attacher pour une seule opération
I with(mydata, mean(two))
Sélection de sous-ensemble (subset)
I
On accède à un sous-ensemble du Dataframe par [ ou $
I $ extrait une seule varaibleI
Pour travailler avec un sous-ensemble
I on utilise [ or subsetI
mydata.sub<-subset(mydata, two<=16, select = -two)
I prend toutes les observations des variables one & threeI pour lesquelles les observations correspondantes de la two sont
≤16
Exporter (write) un dataframe
I
write.table(mydata, file=“mydata.txt”, col.names=TRUE)
I crée un fichier texte mydata.txt dans le répertoire de travail I Les méta-informations ne passent pasI Le format du fichier texte est
“one” “two” “three”
“1” 1 11 21
“2” 2 12 22
...
I Rem. on dirait que les intitulés de colonnes sont décalées à G I Selon le logiciel qui servira à ouvrir, il faut parfois insérer un
espace
Importer (read) un dataframe
I
À parti d’un fichier texte (.txt ou .csv)
I newdata <- read.table(“mydata.txt”, header=TRUE) I lit un fichier texte dont la première ligne porte le nom des
variables
I qui est placé dans un “data.frame” appelé newdata I Si les titres de col. ne sont pas décalées à G
I comme si ça venait d’un tableur
I R comprendra la col. avec les numéros de ligne comme une autre variable
I
read.table accepte des options
I sur le séparateur de col. (, ;) I sur le séparateur décimal (. ,) I peut lire du .csvI voir ?read.table
Importer un dataframe
I
scan est utilisé pour des données qui ne sont pas en matrice
I ?scan pour les détailsI
Pour importer d’un autre système
I Le + facile exporter de ce système en txt ou csv I perte des méta-données
I rarement possible (pas accès à l’autre système) I R-Studio propose plusieurs formats
I Ne marche pas souvent car ces logiciels changent souvent de format
I Google p.e. “R import Stata 17 data”
I Voir www.statmethods.net/input/importingdata.html I pour quelques formats
Un peu de pratique : “Journals”
I
Exemple, les données JOURNALS :
I
souscriptions à des journaux d’économie pour quelques bibliothèques aux USA en 2000
I 180 observations (les “journals”) sur 10 variables, entre autres : I subs (# of library subscriptions),
I price (subscription price),
I citations (total number of cites per journal)
I
On étudie la relation entre le nombre de souscriptions et le prix par citation
I La citation reflétant l’importance du journal I Donc l’intérêt pour une bibliothèque
Un peu de pratique : “Journals”
I
data("Journals", package = "AER")
I Journals$citeprice <- Journals$price/Journals$citations I “ / “ est une division élément par élément pour des vecteurs I
attach(Journals)
I “attacher” pour utiliser dans les formules
I
Calculez l’estimateur MCO de la régression de log(subs) sur log(price/citations)
I et ses t-stats - pour rappelβˆ= (X0X)−1X0Y et t-stats=
r diag
σˆ2(X0X)−1 I au moyen des formules de matrices
Un peu de pratique : “Journals”
I
Remarques
I Difficulté carσˆ2 est perçu comme une matrice 1×1 non conformable avec
X0X−1
I Plusieurs solutions p.e.⊗produit Kronecker I Résultats : intercept 4.766 et pente -0.533 environ
I
detach(Journals) pour éviter des confusions de nom par la suite
dplyr
I
package dplyr - library(dplyr)
I Partie d’un ensemble de packages “tidyverse” visant à simplifier la gestion de données dans R (on en verra d’autres)
I
Pour illustrer, on va utiliser le jeu de données fligths
I install.packages("nycflights13")puis charger aveclibrary(nycflights13)
I dim(flights): quelles dimensions ? I flightspour voir à quoi il ressemble I
Filtrer des lignes avec filter( )
I 1º arg : le jeu de données, 2º argument et les suivants : condition pour sélectionner les L si l’arg est true
I Exercice : sélectionner dans flights les vols du mois de janvier uniquement
I Puis du 1º janvier uniquement
dplyr
I
Trier des lignes avec arrange( )
I Fonctionne comme filter, mais ordonne selon le 2º arg, puis le 3º (s’il est présent) ...
I Exercice : ordonner flights selon l’année, le mois et le jour I Utiliserdesc()pour ordonner en décroissant
I Exercice : ordonner flights par ordre décroissant de retard à l’arrivée arr_delay
I
Sélectionner des col avec select()
I Souvent, on ne travaille qu’avec quelques colonnes I
Ajouter des col avec mutate()
I
Il y a qqs autres fonctions
I sample_n()etsample_frac()pour prendre un échantillon aléatoire de L
I Résumer des valeurs avecsummarise() I Moins utiles
Devoir # 1 - uniquement code R
I
Estimateur MCO de la régression de log(subs) sur
log(price/citations) au moyen des formules de matrices
IExercice filter() select() mutate () des 2 diapos précédentes
IDéposer sur Moodle
Sommaire
Rappels basiques - voir cours RAE en M1 Rappel graphiques
Meilleurs graphiques : ggplot2
Plot
I
Rappel : swirl course R-programming, lesson 15 Base graphics
IQuelques éléments graphiques supplémentaires
I Sur base du packageplot I Autres packages
I latticeplus sophistiqué I on feraggplot2un peu + loin I http ://varianceexplai-
ned.org/RData/code/code_lesson2/#segment1 I R est considéré comme ayant de très bons graphiques I
La commande plot ( )
I plot( )est la commande par défaut pour représenter graphiquement beaucoup d’objets :
I dataframes, séries temp, modèles linéaires ajustés I C’est aussi une vieille commande, assez rustique
“Scatterplots” - graphiques de dispersion ou XY
I
Probablement les + communs en économétrie
I Attention : conditionne sur une seule variable = bias de variable omise
I
attach(Journals)
I plot(log(subs), log(citeprice)) I
detach(Journals)
I
plot(log(subs)~log(citeprice), data=Journals)
I alternative pour éviter d’avoir à attacher le dataframe
R Paramètres Graphiques
I
Les résultats d’un plot peuvent être modifiés de nombreuses façons
I P.e. argumenttypecontrôle si le plot génère des points (type
= p), lignes (type = l), les 2 (type = b), des pas (type = s) ou d’autres
I
Plusieurs douzaines de paramètres modifiables sont disponibles
I Voir ?parI Soit en les fixant avecpar( ) après une commandeplot I Soit en les fournissant à la fonctionplot( )p.e.
plot(log(subs)~log(citeprice), data=Journals, pch=20, col="blue", ylim=c(0,8), xlim=c(-7,4), main="Library Subscriptions")
I
Prochaine diapo : liste de par
axes should axes be drawn ?
bg background color
cex size of a point or symbol
col color
las orientation of axis label
lty, lwd line type and line width main, subs main title and subtitle
mar size of margins
mfcol, mfrow array defining layout for several graphs on one plot
pch plotting symbol
type types
xlab, ylab axis labels
xlim, ylim axis ranges
xlog, ylog, log logarithmic scales
R Paramètres Graphiques
I
Ajouter des couches à un plot : lines( ), points( ), text( ), legend( )
I Ajouter 1 droiteabline(a, b) I a est intercept, b pente
I
2 plots l’un sur l’autre
I x <- rnorm(50) I x2 <- rnorm(50, -1)I plot(ecdf(x), xlim = range(c(x, x2)))
I ecdf : empirical cumulative density function I plot(ecdf(x2), add = TRUE, lty = "dashed")
Exporter des graphiques
I
Pour utiliser les graphiques R dans d’autres logiciels
I il faut les exporterI
Le + simple : bouton “Export” Plots window
IR peut aussi envoyer le graphe sur un “device”
I Au fond : une extension de fichier pdf ou jpg I Tous les devices fonctionnent pareil dans R I Voir ?devices
1. le device est ouvert par une fonction qui porte son nom, p.e.
pdf( )
2. Ensuite, le plot est exécuté
3. Finalement, le device est fermédev.off( ) I Exemple
I pdf("myfile.pdf", height=5, width=6) I plot(1 :20, pch=1 :20, col=1 :20, cex=2) I dev.off()
I Cherchez myfile.pdf sur votre machine
Formules math dans un Plot
I
R peut passer une formule dans un plot via L
ATEX
I Voir ?plotmathI
Exemple
I plot de la densité normale std avec sa définition math I curve(dnorm, from=-5, to=5, col="slategray", lwd=3,
main="Density of the Standard Normal Distribution") I text(-5, 0.3, expression(f(x) == frac(1, sigma ~~ sqrt(2*pi))
~~ e^{-frac((x - mu)^2, 2*sigma^2)}), adj=0) I Malheureusement, il faut connaitre LATEX I & les paramètres ne sont pas faciles
Histogrammes & boxplots
I
data("CPS1985")
I jeu de données sur le salaire & ses déterminants I
summary(CPS1985)
I révèle que certaines variables sont catégoriques I Catégoriques : appelées factors par R
I
Factors = vecteurs de “noms” appelés catégorie “cat”
I parfois avec metadata p.e. noms des catégories I g <- rep(0 :1, c(2,4))
I g <- factor(g, levels=0 :1, labels=c("male", "female")) I Nomme cat. (0,1) de g en “Male”(=0) & “Female”
I donc g est [1] male male female female female female
6 Factors dans CPS1985
I
Factors sont comptés (fréquences)
I car la moyenne ne signifie rienI
levels(CPS1985$occupation)[c(2,6)] <- c("techn", "mgmt")
I abrège 2 noms d’occupationI
attach(CPS1985)
I permet d’accéder aux variables de CPS1985 par leurs noms I
On va voir des graphes selon la nature des données
I Numérique ou cat.
I 1 seule variable ou 2 en relation
Une variable numérique : histogramme & densité
I
Un histogramme est une estimation non-paramétrique de la densité
f (x)d’une variable aléatoire
xI que l’on forme en divisant lesupport dex en intervalles également espacés
I et en calculant la fraction de l’échantillon dans chaque intervalle
I
hist(wage, freq=FALSE)
I optionfreq=FALSEI fréquences relatives, sinon absolues (comptage) I optionbinwidth=x
I permet de choisir la longueur des bases (nombre d’intervalles) I Trop petite base =⇒ détails spurrieux
I Trop grande =⇒ on ne voit pas des charactéristiques importantes des données
I histest dotée d’un algorithme qui calcule une longueur
“optimale”
I Selon un critère de perte d’information I Mais ça ne marche pas toujours bien
Une variable numérique : histogramme & densité
I
hist(log(wage), freq=FALSE)
I La distribution du log est moins asymétrique que celle des données brutes
I Les données en log sont souvent plus proches d’une normale I
lines(density(log(wage)), col=4)
I La commandedensity calcule un histogramme lissé I Technique non-paramétrique
I La ligne est calculée en comptant le nombre d’obs dans un rayon autour de chaque observation
I Il y a plusieurs techniques, c’est un domaine de l’économétrie I La commandelines fait quedensitys’écrit par-dessus l’hist
précédent
Une catégorique
I
La moyenne & la variance ne signifient rien
I mais bien les fréquencesI
summary(occupation) : fréquences absolues (comptes)
Itab <- table(occupation) : stocke ces fréq. ds une table
Iprop.table(tab) calcule les proportions (fréq. relatives)
IBarplots & pie visualisent souvent bien les données cat.
I barplot(tab) I pie(tab)
2 catégoriques
I
Habituellement présentées dans une Table de Contingence
I xtabs( )avec une interface formule :I p.e.xtabs(~ gender + occupation, data = CPS1985) I data= optionel car on a attaché
I table(gender, occupation)mêmes résultats I
Plot de ça est un “
spine plot”I plot(gender ~ occupation)
I plot(gender, occupation)regardez les différences I
Un peu plus joli : mosaic plot
I Packagevcd“Visualizing Categorical Data”
I On peut mettre en couleur
2 numériques
I
Coefficient de corrélation
rest typique
I Variables positives & asymétriques : Spearman’sρ
I corrélation desranks, au lieu des valeurs est souvent préféré carr n’est pas robuste à l’asymétrie
I
cor(log(wage), education)
I
cor(log(wage), education, method="spearman")
I Résultats semblables pour ces donnéesI
plot(log(wage)~education)
I Le scatterplot montre peu de corrélation I 38% est une corrélation assez faible
1 numérique & 1 catégorique
I
Souvent, on calcule des moments conditionnels
I p.e. salaire moyen selon le sexeI tapply(log(wage), gender, mean)
I “Appliquer” mean sur les 2 variables gender & log(wage) I Mean peut être remplacé par n’importe quelle fonction valide I Attention : induit biais de variable omise !
I
Les Box plots & QQ (quantile-quantile) plots sont souvent
utilisés
1 numérique & 1 catégorique : Box plot
I Un box plot est une représentation grossière d’une distribution empirique
I Le box est limité par des “charnières” (1º & 3º quartiles) et montre la médiane
I Hors du box, 2 lignes indiquent les obs. les + petites & + grandes
I à moins de 1.5×taille du box à partir de la charnière la + proche
I Toute obs. au-delà est représentées séparément par un point I
boxplot(log(wage)~gender)
1 numérique & 1 catégorique : QQ plot
I Un QQ plot apareille les quantiles de 2 distributions I Se rappeler que les quantiles sont des quantités
I p.e. le 1º quartile du salaire féminin est le salaire t.q 25% des femmes gagnent moins & 75% +
I Si les 2 distributions sont identiques I le QQ plot est la diagonale
I Sinon, si p.e. les hommes tendent à gagner + que les femmes, alors
I avec les hommes sur l’axe des x, le QQ plot sera sous la diag.
I Évoque le graphe du coefficient de Gini
I mwage <- subset(CPS1985, gender == "male")$wage I fwage <- subset(CPS1985, gender == "female")$wage I qqplot(mwage, fwage)
I abline(0,1)
I
detach(CPS1985) pour refermer CPS1985
Sommaire
Rappels basiques - voir cours RAE en M1 Rappel graphiques
Meilleurs graphiques : ggplot2
Intro
Installez & chargez ggplot2 ggplot2 a des données intégrées
I
data("diamonds")
IView(diamonds)
I Carat = poids, cut, color, clarity, prix I Toutes des mesures du diamant I Autres attributs :help(diamonds)
I
Scatterplot : représenter les liens entre ces caractéristiques
I On peut choisir les axes, mais aussiI couleur, taille & forme des points
1º pas
I
ggplot(diamonds, aes(x=carat, y=price)) + geom_point()
I Comment marche cette commande ?I
3 parts dans 1 commande ggplot
1. data, on écrit "diamonds"2. Organisation des attributs I aes = “aesthetics”
I unaesthetics= toute dimension d’un graphe qu’on peut percevoir visuellement
I On utilise des parenthèses 3. On rajoute une “couche” (layer)
I Ici, on indique qu’on veut un scatter plot avec “geom_point”
I Bcp de couches ont un nom qui commence par "geom"
Ajouter color
I
ggplot(diamonds, aes(x=carat, y=price, color=clarity)) + geom_point()
I On rajoute un “aesthetics”, ici la couleur I Qu’on associe au factor “clarity”
I Remarquez que ggplot a créé une légende en couleur I Essayez avec d’autres factors : regardez dans le fichier de
données
I
Pour représenter à la fois color & cut
I on rajoute simplement un aesthetic I qui peut être la taille du point : sizeI Faites-le
I Au lieu de “size”, on peut aussi utiliser “shape”
Couche supplémentaire
I
Le scatter plot est un "layer"
I On peut en rajouter avec le signe +
I p.e. une courbe lissée pour la tendance générale : geom_smooth
I En repartant du 1º plot
I ggplot(diamonds, aes(x=carat, y=price)) + geom_point() + geom_smooth()
I La zone grise autour de la courbe est un intervalle de confiance I On peut l’enlever avec l’option geom_smooth : "se=FALSE"
I On peut aussi mettre une ligne de régression simple avec l’option method="lm"
I lm pour “linear model”
I refaites la cmd avec les 2 options
I
Si on utilise en plus l’aesthetic “color”
I ggplot va estimer une courbe lisse pour chaque couleur I Allez-y
I Si vous enlevez geom_point, vous ne verrez que les courbes
Faceting : plot multiple
I
Une autre façon de communiquer l’info sur un attribut factor
I Diviser le plot en multiples plotsI un pour chaque niveau du factor (pas trop de niveaux) I On appelle ça "faceting"
I ggplot : couche "facet_wrap"
I P.e. faceting sur “clarity” sur des plots (carat, price, cut) I ggplot(diamonds, aes(x=carat, y=price, color=cut)) +
geom_point() + facet_wrap(~ clarity)
I On peut rajouter une dimension de faceting avec p.e.
facet_wrap(cut~ clarity) I Mais ça n’est plus très clair
I
On peut rajouter un titre avec + ggtitle("My scatter plot")
I changer la légende de x+ xlab("Weight (carats)")I Limiter la longueur des axes, mettre en log...
Histogrammes & Densités
I
Histogramme : on ne regarde qu’un seul attribut
I ggplot(diamonds, aes(x=price)) + geom_histogram() I Il suffit de changer+ geom_point()en+ geom_histogram() I R renvoie un signal sur “binwidth” = taille de la base durectangle
I Défaut = 30 rectangles - pas un algorithme ! I On peut changer, p.e.
ggplot(diamonds, aes(x=price)) + geom_histogram(binwidth=2000)
I
On peut faire à peu près la même chose qu’avec un scatterplot
ISi on écrit geom_density au lieu de geom_histogram
I on a une densité lissée au lieu d’un histogramme I Comment calculer cette densité n’est pas évident
I Mais est une sorte d’histogramme où l’on compte combien de points il y a autour de chaque point
Boxplot & Violons
I
Boxplot du prix selon les niveaux de couleur
I ggplot(diamonds, aes(x=color, y=price)) + geom_boxplot() I Il y a beaucoup d’outliers
I En rajoutant+ scale_y_log10()on les voit moins
I
Si la distribution empirique ne suit pas ± une normale
I Le box plot est pas terribleI p.e. si on a 2 modes
I
Une image possiblement + fidèle est le “violin”
I On remplacegeom_boxplot()pargeom_violin() I Pas super clair si on ne passe pas aux log
I La largeur en chaque prix est la fréquence de ce prix
I Supplément du dimanche de 500 quotidiens US
I Tous les ans, un échantillon de 120-150 citoyens sélectionnés
“aléatoirement”
I variables :profession,hometown,state& yearly earnings.
I dataframeParade2005contient la version 2005 version I avec une dichotomique “celebrity status” fortement
sur-échantillonnée
I
Devoir 2
I Earning moyen en Californie, discuter I Nombre d’échantillonnés en Idaho
I Qu’en dire sur l’échantillon ? I Earning
I moyen & médian des célébrités, commenter I Fréquence & densité
I Boxplot selon statut célébrité I Répéter avec log
I Essayer d’utiliser ggplot pour améliorer ce boxplot graphiquement
I Adapter pour un autre jeu de données I Déposer le fichier .R sur Moodle