Énoncé

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

On récupère un jeu de données qui rassemble des ping réguliers vers une machine non spécifiée sur une durée d’environ 25 minutes à une fréquence d’un ping toutes les 0.2 secondes. Les unités des mesures sont en milisecondes.

data=read.csv("data.csv",header=F)$V1
str(data)
##  num [1:8366] 26.5 26.7 26.2 26.4 26.1 26.2 26.1 26.2 26.2 26.2 ...

On a donc un ensemble de 8366 nombres et les premières valeurs semblent très proches les unes des autres.

On regarde maintenant si ces données sont structurées dans le temps. Selon l’énoncé du DM, elles devraient l’être. (On fera désormais comme si les pings avaient été réalisés toutes les secondes pour des raisons de simplicité. Cela ne changera rien pour notre jeu de données, sauf si on veut plus tard comparer ces pings avec d’autres données (ex : traffic sur le réseau sur 25 minutes au même moment que l’enregistrement des pings), auquel des cas il faudra bien respecter la fréquence de 0,2 secondes.)

Première visualisation des données

plot.ts(data, xlab = "Time (s)", ylab = "Ping (ms)");

Existance de tendance ou de structure

On observe plusieurs phases :

Les intervalles de mes phases ne sont pas assez précises. Je vais donc séparer les données pour récupérer des intervalles plus précis.

P1_temp = data[1:length(data)] # Première phase, la phase de base, celle à 26 ms de moyenne
P1 = P1_temp[(P1_temp<27) ]
P1 = P1[P1>25]

P2_temp = data[1:1000] # Deuxième  phase
P2 = P2_temp[P2_temp<25]

P3= data[3005:3155] # Troisième phase

P4= data[8200:length(data)] # Dernière phase

J’ai donc regroupé les 4 phases en supprimant les valeurs qui semblait être des aberrations pour la phase P1.

Pour P2, j’ai simplement pris les valeurs pour lesquels j’ai moins de 25 ms.

Pour P3 et P4 j’ai isolé les intervalles “à la main”, pour rester précis et garder les valeurs étranges (ex : les valeurs hautes de P3)

Analyse des phases : P1

On trace tout d’abord la courbe de P1 :

plot.ts(P1, xlab = "Time (s)", ylab = "Ping (ms)");

On peut peut-être observe une structure particulière : un palier vers 5000 secondes au niveau duquel le temps va généralement augmenter de 0.1 ms. Je vais donc faire l’histogramme pour repérer les valeurs typiques.

hist(P1,xlab = "Ping (ms)");

Il y a un pic important pour les valeurs entre 26.0 et 26.2.

Je peux alors résumer l’échantillon :

