Le but de ce DM est de vérifier que vous avez compris les principales étapes à suivre lorsque l’on analyse un jeu de données.

Pour cela, vous appliquerez la démarche de statistiques descriptives vue en cours aux divers jeux de données proposés:

À chaque étape, vous justifierez que ce que vous calculez ou affichez a bien du sens. Le cas échéant, si le jeu de données ne satisfait pas les hypothèses attendues, vous essayerez de vous restreindre à un sous-ensemble du jeu de données en justifiant vos choix. Si vous avez l’impression qu’il y a plusieurs régimes (successifs ou supperposés), vous séparerez les deux régimes et les analyserez séparément.

On rappelle les différentes fonctions de base de R qui pourront vous êtres utiles: str, summary, mean, diff, sort, var, sd, plot, plot.ts, hist, boxplot.

Récupération des jeux de données

## [1] 1.91571 2.80841 2.81202 2.80412 2.80404 2.81324

Nous venons de récuperer les données. Elles sont maintenant dans data.

Nous allons traiter dans ce rapport de l’étude de données sur HPC : durée de l’exécution des différents appels à la fonction DGEMM lors d’une factorisation de Cholesky à l’aide de StarPU. Les unités de mesures sont en milisecondes.

Première visualisation du jeu de données

Avant de regarder le graphique, nous devons faire une petite analyse pour savoir ce que contient notre jeu de données.

str(data);
##  num [1:6956] 1.92 2.81 2.81 2.8 2.8 ...

Nous voyons que c’est un jeu conséquent en nombre. Ceci est bien pour observer et critiquer nos résultats. De plus ils semblent se stabiliser rapidement.

Nous enchaînons par simplement afficher le jeu de donner sans mettre de paramètres et de contraintes sur le graphique obtenu. Nous savons tout de même que c’est un jeu des données temporel.

plot.ts(data);

Il semble y avoir deux durées d’appels distincts. L’une regroupe une majeur partie de l’échantillon. L’autre est plus ponctuelle, dans le sens qu’elle se produit moins fréquemment mais aussi à des intervalles temporelles qui semblent se rapprocher dans la progression temporelle de l’expérience (si l’on considère que les mesures sont faites dans le temps de façon “continue”).

Pour les valeurs dites aberrantes nous pouvons en voir 4 au dessus des autres et 6-7 en dessous des deux tendances.

Nous allons donc essayer d’isoler ces valeurs extrêmes (celles au dessus de 9 et celles en dessous de 2), puis les deux durées qui se repètent (soit un tout petit peut en dessous de 3 et supérieur à 8). Nous pouvons aussi regarder si aucune valeurs n’est négative, car ceci sera aberrant et incorrecte (une durée ne peux être négative).

negative = data[data<=0];
seuil_max = 9.5;
seuil_min = 2;
valeur1 = 3;
valeur2 = 8;
minima = data[data<seuil_min];
maxima = data[data>seuil_max];
val2 = data[data>valeur2 & data<seuil_max];
val1 = data[data<valeur1 & data>seuil_min];

Valeurs negatives

Commençons par les valeurs impossibles dans des durées.

str(negative);
##  num(0)

Très bien, nous n’avons pas de négatifs, c’est qu’il n’y a pas eu d’erreurs lors de la capture des temps d’appels.

Valeurs extrêmes

Regardons combien de valeurs étranges nous avons :

str(minima);
##  num [1:23] 1.916 0.869 1.827 1.978 1.808 ...
str(maxima);
##  num [1:4] 9.99 13.29 12.33 9.82

Nous n’avons donc pas besoin face à la quantité de données fournie. Nous pouvons donc considérer qu’elles ne sont pas significatives dans l’évalutation de notre jeu de données.

Seuil principal

Regardons de plus près les données qui semblaient former un seuil entre 2 et 3.

plot.ts(val1);

Un certain nombre de valeurs diffèrent du reste de l’échantillon qui tourne autour de 2.8. Je vais essayer d’éliminer ces valeurs qui ne définissent aucune tendance, par leur ponctualité.

val1 = val1[val1 >= 2.7 & val1 <= 2.9];
str(val1);
##  num [1:6820] 2.81 2.81 2.8 2.8 2.81 ...

Après ce lissage de notre échantillon, il nous reste encore énormement de valeurs. Nous allons réafficher ce que nous avons pour essayer d’en déduite une tendance.

plot.ts(val1);

On pourrait distinguer deux sections différentes : * Une qui fluctue pas mal de l’indice 0 à 3000. * Une autre qui semble stationaire de 4000 à 7000. Je propose donc de séparer l’échantillon une deuxième fois. Nous allons perdre 1000 données mais ce n’est pas très grave vu l’étendu de notre échantillon et l’on pourrait dire ce que l’on pert est juste une phase de transition.

val1_f = val1[0:3000];
val1_s = val1[4000:length(val1)];

Partie fluctuente

Nous pouvons essayer d’afficher cet échantillon, en premier temps pour voir ce que l’on obtient à une plus petite échelle.

plot.ts(val1_f);

