Exercice 1 : personnalisation d’un graphique

  1. Représentez trois points en positions (x, y) : (1, 2), (2, 2) et (3, 3).

    • Ajoutez le titre “Mon graphique” avec l’argument main
    • Sauvegardez ce graphique en format .jpeg sous le nom initial_graph.jpeg avec la fonction jpeg() suivie de dev.off()
  2. Recommencez ce graphique en personnalisant l’affichage avec les options ou fonctions suivantes pas à pas (faites un nouveau graphique à chaque étape en ajoutant le nouveau paramètre) :

  • xlim et ylim : délimitez l’affichage des échelles des deux axes entre 0 et 4
  • cex : doublez la taille des points
  • pch : donnez d’abord une forme de cercle plein à chaque point ;

Recommencez ensuite en spécifiant une forme différente pour chaque point :

  • le 1er sous forme d’une croix (comme un +)
  • le 2ème sous forme d’un triangle pointé vers le bas vide
  • le 3ème sous forme d’un losange plein
  • palette() : trouvez les couleurs de votre session et identifiez l’indice de la couleur grise
  • col : mettez tous les points en gris puis donnez une couleur différente à chaque point :

    • rouge pour le 1er
    • bleu pour le 2nd
    • contour en magenta et fond en cyan pour le 3ème (avec l’option bg en plus)
  • lwd : doublez la largeur des traits tracés (ici des points)
  • bty : retirez la cadre entourant le graphique pour ne conserver que les axes
  • xlab et ylab = nommez les axes Axe des abscisses et Axe Y.

  1. Ajoutez un 4ème point sous forme d’un cercle plein gris aux coordonnées (1.5, 3) avec la fonction points()

  2. Ajoutez une ligne pointillée de couleur verte en position horizontale à l’ordonnée 1 avec la fonction abline() et en particulier l’option lty

  3. Ajoutez une légende avec la fonction `legend()à dans le coin en haut à droite et aidez-vous des arguments :
  • col, pt.bg, pt.lwd et pt.cex: pour respecter les couleurs, formes des points que vous mettrez à la taille 1.5
  • legend : pour nommer vos points A, B, C et D
  • title : pour donner un nom Mes 4 points à la légende
  • horiz : pour positionner les points côte à côte plutôt que les uns en dessous des autres
  1. Donnez le titre Mon graphique personnalisé à votre figure
  2. Sauvegardez-la en format pdf avec le nom “cutom_graph.pdf”

Fonctions à utiliser

  • jpeg()
  • pdf()
  • dev.off()
  • plot()
  • palette()
  • grep()
  • points()
  • abline()
  • legend()
  • title()

En cas d’urgence poussez sur Code pour révéler la solution.

Solution de l’exercice 1:

png 
  2 

[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray"   

png 
  2 

Exercice 2: représentations graphiques de données qualitatives

  • Importez dans R le fichier motorisation.txt dans votre repertoire de travail. Le fichier est egalement present dans: /shared/projects/dubii2020/data/module3/seance2/
  • Générez un camembert de la répartition des différentes motorisations et choisissez vous-mêmes des couleurs.
  • Générez également un diagramme en bâtons avec les proportions (fréquences relatives) des différentes motorisations colorées comme dans le camembert.
  • Disposez les deux graphes côte à côte sur un même graphique.

Fonctions à utiliser

  • read.table()
  • table()
  • pie()
  • barplot()
  • par()avec l’agument mfrow

Solutions exercice 2:

Etape 1: lire le fichier dans R

'data.frame':   22 obs. of  1 variable:
 $ V1: chr  "Hybride" "Diesel" "Diesel" "Essence" ...

Etape 2: Faire les figures

Essayez dans une premier temps de faire chaque graphique independamment avec les bonnes commandes avant de les afficher sur une meme fenetre graphique

Note: lorsque vous utilisez Rstudio: une erreur peur se produire si votre fenetre graphique est trop petite, compte tenu des marges et de la taille de votre ecran-> pensez alors a redimensionner la fenetre graphique avant de lancer vos commandes graphiques

  • Pour le pie chart:

N’hesitez pas à decomposer la commande ci-dessus élement par élement pour bien la comprendre en tapant successivement:


    Diesel Electrique    Essence    Hybride 
         9          1          7          5 
[1] "Diesel"     "Electrique" "Essence"    "Hybride"   
[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray"   
[1] "green3"  "blue"    "magenta" "orange" 

Alternativement: vous pouviez utiliser la commande pie sans utiliser de tableau de contingence en donnant comme argument x un vecteur avec les comptes de chaque valeur comme ci-dessous

Enfin, si vous voulez afficher les parts du camembert par ordre croissant, vous pouvez appliquer la fonction sort() sur la valeur obtenue par la commande (table(motorisation$type_de_motorisation))

  • Pour le barplot:

N’hesitez pas a aggrandir votre fenetre d’affichage pour voir les noms sous les batons…ou reduisez leur taille en utilisant l’argument cex.names:

Il est aussi possible d’utiliser barplot avec une matrice comme argument x. Dans ce cas, par defaut avec l’argument beside=F, les elements du diagramme en baton seront empilés.

Si vous voulez les afficher du plus grand au plus petit effectif, ajouter sort() en precisant decreasing=T

  • Pour afficher les 2 plots dans une meme fenetre graphique:

Version attendue dans l’exrecice:

Version finale pour aller plus loin en integrant des alternatives decrites pour chaque figure et avec les bonnes regles d’affichage du script R:

Vous noterez qu’il est prefable de visualiser les donnees qualitatives, comme ici le type de motorisation, au moyen d’un diagramme en batons. Cela vous ai rappele en ‘Note’ dans la fenetre d’aide de la fonction pie!

Exercice 3 représentation graphique de la distribution d’une variable quantitative continue

  • Tirez aléatoirement un ensemble de 100 nombres compatibles avec une distribution normale de moyenne 10 et d’écart type 5.
  • Sauvegardez-les dans un objet R.
  • Tracez la représentation histogramme des valeurs obtenues.
  • Changez le nombre d’intervalles de l’histogramme : 5, 50 et 100.
  • Tracez également une boite à moustache horizontale de ces data.
  • Affichez les 3 histogrammes et le boxplot les uns en dessous des autres dans une même fenêtre graphique.

Fonctions recommandées:

  • rnorm()
  • hist() avec l’argument breaks
  • boxplot
  • par() avec l’argument mfrow

Exercice 4: lois de probabilité

  • Si \(X\) suit une loi normale de moyenne 10 et d’écart type 55, quelle est la probabilité \(P(7 \le X \le 15)\) ?

  • Si \(X\) suit une loi normale de moyenne \(\mu=10\) et d’écart type \(\sigma=55\), quelle est la valeur de \(k\) telle que \(P( X \ld k) = 0.67\) ?

  • Soit un test de Chi2 à 3 degrés de libertés avec une valeur de la statistique de `Chi2=16.26$. Quelle est la p-value de ce test ?