summary(P1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   25.40   26.10   26.20   26.19   26.20   26.90

Etant donnée le nombre très important de valeurs à 26 et 26.1 ms, il n’y a donc pas de surprise sur le fait que la moyenne et la médianne sont très proches. Nos valeurs ne sont donc pas réparties uniformément entre 25.40 et 26.90.

boxplot(P1)

Enfin, le boxplot résume bien l’échantillon puisqu’il montre encore les caractéristiques décrites précédemment.

Analyse des phases : P2

On trace tout d’abord la courbe de P2 :

plot.ts(P2, xlab = "Time (s)", ylab = "Ping (ms)");

La courbe a l’air bien plus instable cette fois mais c’est parce qu’on a beaucoup moins de valeurs. On obtient donc un “zoom” sur lequel je n’observe toujours pas de structure particulière. Je peux alors tracer l’histogramme.

hist(P2,xlab = "Ping (ms)");

Il y a un pic important pour les valeurs entre 22.2 et 24.4. Sinon, ou pourrait probablement considérer que c’est uniforme pour les valeurs entre 22.4 et 23.6.

Je peux alors résumer l’échantillon :

summary(P2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.30   22.40   22.40   22.60   22.72   23.60

Comme on pouvait s’en douter la moyenne et la médiane sont encore très proches. Dans cette phase stationnaire, les valeurs sont proches de 22.6 et sont réparties assez uniformément entre 25.40 et 26.90.

boxplot(P2)

On a enfin le boxplot qui résume la phase P2.

Analyse des phases : P3

On trace tout d’abord la courbe de P3 :

plot.ts(P3, xlab = "Time (s)", ylab = "Ping (ms)");

La courbe a l’air relativement stable sauf pour 3 points que l’on va supprimer et traiter comme des aberrations. On remarque que le changement de phase est compris dans cette phase. Je vais affiner l’intervalle de mes valeurs pour que le changement de régime ne soit plus présent.

P3=P3[5:145]
P3=P3[P3<30]
plot.ts(P3, xlab = "Time (s)", ylab = "Ping (ms)");

On a supprimé les valeurs parasites, qui étaient sans doutes des aberrations. On peut alors tracer l’histogramme.

hist(P3,xlab = "Ping (ms)");

On remarque un pic important pour les valeurs entre 22.0 et 22.5 ainsi qu’un pic deux fois moins important pour les valeurs entre 22.5 et 23.0. Sinon on peut dire que c’est uniforme pour les valeurs entre 23 et 25.5.

Je peux alors résumer l’échantillon :

summary(P3)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.20   22.40   22.50   22.60   22.67   25.40

Comme on pouvait s’en douter la moyenne et la médiane sont encore très proches. Dans cette phase stationnaire, les valeurs sont proches de 22.6 et sont réparties assez uniformément entre 22.20 et 25.40.

boxplot(P3)

On a enfin le boxplot qui résume la phase P3. On remarque qu’il se rapproche de la phase P2.

Analyse des phases : P4

On trace tout d’abord la courbe de P4 :

plot.ts(P4, xlab = "Time (s)", ylab = "Ping (ms)");

La courbe est relativement instable. On trace l’histogramme pour mieux se rendre compte

hist(P4,xlab = "Ping (ms)");

On peut observer 2 pics dominants pour les valeurs entre 26 et 28. On peut également observer des valeurs peu fréquentes entre 35 et 38. Sinon, on peut dire que c’est uniforme pour les valeurs entre 28 et 35

Je peux alors résumer l’échantillon :

summary(P4);
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   26.20   27.40   29.90   30.23   32.90   37.60

Comme on pouvait s’en douter la moyenne et la médiane sont presque les mêmes.

boxplot(P4)

On a enfin le boxplot qui résume la phase P4. On observe bien la moyenne et l’écart important entre le min et le max

Conclusion

Etant donné qu’on analysait ici des pings on peut émettre des hypothèses sur les phases :

Pour aller plus loin

Pour aller plus loin on pourrait s’intéresser aux transitions entres les différents régimes. Il s’agirait alors de voir si la transition augmente ou diminue régulièrement. Il n’y aurait pas d’intérêt d’utiliser de boxplot dans ces cas. Ces transitions devraient être les mêmes pour P2 et P3, rapides mais visibles, tandis que celle sur P4 se ferait d’un seul coup (même si on peut remarquer un ensemble de pics 20 secondes plus tôt, qui pourrait annoncer ce changement de phase).

Transition entre deux régimes stationnaires : P1 et P2

On récupère les valeurs représentatives de la transition entre le régime P1 et le régime P2. On remarque qu’il y a une abérration, on la supprime.

transP1_P2 = data[720:740]
transP1_P2 = transP1_P2[transP1_P2<28]
plot.ts(transP1_P2, xlab = "Time (s)", ylab = "Ping (ms)")

On observe un changement de phase en une seule valeur.

Il n’y a donc aucun intérêt à essayer de traiter ces données.

Tous les changements de phases seront du même type puisqu’on travaille sur une communication entre machines et le temps d’échange est à peu près constant quand il n’y a aucune perturbation.