Sinon, une méthode plus simple à comprendre et ne faisant pas intervenir d'appel à la fonction sinus se base sur le fait que si $X∼U(0,1) et Y∼U(0,1) alors P[X2+Y2≤1]=\pi/4$ (voir méthode de Monte Carlo sur Wikipedia). Le code suivant illustre ce fait :
@@ -27,11 +27,18 @@ if sys.version_info.major < 3 or sys.version_info.minor < 6:
print("Veuillez utiliser Python 3.6 (ou plus) !")
#+END_SRC
#+RESULTS:
: Python 3.8.2 (default, Mar 11 2020, 00:29:50)
: [Clang 11.0.0 (clang-1100.0.33.17)] on darwin
: Type "help", "copyright", "credits" or "license" for more information.
#+BEGIN_SRC emacs-lisp :results output
(unless (featurep 'ob-python)
(print "Veuillez activer python dans org-babel (org-babel-do-languages) !"))
#+END_SRC
#+RESULTS:
** R 3.4
Nous n'utilisons que des fonctionnalités de base du langage R, une version antérieure devrait suffire.
...
...
@@ -40,6 +47,14 @@ Nous n'utilisons que des fonctionnalités de base du langage R, une version ant
(print "Veuillez activer R dans org-babel (org-babel-do-languages) !"))
#+END_SRC
#+RESULTS:
#+begin_src R :results output graphics :file (org-babel-temp-file "figure" ".png") :exports both :width 600 :height 400 :session *R*
test
#+end_src
#+RESULTS:
* Préparation des données
Les données de l'incidence du syndrome grippal sont disponibles du site Web du [[http://www.sentiweb.fr/][Réseau Sentinelles]]. Nous les récupérons sous forme d'un fichier en format CSV dont chaque ligne correspond à une semaine de la période d'observation. Nous téléchargeons toujours le jeu de données complet (rien d'autre n'est proposé), qui commence en 1984 et se termine avec une semaine récente. L'URL est:
...
...
@@ -80,6 +95,13 @@ Regardons ce que nous avons obtenu:
Il y a malheureusement beaucoup de façon d'indiquer l'absence d'un point de données. Nous testons ici seulement pour la présence de champs vides. Il faudrait aussi rechercher des valeurs non-numériques dans les colonnes à priori numériques. Nous ne le faisons pas ici, mais une vérification ultérieure capterait des telles anomalies.
Il y a deux colonnes qui nous intéressent: la première (~"week"~) et la troisième (~"inc"~). Nous vérifions leurs noms dans l'en-tête, que nous effaçons par la suite. Enfin, nous créons un tableau avec les deux colonnes pour le traitement suivant.
#+BEGIN_SRC python :results silent
...
...
@@ -101,7 +126,7 @@ week = [row[0] for row in valid_table]
assert week[0] == 'week'
del week[0]
inc = [row[2] for row in valid_table]
assert inc[0] == 'inc
assert inc[0] == 'inc'
del inc[0]
data = list(zip(week, inc))
#+END_SRC
...
...
@@ -111,6 +136,21 @@ Regardons les premières et les dernières lignes. Nous insérons ~None~ pour in
Il est toujours prudent de vérifier si les données semblent crédibles. Nous savons que les semaines sont données par six chiffres (quatre pour l'année et deux pour la semaine), et que les incidences sont des nombres entiers positifs.
#+BEGIN_SRC python :results output
...
...
@@ -121,6 +161,8 @@ for week, inc in data:
print("Valeur suspecte dans la colonne 'inc': ", (week, inc))
#+END_SRC
#+RESULTS:
Pas de problème !
** Conversions
...
...
@@ -140,6 +182,21 @@ str_data = [(str(date), str(inc)) for date, inc in converted_data]
Nous faisons encore une vérification: nos dates doivent être séparées d'exactement une semaine, sauf autour du point manquant.
#+BEGIN_SRC python :results output
...
...
@@ -149,6 +206,9 @@ for date1, date2 in zip(dates[:-1], dates[1:]):
print(f"Il y a {date2-date1} entre {date1} et {date2}")
#+END_SRC
#+RESULTS:
: Il y a 14 days, 0:00:00 entre 1989-05-01 et 1989-05-15
** Passage Python -> R
Nous passons au langage R pour inspecter nos données, parce que l'analyse et la préparation de graphiques sont plus concises en R, sans nécessiter aucune bibliothèque supplémentaire.
: Error in head(inc_annuelle[order(-inc_annuelle$incidence), ]) :
: objet 'inc_annuelle' introuvable
Enfin, un histogramme montre bien que les épidémies fortes, qui touchent environ 10% de la population française, sont assez rares: il y en eu trois au cours des 35 dernières années.
#+BEGIN_SRC R :results output graphics :file annual-inc-hist.png
Un modèle simple et fréquemment utilisé pour décrire la performance d'une connexion de réseau consiste à supposer que le temps d'envoi T pour un message dépend principalement de sa taille $S$ (nombre d'octets) et de deux grandeurs propres à la connexion : la latence $L$ (en secondes) et la capacité $C$ (en octets/seconde). La relation entre ces quatre quantités est $T(S) = L + S/C$. Ce modèle néglige un grand nombre de détails. D'une part, $L$ et $C$ dépendent bien sûr du protocole de communication choisi mais aussi dans une certaine mesure de $S$. D'autre part, la mesure de $T(S)$ comporte en général une forte composante aléatoire. Nous nous intéressons ici au temps moyen qu'il faut pour envoyer un message d'une taille donnée.
Ceci est un document org-mode avec quelques exemples de code
python. Une fois ouvert dans emacs, ce document peut aisément être
exporté au format HTML, PDF, et Office. Pour plus de détails sur
Votre tâche est d'estimer $L$ et $C$ à partir d'une série d'observations de $T$ pour des valeurs différentes de $S$. Préparez votre analyse sous forme d'un document computationnel réplicable qui commence avec la lectures des données brutes, disponibles pour deux connexions différentes, qui ont été obtenues avec l'outil ping :
- Le premier jeu de données examine une connexion courte à l'intérieur d'un campus : http://mescal.imag.fr/membres/arnaud.legrand/teaching/2014/RICM4_EP_ping/liglab2.log.gz
- Le deuxième jeu de données mesure la performance d'une connexion vers un site Web éloigné assez populaire et donc chargé : http://mescal.imag.fr/membres/arnaud.legrand/teaching/2014/RICM4_EP_ping/stackoverflow.log.gz
Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera
compilé en html. Tout le code contenu sera ré-exécuté, les résultats
récupérés et inclus dans un document final. Si vous ne souhaitez pas
ré-exécuter tout le code à chaque fois, il vous suffit de supprimer
le # et l'espace qui sont devant le ~#+PROPERTY:~ au début de ce
document.
Comme nous vous l'avons montré dans la vidéo, on inclue du code
python de la façon suivante (et on l'exécute en faisant ~C-c C-c~):
Les deux fichiers contiennent la sortie brute de l'outil ping qui a été exécuté dans une boucle en variant de façon aléatoire la taille du message. Chaque ligne a la forme suivante:
#+begin_src python :results output :exports both
print("Hello world!")
#+end_src
#+BEGIN_SRC
[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 ms
#+END_SRC
Au début, entre crochet, vous trouvez la date à laquelle la mesure a été prise, exprimée en secondes depuis le 1er janvier 1970. La taille du message en octets est donnée juste après, suivie par le nom de la machine cible et son adresse IP, qui sont normalement identiques pour toutes les lignes à l'intérieur d'un jeu de données. À la fin de la ligne, nous trouvons le temps d'envoi (aller-retour) en millisecondes. Les autres indications, =icmp_seq= et =ttl=, n'ont pas d'importance pour notre analyse. Attention, il peut arriver qu'une ligne soit incomplète et il faut donc vérifier chaque ligne avant d'en extraire des informations !
_Votre mission si vous l'acceptez :_
1. Commencez par travailler avec le premier jeu de données (liglab2). Représentez graphiquement l'évolution du temps de transmission au cours du temps (éventuellement à différents instants et différentes échelles de temps) pour évaluer la stabilité temporelle du phénomène. Ces variations peuvent-elles être expliquées seulement par la taille des messages ?
2. Représentez le temps de transmission en fonction de la taille des messages. Vous devriez observer une "rupture", une taille à partir de laquelle la nature de la variabilité change. Vous estimerez (graphiquement) cette taille afin de traiter les deux classes de tailles de message séparément.
3. Effectuez une régression linéaire pour chacune des deux classes et évaluez les valeurs de L et de C correspondantes. Vous superposerez le résultat de cette régression linéaire au graphe précédent.
4. (Optionnel) La variabilité est tellement forte et asymétrique que la régression du temps moyen peut être considérée comme peu pertinente. On peut vouloir s'intéresser à caractériser plutôt le plus petit temps de transmission. Une approche possible consiste donc à filtrer le plus petit temps de transmission pour chaque taille de message et à effectuer la régression sur ce sous-ensemble de données. Cela peut également être l'occasion pour ceux qui le souhaitent de se familiariser avec la régression de quantiles (implémentée en R dans la bibliothèque quantreg et en Python dans la bibliothèque statsmodels).
5. Répétez les étapes précédentes avec le second jeu de données (stackoverflow)