Fonctions recommandées:

  • pnorm()
  • qnorm()
  • pchisq

Exercice 5: représentations graphiques de données quantitatives

  • Récupérez le jeu de données airquality disponible sous R.
  • Créez les graphes de la figure ci-après avec ce jeu de données.
Examples of graphical representations.

Examples of graphical representations.

Fonctions à utiliser

  • data()
  • par() avec les arguments mfrow et `mar``
  • plot()
  • hist()
  • lines()
  • boxplot()
  • abline()
  • lm()
  • title()

Solutions de l’exercice 6:

'data.frame':   153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

For the boxplots, you could also have generated a factor with names to each level:

IMPORTANT NOTE ON NAMES OF VARIABLES:* Here for boxplot as for most R functions, you may enter the argument data="", and then just put the name of the variables without repeating the name of the dataframe:

Alternatively, you may use attach() to access to the variables of the dataset directly by their name, then enter your commands, and then detach() once finsihed

Exercice 6 : analyse de données

Importez dans R le fichier poisson.txt R. Il s’agit d’un jeu de données de l’espèce de poisson “grand corégone” du lac Nathalie dans le territoire de la baie James (province du Québec) (d’après B. Scherrer). En 1977, Dumont a cherché les relations existantes entre le potentiel reproducteur (nombre d’œufs) de cette espèce de poisson (grand Corégone) et plusieurs caractères morphologiques. L’étude a été menée afin de déterminer une éventuelle relation entre le nombre d’œufs, révélant le potentiel reproducteur des poissons, et les variables morphologiques caractérisant ces poissons.

1. Statistiques descriptives

a.  Identifier les variables et le nombre d’observations de l’échantillon.

**Fonctions recommandées :**
- `read.table()`
- `head()`
- `dim()`
- `str()`
- `names()`
'data.frame':   41 obs. of  5 variables:
 $ longueur_mm     : int  420 442 397 421 464 436 424 440 420 421 ...
 $ poids_total_g   : int  785 850 655 790 965 880 840 1030 770 890 ...
 $ poids_gonades_mg: num  74.1 54.5 49.6 71.6 69.4 ...
 $ age_annee       : int  12 10 9 9 11 9 8 12 10 10 ...
 $ oeufs_nombre    : int  10676 9461 8328 10281 14028 4984 13697 17206 13485 14055 ...
  1. Calculer la moyenne, la variance et l’écart-type de chaque variable aléatoire.

    Fonctions recommandées
    • mean()
    • var()
    • sd()
    • apply()
    • summary()
  longueur_mm    poids_total_g    poids_gonades_mg   age_annee      oeufs_nombre  
 Min.   :397.0   Min.   : 655.0   Min.   : 31.30   Min.   : 8.00   Min.   : 4984  
 1st Qu.:421.0   1st Qu.: 825.0   1st Qu.: 77.70   1st Qu.:10.00   1st Qu.:13139  
 Median :434.0   Median : 855.0   Median : 97.70   Median :10.00   Median :14606  
 Mean   :435.3   Mean   : 901.6   Mean   : 92.84   Mean   :10.39   Mean   :15071  
 3rd Qu.:443.0   3rd Qu.: 975.0   3rd Qu.:101.90   3rd Qu.:11.00   3rd Qu.:16950  
 Max.   :487.0   Max.   :1310.0   Max.   :170.30   Max.   :13.00   Max.   :25834  
     longueur_mm    poids_total_g poids_gonades_mg        age_annee     oeufs_nombre 
       435.29268        901.58537         92.84390         10.39024      15070.75610 
     longueur_mm    poids_total_g poids_gonades_mg        age_annee     oeufs_nombre 
       19.755055       141.264110        25.247169         1.180636      4173.765062 
  1. Réaliser les représentations des distributions de chaque variable aléatoire.

    Fonctions à utiliser
    • hist()
    • par(mfrow = c(-,-))
    • curve()
    • `dnorm()
  2. Ces variables vous semblent-elles distribuées selon une loi Normale ? Pour le vérifier, superposez sur chaque histogramme les courbes de densité des lois normales correspondantes (les moyennes et les variances sont estimées à partir des données de l’échantillon). Vous pouvez tracer par superposition la loi normale de même moyenne et écart type sur chaque histogramme. Vous pouvez également tracer le qqplot pour comparer la distribution de chaque variable à celle d’une loi normale. Enfin, vous pouvez tester l’hypothèse nulle de la normalité par un test de Shapiro.

    Fonctions à utiliser
    • curve()
    • dnorm()
    • qqplot()
    • qqline()

