diff --git a/module2/exo4/barchart1.png b/module2/exo4/barchart1.png new file mode 100644 index 0000000000000000000000000000000000000000..1249f07ca648c78d9f6cd72a28174ce3018c9f6a Binary files /dev/null and b/module2/exo4/barchart1.png differ diff --git a/module2/exo4/barchart2.png b/module2/exo4/barchart2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1409bdc9802280ccd4146c6c6d72b6d26067105 Binary files /dev/null and b/module2/exo4/barchart2.png differ diff --git a/module2/exo4/org_keywords.csv b/module2/exo4/org_keywords.csv new file mode 100644 index 0000000000000000000000000000000000000000..30eeb93e163ead0e1f31f416d234c4ef003529f1 --- /dev/null +++ b/module2/exo4/org_keywords.csv @@ -0,0 +1,567 @@ +Date,Keyword +2011-02-08,R +2011-02-08,Blog +2011-02-08,WP8 +2011-02-08,WP8 +2011-02-08,WP8 +2011-02-17,WP0 +2011-02-23,WP0 +2011-04-05,Workload +2011-05-17,Workload +2011-05-23,WP8 +2011-05-25,GameTheory +2011-05-30,BOINC +2011-06-06,WP4 +2011-06-15,Workload +2011-06-20,Gradient +2011-06-29,SG +2011-07-07,WP7 +2011-07-25,WP4 +2011-08-16,BOINC +2011-08-16,BOINC +2011-10-13,WP0 +2011-10-14,Workload +2011-11-30,Blog +2011-11-30,SG +2012-01-09,WP1 +2012-01-20,Blog +2012-01-20,SG +2012-01-23,Blog +2012-01-23,WP8 +2012-01-23,WP4 +2012-01-24,Blog +2012-01-24,WP4 +2012-01-24,WP0 +2012-01-26,WP6 +2012-01-26,Blog +2012-01-27,Blog +2012-01-27,WP4 +2012-02-10,WP7 +2012-02-13,WP4 +2012-03-01,WP4 +2012-03-05,git +2012-03-07,WP7 +2012-03-15,WP4 +2012-03-16,BOINC +2012-03-20,WP7 +2012-03-20,OrgMode +2012-03-28,noexport +2012-03-29,WP4 +2012-04-19,WP4 +2012-05-09,WP4 +2012-05-09,autotuning +2012-05-10,WP4 +2012-05-13,WP6 +2012-05-22,WP3 +2012-05-24,WP3 +2012-05-29,WP3 +2012-06-07,WP7 +2012-06-08,WP7 +2012-06-13,WP0 +2012-06-19,WP7 +2012-06-27,BOINC +2012-08-06,R +2012-08-08,Epistemology +2012-08-09,Epistemology +2012-08-11,OrgMode +2012-08-20,WP4 +2012-09-04,WP7 +2012-09-10,WP4 +2012-09-11,WP3 +2012-09-13,WP3 +2012-09-14,WP4 +2012-09-24,Blog +2012-09-27,BOINC +2012-09-28,BOINC +2012-10-16,R +2012-11-07,WP7 +2012-11-18,Argonne +2012-11-18,autotuning +2012-11-19,Argonne +2012-12-18,Argonne +2012-12-18,Argonne +2013-01-03,Argonne +2013-01-09,WP4 +2013-01-11,WP4 +2013-01-17,WP0 +2013-01-17,WP4 +2013-01-22,WP4 +2013-01-24,OrgMode +2013-01-24,git +2013-01-29,WP3 +2013-01-31,WP4 +2013-02-01,WP0 +2013-02-05,WP3 +2013-02-05,WP7 +2013-02-05,WP3 +2013-02-11,R +2013-02-11,WP4 +2013-03-05,WP4 +2013-03-06,SG +2013-03-12,WP4 +2013-03-14,Blog +2013-03-17,OrgMode +2013-03-18,WP3 +2013-03-18,WP3 +2013-03-19,Epistemology +2013-03-20,OrgMode +2013-03-21,WP3 +2013-03-22,WP4 +2013-03-26,WP8 +2013-03-28,WP4 +2013-04-02,WP8 +2013-04-03,Blog +2013-04-17,WP4 +2013-05-07,WP8 +2013-05-14,WP4 +2013-05-15,WP3 +2013-05-21,WP4 +2013-05-21,R +2013-05-21,R +2013-06-26,Blog +2013-06-26,WP4 +2013-07-02,GameTheory +2013-07-04,WP4 +2013-07-05,WP7 +2013-07-10,Blog +2013-08-13,WP4 +2013-09-03,WP4 +2013-09-24,WP4 +2013-09-25,BOINC +2013-09-27,BOINC +2013-09-30,BOINC +2013-10-01,BOINC +2013-10-02,BOINC +2013-10-09,WP4 +2013-10-10,WP4 +2013-10-10,WP4 +2013-10-23,WP7 +2013-11-17,WP8 +2013-11-18,WP4 +2013-11-18,WP4 +2013-11-19,WP4 +2013-11-20,R +2013-11-25,Argonne +2013-11-26,R +2013-11-27,Argonne +2013-11-27,Argonne +2013-12-06,WP4 +2013-12-11,Argonne +2013-12-12,Argonne +2014-01-16,WP4 +2014-01-16,Argonne +2014-01-30,Argonne +2014-02-14,Argonne +2014-06-23,WP8 +2014-07-02,OrgMode +2014-08-26,autotuning +2014-09-04,GameTheory +2014-09-09,WP4 +2014-09-16,WP8 +2014-09-19,INRIA +2014-09-22,R +2014-10-20,WP7 +2014-10-29,WP4 +2014-11-10,WP4 +2014-11-16,WP4 +2014-11-17,WP4 +2014-11-18,WP8 +2014-11-24,Argonne +2014-12-09,WP8 +2014-12-16,WP8 +2015-01-07,R +2015-01-22,LIG +2015-01-23,WP1 +2015-02-04,Stats +2015-02-05,WP4 +2015-02-06,LIG +2015-02-18,WP4 +2015-02-25,Teaching +2015-02-25,Vulgarization +2015-02-26,WP7 +2015-02-26,WP7 +2015-03-05,WP4 +2015-03-10,WP7 +2015-03-12,Vulgarization +2015-03-16,WP7 +2015-03-20,LIG +2015-03-24,Teaching +2015-03-26,WP7 +2015-03-31,WP7 +2015-04-01,LIG +2015-04-02,OrgMode +2015-04-02,WP7 +2015-04-06,Teaching +2015-04-11,WP4 +2015-04-24,WP7 +2015-04-30,WP7 +2015-04-30,WP7 +2015-05-07,LIG +2015-05-13,WP7 +2015-05-19,WP8 +2015-05-20,WP8 +2015-05-21,WP8 +2015-05-28,WP7 +2015-06-12,WP4 +2015-06-17,WP4 +2015-06-18,LIG +2015-06-29,Argonne +2015-07-01,R +2015-07-22,WP4 +2015-07-22,WP8 +2015-07-24,Teaching +2015-07-24,Teaching +2015-07-31,R +2015-08-09,WP7 +2015-08-09,WP7 +2015-08-25,WP8 +2015-08-26,R +2015-09-02,Stats +2015-09-04,WP7 +2015-09-14,WP7 +2015-09-21,WP4 +2015-09-21,HOME +2015-09-23,WP4 +2015-09-23,HOME +2015-10-01,POLARIS +2015-10-05,WP4 +2015-10-09,HOME +2015-10-14,WP8 +2015-10-26,WP4 +2015-11-03,Teaching +2015-11-09,WP4 +2015-11-09,WP7 +2015-11-10,HOME +2015-11-12,LIG +2015-11-16,LIG +2015-11-16,LIG +2015-11-17,WP4 +2015-11-18,HOME +2015-11-19,LIG +2015-11-27,POLARIS +2015-12-03,WP8 +2015-12-03,R +2015-12-07,WP4 +2015-12-09,POLARIS +2015-12-10,POLARIS +2015-12-10,GameTheory +2015-12-16,Teaching +2015-12-17,POLARIS +2015-12-22,Python +2015-12-23,HOME +2016-01-06,LIG +2016-01-06,WP7 +2016-01-06,POLARIS +2016-01-06,HOME +2016-01-06,POLARIS +2016-01-11,Python +2016-01-11,R +2016-01-12,WP8 +2016-01-13,Teaching +2016-01-15,WP8 +2016-01-19,WP4 +2016-01-19,Europe +2016-01-20,autotuning +2016-01-21,POLARIS +2016-01-22,INRIA +2016-01-25,WP7 +2016-01-26,R +2016-01-26,POLARIS +2016-01-26,Teaching +2016-01-26,Teaching +2016-01-27,LIG +2016-01-27,WP4 +2016-01-28,Europe +2016-01-29,WP4 +2016-02-01,POLARIS +2016-02-04,SG +2016-02-08,LIG +2016-02-08,LIG +2016-02-25,Python +2016-03-02,autotuning +2016-03-04,INRIA +2016-03-07,git +2016-03-07,OrgMode +2016-03-10,POLARIS +2016-03-10,Python +2016-03-14,LIG +2016-03-15,LIG +2016-03-17,git +2016-03-17,HOME +2016-03-21,WP4 +2016-03-21,R +2016-03-24,POLARIS +2016-03-24,GameTheory +2016-03-28,OrgMode +2016-03-29,WP4 +2016-03-29,Europe +2016-03-29,OrgMode +2016-03-29,git +2016-03-29,OrgMode +2016-03-31,git +2016-04-01,POLARIS +2016-04-07,Stats +2016-04-07,POLARIS +2016-04-08,Stats +2016-04-11,LIG +2016-04-13,R +2016-04-15,Stats +2016-04-25,Teaching +2016-04-28,POLARIS +2016-04-28,POLARIS +2016-04-29,SG +2016-04-29,INRIA +2016-05-02,LIG +2016-05-02,WP4 +2016-05-04,LIG +2016-05-10,SG +2016-05-10,Seminar +2016-05-11,WP4 +2016-05-12,POLARIS +2016-05-12,WP4 +2016-05-19,WP4 +2016-05-25,POLARIS +2016-05-27,INRIA +2016-05-30,LIG +2016-05-30,INRIA +2016-05-30,R +2016-06-01,HOME +2016-06-02,POLARIS +2016-06-03,Stats +2016-06-06,LIG +2016-06-08,LIG +2016-06-16,POLARIS +2016-06-17,R +2016-06-22,POLARIS +2016-06-22,Europe +2016-06-27,WP4 +2016-06-27,autotuning +2016-06-28,WP4 +2016-06-28,autotuning +2016-06-28,HACSPECIS +2016-06-29,WP4 +2016-06-29,Europe +2016-06-29,WP7 +2016-07-08,WP8 +2016-07-11,Europe +2016-07-19,twitter +2016-07-19,R +2016-07-19,R +2016-07-20,Teaching +2016-07-20,WP4 +2016-07-21,twitter +2016-07-25,LaTeX +2016-07-27,git +2016-08-25,HACSPECIS +2016-08-31,HACSPECIS +2016-09-02,Europe +2016-09-08,POLARIS +2016-09-08,INRIA +2016-09-08,INRIA +2016-09-12,POLARIS +2016-09-22,POLARIS +2016-09-22,HOME +2016-09-28,Europe +2016-09-29,POLARIS +2016-10-04,Europe +2016-10-10,LIG +2016-10-12,POLARIS +2016-11-10,BULL +2016-11-13,BULL +2016-11-15,BULL +2016-11-15,BULL +2016-11-18,INRIA +2016-11-21,git +2016-11-23,git +2016-11-23,WP7 +2016-11-24,POLARIS +2016-12-05,POLARIS +2016-12-08,LIG +2016-12-14,Orange +2016-12-15,POLARIS +2016-12-16,R +2016-12-16,INRIA +2016-12-16,Vulgarization +2017-01-09,R +2017-01-12,POLARIS +2017-01-13,Europe +2017-01-16,LIG +2017-01-19,POLARIS +2017-01-19,POLARIS +2017-01-19,Teaching +2017-01-20,POLARIS +2017-01-20,INRIA +2017-01-24,HACSPECIS +2017-01-26,Teaching +2017-01-26,POLARIS +2017-01-26,POLARIS +2017-01-30,Europe +2017-02-01,WP4 +2017-02-01,Europe +2017-02-02,Europe +2017-02-03,POLARIS +2017-02-08,WP4 +2017-02-08,Teaching +2017-02-09,Seminar +2017-02-09,POLARIS +2017-02-13,LIG +2017-02-15,POLARIS +2017-02-16,POLARIS +2017-02-17,INRIA +2017-03-01,Seminar +2017-03-03,Seminar +2017-03-07,Seminar +2017-03-07,Teaching +2017-03-08,Teaching +2017-03-09,WP4 +2017-03-13,LIG +2017-03-13,noexport +2017-03-13,noexport +2017-03-13,Teaching +2017-03-16,POLARIS +2017-03-16,POLARIS +2017-03-20,Teaching +2017-03-23,Seminar +2017-03-23,POLARIS +2017-03-23,noexport +2017-03-24,INRIA +2017-03-28,Seminar +2017-04-02,Teaching +2017-04-04,Teaching +2017-04-06,POLARIS +2017-04-06,Europe +2017-04-06,POLARIS +2017-04-06,Seminar +2017-04-07,Teaching +2017-04-27,POLARIS +2017-05-02,R +2017-05-05,INRIA +2017-05-10,POLARIS +2017-05-11,POLARIS +2017-05-11,POLARIS +2017-05-12,Teaching +2017-05-15,LIG +2017-05-22,INRIA +2017-06-07,noexport +2017-06-08,LIG +2017-06-09,INRIA +2017-06-12,LIG +2017-06-14,INRIA +2017-06-15,INRIA +2017-06-16,INRIA +2017-06-20,Teaching +2017-06-21,Teaching +2017-06-22,WP8 +2017-06-23,Teaching +2017-06-27,R +2017-06-27,R +2017-06-27,POLARIS +2017-06-27,Seminar +2017-07-03,R +2017-07-06,SG +2017-07-06,PF +2017-07-11,Teaching +2017-07-24,Vulgarization +2017-07-26,Europe +2017-09-01,R +2017-09-01,WP8 +2017-09-04,Seminar +2017-09-05,Teaching +2017-09-06,Teaching +2017-09-08,INRIA +2017-09-18,LIG +2017-09-28,POLARIS +2017-09-28,POLARIS +2017-10-03,Teaching +2017-10-06,INRIA +2017-10-06,OrgMode +2017-10-09,LIG +2017-10-16,HACSPECIS +2017-10-18,WP8 +2017-10-25,HACSPECIS +2017-10-25,HACSPECIS +2017-10-26,Seminar +2017-10-27,R +2017-11-06,POLARIS +2017-11-07,OrgMode +2017-11-10,INRIA +2017-11-13,LIG +2017-11-24,R +2017-11-24,R +2017-11-24,R +2017-11-24,R +2017-11-29,LIG +2017-12-07,Europe +2017-12-07,WP8 +2017-12-07,R +2017-12-07,Seminar +2017-12-08,Teaching +2017-12-08,INRIA +2017-12-08,WP7 +2017-12-08,WP7 +2017-12-11,Teaching +2017-12-11,LIG +2017-12-11,R +2017-12-11,Python +2017-12-11,R +2017-12-12,R +2017-12-12,R +2017-12-12,R +2017-12-12,R +2017-12-12,Europe +2017-12-14,Seminar +2017-12-15,R +2017-12-15,Seminar +2017-12-15,Teaching +2017-12-18,Teaching +2017-12-18,Seminar +2017-12-19,LIG +2017-12-21,Seminar +2018-01-08,Teaching +2018-01-11,Seminar +2018-01-11,Teaching +2018-01-15,Teaching +2018-01-17,HACSPECIS +2018-01-18,Seminar +2018-01-18,Stats +2018-01-22,R +2018-01-23,R +2018-02-06,R +2018-02-06,R +2018-02-06,POLARIS +2018-02-28,INRIA +2018-03-01,Seminar +2018-03-02,HACSPECIS +2018-03-02,HACSPECIS +2018-03-06,POLARIS +2018-03-08,Seminar +2018-03-08,HOME +2018-03-09,INRIA +2018-03-19,Europe +2018-03-22,R +2018-03-22,Seminar +2018-04-04,Python +2018-04-04,Python +2018-04-05,LIG +2018-04-05,Seminar +2018-04-26,POLARIS +2018-04-26,Seminar +2018-04-27,INRIA +2018-05-02,HOME +2018-05-03,INRIA +2018-05-03,Seminar +2018-05-03,Teaching +2018-05-04,OrgMode +2018-05-08,Seminar +2018-05-14,LIG +2018-05-15,Seminar +2018-05-17,POLARIS +2018-05-30,INRIA +2018-05-31,LIG +2018-06-01,INRIA +2018-06-07,Seminar +2018-06-08,Seminar +2018-06-11,LIG +2018-06-12,R +2018-06-22,WP4 +2018-06-26,INRIA diff --git a/module2/exo4/stat_activity.html b/module2/exo4/stat_activity.html new file mode 100644 index 0000000000000000000000000000000000000000..5e166f20e77cd3de91e4ed294912b1dca2525be3 --- /dev/null +++ b/module2/exo4/stat_activity.html @@ -0,0 +1,589 @@ + + + + +Analyse des mots-clés de mon journal + + + + + + + + + + + + + + +
+