Nous pouvons observer qu’une majeur partie des données est comprise entre 2.75 et 2.80. Nous allons essayer d’affiner avec l’aide de hist.

hist(val1_f);

Après l’observation de cet histogramme nous pouvons dire que presque toutes les valeurs sont entre 2.78 et 2.80. Nous allons essayer d’éclaircir un peu cet intervalle en augmentant le nombre de bins. Si les bins auront la même valeur entre ces bornes, c’est que l’échantillon sera bien répartie. Sinon c’est qu’une tendance, une valeur forte (qui se répète souvent) apparaitra.

hist(val1_f, breaks=40);

Apèrs cet histogramme, nous pouvons observer plus facilement la répartition des données. ainsi le temps d’appels à la focntion est principalement autour de 2.78 milisecondes. Vérifions avec le calcul de la médiane, moyenne et les quartilles.

summary(val1_f);
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.701   2.766   2.777   2.776   2.788   2.886

Nous voyons que les valeurs sont très proche de se que nous pouvions estimer. En effet les quartilles, la moyenne et la médianne sont dans un mouchoir de poche. Maintenant nous allons résumer cette échantillon par une boite à moustache.

boxplot(val1_f);

Nous venons donc d’observer que la partie dite fluctuente ne variait finalement pas tant que ça. Elle nous donne un temps d’appels à la fonction de 2.77 milisecondes.

Partie stable

Analysons maintenant la partie stable de ce premier seuil.

plot.ts(val1_s);

Nous avons ici aussi quelques valeurs qui sortent du lot, je pense encore que nous pouvons les sorti de l’échantillon au considération de l’ampleur de notre jeu de données.

val1_s = val1_s[val1_s>2.777 & val1_s<2.853]
str(val1_s);
##  num [1:2781] 2.82 2.82 2.84 2.83 2.8 ...

Comme nous le voyons il nous reste encore beaucoup de données. Affichons les avec une meilleure échelle.

plot.ts(val1_s);

Les temps ont l’air d’être assez équitablement répartis sur l’intervalle de visualisation, vérifions avec un histogramme dans lequel le nombre de bins sera choisi par essais successifs jusqu’à obtention d’une bonne visualisation.

hist(val1_s, breaks=40);

La répartition des valeurs est concentrée autour de 2.83 milisecondes. Nous allons vérifier en éditant la moyenne :

summary(val1_s);
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.790   2.826   2.831   2.831   2.836   2.853

La moyenne et la mediane sont égales. Et comme pour l’autre partie fluctuente les données sont cantonnées autour de 2.83. Nous traçons maintenant une boîte à moustache qui résumera notre analyse. En effet elle aura un petit taille, montrant la concentration des données autour de la moyenne.

boxplot(val1_s);

Pour résumer nous avons définis un temps d’appels moyen sur cette échantillon à 2.831 milisecondes.

Seuil secondaire

Jettons maintenant un coup d’oeil autour des valeurs un peu plus élevées.

str(val2);
##  num [1:31] 8.85 8.81 8.79 8.81 8.8 ...
plot.ts(val2);

Sur le nombre de valeurs que nous avons dans ce second seuil nous pouvons peut être enlever la valeur la plus basse, elle doit aussi faire partie de valeurs “extrêmes”.

val2 = val2[val2>8.4];
plot.ts(val2);

Nous voyons maintenant que les valeurs sont très proches entre elles en valeurs, il ne faut pas oublier qu’en temporel, elles sont assez espacées. Le fait de ne plus avoir qu’un petit jeu par rapport au départ nous permet de tracer rapidement un histogramme sans choisir le nombre de bins.

hist(val2);

Nous pouvons voir qu’entre les valeurs 8.80 et 8.95, il y la majorité des valeurs. Nous pouvons donc considérer que la moyenne est entre c’est deux valeurs mais elle sera surement plus élevée que la médianne car il n’y a pas de valeurs dans l’intervalle 8.95 à 9.00. Nous allons vérifier :

summary(val2);
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.762   8.834   8.870   8.887   8.933   9.022

Nous avons confirmé nos attentes. Nous sommes sur des temps de différence plutôt courts nous pouvons donc resumer cet échantillon par une boîte à moustache.

boxplot(val2);

Ici la boîte est assez large contrairement à la tendance majoritaire. Mais cela n’est pas très grave car la fréquence du seuil actuelle n’est pas atteinte souvent.

Conclusion

Nous avons pu observer trois valeurs distinctes dont deux très proches 2.831 et 2.77 milisecondes. Il s’agit là des valeurs les plus souvent observées. Sachant que la mesure peut être pas très précise sur ce type de calculs et de temps, on peux considérer qu’il s’agit de la même valeur mais que l’instrument de mesure à incertitude de 1 miliseconde.

Pour l’autre seuil, qui n’apparait pas si souvent que celui autour de 2.8, je pense les conditions de l’expérience pourraient nous aider à mieux conclure et peut être aussi à éviter cette valeur de 8.88 milisecondes, soit 4 fois plus que le temps “habituel”.