Pour note: vous pouvez rechercher la valeur maximale sur l’axe des y en regardant le max de la densite et l’utiliser comme valeur dans l’argument ylim. Pour la distribution normale theorique, la moyenne est aussi le mode donc la valeur Y maximale, il suffit donc de recuperer la valeur Y à cette moyenne donnée par la fonction dnorm() :

[1] 9.558331e-05

Pour les valeurs de la variable avec max(hist(variable)$density) reagardez la structure de l’histogramme avec str() et recuperez le max de la densite:

List of 6
 $ breaks  : num [1:7] 0 5000 10000 15000 20000 25000 30000
 $ counts  : int [1:6] 1 2 20 14 3 1
 $ density : num [1:6] 4.88e-06 9.76e-06 9.76e-05 6.83e-05 1.46e-05 ...
 $ mids    : num [1:6] 2500 7500 12500 17500 22500 27500
 $ xname   : chr "coregone$oeufs_nombre"
 $ equidist: logi TRUE
 - attr(*, "class")= chr "histogram"

[1] 9.756098e-05

On peut aussi representer des qqplot: comparaison de la distribution des donnees a une distribution connue, ici a celle d’une loi normale

Pour aller plus loin, on peut tester la normalite de la distribution avec le test de shapiro:


    Shapiro-Wilk normality test