Analyse des mots-clés de mon journal

+
+

Table des matières

+ +
+

+J'ai la chance de ne pas avoir de comptes à rendre trop précis sur le +temps que je passe à faire telle ou telle chose. Ça tombe bien car je +n'aime pas vraiment suivre précisément et quotidiennement le temps que +je passe à faire telle ou telle chose. Par contre, comme vous avez pu +le voir dans une des vidéos de ce module, je note beaucoup +d'information dans mon journal et j'étiquette (quand j'y pense) ces +informations. Je me suis dit qu'il pourrait être intéressant de voir +si l'évolution de l'utilisation de ces étiquettes révélait quelque +chose sur mes centres d'intérêts professionnels. Je ne compte pas en +déduire grand chose de significatif sur le plan statistique vu que je +sais que ma rigueur dans l'utilisation de ces étiquettes et leur +sémantique a évolué au fil des années mais bon, on va bien voir ce +qu'on y trouve. +

+ +
+

1 Mise en forme des données

+
+

+Mon journal est stocké dans /home/alegrand/org/journal.org. Les +entrées de niveau 1 (une étoile) indiquent l'année, celles de niveau 2 +(2 étoiles) le mois, celles de niveau 3 (3 étoiles) la date du jour et +enfin, celles de profondeur plus importantes ce sur quoi j'ai +travaillé ce jour là. Ce sont généralement celles-ci qui sont +étiquetées avec des mots-clés entre ":" à la fin de la ligne. +

+ +

+Je vais donc chercher à extraire les lignes comportant trois * en +début de ligne et celles commençant par une * et terminant par des +mots-clés (des : suivis éventuellement d'un espace). L'expression +régulière n'est pas forcément parfaite mais ça me donne une première +idée de ce que j'aurais besoin de faire en terme de remise en forme. +

+ +
+ +
grep -e '^\*\*\* ' -e '^\*.*:.*: *$' ~/org/journal.org | tail -n 20
+
+
+ +
+*** 2018-06-01 vendredi
+**** CP Inria du 01/06/18                                  :POLARIS:INRIA:
+*** 2018-06-04 lundi
+*** 2018-06-07 jeudi
+**** The Cognitive Packet Network - Reinforcement based Network Routing with Random Neural Networks (Erol Gelenbe) :Seminar:
+*** 2018-06-08 vendredi
+**** The credibility revolution in psychological science: the view from an editor's desk (Simine Vazire, UC DAVIS) :Seminar:
+*** 2018-06-11 lundi
+**** LIG leaders du 11 juin 2018                             :POLARIS:LIG:
+*** 2018-06-12 mardi
+**** geom_ribbon with discrete x scale                                  :R:
+*** 2018-06-13 mercredi
+*** 2018-06-14 jeudi
+*** 2018-06-20 mercredi
+*** 2018-06-21 jeudi
+*** 2018-06-22 vendredi
+**** Discussion Nicolas Benoit (TGCC, Bruyère)                    :SG:WP4:
+*** 2018-06-25 lundi
+*** 2018-06-26 mardi
+**** Point budget/contrats POLARIS                         :POLARIS:INRIA:
+
+ +

+OK, je suis sur la bonne voie. Je vois qu'il y a pas mal d'entrées +sans annotations. Tant pis. Il y a aussi souvent plusieurs mots-clés +pour une même date et pour pouvoir bien rajouter la date du jour en +face de chaque mots-clés, je vais essayer un vrai langage plutôt que +d'essayer de faire ça à coup de commandes shell. Je suis de l'ancienne +génération donc j'ai plus l'habitude de perl que de python pour ce +genre de choses. Curieusement, ça s'écrit bien plus facilement (ça m'a +pris 5 minutes) que ça ne se relit… ☺ +

+ +
+ +
open INPUT, "/home/alegrand/org/journal.org" or die $_;
+open OUTPUT, "> ./org_keywords.csv" or die;
+$date="";
+print OUTPUT "Date,Keyword\n";
+%skip = my %params = map { $_ => 1 } ("", "ATTACH", "Alvin", "Fred", "Mt", "Henri", "HenriRaf");
+
+while(defined($line=<INPUT>)) {
+    chomp($line);
+    if($line =~ '^\*\*\* (20[\d\-]*)') {
+	$date=$1;
+    }
+    if($line =~ '^\*.*(:\w*:)\s*$') {
+	@kw=split(/:/,$1);
+	if($date eq "") { next;}
+	foreach $k (@kw) {
+	    if(exists($skip{$k})) { next;}
+	    print OUTPUT "$date,$k\n";
+	}
+    }
+}
+
+
+ +

+Vérifions à quoi ressemble le résultat: +

+
+ +
head org_keywords.csv
+echo "..."
+tail org_keywords.csv
+
+
+ +
+Date,Keyword
+2011-02-08,R
+2011-02-08,Blog
+2011-02-08,WP8
+2011-02-08,WP8
+2011-02-08,WP8
+2011-02-17,WP0
+2011-02-23,WP0
+2011-04-05,Workload
+2011-05-17,Workload
+...
+2018-05-17,POLARIS
+2018-05-30,INRIA
+2018-05-31,LIG
+2018-06-01,INRIA
+2018-06-07,Seminar
+2018-06-08,Seminar
+2018-06-11,LIG
+2018-06-12,R
+2018-06-22,WP4
+2018-06-26,INRIA
+
+ +

+C'est parfait! +

+
+
+ +
+

2 Statistiques de base

+
+

+Je suis bien plus à l'aise avec R qu'avec python. J'utiliserai les +package du tidyverse dès que le besoin s'en fera sentir. Commençons +par lire ces données: +

+
+ +
library(lubridate) # à installer via install.package("tidyverse")
+library(dplyr)
+df=read.csv("./org_keywords.csv",header=T)
+df$Year=year(date(df$Date))
+
+
+ +
+Attachement du package : ‘lubridate’
+
+The following object is masked from ‘package:base’:
+
+    date
+
+Attachement du package : ‘dplyr’
+
+The following objects are masked from ‘package:lubridate’:
+
+    intersect, setdiff, union
+
+The following objects are masked from ‘package:stats’:
+
+    filter, lag
+
+The following objects are masked from ‘package:base’:
+
+    intersect, setdiff, setequal, union
+
+ +

+Alors, à quoi ressemblent ces données: +

+
+ +
str(df)
+summary(df)
+
+
+ +
+'data.frame':	566 obs. of  3 variables:
+ $ Date   : Factor w/ 420 levels "2011-02-08","2011-02-17",..: 1 1 1 1 1 2 3 4 5 6 ...
+ $ Keyword: Factor w/ 36 levels "Argonne","autotuning",..: 22 3 36 36 36 30 30 29 29 36 ...
+ $ Year   : num  2011 2011 2011 2011 2011 ...
+         Date         Keyword         Year     
+ 2011-02-08:  5   WP4     : 77   Min.   :2011  
+ 2016-01-06:  5   POLARIS : 56   1st Qu.:2013  
+ 2016-03-29:  5   R       : 48   Median :2016  
+ 2017-12-11:  5   LIG     : 40   Mean   :2015  
+ 2017-12-12:  5   Teaching: 38   3rd Qu.:2017  
+ 2016-01-26:  4   WP7     : 36   Max.   :2018  
+ (Other)   :537   (Other) :271
+
+ +

+Les types ont l'air correct, 568 entrées, tout va bien. +

+
+ +
df %>% group_by(Keyword, Year) %>% summarize(Count=n()) %>% 
+   ungroup() %>% arrange(Keyword,Year) -> df_summarized
+df_summarized
+
+
+ +
+# A tibble: 120 x 3
+   Keyword     Year Count
+   <fct>      <dbl> <int>
+ 1 Argonne     2012     4
+ 2 Argonne     2013     6
+ 3 Argonne     2014     4
+ 4 Argonne     2015     1
+ 5 autotuning  2012     2
+ 6 autotuning  2014     1
+ 7 autotuning  2016     4
+ 8 Blog        2011     2
+ 9 Blog        2012     6
+10 Blog        2013     4
+# ... with 110 more rows
+
+ +

+Commençons par compter combien d'annotation je fais par an. +

+
+ +
df_summarized_total_year = df_summarized %>% group_by(Year) %>% summarize(Cout=sum(Count))
+df_summarized_total_year
+
+
+ +
+# A tibble: 8 x 2
+   Year  Cout
+  <dbl> <int>
+1  2011    24
+2  2012    57
+3  2013    68
+4  2014    21
+5  2015    80
+6  2016   133
+7  2017   135
+8  2018    48
+
+ +

+Ah, visiblement, je m'améliore au fil du temps et en 2014, j'ai oublié +de le faire régulièrement. +

+ +

+L'annotation étant libre, certains mots-clés sont peut-être très peu +présents. Regardons ça. +

+
+ +
df_summarized %>% group_by(Keyword) %>% summarize(Count=sum(Count)) %>%  arrange(Count) %>% as.data.frame()
+
+
+ +
+         Keyword Count
+1       Gradient     1
+2          LaTeX     1
+3         Orange     1
+4             PF     1
+5        twitter     2
+6            WP1     2
+7            WP6     2
+8   Epistemology     3
+9           BULL     4
+10 Vulgarization     4
+11      Workload     4
+12    GameTheory     5
+13      noexport     5
+14    autotuning     7
+15        Python     7
+16         Stats     7
+17           WP0     7
+18            SG     8
+19           git     9
+20     HACSPECIS    10
+21          Blog    12
+22         BOINC    12
+23          HOME    12
+24           WP3    12
+25       OrgMode    14
+26       Argonne    15
+27        Europe    18
+28       Seminar    28
+29           WP8    28
+30         INRIA    30
+31           WP7    36
+32      Teaching    38
+33           LIG    40
+34             R    48
+35       POLARIS    56
+36           WP4    77
+
+ +

+OK, par la suite, je me restraindrai probablement ceux qui +apparaissent au moins trois fois. +

+
+
+ +
+

3 Représentations graphiques

+
+

+Pour bien faire, il faudrait que je mette une sémantique et une +hiérarchie sur ces mots-clés mais je manque de temps là. Comme +j'enlève les mots-clés peu fréquents, je vais quand même aussi +rajouter le nombre total de mots-clé pour avoir une idée de ce que +j'ai perdu. Tentons une première représentation graphique: +

+
+ +
library(ggplot2)
+df_summarized %>% filter(Count > 3) %>%
+    ggplot(aes(x=Year, y=Count)) + 
+    geom_bar(aes(fill=Keyword),stat="identity") + 
+    geom_point(data=df_summarized %>% group_by(Year) %>% summarize(Count=sum(Count))) +
+    theme_bw()
+
+
+ + +
+

barchart1.png +

+
+ +

+Aouch. C'est illisible avec une telle palette de couleurs mais vu +qu'il y a beaucoup de valeurs différences, difficile d'utiliser une +palette plus discriminante. Je vais quand même essayer rapidement +histoire de dire… Pour ça, j'utiliserai une palette de couleur +("Set1") où les couleurs sont toutes bien différentes mais elle n'a +que 9 couleurs. Je vais donc commencer par sélectionner les 9 +mots-clés les plus fréquents. +

+ +
+ +
library(ggplot2)
+frequent_keywords = df_summarized %>% group_by(Keyword) %>% 
+    summarize(Count=sum(Count)) %>%  arrange(Count) %>% 
+    as.data.frame() %>% tail(n=9)
+
+df_summarized %>% filter(Keyword %in% frequent_keywords$Keyword) %>%
+    ggplot(aes(x=Year, y=Count)) + 
+    geom_bar(aes(fill=Keyword),stat="identity") + 
+    geom_point(data=df_summarized %>% group_by(Year) %>% summarize(Count=sum(Count))) +
+    theme_bw() + scale_fill_brewer(palette="Set1")
+
+
+ + +
+

barchart2.png +

+
+ +

+OK. Visiblement, la part liée à l'administration (Inria, LIG, POLARIS) +et à l'enseignement (Teaching) augmente. L'augmentation des parties +sur R est à mes yeux signe d'une amélioration de ma maîtrise de +l'outil. L'augmentation de la partie Seminar ne signifie pas grand +chose car ce n'est que récemment que j'ai commencé à étiqueter +systématiquement les notes que je prenais quand j'assiste à un +exposé. Les étiquettes sur WP ont trait à la terminologie d'un ancien +projet ANR que j'ai continuer à utiliser (WP4 = prédiction de +performance HPC, WP7 = analyse et visualisation, WP8 = plans +d'expérience et moteurs d'expérimentation, …). Le fait que WP4 +diminue est plutôt le fait que les informations à ce sujet sont +maintenant plutôt les journaux de mes doctorants qui réalisent +vraiment les choses que je ne fais que superviser. +

+ +

+Bon, une analyse de ce genre ne serait pas digne de ce nom sans un +wordcloud (souvent illisible, mais tellement sexy! ☺). Pour ça, je +m'inspire librement de ce post: +http://onertipaday.blogspot.com/2011/07/word-cloud-in-r.html +

+ +
+ +
library(wordcloud) # à installer via install.package("wordcloud")
+library(RColorBrewer)
+pal2 <- brewer.pal(8,"Dark2")
+df_summarized %>% group_by(Keyword) %>% summarize(Count=sum(Count)) -> df_summarized_keyword
+wordcloud(df_summarized_keyword$Keyword, df_summarized_keyword$Count,
+     random.order=FALSE, rot.per=.15, colors=pal2, vfont=c("sans serif","plain"))
+
+
+ + +
+

wordcloud.png +

+
+ +

+Bon… voilà, c'est "joli" mais sans grand intérêt, tout +particulièrement quand il y a si peu de mots différents. +

+
+
+
+
+

Auteur: Laurence Farhi

+

Created: 2018-06-29 Fri 11:21

+

Emacs 25.3.1 (Org mode 8.2.10)

+

Validate

+
+ + diff --git a/module2/exo4/stat_activity.org b/module2/exo4/stat_activity.org new file mode 100644 index 0000000000000000000000000000000000000000..a1fd7300d6ef3566cb44999ae2d1b5a22f278124 --- /dev/null +++ b/module2/exo4/stat_activity.org @@ -0,0 +1,367 @@ +#+TITLE: Analyse des mots-clés de mon journal +#+LANGUAGE: fr + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + +#+PROPERTY: header-args :session :exports both :eval never-export + +J'ai la chance de ne pas avoir de comptes à rendre trop précis sur le +temps que je passe à faire telle ou telle chose. Ça tombe bien car je +n'aime pas vraiment suivre précisément et quotidiennement le temps que +je passe à faire telle ou telle chose. Par contre, comme vous avez pu +le voir dans une des vidéos de ce module, je note beaucoup +d'information dans mon journal et j'étiquette (quand j'y pense) ces +informations. Je me suis dit qu'il pourrait être intéressant de voir +si l'évolution de l'utilisation de ces étiquettes révélait quelque +chose sur mes centres d'intérêts professionnels. Je ne compte pas en +déduire grand chose de significatif sur le plan statistique vu que je +sais que ma rigueur dans l'utilisation de ces étiquettes et leur +sémantique a évolué au fil des années mais bon, on va bien voir ce +qu'on y trouve. + +* Mise en forme des données +Mon journal est stocké dans ~/home/alegrand/org/journal.org~. Les +entrées de niveau 1 (une étoile) indiquent l'année, celles de niveau 2 +(2 étoiles) le mois, celles de niveau 3 (3 étoiles) la date du jour et +enfin, celles de profondeur plus importantes ce sur quoi j'ai +travaillé ce jour là. Ce sont généralement celles-ci qui sont +étiquetées avec des mots-clés entre ":" à la fin de la ligne. + +Je vais donc chercher à extraire les lignes comportant trois ~*~ en +début de ligne et celles commençant par une ~*~ et terminant par des +mots-clés (des ~:~ suivis éventuellement d'un espace). L'expression +régulière n'est pas forcément parfaite mais ça me donne une première +idée de ce que j'aurais besoin de faire en terme de remise en forme. + +#+begin_src shell :results output :exports both :eval never-export +grep -e '^\*\*\* ' -e '^\*.*:.*: *$' ~/org/journal.org | tail -n 20 +#+end_src + +#+RESULTS: +#+begin_example +,*** 2018-06-01 vendredi +,**** CP Inria du 01/06/18 :POLARIS:INRIA: +,*** 2018-06-04 lundi +,*** 2018-06-07 jeudi +,**** The Cognitive Packet Network - Reinforcement based Network Routing with Random Neural Networks (Erol Gelenbe) :Seminar: +,*** 2018-06-08 vendredi +,**** The credibility revolution in psychological science: the view from an editor's desk (Simine Vazire, UC DAVIS) :Seminar: +,*** 2018-06-11 lundi +,**** LIG leaders du 11 juin 2018 :POLARIS:LIG: +,*** 2018-06-12 mardi +,**** geom_ribbon with discrete x scale :R: +,*** 2018-06-13 mercredi +,*** 2018-06-14 jeudi +,*** 2018-06-20 mercredi +,*** 2018-06-21 jeudi +,*** 2018-06-22 vendredi +,**** Discussion Nicolas Benoit (TGCC, Bruyère) :SG:WP4: +,*** 2018-06-25 lundi +,*** 2018-06-26 mardi +,**** Point budget/contrats POLARIS :POLARIS:INRIA: +#+end_example + +OK, je suis sur la bonne voie. Je vois qu'il y a pas mal d'entrées +sans annotations. Tant pis. Il y a aussi souvent plusieurs mots-clés +pour une même date et pour pouvoir bien rajouter la date du jour en +face de chaque mots-clés, je vais essayer un vrai langage plutôt que +d'essayer de faire ça à coup de commandes shell. Je suis de l'ancienne +génération donc j'ai plus l'habitude de perl que de python pour ce +genre de choses. Curieusement, ça s'écrit bien plus facilement (ça m'a +pris 5 minutes) que ça ne se relit... \smiley + +#+begin_src perl :results output :exports both :eval never-export +open INPUT, "/home/alegrand/org/journal.org" or die $_; +open OUTPUT, "> ./org_keywords.csv" or die; +$date=""; +print OUTPUT "Date,Keyword\n"; +%skip = my %params = map { $_ => 1 } ("", "ATTACH", "Alvin", "Fred", "Mt", "Henri", "HenriRaf"); + +while(defined($line=)) { + chomp($line); + if($line =~ '^\*\*\* (20[\d\-]*)') { + $date=$1; + } + if($line =~ '^\*.*(:\w*:)\s*$') { + @kw=split(/:/,$1); + if($date eq "") { next;} + foreach $k (@kw) { + if(exists($skip{$k})) { next;} + print OUTPUT "$date,$k\n"; + } + } +} +#+end_src + +#+RESULTS: + +Vérifions à quoi ressemble le résultat: +#+begin_src shell :results output :exports both +head org_keywords.csv +echo "..." +tail org_keywords.csv +#+end_src + +#+RESULTS: +#+begin_example +Date,Keyword +2011-02-08,R +2011-02-08,Blog +2011-02-08,WP8 +2011-02-08,WP8 +2011-02-08,WP8 +2011-02-17,WP0 +2011-02-23,WP0 +2011-04-05,Workload +2011-05-17,Workload +... +2018-05-17,POLARIS +2018-05-30,INRIA +2018-05-31,LIG +2018-06-01,INRIA +2018-06-07,Seminar +2018-06-08,Seminar +2018-06-11,LIG +2018-06-12,R +2018-06-22,WP4 +2018-06-26,INRIA +#+end_example + +C'est parfait! + +* Statistiques de base +Je suis bien plus à l'aise avec R qu'avec python. J'utiliserai les +package du tidyverse dès que le besoin s'en fera sentir. Commençons +par lire ces données: +#+begin_src R :results output :session *R* :exports both +library(lubridate) # à installer via install.package("tidyverse") +library(dplyr) +df=read.csv("./org_keywords.csv",header=T) +df$Year=year(date(df$Date)) +#+end_src + +#+RESULTS: +#+begin_example + +Attachement du package : ‘lubridate’ + +The following object is masked from ‘package:base’: + + date + +Attachement du package : ‘dplyr’ + +The following objects are masked from ‘package:lubridate’: + + intersect, setdiff, union + +The following objects are masked from ‘package:stats’: + + filter, lag + +The following objects are masked from ‘package:base’: + + intersect, setdiff, setequal, union +#+end_example + +Alors, à quoi ressemblent ces données: +#+begin_src R :results output :session *R* :exports both +str(df) +summary(df) +#+end_src + +#+RESULTS: +#+begin_example +'data.frame': 566 obs. of 3 variables: + $ Date : Factor w/ 420 levels "2011-02-08","2011-02-17",..: 1 1 1 1 1 2 3 4 5 6 ... + $ Keyword: Factor w/ 36 levels "Argonne","autotuning",..: 22 3 36 36 36 30 30 29 29 36 ... + $ Year : num 2011 2011 2011 2011 2011 ... + Date Keyword Year + 2011-02-08: 5 WP4 : 77 Min. :2011 + 2016-01-06: 5 POLARIS : 56 1st Qu.:2013 + 2016-03-29: 5 R : 48 Median :2016 + 2017-12-11: 5 LIG : 40 Mean :2015 + 2017-12-12: 5 Teaching: 38 3rd Qu.:2017 + 2016-01-26: 4 WP7 : 36 Max. :2018 + (Other) :537 (Other) :271 +#+end_example + +Les types ont l'air correct, 568 entrées, tout va bien. +#+begin_src R :results output :session *R* :exports both +df %>% group_by(Keyword, Year) %>% summarize(Count=n()) %>% + ungroup() %>% arrange(Keyword,Year) -> df_summarized +df_summarized +#+end_src + +#+RESULTS: +#+begin_example +# A tibble: 120 x 3 + Keyword Year Count + + 1 Argonne 2012 4 + 2 Argonne 2013 6 + 3 Argonne 2014 4 + 4 Argonne 2015 1 + 5 autotuning 2012 2 + 6 autotuning 2014 1 + 7 autotuning 2016 4 + 8 Blog 2011 2 + 9 Blog 2012 6 +10 Blog 2013 4 +# ... with 110 more rows +#+end_example + +Commençons par compter combien d'annotation je fais par an. +#+begin_src R :results output :session *R* :exports both +df_summarized_total_year = df_summarized %>% group_by(Year) %>% summarize(Cout=sum(Count)) +df_summarized_total_year +#+end_src + +#+RESULTS: +#+begin_example +# A tibble: 8 x 2 + Year Cout + +1 2011 24 +2 2012 57 +3 2013 68 +4 2014 21 +5 2015 80 +6 2016 133 +7 2017 135 +8 2018 48 +#+end_example + +Ah, visiblement, je m'améliore au fil du temps et en 2014, j'ai oublié +de le faire régulièrement. + +L'annotation étant libre, certains mots-clés sont peut-être très peu +présents. Regardons ça. +#+begin_src R :results output :session *R* :exports both +df_summarized %>% group_by(Keyword) %>% summarize(Count=sum(Count)) %>% arrange(Count) %>% as.data.frame() +#+end_src + +#+RESULTS: +#+begin_example + Keyword Count +1 Gradient 1 +2 LaTeX 1 +3 Orange 1 +4 PF 1 +5 twitter 2 +6 WP1 2 +7 WP6 2 +8 Epistemology 3 +9 BULL 4 +10 Vulgarization 4 +11 Workload 4 +12 GameTheory 5 +13 noexport 5 +14 autotuning 7 +15 Python 7 +16 Stats 7 +17 WP0 7 +18 SG 8 +19 git 9 +20 HACSPECIS 10 +21 Blog 12 +22 BOINC 12 +23 HOME 12 +24 WP3 12 +25 OrgMode 14 +26 Argonne 15 +27 Europe 18 +28 Seminar 28 +29 WP8 28 +30 INRIA 30 +31 WP7 36 +32 Teaching 38 +33 LIG 40 +34 R 48 +35 POLARIS 56 +36 WP4 77 +#+end_example + +OK, par la suite, je me restraindrai probablement ceux qui +apparaissent au moins trois fois. + +* Représentations graphiques +Pour bien faire, il faudrait que je mette une sémantique et une +hiérarchie sur ces mots-clés mais je manque de temps là. Comme +j'enlève les mots-clés peu fréquents, je vais quand même aussi +rajouter le nombre total de mots-clé pour avoir une idée de ce que +j'ai perdu. Tentons une première représentation graphique: +#+begin_src R :results output graphics :file barchart1.png :exports both :width 600 :height 400 :session *R* +library(ggplot2) +df_summarized %>% filter(Count > 3) %>% + ggplot(aes(x=Year, y=Count)) + + geom_bar(aes(fill=Keyword),stat="identity") + + geom_point(data=df_summarized %>% group_by(Year) %>% summarize(Count=sum(Count))) + + theme_bw() +#+end_src + +#+RESULTS: +[[file:barchart1.png]] + +Aouch. C'est illisible avec une telle palette de couleurs mais vu +qu'il y a beaucoup de valeurs différences, difficile d'utiliser une +palette plus discriminante. Je vais quand même essayer rapidement +histoire de dire... Pour ça, j'utiliserai une palette de couleur +("Set1") où les couleurs sont toutes bien différentes mais elle n'a +que 9 couleurs. Je vais donc commencer par sélectionner les 9 +mots-clés les plus fréquents. + +#+begin_src R :results output graphics :file barchart2.png :exports both :width 600 :height 400 :session *R* +library(ggplot2) +frequent_keywords = df_summarized %>% group_by(Keyword) %>% + summarize(Count=sum(Count)) %>% arrange(Count) %>% + as.data.frame() %>% tail(n=9) + +df_summarized %>% filter(Keyword %in% frequent_keywords$Keyword) %>% + ggplot(aes(x=Year, y=Count)) + + geom_bar(aes(fill=Keyword),stat="identity") + + geom_point(data=df_summarized %>% group_by(Year) %>% summarize(Count=sum(Count))) + + theme_bw() + scale_fill_brewer(palette="Set1") +#+end_src + +#+RESULTS: +[[file:barchart2.png]] + +OK. Visiblement, la part liée à l'administration (~Inria~, ~LIG~, ~POLARIS~) +et à l'enseignement (~Teaching~) augmente. L'augmentation des parties +sur ~R~ est à mes yeux signe d'une amélioration de ma maîtrise de +l'outil. L'augmentation de la partie ~Seminar~ ne signifie pas grand +chose car ce n'est que récemment que j'ai commencé à étiqueter +systématiquement les notes que je prenais quand j'assiste à un +exposé. Les étiquettes sur ~WP~ ont trait à la terminologie d'un ancien +projet ANR que j'ai continuer à utiliser (~WP4~ = prédiction de +performance HPC, ~WP7~ = analyse et visualisation, ~WP8~ = plans +d'expérience et moteurs d'expérimentation, ...). Le fait que ~WP4~ +diminue est plutôt le fait que les informations à ce sujet sont +maintenant plutôt les journaux de mes doctorants qui réalisent +vraiment les choses que je ne fais que superviser. + +Bon, une analyse de ce genre ne serait pas digne de ce nom sans un +/wordcloud/ (souvent illisible, mais tellement sexy! \smiley). Pour ça, je +m'inspire librement de ce post: +http://onertipaday.blogspot.com/2011/07/word-cloud-in-r.html + +#+begin_src R :results output graphics :file wordcloud.png :exports both :width 600 :height 400 :session *R* +library(wordcloud) # à installer via install.package("wordcloud") +library(RColorBrewer) +pal2 <- brewer.pal(8,"Dark2") +df_summarized %>% group_by(Keyword) %>% summarize(Count=sum(Count)) -> df_summarized_keyword +wordcloud(df_summarized_keyword$Keyword, df_summarized_keyword$Count, + random.order=FALSE, rot.per=.15, colors=pal2, vfont=c("sans serif","plain")) +#+end_src + +#+RESULTS: +[[file:wordcloud.png]] + +Bon... voilà, c'est "joli" mais sans grand intérêt, tout +particulièrement quand il y a si peu de mots différents. diff --git a/module2/exo4/wordcloud.png b/module2/exo4/wordcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..95cb7343027266dd3187a69db1e0351aeda84dce Binary files /dev/null and b/module2/exo4/wordcloud.png differ