• Aucun résultat trouvé

Programmation dans Ch. 1. Bases de R

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation dans Ch. 1. Bases de R"

Copied!
47
0
0

Texte intégral

(1)

Programmation dans Ch. 1. Bases de R

M2 CEE

Pr. Philippe Polomé, Université Lumière Lyon 2

2020 – 2021

(2)

Sommaire

Rappels basiques - voir cours RAE en M1 Rappel graphiques

Meilleurs graphiques : ggplot2

(3)

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

I

Projet : 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

(4)

Rappel de quelques commandes

I

Suivre les commandes sur le fichier de code

I

Fonctions math communes : log, exp, sign, sqrt, abs, min, max

I

Vecteurs 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

(5)

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’

)

I

dim(A) = dimensions de A (L puis C)

I

nrow(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 i

I

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]

(6)

Opérations sur matrices

I

det(A1) déterminant

I

eigen(A1) eigenvalues

I

chol(A1) décomposition de Cholesky

I

solve(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

I

diag(A1) extrait la diag

(7)

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

. .

. .

. .

. .

(8)

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

I

Rem.

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

(9)

Création

I

Un Dataframe peut être créé de plusieurs façons

I clavier, lecture fichier R, importation

I

Création clavier (cfr Swirl programming lesson 7)

I alternative 1

I 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

(10)

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 I

Pour attacher pour une seule opération

I with(mydata, mean(two))

(11)

Sélection de sous-ensemble (subset)

I

On accède à un sous-ensemble du Dataframe par [ ou $

I $ extrait une seule varaible

I

Pour travailler avec un sous-ensemble

I on utilise [ or subset

I

mydata.sub<-subset(mydata, two<=16, select = -two)

I prend toutes les observations des variables one & three

I pour lesquelles les observations correspondantes de la two sont

≤16

(12)

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 pas

I 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

(13)

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 .csv

I voir ?read.table

(14)

Importer un dataframe

I

scan est utilisé pour des données qui ne sont pas en matrice

I ?scan pour les détails

I

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

(15)

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

(16)

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

(17)

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

(18)

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 avec

library(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

(19)

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

(20)

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

I

Exercice filter() select() mutate () des 2 diapos précédentes

I

Déposer sur Moodle

(21)

Sommaire

Rappels basiques - voir cours RAE en M1 Rappel graphiques

Meilleurs graphiques : ggplot2

(22)

Plot

I

Rappel : swirl course R-programming, lesson 15 Base graphics

I

Quelques é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

(23)

“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

(24)

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 ?par

I 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

(25)

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

(26)

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")

(27)

Exporter des graphiques

I

Pour utiliser les graphiques R dans d’autres logiciels

I il faut les exporter

I

Le + simple : bouton “Export” Plots window

I

R 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

(28)

Formules math dans un Plot

I

R peut passer une formule dans un plot via L

A

TEX

I Voir ?plotmath

I

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

(29)

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

(30)

6 Factors dans CPS1985

I

Factors sont comptés (fréquences)

I car la moyenne ne signifie rien

I

levels(CPS1985$occupation)[c(2,6)] <- c("techn", "mgmt")

I abrège 2 noms d’occupation

I

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

(31)

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

x

I 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=FALSE

I 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

(32)

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

(33)

Une catégorique

I

La moyenne & la variance ne signifient rien

I mais bien les fréquences

I

summary(occupation) : fréquences absolues (comptes)

I

tab <- table(occupation) : stocke ces fréq. ds une table

I

prop.table(tab) calcule les proportions (fréq. relatives)

I

Barplots & pie visualisent souvent bien les données cat.

I barplot(tab) I pie(tab)

(34)

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

(35)

2 numériques

I

Coefficient de corrélation

r

est 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ées

I

plot(log(wage)~education)

I Le scatterplot montre peu de corrélation I 38% est une corrélation assez faible

(36)

1 numérique & 1 catégorique

I

Souvent, on calcule des moments conditionnels

I p.e. salaire moyen selon le sexe

I 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

(37)

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)

(38)

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

(39)

Sommaire

Rappels basiques - voir cours RAE en M1 Rappel graphiques

Meilleurs graphiques : ggplot2

(40)

Intro

Installez & chargez ggplot2 ggplot2 a des données intégrées

I

data("diamonds")

I

View(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 aussi

I couleur, taille & forme des points

(41)

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"

(42)

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 : size

I Faites-le

I Au lieu de “size”, on peut aussi utiliser “shape”

(43)

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

(44)

Faceting : plot multiple

I

Une autre façon de communiquer l’info sur un attribut factor

I Diviser le plot en multiples plots

I 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...

(45)

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 du

rectangle

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

I

Si 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

(46)

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 terrible

I 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

(47)

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

Références

Documents relatifs

[r]

Le jeu consiste à attraper, à l’aide d’une canne munie à son extrémité d’un crochet, un canard en plastique placé à la surface de l’eau.. Cette eau est mise en

Si on suppose que la totalité de l’acide éthanoïque réagit, expliquer en utilisant l’équation de la réaction, pourquoi la quantité de matière maximale

[r]

LANCE UN APPEL à tous les fabricants de tabac et promoteurs de sa consommation, pour que, dans l'esprit de la présente résolution et de la résolution WHA39.14, ils s'abstiennent

On peut définir une seule clé primaire, mais on peut rajouter des clés secondaires avec UNIQUE, qui imposera des valeurs différentes de ces clés pour chaque enregistrement

[r]

Les jeunes sont accompagnés par un journaliste et un animateur qui les aident à se raconter par écrit et les accompagnent jusqu'à la rédaction d'un