data:  coregone$longueur_mm
W = 0.97165, p-value = 0.3896

    Shapiro-Wilk normality test

data:  coregone$poids_g
W = 0.93983, p-value = 0.031

    Shapiro-Wilk normality test

data:  coregone$poids_gonades_mg
W = 0.93983, p-value = 0.031

    Shapiro-Wilk normality test

data:  coregone$age_annee
W = 0.92799, p-value = 0.01239

    Shapiro-Wilk normality test

data:  coregone$oeufs_nombre
W = 0.96143, p-value = 0.1765

2. Comparaison des potentiels reproducteurs selon l’âge :

Existe-t-il une différence du nombre d’œufs produits entre les poissons jeunes (âge inférieur à 10 ans) et âgés (âge supérieur ou égal à 10)?

a.  Créez une nouvelle variable qualitative pour identifier les deux groupes : les individus `jeunes` et les individus `âgés`

**Fonction à utiliser**
- `which()`
  1. Représentez la distribution de la variable œufs en fonction de la variable âge.

    Fonctions à utiliser
    • boxplot()
    • stripchart

Extraction of boxplot data: add argument plot=F -> the boxplot is not displayed but info are provided including for example stats for example:

        [,1]    [,2]
[1,]  8328.0 10676.0
[2,] 11993.0 13659.0
[3,] 13697.0 16760.5
[4,] 15320.5 19942.0
[5,] 18147.0 23982.0
attr(,"class")
    jeune 
"integer" 

En plus: representation des donnees par age

  1. Calculez les moyennes dans chaque groupe du nombre d’œufs

    Fonctions à utiliser
    • apply()
    • mean()
   jeune    vieux 
13721.83 16794.39 
[1] 13721.83
[1] 16794.39
  1. Existe-t-il une différence entre ces moyennes ?

    Fonctions à utiliser
    • t.test()
    • wilcox.test()

    Welch Two Sample t-test

data:  coregone$oeufs_nombre by coregone$classe_age
t = -2.4862, df = 36.672, p-value = 0.01759
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5577.3332  -567.7924
sample estimates:
mean in group jeune mean in group vieux 
           13721.83            16794.39 

    Wilcoxon rank sum test with continuity correction

data:  coregone$oeufs_nombre by coregone$classe_age
W = 124, p-value = 0.0302
alternative hypothesis: true location shift is not equal to 0
  1. Existe-t-il une relation linéaire entre le poids des gonades et le nombre d’oeufs produits ?

    Fonctions à utiliser
    • plot()
    • cor()
    • lm()
    • or.test()


    Pearson's product-moment correlation

data:  coregone$oeufs_nombre and coregone$poids_gonades_mg
t = 9.9292, df = 39, p-value = 3.128e-12
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.7285804 0.9156779
sample estimates:
      cor 
0.8464914 

Call:
lm(formula = coregone$oeufs_nombre ~ coregone$poids_gonades_mg)

Residuals:
   Min     1Q Median     3Q    Max 
 -3717  -1772   -244   1221   5605 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                2078.30    1354.89   1.534    0.133    
coregone$poids_gonades_mg   139.94      14.09   9.929 3.13e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2250 on 39 degrees of freedom
Multiple R-squared:  0.7165,    Adjusted R-squared:  0.7093 
F-statistic: 98.59 on 1 and 39 DF,  p-value: 3.128e-12
**Facultatif :** Vous pouvez ensuite tester l’effet d’autres variables sur la variable `oeufs`.

Conclusion :

Les poissons ages ont tendance a pondre plus d’oeufs que les jeunes, ce qui est en relation avec le poids de leurs gonades.